summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Wiegley <johnw@newartisans.com>2015-08-04 14:33:03 -0700
committerJohn Wiegley <johnw@newartisans.com>2015-08-04 14:33:03 -0700
commita3e946f90f902600819f64217c8cd98c72bb21ba (patch)
treed7f0de1c234b457ce608c38d71040bca4cff43eb /src
parent947a46ebebd141e928a9fcebb584e34df4e210a7 (diff)
parentfbba9adc16c515632a5009d2ec88c9fcab532676 (diff)
downloadfork-ledger-a3e946f90f902600819f64217c8cd98c72bb21ba.tar.gz
fork-ledger-a3e946f90f902600819f64217c8cd98c72bb21ba.tar.bz2
fork-ledger-a3e946f90f902600819f64217c8cd98c72bb21ba.zip
Merge remote-tracking branch 'origin/master' into next
Diffstat (limited to 'src')
-rw-r--r--src/filters.cc33
-rw-r--r--src/filters.h13
-rw-r--r--src/value.cc4
3 files changed, 36 insertions, 14 deletions
diff --git a/src/filters.cc b/src/filters.cc
index b6530c04..d9fb64b0 100644
--- a/src/filters.cc
+++ b/src/filters.cc
@@ -448,16 +448,20 @@ void collapse_posts::report_subtotal()
DEBUG("filters.collapse", "Pseudo-xact date = " << *xact._date);
DEBUG("filters.collapse", "earliest date = " << earliest_date);
DEBUG("filters.collapse", "latest date = " << latest_date);
+
+ foreach (totals_map::value_type& pat, totals) {
+ handle_value(/* value= */ pat.second,
+ /* account= */ &temps.create_account(pat.first),
+ /* xact= */ &xact,
+ /* temps= */ temps,
+ /* handler= */ handler,
+ /* date= */ latest_date,
+ /* act_date_p= */ false);
+ }
- handle_value(/* value= */ subtotal,
- /* account= */ totals_account,
- /* xact= */ &xact,
- /* temps= */ temps,
- /* handler= */ handler,
- /* date= */ latest_date,
- /* act_date_p= */ false);
}
+ totals.clear();
component_posts.clear();
last_xact = NULL;
@@ -466,6 +470,20 @@ void collapse_posts::report_subtotal()
count = 0;
}
+value_t& collapse_posts::find_totals(account_t* account)
+{
+ unsigned short depth=3;
+
+ if(depth==0)
+ return totals[_("<Total>")];
+
+ if(account->depth==depth)
+ return totals[account->fullname()];
+
+ //else recurse
+ return find_totals(account->parent);
+}
+
void collapse_posts::operator()(post_t& post)
{
// If we've reached a new xact, report on the subtotal
@@ -475,6 +493,7 @@ void collapse_posts::operator()(post_t& post)
report_subtotal();
post.add_to_value(subtotal, amount_expr);
+ post.add_to_value(find_totals(post.account), amount_expr);
component_posts.push_back(&post);
diff --git a/src/filters.h b/src/filters.h
index 1404b38e..9b745235 100644
--- a/src/filters.h
+++ b/src/filters.h
@@ -421,6 +421,9 @@ public:
class collapse_posts : public item_handler<post_t>
{
+
+ typedef std::map<string,value_t> totals_map;
+
expr_t& amount_expr;
predicate_t display_predicate;
predicate_t only_predicate;
@@ -429,7 +432,7 @@ class collapse_posts : public item_handler<post_t>
xact_t * last_xact;
post_t * last_post;
temporaries_t temps;
- account_t * totals_account;
+ totals_map totals;
bool only_collapse_if_zero;
std::list<post_t *> component_posts;
report_t& report;
@@ -448,17 +451,13 @@ public:
only_predicate(_only_predicate), count(0),
last_xact(NULL), last_post(NULL),
only_collapse_if_zero(_only_collapse_if_zero), report(_report) {
- create_accounts();
TRACE_CTOR(collapse_posts, "post_handler_ptr, ...");
}
virtual ~collapse_posts() {
TRACE_DTOR(collapse_posts);
handler.reset();
}
-
- void create_accounts() {
- totals_account = &temps.create_account(_("<Total>"));
- }
+ value_t& find_totals(account_t* account);
virtual void flush() {
report_subtotal();
@@ -480,7 +479,7 @@ public:
last_post = NULL;
temps.clear();
- create_accounts();
+ totals.clear();
component_posts.clear();
item_handler<post_t>::clear();
diff --git a/src/value.cc b/src/value.cc
index 2737add9..4ea7c7a8 100644
--- a/src/value.cc
+++ b/src/value.cc
@@ -341,6 +341,10 @@ value_t& value_t::operator+=(const value_t& val)
}
switch (type()) {
+ case VOID:
+ *this = value_t(val);
+ return *this;
+
case DATETIME:
switch (val.type()) {
case INTEGER: