100 lines
3.0 KiB
C++
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") {}
|