From 8f5a651c5bf6c78c04f18ab2358617f988ab0c78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9gory=20Soutad=C3=A9?= Date: Sat, 30 Apr 2011 12:37:16 +0200 Subject: [PATCH] Add update next months feature --- ChangeLog | 3 +- src/view/AccountPanel.cpp | 112 +++++++++++++++++++++++++++++++++++++- src/view/AccountPanel.h | 1 + 3 files changed, 114 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 45ff72d..2788bd3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,4 @@ -v0.2 (26/04/2011) +v0.2 (30/04/2011) ** User ** Better use of sizers (so better interface!) @@ -15,6 +15,7 @@ v0.2 (26/04/2011) Database is now at ~/.kisscount/kc.bdd Add Debian's packages !! Add Import Panel, OFX and Grisbi imports + Add update next months ** Dev ** Use a factory to create panels (prepare for plug-in) diff --git a/src/view/AccountPanel.cpp b/src/view/AccountPanel.cpp index 704ca01..c9fe1a5 100644 --- a/src/view/AccountPanel.cpp +++ b/src/view/AccountPanel.cpp @@ -21,7 +21,7 @@ enum {ACCOUNT_NUMBER, ACCOUNT_NAME, ACCOUNT_INIT, ACCOUNT_CUR, ACCOUNT_FINAL, NUMBER_COLS_ACCOUNTS}; enum {CUR_CREDIT, CUR_DEBIT, TOTAL_CREDIT, TOTAL_DEBIT, REMAINS, STATS_ROW, CATS_STATS}; -enum {CALENDAR_TREE_ID=1, OPS_GRID_ID, CALENDAR_ID, ACCOUNTS_GRID_ID, MENU_GENERATE_ID, MENU_DELETE_ID, DISPLAY_MODE_ID, GROUP_ID, UNGROUP_ID}; +enum {CALENDAR_TREE_ID=1, OPS_GRID_ID, CALENDAR_ID, ACCOUNTS_GRID_ID, MENU_GENERATE_ID, MENU_DELETE_ID, DISPLAY_MODE_ID, GROUP_ID, UNGROUP_ID, UPDATE_NEXT_MONTHS_ID}; enum {VIRTUAL_MODE=0, REAL_MODE, CHECK_MODE}; @@ -38,6 +38,7 @@ EVT_CALENDAR_SEL_CHANGED(CALENDAR_ID, AccountPanel::OnCalendarChange) EVT_RADIOBOX(DISPLAY_MODE_ID, AccountPanel::OnModeChange) EVT_BUTTON(GROUP_ID, AccountPanel::OnGroup) EVT_BUTTON(UNGROUP_ID, AccountPanel::OnUnGroup) +EVT_BUTTON(UPDATE_NEXT_MONTHS_ID, AccountPanel::OnUpdateNextMonths) END_EVENT_TABLE() AccountPanel::AccountPanel(KissCount* kiss, wxUI *parent) : KissPanel(kiss, parent), _curMonth(-1), _curYear(-1), _tree(this, CALENDAR_TREE_ID, wxDefaultPosition, wxDefaultSize, wxTR_HIDE_ROOT) @@ -132,8 +133,10 @@ AccountPanel::AccountPanel(KissCount* kiss, wxUI *parent) : KissPanel(kiss, pare wxButton* buttonGroup = new wxButton(this, GROUP_ID, _("Group")); wxButton* buttonUnGroup = new wxButton(this, UNGROUP_ID, _("UnGroup")); + wxButton* buttonUpdateNextMonths = new wxButton(this, UPDATE_NEXT_MONTHS_ID, _("Update next months")); vbox3->Add(&_tree, 0, wxGROW|wxALL, 2); + vbox3->Add(buttonUpdateNextMonths, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 10); vbox3->Add(buttonGroup, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 10); vbox3->Add(buttonUnGroup, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 10); @@ -985,3 +988,110 @@ void AccountPanel::OnUnGroup(wxCommandEvent& event) { _grid->UnGroup(); } + +void AccountPanel::OnUpdateNextMonths(wxCommandEvent& event) +{ + double* deltas, *cur_amounts, amount; + int i, a; + User* user = _kiss->GetUser(); + bool had_values, accounts_updated = false; + int last_month = 0, last_year = 0, account_updated = 0; + std::map > operations; + + deltas = new double[user->_accounts.size()] ; + cur_amounts = new double[user->_accounts.size()] ; + + operations = _kiss->GetAllOperations(); + + if (_curMonth == 11) + { + last_month = 0; + last_year = _curYear+1; + } + else + { + last_month = _curMonth+1; + last_year = _curYear; + } + + for (i=0; i<(int)user->_accounts.size(); i++) + { + deltas[i] = _kiss->GetAccountAmount(user->_accounts[i].id, _curMonth, _curYear); + cur_amounts[i] = deltas[i] += _kiss->CalcAccountAmount(user->_accounts[i].id, _curMonth, _curYear, &had_values); + + for (a=0; a<(int)operations[last_year].size(); a++) + if (operations[last_year][a] == last_month) break; + + if (a == (int)operations[last_year].size()) + { + deltas[i] = 0; + continue; + } + + amount = _kiss->GetAccountAmount(user->_accounts[i].id, last_month, last_year); + + deltas[i] -= amount; + + account_updated++; + } + + if (!account_updated) + goto end; + + last_month = _curMonth; + last_year = _curYear; + + while (1) + { + account_updated = 0; + + if (last_month == 11) + { + last_month = 0; + last_year = last_year+1; + } + else + last_month++; + + for (i=0; i<(int)user->_accounts.size(); i++) + { + if (deltas[i] == 0.0) continue; + + amount = _kiss->GetAccountAmount(user->_accounts[i].id, last_month, last_year); + if ((cur_amounts[i] - amount) != deltas[i]) continue; + + cur_amounts[i] = amount + deltas[i]; + _kiss->SetAccountAmount(last_month, last_year, user->_accounts[i].id, cur_amounts[i]); + cur_amounts[i] += _kiss->CalcAccountAmount(user->_accounts[i].id, last_month, last_year, &had_values); + + account_updated++; + } + + if (!account_updated) break; + + accounts_updated = true; + } + + if (last_month == 0) + { + last_month = 11; + last_year--; + } + else + last_month--; + +end: + if (accounts_updated) + { + wxString message = _("Accounts updated until ") + months[last_month]; + + message += wxT(" ") + wxString::Format(wxT("%d"), last_year); + + wxMessageBox(message, wxT("KissCount"), wxICON_INFORMATION | wxOK); + } + else + wxMessageBox(_("Any account updated !"), wxT("KissCount"), wxICON_INFORMATION | wxOK); + + delete[] deltas; + delete[] cur_amounts; +} diff --git a/src/view/AccountPanel.h b/src/view/AccountPanel.h index 3cedd38..a96dd4e 100644 --- a/src/view/AccountPanel.h +++ b/src/view/AccountPanel.h @@ -62,6 +62,7 @@ public: void OnModeChange(wxCommandEvent& event); void OnGroup(wxCommandEvent& event); void OnUnGroup(wxCommandEvent& event); + void OnUpdateNextMonths(wxCommandEvent& event); int _curMonth, _curYear;