summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/account.cc20
-rw-r--r--src/account.h3
-rw-r--r--src/py_account.cc3
-rw-r--r--src/textual.cc4
4 files changed, 23 insertions, 7 deletions
diff --git a/src/account.cc b/src/account.cc
index 29c28866..5f9f7f51 100644
--- a/src/account.cc
+++ b/src/account.cc
@@ -610,8 +610,10 @@ void account_t::clear_xdata()
pair.second->clear_xdata();
}
-value_t account_t::amount(const optional<expr_t&>& expr) const
+value_t account_t::amount(const optional<bool> real_only, const optional<expr_t&>& expr) const
{
+ DEBUG("account.amount", "real only: " << real_only);
+
if (xdata_ && xdata_->has_flags(ACCOUNT_EXT_VISITED)) {
posts_list::const_iterator i;
if (xdata_->self_details.last_post)
@@ -622,6 +624,10 @@ value_t account_t::amount(const optional<expr_t&>& expr) const
for (; i != posts.end(); i++) {
if ((*i)->xdata().has_flags(POST_EXT_VISITED)) {
if (! (*i)->xdata().has_flags(POST_EXT_CONSIDERED)) {
+ if (! (*i)->has_flags(POST_VIRTUAL)) {
+ (*i)->add_to_value(xdata_->self_details.real_total, expr);
+ }
+
(*i)->add_to_value(xdata_->self_details.total, expr);
(*i)->xdata().add_flags(POST_EXT_CONSIDERED);
}
@@ -637,6 +643,10 @@ value_t account_t::amount(const optional<expr_t&>& expr) const
for (; i != xdata_->reported_posts.end(); i++) {
if ((*i)->xdata().has_flags(POST_EXT_VISITED)) {
if (! (*i)->xdata().has_flags(POST_EXT_CONSIDERED)) {
+ if (! (*i)->has_flags(POST_VIRTUAL)) {
+ (*i)->add_to_value(xdata_->self_details.real_total, expr);
+ }
+
(*i)->add_to_value(xdata_->self_details.total, expr);
(*i)->xdata().add_flags(POST_EXT_CONSIDERED);
}
@@ -644,7 +654,11 @@ value_t account_t::amount(const optional<expr_t&>& expr) const
xdata_->self_details.last_reported_post = i;
}
- return xdata_->self_details.total;
+ if (real_only == true) {
+ return xdata_->self_details.real_total;
+ } else {
+ return xdata_->self_details.total;
+ }
} else {
return NULL_VALUE;
}
@@ -662,7 +676,7 @@ value_t account_t::total(const optional<expr_t&>& expr) const
add_or_set_value(xdata_->family_details.total, temp);
}
- temp = amount(expr);
+ temp = amount(false, expr);
if (! temp.is_null())
add_or_set_value(xdata_->family_details.total, temp);
}
diff --git a/src/account.h b/src/account.h
index 0abbd87a..2db36cea 100644
--- a/src/account.h
+++ b/src/account.h
@@ -170,6 +170,7 @@ public:
struct details_t
{
value_t total;
+ value_t real_total;
bool calculated;
bool gathered;
@@ -277,7 +278,7 @@ public:
return *xdata_;
}
- value_t amount(const optional<expr_t&>& expr = none) const;
+ value_t amount(const optional<bool> real_only = false, const optional<expr_t&>& expr = none) const;
value_t total(const optional<expr_t&>& expr = none) const;
const xdata_t::details_t& self_details(bool gather_all = true) const;
diff --git a/src/py_account.cc b/src/py_account.cc
index 59680a23..295ed9d7 100644
--- a/src/py_account.cc
+++ b/src/py_account.cc
@@ -105,7 +105,7 @@ namespace {
value_t py_amount_1(const account_t& account, const boost::optional<expr_t&>& expr)
{
- return account.amount(expr);
+ return account.amount(false, expr);
}
value_t py_total_0(const account_t& account)
@@ -133,6 +133,7 @@ void export_account()
class_< account_t::xdata_t::details_t > ("AccountXDataDetails")
.def_readonly("total", &account_t::xdata_t::details_t::total)
+ .def_readonly("real_total", &account_t::xdata_t::details_t::real_total)
.def_readonly("calculated", &account_t::xdata_t::details_t::calculated)
.def_readonly("gathered", &account_t::xdata_t::details_t::gathered)
diff --git a/src/textual.cc b/src/textual.cc
index 4e24fd44..16054445 100644
--- a/src/textual.cc
+++ b/src/textual.cc
@@ -1633,7 +1633,7 @@ post_t * instance_t::parse_post(char * line,
const amount_t& amt(*post->assigned_amount);
value_t account_total
- (post->account->amount().strip_annotations(keep_details_t()));
+ (post->account->amount(!post->has_flags(POST_VIRTUAL)).strip_annotations(keep_details_t()));
DEBUG("post.assign", "line " << context.linenum << ": "
<< "account balance = " << account_total);
@@ -1666,7 +1666,7 @@ post_t * instance_t::parse_post(char * line,
// Subtract amounts from previous posts to this account in the xact.
for (post_t* p : xact->posts) {
- if (p->account == post->account) {
+ if (p->account == post->account && p->has_flags(POST_VIRTUAL) == post->has_flags(POST_VIRTUAL)) {
diff -= p->amount;
DEBUG("textual.parse", "line " << context.linenum << ": "
<< "Subtracting " << p->amount << ", diff = " << diff);