wxString StocksListCtrl::OnGetItemText(long item, long column) const { if (column == COL_ID) return wxString::Format("%i", m_stocks[item].STOCKID).Trim(); if (column == COL_DATE) return mmGetDateForDisplay(mmGetStorageStringAsDate(m_stocks[item].PURCHASEDATE)); if (column == COL_NAME) return m_stocks[item].STOCKNAME; if (column == COL_SYMBOL) return m_stocks[item].SYMBOL; if (column == COL_NUMBER) { int precision = m_stocks[item].NUMSHARES == floor(m_stocks[item].NUMSHARES) ? 0 : 4; return Model_Currency::toString(m_stocks[item].NUMSHARES, stock_panel_->m_currency, precision); } if (column == COL_PRICE) return Model_Currency::toString(m_stocks[item].PURCHASEPRICE, stock_panel_->m_currency); if (column == COL_VALUE) return Model_Currency::toString(m_stocks[item].VALUE, stock_panel_->m_currency, 4); if (column == COL_GAIN_LOSS) return Model_Currency::toString(getGainLoss(item), stock_panel_->m_currency); if (column == COL_CURRENT) return Model_Currency::toString(m_stocks[item].CURRENTPRICE, stock_panel_->m_currency, 4); if (column == COL_CURRVALUE) return Model_Currency::toString(m_stocks[item].CURRENTPRICE*m_stocks[item].NUMSHARES, stock_panel_->m_currency); if (column == COL_PRICEDATE) return mmGetDateForDisplay(mmGetStorageStringAsDate(Model_Stock::instance().lastPriceDate(&m_stocks[item]))); if (column == COL_COMMISSION) return Model_Currency::toString(m_stocks[item].COMMISSION, stock_panel_->m_currency); if (column == COL_NOTES) { wxString full_notes = m_stocks[item].NOTES; if (Model_Attachment::NrAttachments(Model_Attachment::reftype_desc(Model_Attachment::STOCK), m_stocks[item].STOCKID)) full_notes = full_notes.Prepend(mmAttachmentManage::GetAttachmentNoteSign()); return full_notes; } return wxEmptyString; }
wxString StocksListCtrl::OnGetItemText(long item, long column) const { if (column == COL_DATE) return mmGetDateForDisplay(mmGetStorageStringAsDate(m_stocks[item].PURCHASEDATE)); if (column == COL_NAME) return m_stocks[item].STOCKNAME; if (column == COL_NUMBER) { int precision = m_stocks[item].NUMSHARES == floor(m_stocks[item].NUMSHARES) ? 0 : 4; return Model_Currency::toString(m_stocks[item].NUMSHARES, stock_panel_->m_currency, precision); } if (column == COL_GAIN_LOSS) return Model_Currency::toString(getGainLoss(item), stock_panel_->m_currency /*, 4*/); if (column == COL_VALUE) return Model_Currency::toString(m_stocks[item].VALUE, stock_panel_->m_currency); if (column == COL_CURRENT) return Model_Currency::toString(m_stocks[item].CURRENTPRICE, stock_panel_->m_currency); if (column == COL_NOTES) { wxString full_notes = m_stocks[item].NOTES; if (Model_Attachment::NrAttachments(Model_Attachment::reftype_desc(Model_Attachment::STOCK), m_stocks[item].STOCKID)) full_notes = full_notes.Prepend(mmAttachmentManage::GetAttachmentNoteSign()); return full_notes; } return ""; }
void mmFilterTransactionsDialog::from_json(const wxString &data) { wxString str = data; if (!(str.StartsWith("{") && str.EndsWith("}"))) str = "{}"; std::stringstream ss; ss << str.ToStdString(); json::Object o; json::Reader::Read(o, ss); //Label m_settingLabel->ChangeValue(wxString(json::String(o["LABEL"]))); //Sort order sorterDropDown_->SetStringSelection(wxGetTranslation(wxString(json::String(o["SORTORDER"])))); //Account accountCheckBox_->SetValue(!wxString(json::String(o["ACCOUNT"])).empty()); accountDropDown_->Enable(accountCheckBox_->IsChecked()); accountDropDown_->SetStringSelection(wxString(json::String(o["ACCOUNT"]))); //Dates dateRangeCheckBox_->SetValue(!wxString(json::String(o["DATE"])).empty() || !wxString(json::String(o["DATE2"])).empty()); fromDateCtrl_->Enable(dateRangeCheckBox_->IsChecked()); fromDateCtrl_->SetValue(mmGetStorageStringAsDate(wxString(json::String(o["DATE1"])))); toDateControl_->Enable(dateRangeCheckBox_->IsChecked()); toDateControl_->SetValue(mmGetStorageStringAsDate(wxString(json::String(o["DATE2"])))); //Payee payeeCheckBox_->SetValue(!wxString(json::String(o["PAYEE"])).empty()); cbPayee_->Enable(payeeCheckBox_->IsChecked()); cbPayee_->SetValue(wxString(json::String(o["PAYEE"]))); //Category wxString value = wxString(json::String(o["CATEGORY"])); categoryCheckBox_->SetValue(!value.empty()); btnCategory_->Enable(categoryCheckBox_->IsChecked()); bSimilarCategoryStatus_ = json::Boolean(o["SIMILAR_YN"]); similarCategCheckBox_->SetValue(bSimilarCategoryStatus_); similarCategCheckBox_->Enable(categoryCheckBox_->IsChecked()); wxStringTokenizer categ_token(value, ":", wxTOKEN_RET_EMPTY_ALL); Model_Category::Data* category = Model_Category::instance().get(categ_token.GetNextToken().Trim()); if (category) categID_ = category->CATEGID; Model_Subcategory::Data* sub_category = 0; wxString subcateg_name = categ_token.GetNextToken().Trim(false); if (!subcateg_name.IsEmpty()) { sub_category = Model_Subcategory::instance().get(subcateg_name, categID_); if (sub_category) subcategID_ = sub_category->SUBCATEGID; } btnCategory_->SetLabel(Model_Category::full_name(categID_, subcategID_)); //Status statusCheckBox_->SetValue(!wxString(json::String(o["STATUS"])).empty()); choiceStatus_->Enable(statusCheckBox_->IsChecked()); choiceStatus_->SetStringSelection(wxGetTranslation(wxString(json::String(o["STATUS"])))); //Type wxString type = wxString(json::String(o["TYPE"])); typeCheckBox_->SetValue(!type.empty()); cbTypeWithdrawal_->SetValue(type.Contains("W")); cbTypeWithdrawal_->Enable(typeCheckBox_->IsChecked()); cbTypeDeposit_->SetValue(type.Contains("D")); cbTypeDeposit_->Enable(typeCheckBox_->IsChecked()); cbTypeTransferTo_->SetValue(type.Contains("T")); cbTypeTransferTo_->Enable(typeCheckBox_->IsChecked()); cbTypeTransferFrom_->SetValue(type.Contains("F")); cbTypeTransferFrom_->Enable(typeCheckBox_->IsChecked()); //Amounts bool amt1 = 0.0 != json::Number(o["AMOUNT_MIN"]); bool amt2 = 0.0 != json::Number(o["AMOUNT_MAX"]); amountRangeCheckBox_->SetValue(amt1 || amt2); amountMinEdit_->Enable(amountRangeCheckBox_->IsChecked()); amountMaxEdit_->Enable(amountRangeCheckBox_->IsChecked()); if (amt1) amountMinEdit_->SetValue(json::Number(o["AMOUNT_MIN"])); else amountMinEdit_->ChangeValue(""); if (amt2) amountMaxEdit_->SetValue(json::Number(o["AMOUNT_MAX"])); else amountMaxEdit_->ChangeValue(""); //Number transNumberCheckBox_->SetValue(!wxString(json::String(o["NUMBER"])).empty()); transNumberEdit_->Enable(transNumberCheckBox_->IsChecked()); transNumberEdit_->ChangeValue(wxString(json::String(o["NUMBER"]))); //Notes notesCheckBox_->SetValue(!wxString(json::String(o["NOTES"])).empty()); notesEdit_->Enable(notesCheckBox_->IsChecked()); notesEdit_->ChangeValue(wxString(json::String(o["NOTES"]))); }
wxString mmReportSummaryByDate::getHTMLText() { int i = 0, j; double balancePerDay[5]; mmHTMLBuilder hb; wxString datePrec; wxDate date, dateStart = wxDate::Now(), dateEnd = wxDate::Now(); wxDateSpan span; mmHistoryItem *pHistItem; mmHistoryData arHistory; std::vector<balanceMap> balanceMapVec(Model_Account::instance().all().size()); std::vector<std::map<wxDate, double>::const_iterator> arIt(balanceMapVec.size()); std::vector<double> arBalance(balanceMapVec.size()); std::vector<wxString> totBalanceData; std::vector<wxDate> arDates; hb.init(); hb.addDivContainer(); hb.addHeader(2, wxString::Format(_("Accounts Balance - %s"), mode_==0 ? _("Monthly Report"):_("Yearly Report"))); hb.addDateNow(); hb.addLineBreak(); hb.startTable(); hb.startThead(); hb.startTableRow(); hb.addTableHeaderCell(_("Date")); hb.addTableHeaderCell(_("Cash"), true); hb.addTableHeaderCell(_("Bank Accounts"), true); hb.addTableHeaderCell(_("Credit Card Accounts"), true); hb.addTableHeaderCell(_("Term Accounts"), true); hb.addTableHeaderCell(_("Total"), true); hb.addTableHeaderCell(_("Stocks"), true); hb.addTableHeaderCell(_("Balance"), true); hb.endTableRow(); hb.endDiv(); hb.endThead(); for (const auto& account: Model_Account::instance().all()) { if (Model_Account::type(account) != Model_Account::INVESTMENT) { // in balanceMapVec ci sono i totali dei movimenti giorno per giorno const Model_Currency::Data* currency = Model_Account::currency(account); for (const auto& tran: Model_Account::transaction(account)) balanceMapVec[i][Model_Checking::TRANSDATE(tran)] += Model_Checking::balance(tran, account.ACCOUNTID) * Model_CurrencyHistory::getDayRate(currency->id(), tran.TRANSDATE); if (Model_Account::type(account) != Model_Account::TERM && balanceMapVec[i].size()) { date = balanceMapVec[i].begin()->first; if (date.IsEarlierThan(dateStart)) dateStart = date; } arBalance[i] = account.INITIALBAL * Model_CurrencyHistory::getDayRate(currency->id(), dateStart.FormatISODate()); } else { Model_Stock::Data_Set stocks = Model_Stock::instance().find(Model_Stock::HELDAT(account.id())); for (const auto & stock : stocks) { arHistory.resize(arHistory.size() + 1); pHistItem = arHistory.data() + arHistory.size() - 1; pHistItem->acctId = account.id(); pHistItem->stockId = stock.STOCKID; pHistItem->purchasePrice = stock.PURCHASEPRICE; pHistItem->purchaseDate = Model_Stock::PURCHASEDATE(stock); pHistItem->purchaseDateStr = stock.PURCHASEDATE; pHistItem->numShares = stock.NUMSHARES; pHistItem->stockHist = Model_StockHistory::instance().find(Model_StockHistory::SYMBOL(stock.SYMBOL)); std::stable_sort(pHistItem->stockHist.begin(), pHistItem->stockHist.end(), SorterByDATE()); std::reverse(pHistItem->stockHist.begin(), pHistItem->stockHist.end()); } } i++; } if (mode_ == 0) { dateEnd -= wxDateSpan::Months(1); dateEnd.SetToLastMonthDay(dateEnd.GetMonth(), dateEnd.GetYear()); span = wxDateSpan::Months(1); } else if (mode_ == 1) { dateEnd.Set(31, wxDateTime::Dec, wxDateTime::Now().GetYear()); span = wxDateSpan::Years(1); } else wxASSERT(0); date = dateEnd; while (date.IsLaterThan(dateStart)) date -= span; dateStart = date; i = 0; for (const auto& acctMap: balanceMapVec) arIt[i++] = acctMap.begin(); // prepare the dates array while (dateStart <= dateEnd) { if (mode_ == 0) dateStart.SetToLastMonthDay(dateStart.GetMonth(), dateStart.GetYear()); arDates.push_back(dateStart); dateStart += span; } date = wxDate::Today(); if (date.GetDay() != dateEnd.GetDay() || date.GetMonth() != dateEnd.GetMonth() || date.GetYear() != dateEnd.GetYear()) arDates.push_back(date); for (const auto & dateStart : arDates) { i = 0; for (auto& account: Model_Account::instance().all()) { if (Model_Account::type(account) != Model_Account::INVESTMENT) { for (; arIt[i] != balanceMapVec[i].end(); ++arIt[i]) { if (arIt[i]->first.IsLaterThan(dateStart)) break; arBalance[i] += arIt[i]->second; } } else { double convRate = 1.0; Model_Currency::Data* currency = Model_Account::currency(account); if (currency) convRate = Model_CurrencyHistory::getDayRate(currency->id(), dateStart.FormatISODate()); arBalance[i] = arHistory.getDailyBalanceAt(&account, dateStart) * convRate; } i++; } totBalanceData.push_back(dateStart.FormatISODate()); for (j=0; j<5; j++) balancePerDay[j] = 0.0; for (j=0; j<5; j++) { i = 0; for (const auto& account: Model_Account::instance().all()) { if ((j == 0 && Model_Account::type(account) == Model_Account::CASH) || (j == 1 && Model_Account::type(account) == Model_Account::CHECKING) || (j == 2 && Model_Account::type(account) == Model_Account::CREDIT_CARD) || (j == 3 && Model_Account::type(account) == Model_Account::TERM) || (j == 4 && Model_Account::type(account) == Model_Account::INVESTMENT)) { balancePerDay[j] += arBalance[i]; } i++; } totBalanceData.push_back(Model_Currency::toCurrency(balancePerDay[j])); } totBalanceData.push_back(Model_Currency::toCurrency(balancePerDay[0] + balancePerDay[1] + balancePerDay[2] + balancePerDay[3])); totBalanceData.push_back(Model_Currency::toCurrency(balancePerDay[0] + balancePerDay[1] + balancePerDay[2] + balancePerDay[3] + balancePerDay[4])); } hb.startTbody(); for (i = totBalanceData.size() - 8; i >= 0; i -= 8) { if (datePrec.Left(4) != totBalanceData[i].Left(4)) { hb.startTotalTableRow(); hb.addTableCell(totBalanceData[i].Left(4)); hb.addTableCell(""); hb.addTableCell(""); hb.addTableCell(""); hb.addTableCell(""); hb.addTableCell(""); hb.addTableCell(""); hb.addTableCell(""); hb.endTableRow(); } hb.startTableRow(); hb.addTableCell(mmGetDateForDisplay(mmGetStorageStringAsDate(totBalanceData[i]))); hb.addTableCell(totBalanceData[i + 1], true); hb.addTableCell(totBalanceData[i + 2], true); hb.addTableCell(totBalanceData[i + 3], true); hb.addTableCell(totBalanceData[i + 4], true); hb.addTableCell(totBalanceData[i + 6], true); hb.addTableCell(totBalanceData[i + 5], true); hb.addTableCell(totBalanceData[i + 7], true); hb.endTableRow(); datePrec = totBalanceData[i]; } hb.endTbody(); hb.endTable(); hb.end(); Model_Report::outputReportFile(hb.getHTMLText()); return ""; }
wxString mmReportTransactions::getHTMLText() { mmHTMLBuilder hb; hb.init(); hb.addDivContainer(); wxString transHeading = _("Transaction List "); const Model_Account::Data* acc = Model_Account::instance().get(refAccountID_); if (acc) transHeading = wxString::Format(_("Transaction List for Account: %s"), acc->ACCOUNTNAME); hb.addHeader(2, transHeading); hb.addDateNow(); hb.addLineBreak(); hb.startSortTable(); hb.startThead(); // Display the data Headings hb.startTableRow(); hb.addTableHeaderCell(_("Date")); hb.addTableHeaderCell(_("Account")); hb.addTableHeaderCell(_("Payee")); hb.addTableHeaderCell(_("Status")); hb.addTableHeaderCell(_("Category")); hb.addTableHeaderCell(_("Type")); hb.addTableHeaderCell(_("Number")); hb.addTableHeaderCell(_("Notes")); hb.addTableHeaderCell(_("Amount"), true); hb.endTableRow(); hb.endThead(); hb.startTbody(); double total = 0; Model_Account::Data* account = nullptr; bool monoAcc = transDialog_->getAccountCheckBox(); if (monoAcc) account = Model_Account::instance().get(transDialog_->getAccountID()); // Display the data for each row for (auto& transaction : trans_) { hb.startTableRow(); hb.addTableCell(mmGetDateForDisplay(mmGetStorageStringAsDate(transaction.TRANSDATE))); hb.addTableCellLink(wxString::Format("trxid:%d", transaction.TRANSID), transaction.ACCOUNTNAME); hb.addTableCell(transaction.PAYEENAME); hb.addTableCell(transaction.STATUS); hb.addTableCell(transaction.CATEGNAME); hb.addTableCell(wxGetTranslation(transaction.TRANSCODE)); hb.addTableCell(transaction.TRANSACTIONNUMBER); hb.addTableCell(transaction.NOTES); // Get the exchange rate for the account if (!monoAcc) { account = Model_Account::instance().get(transaction.ACCOUNTID); if (account) { const Model_Currency::Data* currency = Model_Account::currency(account); double convRate = 1; if (currency) convRate = currency->BASECONVRATE; double amount = Model_Checking::balance(transaction, transaction.ACCOUNTID) * convRate; hb.addCurrencyCell(amount); total += amount; } else hb.addTableCell(""); } else { double amount = Model_Checking::balance(transaction, account->ACCOUNTID); const Model_Currency::Data* currency = Model_Account::currency(account); hb.addCurrencyCell(amount, currency); total += amount; } hb.endTableRow(); } hb.endTbody(); // display the total balance. const wxString totalStr = Model_Currency::toCurrency(total, (monoAcc ? Model_Account::currency(account) : Model_Currency::GetBaseCurrency())); const std::vector<wxString> v{ totalStr }; hb.addTotalRow(_("Total Amount: "), 9, v); hb.endTable(); transDialog_->getDescription(hb); hb.endDiv(); hb.end(); return hb.getHTMLText(); }
wxString mmReportSummaryByDate::getHTMLText() { int i = 0, j; double balancePerDay[5]; mmHTMLBuilder hb; wxString datePrec; wxDate date, dateStart = wxDate::Now(), dateEnd = wxDate::Now(); wxDateSpan span; std::vector<balanceMap> balanceMapVec(Model_Account::instance().all().size()); std::vector<std::map<wxDate, double>::const_iterator> arIt(balanceMapVec.size()); std::vector<double> arBalance(balanceMapVec.size()); std::vector<wxString> totBalanceData; hb.init(); hb.addDivContainer(); hb.addHeader(2, wxString::Format(_("Account Balance - %s"), mode_==0 ? _("Monthly Report"):_("Yearly Report"))); hb.addDateNow(); hb.addLineBreak(); hb.startTable(); hb.startThead(); hb.startTableRow(); hb.addTableHeaderCell(_("Date")); hb.addTableHeaderCell(_("Bank Account"), true); hb.addTableHeaderCell(_("Credit Card Accounts"), true); hb.addTableHeaderCell(_("Term Accounts"), true); hb.addTableHeaderCell(_("Stocks"), true); hb.addTableHeaderCell(_("Balance"), true); hb.endTableRow(); hb.endDiv(); hb.endThead(); for (const auto& account: Model_Account::instance().all()) { if (Model_Account::type(account) == Model_Account::CHECKING || Model_Account::type(account) == Model_Account::CREDIT_CARD || Model_Account::type(account) == Model_Account::TERM) { // in balanceMapVec ci sono i totali dei movimenti giorno per giorno const Model_Currency::Data* currency = Model_Account::currency(account); for (const auto& tran: Model_Account::transaction(account)) balanceMapVec[i][Model_Checking::TRANSDATE(tran)] += Model_Checking::balance(tran, account.ACCOUNTID) * currency->BASECONVRATE; if ((Model_Account::type(account) == Model_Account::CHECKING || Model_Account::type(account) == Model_Account::CREDIT_CARD) && balanceMapVec[i].size()) { date = balanceMapVec[i].begin()->first; if (date.IsEarlierThan(dateStart)) dateStart = date; } arBalance[i] = account.INITIALBAL * currency->BASECONVRATE; } i++; } if (mode_ == 0) { dateEnd -= wxDateSpan::Months(1); dateEnd.SetToLastMonthDay(dateEnd.GetMonth(), dateEnd.GetYear()); span = wxDateSpan::Months(1); } else if (mode_ == 1) { dateEnd.Set(31, wxDateTime::Dec, wxDateTime::Now().GetYear(), 23, 59, 59); span = wxDateSpan::Years(1); } else wxASSERT(0); date = dateEnd; while (date.IsLaterThan(dateStart)) date -= span; dateStart = date; //dateStart.Set(31,wxDateTime::Dec,2013); i = 0; for (const auto& acctMap: balanceMapVec) arIt[i++] = acctMap.begin(); while (dateStart <= dateEnd) { if (mode_ == 0 ) dateStart.SetToLastMonthDay(dateStart.GetMonth(), dateStart.GetYear()); i = 0; for (auto& account: Model_Account::instance().all()) { if (Model_Account::type(account) == Model_Account::CHECKING || Model_Account::type(account) == Model_Account::CREDIT_CARD || Model_Account::type(account) == Model_Account::TERM) { for (; arIt[i] != balanceMapVec[i].end(); ++arIt[i]) { if (arIt[i]->first.IsLaterThan(dateStart)) break; arBalance[i] += arIt[i]->second; } } else if (Model_Account::type(account) == Model_Account::INVESTMENT) arBalance[i] = GetDailyBalanceAt(&account, dateStart); i++; } totBalanceData.push_back(dateStart.FormatISODate()); for (j=0; j<5; j++) balancePerDay[j] = 0.0; for (j=0; j<4; j++) { i = 0; for (const auto& account: Model_Account::instance().all()) { if ((j == 0 && Model_Account::type(account) == Model_Account::CHECKING) || (j == 1 && Model_Account::type(account) == Model_Account::CREDIT_CARD) || (j == 2 && Model_Account::type(account) == Model_Account::TERM) || (j == 3 && Model_Account::type(account) == Model_Account::INVESTMENT)) { balancePerDay[j] += arBalance[i]; } i++; } totBalanceData.push_back(Model_Currency::toCurrency(balancePerDay[j])); balancePerDay[4] += balancePerDay[j]; } totBalanceData.push_back(Model_Currency::toCurrency(balancePerDay[j])); dateStart += span; } hb.startTbody(); for (i = totBalanceData.size() - 6; i >= 0; i -= 6) { if (datePrec.Left(4) != totBalanceData[i].Left(4)) { hb.startTotalTableRow(); hb.addTableCell(totBalanceData[i].Left(4)); hb.addTableCell(""); hb.addTableCell(""); hb.addTableCell(""); hb.addTableCell(""); hb.addTableCell(""); hb.endTableRow(); } hb.startTableRow(); hb.addTableCell(mmGetDateForDisplay(mmGetStorageStringAsDate(totBalanceData[i]))); hb.addTableCell(totBalanceData[i + 1], true); hb.addTableCell(totBalanceData[i + 2], true); hb.addTableCell(totBalanceData[i + 3], true); hb.addTableCell(totBalanceData[i + 4], true); hb.addTableCell(totBalanceData[i + 5], true); hb.endTableRow(); datePrec = totBalanceData[i]; } hb.endTbody(); hb.endTable(); hb.end(); return hb.getHTMLText(); }