AccountData can read from json files to populate accounts.

This commit is contained in:
quentin 2022-08-12 15:26:25 -05:00
parent b43917ce73
commit 04765e1992
16 changed files with 345 additions and 8 deletions

5
.idea/codeStyles/codeStyleConfig.xml generated Normal file
View File

@ -0,0 +1,5 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" />
</state>
</component>

View File

@ -3,4 +3,10 @@ project(budget)
set(CMAKE_CXX_STANDARD 20)
add_executable(budget src/main.cpp src/money/account.cpp src/money/account.h)
add_executable(${PROJECT_NAME} src/main.cpp src/main.h
src/money/account.cpp src/money/account.h
src/money/transaction.cpp src/money/transaction.h
src/money/recept.cpp src/money/recept.h
src/data/data.tpp src/data/data.h
src/data/accountData.cpp src/data/accountData.h
src/money/earning.cpp src/money/earning.h)

83
src/data/accountData.cpp Normal file
View File

@ -0,0 +1,83 @@
//
// Created by quentin on 8/4/22.
//
#include "accountData.h"
#include <fstream>
#include <iostream>
AccountData::AccountData(const std::string &file) : Data(file) {
account = AccountData::createObject();
}
Account AccountData::createObject() {
if (isJsonCorrect()) {
bool withdrawable = document["withdrawable"].GetBool();
std::string name = document["name"].GetString();
std::list<Transaction> transactions;
for (auto &domTransaction : document["transactions"].GetArray()) {
Receipt receipt(domTransaction["receipt"]["file"].GetString());
int value = domTransaction["value"].GetInt();
transactions.emplace_back(value, receipt);
}
std::list<Earning> earnings;
for (auto &domEarning : document["earnings"].GetArray()) {
earnings.emplace_back(domEarning["value"].GetInt());
}
return Account(transactions, earnings, withdrawable, name);
}
std::string strAnswer;
bool answer;
while (true) {
std::cout << "Account " + getFilePath() + " not found, would you like to remove it from the database? (Y/n): ";
std::cin >> strAnswer;
std::transform(strAnswer.begin(), strAnswer.end(), strAnswer.begin(), ::toupper);
if (strAnswer == "Y" || strAnswer == "YES") {
answer = true;
break;
}
if (strAnswer == "N" || strAnswer == "NO") {
answer = false;
break;
}
std::cout << "Sorry, answer " + strAnswer + " not understood." << std::endl;
}
return Account();
}
bool AccountData::isJsonCorrect() {
if (document.IsObject() &&
document.HasMember("withdrawable") && document["withdrawable"].IsBool() &&
document.HasMember("name") && document["name"].IsString() &&
document.HasMember("transactions") && document["transactions"].IsArray() &&
document.HasMember("earnings") && document["earnings"].IsArray()) {
for (auto &domTransaction : document["transactions"].GetArray()) {
if (!(domTransaction.IsObject() &&
domTransaction.HasMember("receipt") && domTransaction["receipt"].IsObject() &&
domTransaction["receipt"].HasMember("file") && domTransaction["receipt"]["file"].IsString() &&
domTransaction.HasMember("value") && domTransaction["value"].IsInt())) {
return false;
}
}
for (auto &domEarning : document["earnings"].GetArray()) {
if (!(domEarning.IsObject() &&
domEarning.HasMember("value") && domEarning["value"].IsInt())) {
return false;
}
}
return true;
}
return false;
}
Account *AccountData::getAccount() {
return &account;
}

29
src/data/accountData.h Normal file
View File

@ -0,0 +1,29 @@
//
// Created by quentin on 8/4/22.
//
#ifndef BUDGET_ACCOUNTDATA_H
#define BUDGET_ACCOUNTDATA_H
#include "data.h"
#include "../money/account.h"
static const char *jsonTemplate = "";
class AccountData : private Data<Account> {
public:
AccountData(const std::string &file);
Account *getAccount();
private:
Account account;
Account createObject() override;
bool isJsonCorrect() override;
};
#endif //BUDGET_ACCOUNTDATA_H

36
src/data/data.h Normal file
View File

@ -0,0 +1,36 @@
//
// Created by quentin on 8/4/22.
//
#ifndef BUDGET_DATA_H
#define BUDGET_DATA_H
#include <pwd.h>
#include <unistd.h>
#include <string>
#include <rapidjson/document.h>
template<class T>
class Data {
public:
rapidjson::Document document;
Data(std::string file);
virtual T createObject() = 0;
std::string getFilePath();
private:
const std::string fileName;
const std::string homeDirectory = getpwuid(getuid())->pw_dir;
std::string fileDirectory;
virtual bool isJsonCorrect() = 0;
};
#include "data.tpp"
#endif //BUDGET_DATA_H

34
src/data/data.tpp Normal file
View File

@ -0,0 +1,34 @@
//
// Created by quentin on 8/4/22.
//
#include "data.h"
#include <utility>
#include <fstream>
#include <vector>
template<class T>
Data<T>::Data(std::string file) : fileName(std::move(file)) {
// Create file if it doesnt exist
std::fstream fstream(getFilePath(), std::ios::out | std::ios::app);
fstream.close();
std::ifstream ifstream(getFilePath(), std::ios::in | std::ios::binary | std::ios::ate);
std::ifstream::pos_type fileSize = ifstream.tellg();
ifstream.seekg(0, std::ios::beg);
std::vector<char> bytes(fileSize);
ifstream.read(bytes.data(), fileSize);
document.Parse(std::string(bytes.data(), fileSize).c_str());
ifstream.close();
}
template<class T>
std::string Data<T>::getFilePath() {
return fileName;
}

View File

@ -2,4 +2,30 @@
// Created by quentin on 8/3/22.
//
#include "main.h"
#include "data/accountData.h"
#include <pwd.h>
#include <unistd.h>
#include <string>
#include <filesystem>
#include <list>
#include <iostream>
const std::string homeDirectory = getpwuid(getuid())->pw_dir;
void createRequiredFolders() {
std::filesystem::create_directory(homeDirectory + "/.config/budget/");
std::filesystem::create_directories(homeDirectory + "/.local/share/budget");
std::filesystem::create_directories(homeDirectory + "/.local/share/budget/accounts");
}
int main() {
createRequiredFolders();
std::list<AccountData> accounts;
for (const auto &file : std::filesystem::directory_iterator(
homeDirectory + "/.local/share/budget/accounts")) {
accounts.emplace_back(AccountData(file.path()));
}
return 0;
}

8
src/main.h Normal file
View File

@ -0,0 +1,8 @@
//
// Created by quentin on 8/12/22.
//
#ifndef BUDGET_MAIN_H
#define BUDGET_MAIN_H
#endif //BUDGET_MAIN_H

View File

@ -4,6 +4,14 @@
#include "account.h"
account::account(const bool withdrawable) : withdrawable(withdrawable) {
#include <utility>
Account::Account(std::list<Transaction> transactions, std::list<Earning> earnings, bool withdrawable,
std::string name) : transactions(std::move(transactions)), earnings(std::move(earnings)),
withdrawable(withdrawable),
name(std::move(name)) {}
Account::Account() {
withdrawable = true;
name = "";
}

View File

@ -6,14 +6,23 @@
#define BUDGET_ACCOUNT_H
class account {
#include "transaction.h"
#include "earning.h"
#include <list>
#include <string>
class Account {
public:
account(const bool withdrawable);
const bool withdrawable;
Account(std::list<Transaction> transactions, std::list<Earning> earnings, bool withdrawable,
std::string name);
Account();
private:
std::list<> assets;
std::list<Transaction> transactions;
std::list<Earning> earnings;
bool withdrawable;
std::string name;
};

7
src/money/earning.cpp Normal file
View File

@ -0,0 +1,7 @@
//
// Created by quentin on 8/11/22.
//
#include "earning.h"
Earning::Earning(const int value) : value(value) {}

18
src/money/earning.h Normal file
View File

@ -0,0 +1,18 @@
//
// Created by quentin on 8/11/22.
//
#ifndef BUDGET_EARNING_H
#define BUDGET_EARNING_H
class Earning {
public:
explicit Earning(int value);
public:
const int value;
};
#endif //BUDGET_EARNING_H

9
src/money/recept.cpp Normal file
View File

@ -0,0 +1,9 @@
//
// Created by quentin on 8/4/22.
//
#include "recept.h"
#include <utility>
Receipt::Receipt(std::string file) : file(std::move(file)) {}

21
src/money/recept.h Normal file
View File

@ -0,0 +1,21 @@
//
// Created by quentin on 8/4/22.
//
#ifndef BUDGET_RECEPT_H
#define BUDGET_RECEPT_H
#include <string>
class Receipt {
private:
public:
explicit Receipt(std::string file);
private:
std::string file;
};
#endif //BUDGET_RECEPT_H

13
src/money/transaction.cpp Normal file
View File

@ -0,0 +1,13 @@
//
// Created by quentin on 8/4/22.
//
#include "transaction.h"
#include <utility>
Receipt &Transaction::getReceipt() {
return receipt;
}
Transaction::Transaction(const int value, Receipt receipt) : value(value), receipt(std::move(receipt)) {}

25
src/money/transaction.h Normal file
View File

@ -0,0 +1,25 @@
//
// Created by quentin on 8/4/22.
//
#ifndef BUDGET_TRANSACTION_H
#define BUDGET_TRANSACTION_H
#include "recept.h"
class Transaction {
public:
Transaction(int value, Receipt receipt);
Receipt &getReceipt();
public:
const int value;
private:
Receipt receipt;
};
#endif //BUDGET_TRANSACTION_H