@@ -37,6 +37,9 @@ BalanceReport::BalanceReport(BalanceReport::PERIOD_ID period_id) :
3737 ? REPORT_ID::MonthlySummaryofAccounts
3838 : REPORT_ID::YearlySummaryofAccounts
3939 );
40+ m_selection_map[" name" ] = _t (" View" );
41+ m_selection_map[" values" ] = _t (" Account Types" ) + " ," + _t (" Accounts" );
42+ m_selection_map[" default" ] = _t (" Account Types" );
4043}
4144
4245std::map<mmDate, double > BalanceReport::loadAccountBalance_mDate (const AccountData& account_d)
@@ -114,9 +117,10 @@ wxString BalanceReport::getHTMLText()
114117 std::vector<BalanceEntry> date_balanceA_a;
115118
116119 GraphData gd;
120+ const bool view_accounts = (getGenericSelection () == 1 );
117121 int acc_size = mmNavigatorList::instance ().getNumberOfAccountTypes ();
118- // +1 as we add balance to the end ;
119- std::vector<GraphSeries> gs_data (acc_size + 1 );
122+ const auto account_data_a = AccountModel::instance (). find_all () ;
123+ const auto asset_data_a = AssetModel::instance (). find_all ( );
120124
121125 std::vector<mmDate> end_date_a;
122126
@@ -148,11 +152,16 @@ wxString BalanceReport::getHTMLText()
148152 mmDate start_date = selected_start_date;
149153 bool has_included_accounts = false ;
150154 mmDate earliest_open_date = selected_end_date;
155+ std::vector<wxString> series_name_a;
156+
151157 // Calculate the report date
152- for (const auto & account_d : AccountModel::instance (). find_all () ) {
158+ for (const auto & account_d : account_data_a ) {
153159 if (m_account_a && wxNOT_FOUND == m_account_a->Index (account_d.m_name ))
154160 continue ;
155161
162+ if (view_accounts)
163+ series_name_a.push_back (account_d.m_name );
164+
156165 if (!has_included_accounts || account_d.m_open_date < earliest_open_date) {
157166 earliest_open_date = account_d.m_open_date ;
158167 has_included_accounts = true ;
@@ -176,6 +185,25 @@ wxString BalanceReport::getHTMLText()
176185 }
177186 }
178187
188+ const bool include_asset_series = view_accounts && !asset_data_a.empty ();
189+ if (include_asset_series)
190+ series_name_a.push_back (_t (" Assets" ));
191+
192+ if (!view_accounts) {
193+ for (int i = 0 ; i < acc_size; ++i)
194+ series_name_a.push_back (mmNavigatorList::instance ().getAccountTypeName (i));
195+ }
196+
197+ const int series_count = static_cast <int >(series_name_a.size ());
198+ // +1 as we add total balance series to the end.
199+ std::vector<GraphSeries> gs_data (series_count + 1 );
200+ for (int i = 0 ; i < series_count; ++i) {
201+ gs_data[i].name = series_name_a[i];
202+ gs_data[i].type = " column" ;
203+ }
204+ gs_data[series_count].name = _t (" Balance" );
205+ gs_data[series_count].type = " line" ;
206+
179207 // Skip leading periods where selected accounts cannot have any balance yet.
180208 if (has_included_accounts && start_date < earliest_open_date)
181209 start_date = earliest_open_date;
@@ -209,54 +237,76 @@ wxString BalanceReport::getHTMLText()
209237 date_balanceA.date = end_date;
210238 double total = 0.0 ;
211239
212- std::vector<double > balance_a (acc_size + 1 );
240+ std::vector<double > balance_a (series_count );
213241 std::fill (balance_a.begin (), balance_a.end (), 0.0 );
214- int idx;
215- for (const auto & account_d : AccountModel::instance ().find_all ()) {
242+ int idx = 0 ;
243+ int type_idx;
244+ for (const auto & account_d : account_data_a) {
216245 if (m_account_a && wxNOT_FOUND == m_account_a->Index (account_d.m_name ))
217246 continue ;
218247
219- idx = mmNavigatorList::instance ().getAccountTypeIdx (account_d.m_type_ );
220- if (idx == -1 ) {
221- idx = mmNavigatorList::instance ().getAccountTypeIdx (mmNavigatorItem::TYPE_ID_CHECKING);
222- }
223- if (idx > -1 ) {
248+ if (view_accounts) {
224249 double rate = getCurrencyDateRate (account_d.m_currency_id , end_date);
225250 std::pair<double , double > dailybal = getBalance (&account_d, end_date);
226- balance_a[idx] + = dailybal.first * rate;
251+ balance_a[idx] = dailybal.first * rate;
227252 if (AccountModel::type_id (account_d) == mmNavigatorItem::TYPE_ID_INVESTMENT) {
228253 balance_a[idx] += dailybal.second * rate;
229254 }
255+ idx++;
256+ }
257+ else {
258+ type_idx = mmNavigatorList::instance ().getAccountTypeIdx (account_d.m_type_ );
259+ if (type_idx == -1 ) {
260+ type_idx = mmNavigatorList::instance ().getAccountTypeIdx (mmNavigatorItem::TYPE_ID_CHECKING);
261+ }
262+ if (type_idx > -1 ) {
263+ double rate = getCurrencyDateRate (account_d.m_currency_id , end_date);
264+ std::pair<double , double > dailybal = getBalance (&account_d, end_date);
265+ balance_a[type_idx] += dailybal.first * rate;
266+ if (AccountModel::type_id (account_d) == mmNavigatorItem::TYPE_ID_INVESTMENT) {
267+ balance_a[type_idx] += dailybal.second * rate;
268+ }
269+ }
230270 }
231271 }
232272
233- idx = mmNavigatorList::instance ().getAccountTypeIdx (mmNavigatorItem::TYPE_ID_ASSET);
234- if (idx > -1 ) {
235- for (const auto & asset_d : AssetModel::instance ().find_all ()) {
236- double rate = getCurrencyDateRate (asset_d.m_currency_id_n , end_date);
237- balance_a[idx] += AssetModel::instance ().get_data_value_date (
238- asset_d, end_date
239- ).second * rate;
273+ if (view_accounts) {
274+ if (include_asset_series) {
275+ double asset_balance = 0.0 ;
276+ for (const auto & asset_d : asset_data_a) {
277+ double rate = getCurrencyDateRate (asset_d.m_currency_id_n , end_date);
278+ asset_balance += AssetModel::instance ().get_data_value_date (
279+ asset_d, end_date
280+ ).second * rate;
281+ }
282+ balance_a[idx] = asset_balance;
283+ }
284+ }
285+ else {
286+ type_idx = mmNavigatorList::instance ().getAccountTypeIdx (mmNavigatorItem::TYPE_ID_ASSET);
287+ if (type_idx > -1 ) {
288+ for (const auto & asset_d : asset_data_a) {
289+ double rate = getCurrencyDateRate (asset_d.m_currency_id_n , end_date);
290+ balance_a[type_idx] += AssetModel::instance ().get_data_value_date (
291+ asset_d, end_date
292+ ).second * rate;
293+ }
240294 }
241295 }
242296
243297 int k = -1 ;
244- for (int i = 0 ; i < acc_size ; ++i) {
298+ for (int i = 0 ; i < series_count ; ++i) {
245299 date_balanceA.balance_a .push_back (balance_a[i]);
246300 gs_data[++k].values .push_back (balance_a[i]);
247301 total += balance_a[i];
248- gs_data[k].name = mmNavigatorList::instance ().getAccountTypeName (i);
249- gs_data[k].type = " column" ;
250302 }
251303 date_balanceA.balance_a .push_back (total);
252304 date_balanceA_a.push_back (date_balanceA);
253305 gs_data[++k].values .push_back (total);
254- gs_data[k].name = _t (" Balance" );
255- gs_data[k].type = " line" ;
256306 }
257307
258308 std::vector<bool > is_visible_a;
259- for (int i = 0 ; i < acc_size ; i++) {
309+ for (int i = 0 ; i < series_count ; i++) {
260310 bool av;
261311 for (double value : gs_data[i].values ) {
262312 av = false ;
@@ -272,7 +322,7 @@ wxString BalanceReport::getHTMLText()
272322
273323 // Chart
274324 if (getChartSelection () == 0 ) {
275- for (int i = 0 ; i < (acc_size + 1 ); ++i) {
325+ for (int i = 0 ; i < (series_count + 1 ); ++i) {
276326 if (is_visible_a[i]) {
277327 gd.series .push_back (gs_data[i]);
278328 }
@@ -304,7 +354,7 @@ wxString BalanceReport::getHTMLText()
304354 hb.startTableRow ();
305355 {
306356 hb.addTableHeaderCell (_t (" Date" ));
307- for (int i = 0 ; i < acc_size + 1 ; i++) {
357+ for (int i = 0 ; i < series_count + 1 ; i++) {
308358 if (is_visible_a[i])
309359 hb.addTableHeaderCell (gs_data[i].name , " text-right" );
310360 }
@@ -322,7 +372,7 @@ wxString BalanceReport::getHTMLText()
322372 hb.addTableCellMonth (dateTime.GetMonth (), dateTime.GetYear ());
323373 else
324374 hb.addTableCell (wxString::Format (" %d" , dateTime.GetYear ()));
325- for (int i = 0 ; i < acc_size + 1 ; i++) {
375+ for (int i = 0 ; i < series_count + 1 ; i++) {
326376 if (is_visible_a[i])
327377 hb.addMoneyCell (date_balanceA.balance_a [i]);
328378 }
0 commit comments