From: <vo...@us...> - 2013-03-23 19:45:57
|
Revision: 3617 http://sourceforge.net/p/moneymanagerex/code/3617 Author: vomikan Date: 2013-03-23 19:45:54 +0000 (Sat, 23 Mar 2013) Log Message: ----------- update Modified Paths: -------------- trunk/mmex/src/billsdepositsdialog.cpp trunk/mmex/src/budgetingpanel.cpp trunk/mmex/src/categdialog.cpp trunk/mmex/src/mmcoredb.cpp trunk/mmex/src/mmex.cpp trunk/mmex/src/mmtransaction.cpp trunk/mmex/src/mmtransaction.h trunk/mmex/src/payeedialog.cpp trunk/mmex/src/qif_import.cpp trunk/mmex/src/reports/budget.cpp trunk/mmex/src/reports/budgetcategorysummary.cpp trunk/mmex/src/reports/budgetcategorysummary.h trunk/mmex/src/reports/budgetingperf.cpp trunk/mmex/src/reports/budgetingperf.h trunk/mmex/src/reports/categexp.cpp trunk/mmex/src/reports/categexp.h trunk/mmex/src/reports/categovertimeperf.cpp trunk/mmex/src/reports/categovertimeperf.h trunk/mmex/src/reports/payee.cpp trunk/mmex/src/reports/summary.cpp trunk/mmex/src/reports/summary.h trunk/mmex/src/reports/trx_stats.cpp trunk/mmex/src/tests/Makefile.in trunk/mmex/src/transdialog.cpp trunk/mmex/src/univcsvdialog.cpp Modified: trunk/mmex/src/billsdepositsdialog.cpp =================================================================== --- trunk/mmex/src/billsdepositsdialog.cpp 2013-03-23 18:25:38 UTC (rev 3616) +++ trunk/mmex/src/billsdepositsdialog.cpp 2013-03-23 19:45:54 UTC (rev 3617) @@ -1087,7 +1087,7 @@ *pTransaction->splitEntries_.get() = *split_.get(); pTransaction->updateAllData(core_, fromAccountID, pCurrencyPtr); - core_->bTransactionList_.addTransaction(core_, pTransaction); + core_->bTransactionList_.addTransaction(pTransaction); } mmDBWrapper::completeBDInSeries(core_->db_.get(), bdID_); } Modified: trunk/mmex/src/budgetingpanel.cpp =================================================================== --- trunk/mmex/src/budgetingpanel.cpp 2013-03-23 18:25:38 UTC (rev 3616) +++ trunk/mmex/src/budgetingpanel.cpp 2013-03-23 19:45:54 UTC (rev 3617) @@ -333,7 +333,7 @@ { transferAsDeposit = false; } - th.actual_ = core_->bTransactionList_.getAmountForCategory(core_, + th.actual_ = core_->bTransactionList_.getAmountForCategory( th.categID_, th.subcategID_, false, dtBegin, dtEnd, evaluateTransfer, transferAsDeposit, mmIniOptions::instance().ignoreFutureTransactions_ @@ -394,7 +394,7 @@ { transferAsDeposit = false; } - thsub.actual_ = core_->bTransactionList_.getAmountForCategory(core_, thsub.categID_, thsub.subcategID_, false, + thsub.actual_ = core_->bTransactionList_.getAmountForCategory(thsub.categID_, thsub.subcategID_, false, dtBegin, dtEnd, evaluateTransfer, transferAsDeposit, mmIniOptions::instance().ignoreFutureTransactions_ ); if (thsub.actual_ < 0) Modified: trunk/mmex/src/categdialog.cpp =================================================================== --- trunk/mmex/src/categdialog.cpp 2013-03-23 18:25:38 UTC (rev 3616) +++ trunk/mmex/src/categdialog.cpp 2013-03-23 19:45:54 UTC (rev 3617) @@ -441,7 +441,7 @@ return; } - core_->bTransactionList_.UpdateAllTransactionsForCategory(core_, categID, subcategID); + core_->bTransactionList_.UpdateAllTransactionsForCategory(categID, subcategID); treeCtrl_->SetItemText(selectedItemId_, text); } Modified: trunk/mmex/src/mmcoredb.cpp =================================================================== --- trunk/mmex/src/mmcoredb.cpp 2013-03-23 18:25:38 UTC (rev 3616) +++ trunk/mmex/src/mmcoredb.cpp 2013-03-23 19:45:54 UTC (rev 3617) @@ -29,7 +29,7 @@ , categoryList_(this) , accountList_(this) , currencyList_(db) -, bTransactionList_(db) +, bTransactionList_(this) , displayDatabaseError_(true) { if (!db_) Modified: trunk/mmex/src/mmex.cpp =================================================================== --- trunk/mmex/src/mmex.cpp 2013-03-23 18:25:38 UTC (rev 3616) +++ trunk/mmex/src/mmex.cpp 2013-03-23 19:45:54 UTC (rev 3617) @@ -961,7 +961,7 @@ *pTransaction->splitEntries_.get() = *split.get(); pTransaction->updateAllData(m_core.get(), th.accountID_, pCurrencyPtr); - m_core.get()->bTransactionList_.addTransaction(m_core.get(), pTransaction); + m_core.get()->bTransactionList_.addTransaction(pTransaction); } mmDBWrapper::completeBDInSeries(m_db.get(), th.id_); Modified: trunk/mmex/src/mmtransaction.cpp =================================================================== --- trunk/mmex/src/mmtransaction.cpp 2013-03-23 18:25:38 UTC (rev 3616) +++ trunk/mmex/src/mmtransaction.cpp 2013-03-23 19:45:54 UTC (rev 3617) @@ -380,26 +380,26 @@ } //-----------------------------------------------------------------------------// -mmBankTransactionList::mmBankTransactionList(boost::shared_ptr<wxSQLite3Database> db) -: db_(db) +mmBankTransactionList::mmBankTransactionList(mmCoreDB* core) +: core_(core) { /* Allocate some empty space so loading transactions is faster */ transactions_.reserve(5000); } -int mmBankTransactionList::addTransaction(mmCoreDB* core, boost::shared_ptr<mmBankTransaction> pBankTransaction) +int mmBankTransactionList::addTransaction(boost::shared_ptr<mmBankTransaction> pBankTransaction) { if (checkForExistingTransaction(pBankTransaction)) { pBankTransaction->status_ = wxT("D"); } - if(core->payeeList_.PayeeExists(pBankTransaction->payeeID_) == false) + if(core_->payeeList_.PayeeExists(pBankTransaction->payeeID_) == false) { pBankTransaction->payeeID_ = -1; } - wxSQLite3Statement st = db_->PrepareStatement(INSERT_INTO_CHECKINGACCOUNT_V1); + wxSQLite3Statement st = core_->db_.get()->PrepareStatement(INSERT_INTO_CHECKINGACCOUNT_V1); mmBankTransaction &r = *pBankTransaction; int i = 0; @@ -420,11 +420,11 @@ wxASSERT(st.GetParamCount() == i); st.ExecuteUpdate(); - r.transactionID(db_->GetLastRowId().ToLong()); + r.transactionID(core_->db_.get()->GetLastRowId().ToLong()); st.Finalize(); mmOptions::instance().databaseUpdated_ = true; - r.splitEntries_->updateToDB(db_, r.transactionID(), false); + r.splitEntries_->updateToDB(core_->db_, r.transactionID(), false); transactions_.push_back(pBankTransaction); return pBankTransaction->transactionID(); @@ -434,7 +434,7 @@ { bool found = false; - wxSQLite3Statement st = db_->PrepareStatement(IS_TRX_IN_CHECKINGACCOUNT_V1); + wxSQLite3Statement st = core_->db_.get()->PrepareStatement(IS_TRX_IN_CHECKINGACCOUNT_V1); const mmBankTransaction &r = *pBankTransaction; int i = 0; @@ -490,7 +490,7 @@ if (!pBankTransaction) return boost::shared_ptr<mmBankTransaction>(); - boost::shared_ptr<mmBankTransaction> pCopyTransaction(new mmBankTransaction(db_)); + boost::shared_ptr<mmBankTransaction> pCopyTransaction(new mmBankTransaction(core_->db_)); if (pBankTransaction->transType_!=TRANS_TYPE_TRANSFER_STR) pCopyTransaction->accountID_ = accountID; @@ -523,7 +523,7 @@ if (checkForExistingTransaction(pCopyTransaction)) pCopyTransaction->status_ = wxT("D"); - wxSQLite3Statement st = db_->PrepareStatement(INSERT_INTO_CHECKINGACCOUNT_V1); + wxSQLite3Statement st = core_->db_.get()->PrepareStatement(INSERT_INTO_CHECKINGACCOUNT_V1); const mmBankTransaction &r = *pBankTransaction; int i = 0; @@ -544,10 +544,10 @@ wxASSERT(st.GetParamCount() == i); st.ExecuteUpdate(); - pCopyTransaction->transactionID(db_->GetLastRowId().ToLong()); + pCopyTransaction->transactionID(core_->db_.get()->GetLastRowId().ToLong()); st.Finalize(); - pCopyTransaction->splitEntries_->updateToDB(db_, pCopyTransaction->transactionID(), false); + pCopyTransaction->splitEntries_->updateToDB(core_->db_, pCopyTransaction->transactionID(), false); transactions_.push_back(pCopyTransaction); return pCopyTransaction; @@ -593,7 +593,7 @@ void mmBankTransactionList::LoadTransactions(mmCoreDB* core) { - wxSQLite3ResultSet q1 = db_->ExecuteQuery(SELECT_ALL_FROM_CHECKINGACCOUNT_V1); + wxSQLite3ResultSet q1 = core_->db_.get()->ExecuteQuery(SELECT_ALL_FROM_CHECKINGACCOUNT_V1); while (q1.NextRow()) { @@ -609,7 +609,7 @@ if (pBankTransaction->transType_ == TRANS_TYPE_TRANSFER_STR) pBankTransaction->payeeID_ = -1; - wxSQLite3Statement st = db_->PrepareStatement(UPDATE_CHECKINGACCOUNT_V1); + wxSQLite3Statement st = core_->db_.get()->PrepareStatement(UPDATE_CHECKINGACCOUNT_V1); mmBankTransaction &r = *pBankTransaction; int i = 0; @@ -631,7 +631,7 @@ wxASSERT(st.GetParamCount() == i); st.ExecuteUpdate(); - r.splitEntries_->updateToDB(db_, r.transactionID(), true); + r.splitEntries_->updateToDB(core_->db_, r.transactionID(), true); st.Finalize(); mmOptions::instance().databaseUpdated_ = true; } @@ -650,8 +650,7 @@ } } -void mmBankTransactionList::UpdateAllTransactionsForCategory(mmCoreDB* core, - int categID, +void mmBankTransactionList::UpdateAllTransactionsForCategory(int categID, int subCategID) { // We need to update all transactions incase of errors when loading @@ -661,7 +660,7 @@ if (pBankTransaction && (pBankTransaction->categID_ == categID) && (pBankTransaction->subcategID_ == subCategID)) { - pBankTransaction->category_ = core->categoryList_.GetCategorySharedPtr(categID, subCategID); + pBankTransaction->category_ = core_->categoryList_.GetCategorySharedPtr(categID, subCategID); boost::shared_ptr<mmCategory> pCategory = pBankTransaction->category_.lock(); boost::shared_ptr<mmCategory> parent = pCategory->parent_.lock(); @@ -683,7 +682,7 @@ } } -int mmBankTransactionList::UpdateAllTransactionsForPayee(mmCoreDB* core, int payeeID) +int mmBankTransactionList::UpdateAllTransactionsForPayee(int payeeID) { // We need to update all transactions incase of errors when loading for (const_iterator i = transactions_.begin(); i != transactions_.end(); ++i) @@ -691,7 +690,7 @@ boost::shared_ptr<mmBankTransaction> pBankTransaction = *i; if (pBankTransaction && (pBankTransaction->payeeID_ == payeeID)) { - pBankTransaction->payee_ = core->payeeList_.GetPayeeSharedPtr(payeeID); + pBankTransaction->payee_ = core_->payeeList_.GetPayeeSharedPtr(payeeID); if (pBankTransaction->transType_ != TRANS_TYPE_TRANSFER_STR) { boost::shared_ptr<mmPayee> pPayee = pBankTransaction->payee_.lock(); @@ -874,7 +873,7 @@ return payee_id; } -double mmBankTransactionList::getAmountForPayee(const mmCoreDB* core, int payeeID, bool ignoreDate, +double mmBankTransactionList::getAmountForPayee(int payeeID, bool ignoreDate, const wxDateTime &dtBegin, const wxDateTime &dtEnd, bool ignoreFuture) const { double amt = 0.0; @@ -903,7 +902,7 @@ if (pBankTransaction->transType_ == TRANS_TYPE_TRANSFER_STR) continue; - double convRate = core->accountList_.getAccountBaseCurrencyConvRate(pBankTransaction->accountID_); + double convRate = core_->accountList_.getAccountBaseCurrencyConvRate(pBankTransaction->accountID_); amt += pBankTransaction->value(-1) * convRate; } @@ -914,7 +913,6 @@ } double mmBankTransactionList::getAmountForCategory( - const mmCoreDB* core, int categID, int subcategID, bool ignoreDate, @@ -953,7 +951,7 @@ } } - double convRate = core->accountList_.getAccountBaseCurrencyConvRate(pBankTransaction->accountID_); + double convRate = core_->accountList_.getAccountBaseCurrencyConvRate(pBankTransaction->accountID_); if (pBankTransaction->transType_ == TRANS_TYPE_TRANSFER_STR) { if (evaluateTransfer) @@ -1109,7 +1107,7 @@ /** removes the transaction from memory and the database */ bool mmBankTransactionList::deleteTransaction(int accountID, int transactionID) { - if (mmDBWrapper::deleteTransaction(db_.get(), transactionID)) + if (mmDBWrapper::deleteTransaction(core_->db_.get(), transactionID)) { removeTransaction(accountID, transactionID); return true; @@ -1168,7 +1166,7 @@ int mmBankTransactionList::RelocatePayee(mmCoreDB* core, const int destPayeeID, const int sourcePayeeID, int& changedPayees_) { - if (mmDBWrapper::relocatePayee(db_.get(), destPayeeID, sourcePayeeID) == 0) + if (mmDBWrapper::relocatePayee(core_->db_.get(), destPayeeID, sourcePayeeID) == 0) { changedPayees_=0; @@ -1192,7 +1190,7 @@ const int destCatID, const int destSubCatID, const int sourceCatID, const int sourceSubCatID, int& changedCats, int& changedSubCats) { - int err = mmDBWrapper::relocateCategory(db_.get(), + int err = mmDBWrapper::relocateCategory(core_->db_.get(), destCatID, destSubCatID, sourceCatID, sourceSubCatID); if ( err == 0 ) { Modified: trunk/mmex/src/mmtransaction.h =================================================================== --- trunk/mmex/src/mmtransaction.h 2013-03-23 18:25:38 UTC (rev 3616) +++ trunk/mmex/src/mmtransaction.h 2013-03-23 19:45:54 UTC (rev 3617) @@ -143,12 +143,12 @@ class mmBankTransactionList { public: - mmBankTransactionList(boost::shared_ptr<wxSQLite3Database> db); + mmBankTransactionList(mmCoreDB* core); ~mmBankTransactionList() {} boost::shared_ptr<mmBankTransaction> getBankTransactionPtr(int accountID, int transactionID) const; boost::shared_ptr<mmBankTransaction> getBankTransactionPtr(int transactionID) const; - int addTransaction(mmCoreDB* core, boost::shared_ptr<mmBankTransaction> pTransaction); + int addTransaction(boost::shared_ptr<mmBankTransaction> pTransaction); bool checkForExistingTransaction(boost::shared_ptr<mmBankTransaction> pTransaction); boost::shared_ptr<mmBankTransaction> copyTransaction(/*mmCoreDB* pCore,*/ const long transactionID, const long accountID, const bool useOriginalDate); @@ -159,8 +159,8 @@ /* Update Transactions */ void UpdateTransaction(boost::shared_ptr<mmBankTransaction> pTransaction); void UpdateAllTransactions(); - void UpdateAllTransactionsForCategory(mmCoreDB* core, int categID, int subCategID); - int UpdateAllTransactionsForPayee(mmCoreDB* core, int payeeID); + void UpdateAllTransactionsForCategory(int categID, int subCategID); + int UpdateAllTransactionsForPayee(int payeeID); bool removeTransaction(int accountID, int transactionID); bool deleteTransaction(int accountID, int transactionID); @@ -174,8 +174,8 @@ /* Query Functions */ void getExpensesIncome(const mmCoreDB* core, int accountID, double& expenses, double& income, bool ignoreDate, const wxDateTime &dtBegin, const wxDateTime &dtEnd, bool ignoreFuture = false) const; // The setting asDeposit is only valid if evaluateTransfer is true - double getAmountForCategory(const mmCoreDB* core, int categID, int subcategID, bool ignoreDate, const wxDateTime &dtBegin, const wxDateTime &dtEnd, bool evaluateTransfer = false, bool asDeposit = false, bool ignoreFuture = false) const; - double getAmountForPayee(const mmCoreDB* core, int payeeID, bool ignoreDate, const wxDateTime &dtbegin, const wxDateTime &dtEnd, bool ignoreFuture = false) const; + double getAmountForCategory(int categID, int subcategID, bool ignoreDate, const wxDateTime &dtBegin, const wxDateTime &dtEnd, bool evaluateTransfer = false, bool asDeposit = false, bool ignoreFuture = false) const; + double getAmountForPayee(int payeeID, bool ignoreDate, const wxDateTime &dtbegin, const wxDateTime &dtEnd, bool ignoreFuture = false) const; void getTransactionStats(int accountID, int& number, bool ignoreDate, const wxDateTime &dtBegin, const wxDateTime &dtEnd, bool ignoreFuture = false) const; wxDateTime getLastDate(int accountID) const; @@ -194,7 +194,7 @@ std::vector< boost::shared_ptr<mmBankTransaction> > transactions_; private: - boost::shared_ptr<wxSQLite3Database> db_; + mmCoreDB* core_; }; #endif Modified: trunk/mmex/src/payeedialog.cpp =================================================================== --- trunk/mmex/src/payeedialog.cpp 2013-03-23 18:25:38 UTC (rev 3616) +++ trunk/mmex/src/payeedialog.cpp 2013-03-23 19:45:54 UTC (rev 3617) @@ -319,7 +319,7 @@ if (newName != wxGetEmptyString()) { core_->payeeList_.UpdatePayee(m_payee_id_, newName); - core_->bTransactionList_.UpdateAllTransactionsForPayee(core_, m_payee_id_); + core_->bTransactionList_.UpdateAllTransactionsForPayee(m_payee_id_); editButton_->Disable(); fillControls(); Modified: trunk/mmex/src/qif_import.cpp =================================================================== --- trunk/mmex/src/qif_import.cpp 2013-03-23 18:25:38 UTC (rev 3616) +++ trunk/mmex/src/qif_import.cpp 2013-03-23 19:45:54 UTC (rev 3617) @@ -828,7 +828,7 @@ refTrans[index]->status_ = wxT("F"); else refTrans[index]->status_ = wxT("D"); - core_->bTransactionList_.addTransaction(core_, refTrans[index]); + core_->bTransactionList_.addTransaction(refTrans[index]); } core_->db_.get()->Commit(); Modified: trunk/mmex/src/reports/budget.cpp =================================================================== --- trunk/mmex/src/reports/budget.cpp 2013-03-23 18:25:38 UTC (rev 3616) +++ trunk/mmex/src/reports/budget.cpp 2013-03-23 19:45:54 UTC (rev 3617) @@ -16,6 +16,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *************************************************************************/ #include "budget.h" + #include "../mmex.h" #include "../budgetingpanel.h" #include "../htmlbuilder.h" Modified: trunk/mmex/src/reports/budgetcategorysummary.cpp =================================================================== --- trunk/mmex/src/reports/budgetcategorysummary.cpp 2013-03-23 18:25:38 UTC (rev 3616) +++ trunk/mmex/src/reports/budgetcategorysummary.cpp 2013-03-23 19:45:54 UTC (rev 3617) @@ -28,7 +28,7 @@ #include "../reportbase.h" mmReportBudgetCategorySummary::mmReportBudgetCategorySummary(mmCoreDB* core, mmGUIFrame* mainFrame, int budgetYearID) - : mmReportBudget(mainFrame, core), core_(core), budgetYearID_(budgetYearID) + : mmReportBudget(mainFrame, core), budgetYearID_(budgetYearID) { } @@ -143,7 +143,7 @@ { transferAsDeposit = false; } - th.actual_ = core_->bTransactionList_.getAmountForCategory(core_, th.categID_, th.subcategID_, false, + th.actual_ = core_->bTransactionList_.getAmountForCategory(th.categID_, th.subcategID_, false, yearBegin, yearEnd, evaluateTransfer, transferAsDeposit, mmIniOptions::instance().ignoreFutureTransactions_ ); mmex::formatDoubleToCurrencyEdit(th.actual_, th.actualStr_); @@ -207,7 +207,7 @@ { transferAsDeposit = false; } - thsub.actual_ = core_->bTransactionList_.getAmountForCategory(core_, thsub.categID_, thsub.subcategID_, false, + thsub.actual_ = core_->bTransactionList_.getAmountForCategory(thsub.categID_, thsub.subcategID_, false, yearBegin, yearEnd, evaluateTransfer, transferAsDeposit, mmIniOptions::instance().ignoreFutureTransactions_ ); mmex::formatDoubleToCurrencyEdit(thsub.actual_, thsub.actualStr_); Modified: trunk/mmex/src/reports/budgetcategorysummary.h =================================================================== --- trunk/mmex/src/reports/budgetcategorysummary.h 2013-03-23 18:25:38 UTC (rev 3616) +++ trunk/mmex/src/reports/budgetcategorysummary.h 2013-03-23 19:45:54 UTC (rev 3617) @@ -23,10 +23,7 @@ #define _MM_EX_REPORTBUDGET_CATEGORYSUMMARY_H_ #include "budget.h" -#include "../mmcoredb.h" -class mmCoreDB; - class mmReportBudgetCategorySummary : public mmReportBudget { public: @@ -35,7 +32,6 @@ wxString getHTMLText(); private: - mmCoreDB* core_; int budgetYearID_; void displayReportLine(mmHTMLBuilder& hb, mmBudgetEntryHolder budEntry); Modified: trunk/mmex/src/reports/budgetingperf.cpp =================================================================== --- trunk/mmex/src/reports/budgetingperf.cpp 2013-03-23 18:25:38 UTC (rev 3616) +++ trunk/mmex/src/reports/budgetingperf.cpp 2013-03-23 19:45:54 UTC (rev 3617) @@ -3,14 +3,12 @@ #include "../dbwrapper.h" #include "../defs.h" #include "../htmlbuilder.h" -#include "../mmcoredb.h" #include "../mmex.h" #include "../reportbase.h" #include "../util.h" mmReportBudgetingPerformance::mmReportBudgetingPerformance(mmCoreDB* core, mmGUIFrame* mainFrame, int budgetYearID) : mmReportBudget(mainFrame, core), - db_(core_->db_.get()), budgetYearID_(budgetYearID) { } @@ -58,7 +56,7 @@ { transferAsDeposit = false; } - double actualMonthVal = core_->bTransactionList_.getAmountForCategory(core_, budgetEntry.categID_, budgetEntry.subcategID_, + double actualMonthVal = core_->bTransactionList_.getAmountForCategory(budgetEntry.categID_, budgetEntry.subcategID_, false, dtBegin, dtEnd, evaluateTransfer, transferAsDeposit, mmIniOptions::instance().ignoreFutureTransactions_ ); wxString actualMonthValStr; @@ -83,7 +81,7 @@ int endMonth = wxDateTime::Dec; long startYear; - wxString startYearStr = mmDBWrapper::getBudgetYearForID(db_, budgetYearID_); + wxString startYearStr = mmDBWrapper::getBudgetYearForID(core_->db_.get(), budgetYearID_); startYearStr.ToLong(&startYear); wxString headingStr = AdjustYearValues(startDay, startMonth, startYear, startYearStr); @@ -125,8 +123,8 @@ core_->currencyList_.LoadBaseCurrencySettings(); - wxSQLite3Statement st = db_->PrepareStatement(SELECT_SUBCATEGS_FROM_SUBCATEGORY_V1); - wxSQLite3ResultSet q1 = db_->ExecuteQuery(SELECT_ALL_FROM_CATEGORY_V1); + wxSQLite3Statement st = core_->db_.get()->PrepareStatement(SELECT_SUBCATEGS_FROM_SUBCATEGORY_V1); + wxSQLite3ResultSet q1 = core_->db_.get()->ExecuteQuery(SELECT_ALL_FROM_CATEGORY_V1); while (q1.NextRow()) { @@ -134,7 +132,7 @@ initBudgetEntryFields(th, budgetYearID_); th.categID_ = q1.GetInt(wxT("CATEGID")); th.catStr_ = q1.GetString(wxT("CATEGNAME")); - mmDBWrapper::getBudgetEntry(db_, budgetYearID_, th.categID_, th.subcategID_, th.period_, th.amt_); + mmDBWrapper::getBudgetEntry(core_->db_.get(), budgetYearID_, th.categID_, th.subcategID_, th.period_, th.amt_); // Set the estimated amount for the year setBudgetYearlyEstimate(th); @@ -148,7 +146,7 @@ { transferAsDeposit = false; } - th.actual_ = core_->bTransactionList_.getAmountForCategory(core_, th.categID_, th.subcategID_, false, + th.actual_ = core_->bTransactionList_.getAmountForCategory(th.categID_, th.subcategID_, false, yearBegin, yearEnd, evaluateTransfer, transferAsDeposit, mmIniOptions::instance().ignoreFutureTransactions_ ); mmex::formatDoubleToCurrencyEdit(th.actual_, th.actualStr_); @@ -215,7 +213,7 @@ thsub.subcategID_ = q2.GetInt(wxT("SUBCATEGID")); thsub.subCatStr_ = q2.GetString(wxT("SUBCATEGNAME")); - mmDBWrapper::getBudgetEntry(db_, budgetYearID_, thsub.categID_, thsub.subcategID_, thsub.period_, thsub.amt_); + mmDBWrapper::getBudgetEntry(core_->db_.get(), budgetYearID_, thsub.categID_, thsub.subcategID_, thsub.period_, thsub.amt_); // Set the estimated amount for the year setBudgetYearlyEstimate(thsub); @@ -228,7 +226,7 @@ { transferAsDeposit = false; } - thsub.actual_ = core_->bTransactionList_.getAmountForCategory(core_, thsub.categID_, thsub.subcategID_, false, + thsub.actual_ = core_->bTransactionList_.getAmountForCategory(thsub.categID_, thsub.subcategID_, false, yearBegin, yearEnd, evaluateTransfer, transferAsDeposit, mmIniOptions::instance().ignoreFutureTransactions_ ); mmex::formatDoubleToCurrencyEdit(thsub.actual_, thsub.actualStr_); Modified: trunk/mmex/src/reports/budgetingperf.h =================================================================== --- trunk/mmex/src/reports/budgetingperf.h 2013-03-23 18:25:38 UTC (rev 3616) +++ trunk/mmex/src/reports/budgetingperf.h 2013-03-23 19:45:54 UTC (rev 3617) @@ -20,7 +20,6 @@ #define _MM_EX_REPORTBUDGETING_PERFORMANCE_H_ #include "budget.h" -#include "../mmcoredb.h" class mmReportBudgetingPerformance : public mmReportBudget { @@ -30,7 +29,6 @@ wxString getHTMLText(); private: - wxSQLite3Database* db_; int budgetYearID_; void DisplayEstimateMonths(mmHTMLBuilder& hb, mmBudgetEntryHolder& budgetEntry, int startMonth); Modified: trunk/mmex/src/reports/categexp.cpp =================================================================== --- trunk/mmex/src/reports/categexp.cpp 2013-03-23 18:25:38 UTC (rev 3616) +++ trunk/mmex/src/reports/categexp.cpp 2013-03-23 19:45:54 UTC (rev 3617) @@ -1,171 +1,169 @@ -/******************************************************* - Copyright (C) 2006 Madhan Kanagavel - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - ********************************************************/ - -#include "categexp.h" -#include "budget.h" - -#include "../defs.h" -#include "../htmlbuilder.h" -#include "../util.h" -#include "../mmgraphpie.h" - -mmReportCategoryExpenses::mmReportCategoryExpenses( - mmCoreDB* core, - bool ignoreDate, - const wxDateTime& dtBegin, - const wxDateTime& dtEnd, - const wxString& title, - int type -) : - mmPrintableBase(core), - core_(core), - dtBegin_(dtBegin), - dtEnd_(dtEnd), - ignoreDate_(ignoreDate), - title_(title), - type_(type) -{ -} - -wxString mmReportCategoryExpenses::getHTMLText() -{ - mmHTMLBuilder hb; - hb.init(); - hb.addHeader(2, title_); - - mmCommonReportDetails dateDisplay(NULL); - dateDisplay.DisplayDateHeading(hb, dtBegin_, dtEnd_, !ignoreDate_); - - hb.startCenter(); - - // Add the graph - mmGraphPie gg; - hb.addImage(gg.getOutputFileName()); - - hb.startTable(wxT("60%")); - hb.startTableRow(); - hb.addTableHeaderCell(_("Category")); - hb.addTableHeaderCell(_("Amount"), true); - hb.endTableRow(); - - core_->currencyList_.LoadBaseCurrencySettings(); - - std::vector<ValuePair> valueList; - - double grandtotal = 0.0; - - wxString sBalance = wxT("?"); - std::pair<mmCategoryList::const_iterator, mmCategoryList::const_iterator> range = core_->categoryList_.Range(); - for (mmCategoryList::const_iterator it = range.first; it != range.second; ++ it) - { - int categs = 0; - bool grandtotalseparator = true; - double categtotal = 0.0; - const boost::shared_ptr<mmCategory> category = *it; - int categID = category->categID_; - const wxString sCategName = category->categName_; - double amt = core_->bTransactionList_.getAmountForCategory(core_, categID, -1, ignoreDate_, - dtBegin_, dtEnd_, false, false, mmIniOptions::instance().ignoreFutureTransactions_); - if (type_ == 1 && amt < 0.0) amt = 0; - if (type_ == 2 && amt > 0.0) amt = 0; - - categtotal += amt; - grandtotal += amt; - - if (amt != 0) - { - ValuePair vp; - vp.label = sCategName; - vp.amount = amt; - valueList.push_back(vp); - - mmex::formatDoubleToCurrency(amt, sBalance); - hb.startTableRow(); - hb.addTableCell(sCategName, false, true); - hb.addTableCell(sBalance, true, false, true); - hb.endTableRow(); - } - - for (std::vector<boost::shared_ptr<mmCategory> >::const_iterator cit = category->children_.begin() - ; cit != category->children_.end() - ; ++ cit) - { - const boost::shared_ptr<mmCategory> sub_category = *cit; - int subcategID = sub_category->categID_; - - wxString sFullCategName = core_->categoryList_.GetFullCategoryString(categID, subcategID); - amt = core_->bTransactionList_.getAmountForCategory(core_, categID, subcategID, ignoreDate_, - dtBegin_, dtEnd_, false, false, mmIniOptions::instance().ignoreFutureTransactions_); - - if (type_ == 1 && amt < 0.0) amt = 0; - if (type_ == 2 && amt > 0.0) amt = 0; - - categtotal += amt; - grandtotal += amt; - - if (amt != 0) - { - categs++; - ValuePair vp; - vp.label = sFullCategName; - vp.amount = amt; - valueList.push_back(vp); - - mmex::formatDoubleToCurrency(amt, sBalance); - hb.startTableRow(); - hb.addTableCell(sFullCategName, false, true); - hb.addTableCell(sBalance, true, false, true); - hb.endTableRow(); - } - } - - if (categs>1) - { - wxString categtotalStr; - mmex::formatDoubleToCurrency(categtotal, categtotalStr); - hb.addRowSeparator(0); - hb.startTableRow(); - hb.addTableCell(_("Category Total: "),false, true, true, wxT("GRAY")); - hb.addTableCell(categtotalStr, true, false, true, wxT("GRAY")); - hb.endTableRow(); - } - - if (categs>0) - { - grandtotalseparator = false; - hb.addRowSeparator(2); - } - } - - wxString grandtotalStr; - mmex::formatDoubleToCurrency(grandtotal, grandtotalStr); - hb.startTableRow(); - hb.addTableCell(_("Grand Total: "),false, true, true); - hb.addTableCell(grandtotalStr, true, false, true); - hb.endTableRow(); - - hb.endTable(); - hb.endCenter(); - - hb.end(); - - gg.init(valueList); - gg.Generate(wxEmptyString); - - return hb.getHTMLText(); -} +/******************************************************* + Copyright (C) 2006 Madhan Kanagavel + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + ********************************************************/ + +#include "categexp.h" +#include "budget.h" + +#include "../defs.h" +#include "../htmlbuilder.h" +#include "../util.h" +#include "../mmgraphpie.h" + +mmReportCategoryExpenses::mmReportCategoryExpenses( + mmCoreDB* core, + bool ignoreDate, + const wxDateTime& dtBegin, + const wxDateTime& dtEnd, + const wxString& title, + int type +) : + mmPrintableBase(core), + dtBegin_(dtBegin), + dtEnd_(dtEnd), + ignoreDate_(ignoreDate), + title_(title), + type_(type) +{ +} + +wxString mmReportCategoryExpenses::getHTMLText() +{ + mmHTMLBuilder hb; + hb.init(); + hb.addHeader(2, title_); + + mmCommonReportDetails dateDisplay(NULL); + dateDisplay.DisplayDateHeading(hb, dtBegin_, dtEnd_, !ignoreDate_); + + hb.startCenter(); + + // Add the graph + mmGraphPie gg; + hb.addImage(gg.getOutputFileName()); + + hb.startTable(wxT("60%")); + hb.startTableRow(); + hb.addTableHeaderCell(_("Category")); + hb.addTableHeaderCell(_("Amount"), true); + hb.endTableRow(); + + core_->currencyList_.LoadBaseCurrencySettings(); + + std::vector<ValuePair> valueList; + + double grandtotal = 0.0; + + wxString sBalance = wxT("?"); + std::pair<mmCategoryList::const_iterator, mmCategoryList::const_iterator> range = core_->categoryList_.Range(); + for (mmCategoryList::const_iterator it = range.first; it != range.second; ++ it) + { + int categs = 0; + bool grandtotalseparator = true; + double categtotal = 0.0; + const boost::shared_ptr<mmCategory> category = *it; + int categID = category->categID_; + const wxString sCategName = category->categName_; + double amt = core_->bTransactionList_.getAmountForCategory(categID, -1, ignoreDate_, + dtBegin_, dtEnd_, false, false, mmIniOptions::instance().ignoreFutureTransactions_); + if (type_ == 1 && amt < 0.0) amt = 0; + if (type_ == 2 && amt > 0.0) amt = 0; + + categtotal += amt; + grandtotal += amt; + + if (amt != 0) + { + ValuePair vp; + vp.label = sCategName; + vp.amount = amt; + valueList.push_back(vp); + + mmex::formatDoubleToCurrency(amt, sBalance); + hb.startTableRow(); + hb.addTableCell(sCategName, false, true); + hb.addTableCell(sBalance, true, false, true); + hb.endTableRow(); + } + + for (std::vector<boost::shared_ptr<mmCategory> >::const_iterator cit = category->children_.begin() + ; cit != category->children_.end() + ; ++ cit) + { + const boost::shared_ptr<mmCategory> sub_category = *cit; + int subcategID = sub_category->categID_; + + wxString sFullCategName = core_->categoryList_.GetFullCategoryString(categID, subcategID); + amt = core_->bTransactionList_.getAmountForCategory(categID, subcategID, ignoreDate_, + dtBegin_, dtEnd_, false, false, mmIniOptions::instance().ignoreFutureTransactions_); + + if (type_ == 1 && amt < 0.0) amt = 0; + if (type_ == 2 && amt > 0.0) amt = 0; + + categtotal += amt; + grandtotal += amt; + + if (amt != 0) + { + categs++; + ValuePair vp; + vp.label = sFullCategName; + vp.amount = amt; + valueList.push_back(vp); + + mmex::formatDoubleToCurrency(amt, sBalance); + hb.startTableRow(); + hb.addTableCell(sFullCategName, false, true); + hb.addTableCell(sBalance, true, false, true); + hb.endTableRow(); + } + } + + if (categs>1) + { + wxString categtotalStr; + mmex::formatDoubleToCurrency(categtotal, categtotalStr); + hb.addRowSeparator(0); + hb.startTableRow(); + hb.addTableCell(_("Category Total: "),false, true, true, wxT("GRAY")); + hb.addTableCell(categtotalStr, true, false, true, wxT("GRAY")); + hb.endTableRow(); + } + + if (categs>0) + { + grandtotalseparator = false; + hb.addRowSeparator(2); + } + } + + wxString grandtotalStr; + mmex::formatDoubleToCurrency(grandtotal, grandtotalStr); + hb.startTableRow(); + hb.addTableCell(_("Grand Total: "),false, true, true); + hb.addTableCell(grandtotalStr, true, false, true); + hb.endTableRow(); + + hb.endTable(); + hb.endCenter(); + hb.end(); + + gg.init(valueList); + gg.Generate(wxEmptyString); + + return hb.getHTMLText(); +} Modified: trunk/mmex/src/reports/categexp.h =================================================================== --- trunk/mmex/src/reports/categexp.h 2013-03-23 18:25:38 UTC (rev 3616) +++ trunk/mmex/src/reports/categexp.h 2013-03-23 19:45:54 UTC (rev 3617) @@ -1,45 +1,43 @@ -/******************************************************* - Copyright (C) 2006 Madhan Kanagavel - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - ********************************************************/ - -#ifndef _MM_EX_REPORTCATEGEXP_H_ -#define _MM_EX_REPORTCATEGEXP_H_ - -#include "../reportbase.h" - -#include <wx/datetime.h> -#include <wx/string.h> - -class mmCoreDB; - -class mmReportCategoryExpenses : public mmPrintableBase -{ -public: - mmReportCategoryExpenses(mmCoreDB* core - , bool ignoreDate, const wxDateTime& dtBegin, const wxDateTime& dtEnd, const wxString& title, int type); - - wxString getHTMLText(); - -private: - mmCoreDB* core_; - wxDateTime dtBegin_; - wxDateTime dtEnd_; - bool ignoreDate_; - wxString title_; - int type_; -}; -#endif // _MM_EX_REPORTCATEGEXP_H_ +/******************************************************* + Copyright (C) 2006 Madhan Kanagavel + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + ********************************************************/ + +#ifndef _MM_EX_REPORTCATEGEXP_H_ +#define _MM_EX_REPORTCATEGEXP_H_ + +#include "../reportbase.h" + +#include <wx/datetime.h> +#include <wx/string.h> + + +class mmReportCategoryExpenses : public mmPrintableBase +{ +public: + mmReportCategoryExpenses(mmCoreDB* core + , bool ignoreDate, const wxDateTime& dtBegin, const wxDateTime& dtEnd, const wxString& title, int type); + + wxString getHTMLText(); + +private: + wxDateTime dtBegin_; + wxDateTime dtEnd_; + bool ignoreDate_; + wxString title_; + int type_; +}; +#endif // _MM_EX_REPORTCATEGEXP_H_ Modified: trunk/mmex/src/reports/categovertimeperf.cpp =================================================================== --- trunk/mmex/src/reports/categovertimeperf.cpp 2013-03-23 18:25:38 UTC (rev 3616) +++ trunk/mmex/src/reports/categovertimeperf.cpp 2013-03-23 19:45:54 UTC (rev 3617) @@ -1,288 +1,283 @@ -/******************************************************* -Copyright (C) 2006 Madhan Kanagavel - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -********************************************************/ - -//---------------------------------------------------------------------------- -#include "categovertimeperf.h" -#include "../htmlbuilder.h" -#include "../util.h" -//---------------------------------------------------------------------------- -#include <vector> -#include <math.h> -//---------------------------------------------------------------------------- - -namespace -{ - -const int g_NullCategory = -1; -const int g_NullSubCat = g_NullCategory; -//---------------------------------------------------------------------------- -enum EWhat { INCOME, EXPENSES, OVERALL, WHAT_MAX }; -//---------------------------------------------------------------------------- - -/* - Set last day of months 23:59:59.999 -*/ -wxDateTime& prepareEndDate(wxDateTime &dt) -{ - wxDateTime::Month mon = dt.GetMonth(); - int year = dt.GetYear(); - - dt.Set(dt.GetNumberOfDays(mon, year), mon, year, 23, 59, 59, 999); - - return dt; -} -//---------------------------------------------------------------------------- -typedef std::vector<std::pair<wxDateTime, wxDateTime> > periods_t; -typedef std::vector<std::pair<double, double> > columns_totals_t; -//---------------------------------------------------------------------------- - -void prepareAndPrintPeriods -( - const wxDateTime &periodBegin, - const wxDateTime &periodEnd, - mmHTMLBuilder &hb, - periods_t &periods -) -{ - for (periods_t::iterator i = periods.begin(); i != periods.end(); ++i) - { - wxDateTime &dtBegin = i->first; - wxDateTime &dtEnd = i->second; - - dtBegin = periodBegin; - dtBegin += wxDateSpan::Months(std::distance(periods.begin(), i)); - - if (i == periods.begin()) { - wxASSERT(dtBegin == periodBegin); - } - - // -- - - dtEnd = dtBegin; - prepareEndDate(dtEnd); - - if (i == --periods.end()) { - bool ok = dtEnd == periodEnd; - wxASSERT(ok); - wxUnusedVar(ok); - } - - // -- - - wxString yyyy; - yyyy << dtBegin.GetYear(); - - hb.addTableHeaderCell(mmGetNiceShortMonthName(dtBegin.GetMonth()) + wxT(" ") + yyyy); - } -} -//---------------------------------------------------------------------------- - -void printRow -( - const wxDateTime &periodBegin, - const wxDateTime &periodEnd, - const periods_t &periods, - wxSQLite3ResultSet &q1, - int cat_id, - int subcat_id, - const mmCoreDB* core, - mmHTMLBuilder &hb, - columns_totals_t &columns_totals -) -{ - double period_amount = core->bTransactionList_.getAmountForCategory(core, cat_id, subcat_id, false, - periodBegin, periodEnd, false, false, mmIniOptions::instance().ignoreFutureTransactions_ - ); - if (period_amount == 0) { - return; - } - - hb.startTableRow(); - - wxString categ = q1.GetString(wxT("CATEGNAME")); - - if (subcat_id != g_NullSubCat) { - categ += wxT(": "); - categ += q1.GetString(wxT("SUBCATEGNAME")); - } - - hb.addTableCell(categ, false, true); - - double period_amount_sum = 0; // row summary - - for (periods_t::const_iterator i = periods.begin(); i != periods.end(); ++i) - { - const wxDateTime &dtBegin = i->first; - const wxDateTime &dtEnd = i->second; - - // wxLogDebug(wxT("begin=%s, end=%s"), dtBegin.Format().c_str(), dtEnd.Format().c_str()); - - double month_amount = core->bTransactionList_.getAmountForCategory(core, cat_id, subcat_id, false, - dtBegin, dtEnd, false, false, mmIniOptions::instance().ignoreFutureTransactions_ - ); - wxString month_amount_str; - - if (month_amount != 0) - { - period_amount_sum += month_amount; - mmex::formatDoubleToCurrencyEdit(month_amount, month_amount_str); - - periods_t::const_iterator::difference_type j = std::distance(periods.begin(), i); - columns_totals_t::reference r = columns_totals[j]; - - (month_amount < 0 ? r.second : r.first) += month_amount; - } - - hb.addTableCell(month_amount_str, true); - } - - wxASSERT(fabs(period_amount_sum - period_amount) < 0.01); - - // summary of period for category\subcategory - - wxString period_amount_str; - mmex::formatDoubleToCurrencyEdit(period_amount, period_amount_str); - hb.addTableCell(period_amount_str, true); - - hb.endTableRow(); -} -//---------------------------------------------------------------------------- - -void printColumnsTotals -( - const columns_totals_t &columns_totals, - EWhat what, - mmHTMLBuilder &hb -) -{ - hb.startTableRow(); - - const wxString title[WHAT_MAX] = { _("Income"), _("Expenses"), _("Overall") }; - hb.addTableHeaderCell(title[what]); - - for (columns_totals_t::const_iterator i = columns_totals.begin(); i != columns_totals.end(); ++i) - { - double val = what == INCOME ? i->first : - what == EXPENSES ? -i->second : // print as positive value in report - what == OVERALL ? (i->first + i->second) : - 0; - - wxString str; - - if (val != 0) { - mmex::formatDoubleToCurrencyEdit(val, str); - } - - hb.addTableCell(str, true, false, true); - } - - hb.addTableHeaderCell(wxGetEmptyString()); - hb.endTableRow(); -} -//---------------------------------------------------------------------------- - -} // namespace - -//---------------------------------------------------------------------------- - -mmReportCategoryOverTimePerformance::mmReportCategoryOverTimePerformance(mmCoreDB *core) : - mmPrintableBase(core) -{ - wxASSERT(core_); -} -//---------------------------------------------------------------------------- - -wxSQLite3Database& mmReportCategoryOverTimePerformance::getDb() const -{ - return *core_->db_; -} -//---------------------------------------------------------------------------- - -wxString mmReportCategoryOverTimePerformance::getHTMLText() -{ - const int MONTHS_IN_PERIOD = 12; // including current month - - mmHTMLBuilder hb; - hb.init(); - - hb.addHeader(2, wxString::Format(_("Category Income/Expenses Over Last %d Months "), MONTHS_IN_PERIOD)); - hb.addDateNow(); - - // setup period - wxDateTime dummy = wxDateTime::Now(); - const wxDateTime periodEnd = prepareEndDate(dummy); - - dummy.SetDay(1); - dummy -= wxDateSpan::Months(MONTHS_IN_PERIOD - 1); // X months before current one - - const wxDateTime periodBegin = dummy.ResetTime(); - - // wxLogDebug(wxT("yea_begin=%s, yea_end=%s"), periodBegin.Format().c_str(), periodEnd.Format().c_str()); - - // print header of report - - hb.startCenter(); - hb.startTable(); - - hb.startTableRow(); - hb.addTableHeaderCell(_("Category")); - - periods_t periods(MONTHS_IN_PERIOD); - prepareAndPrintPeriods(periodBegin, periodEnd, hb, periods); - - columns_totals_t columns_totals(periods.size()); - - hb.addTableHeaderCell(_("Overall")); - hb.endTableRow(); - - // begin of table - - core_->currencyList_.LoadBaseCurrencySettings(); - - wxSQLite3ResultSet q1 = getDb().ExecuteQuery(SELECT_ALL_CATEGORIES); - - for (int last_cat_id = g_NullCategory; q1.NextRow();) - { - int cat_id = q1.GetInt(wxT("CATEGID")); - - if (last_cat_id != cat_id) { // category changed - last_cat_id = cat_id; - printRow(periodBegin, periodEnd, periods, q1, cat_id, g_NullSubCat, core_, hb, columns_totals); - } - - int sc_idx = q1.FindColumnIndex(wxT("SUBCATEGID")); - - if (!q1.IsNull(sc_idx)) { - int subcat_id = q1.GetInt(sc_idx); - printRow(periodBegin, periodEnd, periods, q1, cat_id, subcat_id, core_, hb, columns_totals); - } - } - - q1.Finalize(); - - printColumnsTotals(columns_totals, INCOME, hb); - printColumnsTotals(columns_totals, EXPENSES, hb); - printColumnsTotals(columns_totals, OVERALL, hb); - - hb.endTable(); - hb.endCenter(); - - hb.end(); - return hb.getHTMLText(); -} -//---------------------------------------------------------------------------- +/******************************************************* +Copyright (C) 2006 Madhan Kanagavel + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +********************************************************/ + +//---------------------------------------------------------------------------- +#include "categovertimeperf.h" +#include "../htmlbuilder.h" +#include "../util.h" +//---------------------------------------------------------------------------- +#include <vector> +#include <math.h> +//---------------------------------------------------------------------------- + +namespace +{ + +const int g_NullCategory = -1; +const int g_NullSubCat = g_NullCategory; +//---------------------------------------------------------------------------- +enum EWhat { INCOME, EXPENSES, OVERALL, WHAT_MAX }; +//---------------------------------------------------------------------------- + +/* + Set last day of months 23:59:59.999 +*/ +wxDateTime& prepareEndDate(wxDateTime &dt) +{ + wxDateTime::Month mon = dt.GetMonth(); + int year = dt.GetYear(); + + dt.Set(dt.GetNumberOfDays(mon, year), mon, year, 23, 59, 59, 999); + + return dt; +} +//---------------------------------------------------------------------------- +typedef std::vector<std::pair<wxDateTime, wxDateTime> > periods_t; +typedef std::vector<std::pair<double, double> > columns_totals_t; +//---------------------------------------------------------------------------- + +void prepareAndPrintPeriods +( + const wxDateTime &periodBegin, + const wxDateTime &periodEnd, + mmHTMLBuilder &hb, + periods_t &periods +) +{ + for (periods_t::iterator i = periods.begin(); i != periods.end(); ++i) + { + wxDateTime &dtBegin = i->first; + wxDateTime &dtEnd = i->second; + + dtBegin = periodBegin; + dtBegin += wxDateSpan::Months(std::distance(periods.begin(), i)); + + if (i == periods.begin()) { + wxASSERT(dtBegin == periodBegin); + } + + // -- + + dtEnd = dtBegin; + prepareEndDate(dtEnd); + + if (i == --periods.end()) { + bool ok = dtEnd == periodEnd; + wxASSERT(ok); + wxUnusedVar(ok); + } + + // -- + + wxString yyyy; + yyyy << dtBegin.GetYear(); + + hb.addTableHeaderCell(mmGetNiceShortMonthName(dtBegin.GetMonth()) + wxT(" ") + yyyy); + } +} +//---------------------------------------------------------------------------- + +void printRow +( + const wxDateTime &periodBegin, + const wxDateTime &periodEnd, + const periods_t &periods, + wxSQLite3ResultSet &q1, + int cat_id, + int subcat_id, + const mmCoreDB* core, + mmHTMLBuilder &hb, + columns_totals_t &columns_totals +) +{ + double period_amount = core->bTransactionList_.getAmountForCategory(cat_id, subcat_id, false, + periodBegin, periodEnd, false, false, mmIniOptions::instance().ignoreFutureTransactions_ + ); + if (period_amount == 0) { + return; + } + + hb.startTableRow(); + + wxString categ = q1.GetString(wxT("CATEGNAME")); + + if (subcat_id != g_NullSubCat) { + categ += wxT(": "); + categ += q1.GetString(wxT("SUBCATEGNAME")); + } + + hb.addTableCell(categ, false, true); + + double period_amount_sum = 0; // row summary + + for (periods_t::const_iterator i = periods.begin(); i != periods.end(); ++i) + { + const wxDateTime &dtBegin = i->first; + const wxDateTime &dtEnd = i->second; + + // wxLogDebug(wxT("begin=%s, end=%s"), dtBegin.Format().c_str(), dtEnd.Format().c_str()); + + double month_amount = core->bTransactionList_.getAmountForCategory(cat_id, subcat_id, false, + dtBegin, dtEnd, false, false, mmIniOptions::instance().ignoreFutureTransactions_ + ); + wxString month_amount_str; + + if (month_amount != 0) + { + period_amount_sum += month_amount; + mmex::formatDoubleToCurrencyEdit(month_amount, month_amount_str); + + periods_t::const_iterator::difference_type j = std::distance(periods.begin(), i); + columns_totals_t::reference r = columns_totals[j]; + + (month_amount < 0 ? r.second : r.first) += month_amount; + } + + hb.addTableCell(month_amount_str, true); + } + + wxASSERT(fabs(period_amount_sum - period_amount) < 0.01); + + // summary of period for category\subcategory + + wxString period_amount_str; + mmex::formatDoubleToCurrencyEdit(period_amount, period_amount_str); + hb.addTableCell(period_amount_str, true); + + hb.endTableRow(); +} +//---------------------------------------------------------------------------- + +void printColumnsTotals +( + const columns_totals_t &columns_totals, + EWhat what, + mmHTMLBuilder &hb +) +{ + hb.startTableRow(); + + const wxString title[WHAT_MAX] = { _("Income"), _("Expenses"), _("Overall") }; + hb.addTableHeaderCell(title[what]); + + for (columns_totals_t::const_iterator i = columns_totals.begin(); i != columns_totals.end(); ++i) + { + double val = what == INCOME ? i->first : + what == EXPENSES ? -i->second : // print as positive value in report + what == OVERALL ? (i->first + i->second) : + 0; + + wxString str; + + if (val != 0) { + mmex::formatDoubleToCurrencyEdit(val, str); + } + + hb.addTableCell(str, true, false, true); + } + + hb.addTableHeaderCell(wxGetEmptyString()); + hb.endTableRow(); +} +//---------------------------------------------------------------------------- + +} // namespace + +//---------------------------------------------------------------------------- + +mmReportCategoryOverTimePerformance::mmReportCategoryOverTimePerformance(mmCoreDB *core) : + mmPrintableBase(core) +{ + wxASSERT(core_); +} +//---------------------------------------------------------------------------- + +wxString mmReportCategoryOverTimePerformance::getHTMLText() +{ + const int MONTHS_IN_PERIOD = 12; // including current month + + mmHTMLBuilder hb; + hb.init(); + + hb.addHeader(2, wxString::Format(_("Category Income/Expenses Over Last %d Months "), MONTHS_IN_PERIOD)); + hb.addDateNow(); + hb.addLineBreak(); + + // setup period + wxDateTime dummy = wxDateTime::Now(); + const wxDateTime periodEnd = prepareEndDate(dummy); + + dummy.SetDay(1); + dummy -= wxDateSpan::Months(MONTHS_IN_PERIOD - 1); // X months before current one + + const wxDateTime periodBegin = dummy.ResetTime(); + + // wxLogDebug(wxT("yea_begin=%s, yea_end=%s"), periodBegin.Format().c_str(), periodEnd.Format().c_str()); + + // print header of report + + hb.startCenter(); + hb.startTable(); + + hb.startTableRow(); + hb.addTableHeaderCell(_("Category")); + + periods_t periods(MONTHS_IN_PERIOD); + prepareAndPrintPeriods(periodBegin, periodEnd, hb, periods); + + columns_totals_t columns_totals(periods.size()); + + hb.addTableHeaderCell(_("Overall")); + hb.endTableRow(); + + // begin of table + + core_->currencyList_.LoadBaseCurrencySettings(); + + wxSQLite3ResultSet q1 = core_->db_.get()->ExecuteQuery(SELECT_ALL_CATEGORIES); + + for (int last_cat_id = g_NullCategory; q1.NextRow();) + { + int cat_id = q1.GetInt(wxT("CATEGID")); + + if (last_cat_id != cat_id) { // category changed + last_cat_id = cat_id; + printRow(periodBegin, periodEnd, periods, q1, cat_id, g_NullSubCat, core_, hb, columns_totals); + } + + int sc_idx = q1.FindColumnIndex(wxT("SUBCATEGID")); + + if (!q1.IsNull(sc_idx)) { + int subcat_id = q1.GetInt(sc_idx); + printRow(periodBegin, periodEnd, periods, q1, cat_id, subcat_id, core_, hb, columns_totals); + } + } + + q1.Finalize(); + + printColumnsTotals(columns_totals, INCOME, hb); + printColumnsTotals(columns_totals, EXPENSES, hb); + printColumnsTotals(columns_totals, OVERALL, hb); + + hb.endTable(); + hb.endCenter(); + + hb.end(); + return hb.getHTMLText(); +} +//---------------------------------------------------------------------------- Modified: trunk/mmex/src/reports/categovertimeperf.h =================================================================== --- trunk/mmex/src/reports/categovertimeperf.h 2013-03-23 18:25:38 UTC (rev 3616) +++ trunk/mmex/src/reports/categovertimeperf.h 2013-03-23 19:45:54 UTC (rev 3617) @@ -1,41 +1,41 @@ -/******************************************************* -Copyright (C) 2006 Madhan Kanagavel - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -********************************************************/ - -//---------------------------------------------------------------------------- -#ifndef _MM_EX_REPORTCATEGOVERTIME_H_ -#define _MM_EX_REPORTCATEGOVERTIME_H_ -//---------------------------------------------------------------------------- -#include "../reportbase.h" -//---------------------------------------------------------------------------- -class wxSQLite3Database; -//---------------------------------------------------------------------------- - -class mmReportCategoryOverTimePerformance : public mmPrintableBase -{ -public: - mmReportCategoryOverTimePerformance(mmCoreDB *core); - - wxString getHTMLText(); - -private: - wxSQLite3Database& getDb() const; -}; -//---------------------------------------------------------------------------- -#endif // _MM_EX_REPORTCATEGOVERTIME_H_ -//---------------------------------------------------------------------------- - +/******************************************************* +Copyright (C) 2006 Madhan Kanagavel + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the ... [truncated message content] |