From 6770380b6da5061857e0a15539f1b85669d24e62 Mon Sep 17 00:00:00 2001 From: John Wiegley Date: Sat, 19 Jun 2010 16:07:54 -0400 Subject: Subsantial fixes and improvements to budgeting 1. A bounded budget "from DATE to DATE" will now generate entries throughout that entire range, if it is triggered. 2. An unbounded budget begins, as before, in the timeframe of the reported posting which triggered it, but now continues until the present date. --- src/filters.cc | 45 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 39 insertions(+), 6 deletions(-) (limited to 'src/filters.cc') diff --git a/src/filters.cc b/src/filters.cc index 1a45ee8a..1a0ecd50 100644 --- a/src/filters.cc +++ b/src/filters.cc @@ -1143,20 +1143,44 @@ void budget_posts::report_budget_items(const date_t& date) bool reported; do { + std::list posts_to_erase; + reported = false; - foreach (pending_posts_list::value_type& pair, pending_posts) { + for (pending_posts_list::iterator i = pending_posts.begin(); + i != pending_posts.end(); + i++) { + pending_posts_list::value_type& pair(*i); + optional begin = pair.first.start; if (! begin) { - if (! pair.first.find_period(date)) + optional range_begin; + if (pair.first.range) + range_begin = pair.first.range->begin(); + + DEBUG("budget.generate", "Finding period for pending post"); + if (! pair.first.find_period(range_begin ? *range_begin : date)) continue; + if (! pair.first.start) + throw_(std::logic_error, + _("Failed to find period for periodic transaction")); begin = pair.first.start; } - assert(begin); + +#if defined(DEBUG_ON) + DEBUG("budget.generate", "begin = " << *begin); + DEBUG("budget.generate", "date = " << date); + if (pair.first.finish) + DEBUG("budget.generate", "pair.first.finish = " << *pair.first.finish); +#endif if (*begin <= date && (! pair.first.finish || *begin < *pair.first.finish)) { post_t& post = *pair.second; + ++pair.first; + if (! pair.first.start) + posts_to_erase.push_back(i); + DEBUG("budget.generate", "Reporting budget for " << post.reported_account()->fullname()); @@ -1176,14 +1200,14 @@ void budget_posts::report_budget_items(const date_t& date) temp.xdata().add_flags(POST_EXT_COMPOUND); } - ++pair.first; - begin = *pair.first.start; - item_handler::operator()(temp); reported = true; } } + + foreach (pending_posts_list::iterator& i, posts_to_erase) + pending_posts.erase(i); } while (reported); } @@ -1208,6 +1232,7 @@ void budget_posts::operator()(post_t& post) handle: if (post_in_budget && flags & BUDGET_BUDGETED) { report_budget_items(post.date()); + count++; item_handler::operator()(post); } else if (! post_in_budget && flags & BUDGET_UNBUDGETED) { @@ -1215,6 +1240,14 @@ void budget_posts::operator()(post_t& post) } } +void budget_posts::flush() +{ + if (count > 0) + report_budget_items(terminus); + + item_handler::flush(); +} + void forecast_posts::add_post(const date_interval_t& period, post_t& post) { date_interval_t i(period); -- cgit v1.2.3