From 5addacfbf21250204b8db25f0a4890c1299cb891 Mon Sep 17 00:00:00 2001 From: John Wiegley Date: Thu, 22 Mar 2012 23:42:18 -0500 Subject: Fixed an interaction with equity and virtual accounts Fixes #686 --- src/filters.cc | 20 ++++++++++++++++++-- src/filters.h | 17 ++++++++++++----- 2 files changed, 30 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/filters.cc b/src/filters.cc index 58e5fcaf..32b3ec3a 100644 --- a/src/filters.cc +++ b/src/filters.cc @@ -900,11 +900,19 @@ void subtotal_posts::operator()(post_t& post) #if defined(DEBUG_ON) std::pair result = #endif - values.insert(values_pair(acct->fullname(), acct_value_t(acct, temp))); + values.insert(values_pair + (acct->fullname(), + acct_value_t(acct, temp, post.has_flags(POST_VIRTUAL), + post.has_flags(POST_MUST_BALANCE)))); #if defined(DEBUG_ON) assert(result.second); #endif } else { + if (post.has_flags(POST_VIRTUAL) != (*i).second.is_virtual) + throw_(std::logic_error, + _("'equity' cannot accept virtual and " + "non-virtual postings to the same account")); + post.add_to_value((*i).second.value, amount_expr); } @@ -1062,10 +1070,17 @@ void posts_as_equity::report_subtotal() /* act_date_p= */ false); } } - total += value; + + if (! pair.second.is_virtual || pair.second.must_balance) + total += value; } values.clear(); +#if 1 + // This last part isn't really needed, since an Equity:Opening + // Balances posting with a null amount will automatically balance with + // all the other postings generated. But it does make the full + // balancing amount clearer to the user. if (! total.is_zero()) { if (total.is_balance()) { foreach (const balance_t::amounts_map::value_type& pair, @@ -1082,6 +1097,7 @@ void posts_as_equity::report_subtotal() (*handler)(balance_post); } } +#endif } void by_payee_posts::flush() diff --git a/src/filters.h b/src/filters.h index ab226429..1dad8852 100644 --- a/src/filters.h +++ b/src/filters.h @@ -640,15 +640,22 @@ protected: public: account_t * account; value_t value; + bool is_virtual; + bool must_balance; - acct_value_t(account_t * a) : account(a) { - TRACE_CTOR(acct_value_t, "account_t *"); + acct_value_t(account_t * a, bool _is_virtual = false, + bool _must_balance = false) + : account(a), is_virtual(_is_virtual), must_balance(_must_balance) { + TRACE_CTOR(acct_value_t, "account_t *, bool, bool"); } - acct_value_t(account_t * a, value_t& v) : account(a), value(v) { - TRACE_CTOR(acct_value_t, "account_t *, value_t&"); + acct_value_t(account_t * a, value_t& v, bool _is_virtual = false, + bool _must_balance = false) + : account(a), value(v), is_virtual(_is_virtual), + must_balance(_must_balance) { + TRACE_CTOR(acct_value_t, "account_t *, value_t&, bool, bool"); } acct_value_t(const acct_value_t& av) - : account(av.account), value(av.value) { + : account(av.account), value(av.value), is_virtual(av.is_virtual) { TRACE_CTOR(acct_value_t, "copy"); } ~acct_value_t() throw() { -- cgit v1.2.3