budget/src/data/accountData.cpp
2022-09-18 14:18:47 -05:00

100 lines
3.0 KiB
C++

//
// Created by quentin on 8/4/22.
//
#include "accountData.h"
#include <iostream>
AccountData::AccountData(const std::string &file) : Data(file) {
account = AccountData::createObject();
}
AccountData::AccountData(const std::string &file, const std::string &name) : Data(file) {
std::string json = R"({"name":")" + name + R"(","payments":[],"earnings":[]})";
document.Parse(json.c_str());
account = AccountData::createObject();
std::cout << "Created account " << name << std::endl;
}
Account AccountData::createObject() {
if (isJsonCorrect()) {
std::string name = document["name"].GetString();
std::list<Payment> payments;
for (auto &domPayment : document["payments"].GetArray()) {
Receipt receipt(domPayment["receipt"]["file"].GetString());
double value = domPayment["value"].GetDouble();
std::time_t date = domPayment["date"].GetInt64();
std::tm tmTime{};
std::memcpy(&tmTime, std::localtime(&date), sizeof(struct tm));
payments.emplace_back(value, receipt, tmTime);
}
std::list<Earning> earnings;
for (auto &domEarning : document["earnings"].GetArray()) {
double value = domEarning["value"].GetDouble();
std::time_t date = domEarning["date"].GetInt64();
std::tm tmTime{};
std::memcpy(&tmTime, std::localtime(&date), sizeof(struct tm));
earnings.emplace_back(value, tmTime);
}
return Account(payments, earnings, name);
}
std::string strAnswer;
bool answer;
while (true) {
std::cout << "Account " + getFilePath() + " Is malformed, would you like to remove it? (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("name") && document["name"].IsString() &&
document.HasMember("payments") && document["payments"].IsArray() &&
document.HasMember("earnings") && document["earnings"].IsArray()) {
for (auto &domPayment : document["payments"].GetArray()) {
if (!(domPayment.IsObject() &&
domPayment.HasMember("receipt") && domPayment["receipt"].IsObject() &&
domPayment["receipt"].HasMember("file") && domPayment["receipt"]["file"].IsString() &&
domPayment.HasMember("value") && domPayment["value"].IsDouble() &&
domPayment.HasMember("date") && domPayment["date"].IsInt64())) {
return false;
}
}
for (auto &domEarning : document["earnings"].GetArray()) {
if (!(domEarning.IsObject() &&
domEarning.HasMember("value") && domEarning["value"].IsDouble() &&
domEarning.HasMember("date") && domEarning["date"].IsInt64())) {
return false;
}
}
return true;
}
return false;
}
Account *AccountData::getAccount() {
return &account;
}
AccountData::AccountData() : Data("/dev/null") {}