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.
This commit is contained in:
John Wiegley 2010-06-19 16:07:54 -04:00
parent b819475a93
commit 6770380b6d
7 changed files with 164 additions and 16 deletions

View file

@ -67,8 +67,8 @@ post_handler_ptr chain_pre_post_handlers(post_handler_ptr base_handler,
// future balance.
if (report.budget_flags != BUDGET_NO_BUDGET) {
budget_posts * budget_handler = new budget_posts(handler,
report.budget_flags);
budget_posts * budget_handler =
new budget_posts(handler, report.terminus.date(), report.budget_flags);
budget_handler->add_period_xacts(report.session.journal->period_xacts);
handler.reset(budget_handler);

View file

@ -1143,20 +1143,44 @@ void budget_posts::report_budget_items(const date_t& date)
bool reported;
do {
std::list<pending_posts_list::iterator> 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<date_t> begin = pair.first.start;
if (! begin) {
if (! pair.first.find_period(date))
optional<date_t> 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<post_t>::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<post_t>::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<post_t>::flush();
}
void forecast_posts::add_post(const date_interval_t& period, post_t& post)
{
date_interval_t i(period);

View file

@ -882,14 +882,17 @@ class budget_posts : public generate_posts
#define BUDGET_WRAP_VALUES 0x04
uint_least8_t flags;
date_t terminus;
std::size_t count;
budget_posts();
public:
budget_posts(post_handler_ptr handler,
uint_least8_t _flags = BUDGET_BUDGETED)
: generate_posts(handler), flags(_flags) {
TRACE_CTOR(budget_posts, "post_handler_ptr, uint_least8_t");
date_t _terminus,
uint_least8_t _flags = BUDGET_BUDGETED)
: generate_posts(handler), flags(_flags), terminus(_terminus), count(0) {
TRACE_CTOR(budget_posts, "post_handler_ptr, date_t, uint_least8_t");
}
virtual ~budget_posts() throw() {
TRACE_DTOR(budget_posts);
@ -897,6 +900,7 @@ public:
void report_budget_items(const date_t& date);
virtual void flush();
virtual void operator()(post_t& post);
};

View file

@ -1,4 +1,4 @@
reg --add-budget books cards
reg --add-budget books cards --now=2009/12/31
<<<
~ monthly
Expenses:Books $10.00

View file

@ -1,4 +1,4 @@
reg --budget books
reg --budget books --now=2009/12/31
<<<
~ monthly
Expenses:Books $10.00

View file

@ -0,0 +1,111 @@
reg --now=2010/02 --sort=date exp --budget
<<<
~ monthly
Expenses:Food $100
Expenses:Movies $20
Assets:Cash
~ monthly from 2009
Expenses:Food $101
Expenses:Movies $21
Assets:Cash
~ monthly to 2010
Expenses:Food $102
Expenses:Movies $22
Assets:Cash
~ monthly from 2009 to 2010
Expenses:Food $103
Expenses:Movies $23
Assets:Cash
2009/06/05 Grocery
Expenses:Food $5
Assets:Cash
>>>
09-Jan-01 Budget transaction Expenses:Food $-101 $-101
09-Jan-01 Budget transaction Expenses:Movies $-21 $-122
09-Jan-01 Budget transaction Expenses:Food $-103 $-225
09-Jan-01 Budget transaction Expenses:Movies $-23 $-248
09-Feb-01 Budget transaction Expenses:Food $-101 $-349
09-Feb-01 Budget transaction Expenses:Movies $-21 $-370
09-Feb-01 Budget transaction Expenses:Food $-103 $-473
09-Feb-01 Budget transaction Expenses:Movies $-23 $-496
09-Mar-01 Budget transaction Expenses:Food $-101 $-597
09-Mar-01 Budget transaction Expenses:Movies $-21 $-618
09-Mar-01 Budget transaction Expenses:Food $-103 $-721
09-Mar-01 Budget transaction Expenses:Movies $-23 $-744
09-Apr-01 Budget transaction Expenses:Food $-101 $-845
09-Apr-01 Budget transaction Expenses:Movies $-21 $-866
09-Apr-01 Budget transaction Expenses:Food $-103 $-969
09-Apr-01 Budget transaction Expenses:Movies $-23 $-992
09-May-01 Budget transaction Expenses:Food $-101 $-1093
09-May-01 Budget transaction Expenses:Movies $-21 $-1114
09-May-01 Budget transaction Expenses:Food $-103 $-1217
09-May-01 Budget transaction Expenses:Movies $-23 $-1240
09-Jun-01 Budget transaction Expenses:Food $-100 $-1340
09-Jun-01 Budget transaction Expenses:Movies $-20 $-1360
09-Jun-01 Budget transaction Expenses:Food $-102 $-1462
09-Jun-01 Budget transaction Expenses:Movies $-22 $-1484
09-Jun-01 Budget transaction Expenses:Food $-101 $-1585
09-Jun-01 Budget transaction Expenses:Movies $-21 $-1606
09-Jun-01 Budget transaction Expenses:Food $-103 $-1709
09-Jun-01 Budget transaction Expenses:Movies $-23 $-1732
09-Jun-05 Grocery Expenses:Food $5 $-1727
09-Jul-01 Budget transaction Expenses:Food $-100 $-1827
09-Jul-01 Budget transaction Expenses:Movies $-20 $-1847
09-Jul-01 Budget transaction Expenses:Food $-101 $-1948
09-Jul-01 Budget transaction Expenses:Movies $-21 $-1969
09-Jul-01 Budget transaction Expenses:Food $-102 $-2071
09-Jul-01 Budget transaction Expenses:Movies $-22 $-2093
09-Jul-01 Budget transaction Expenses:Food $-103 $-2196
09-Jul-01 Budget transaction Expenses:Movies $-23 $-2219
09-Aug-01 Budget transaction Expenses:Food $-100 $-2319
09-Aug-01 Budget transaction Expenses:Movies $-20 $-2339
09-Aug-01 Budget transaction Expenses:Food $-101 $-2440
09-Aug-01 Budget transaction Expenses:Movies $-21 $-2461
09-Aug-01 Budget transaction Expenses:Food $-102 $-2563
09-Aug-01 Budget transaction Expenses:Movies $-22 $-2585
09-Aug-01 Budget transaction Expenses:Food $-103 $-2688
09-Aug-01 Budget transaction Expenses:Movies $-23 $-2711
09-Sep-01 Budget transaction Expenses:Food $-100 $-2811
09-Sep-01 Budget transaction Expenses:Movies $-20 $-2831
09-Sep-01 Budget transaction Expenses:Food $-101 $-2932
09-Sep-01 Budget transaction Expenses:Movies $-21 $-2953
09-Sep-01 Budget transaction Expenses:Food $-102 $-3055
09-Sep-01 Budget transaction Expenses:Movies $-22 $-3077
09-Sep-01 Budget transaction Expenses:Food $-103 $-3180
09-Sep-01 Budget transaction Expenses:Movies $-23 $-3203
09-Oct-01 Budget transaction Expenses:Food $-100 $-3303
09-Oct-01 Budget transaction Expenses:Movies $-20 $-3323
09-Oct-01 Budget transaction Expenses:Food $-101 $-3424
09-Oct-01 Budget transaction Expenses:Movies $-21 $-3445
09-Oct-01 Budget transaction Expenses:Food $-102 $-3547
09-Oct-01 Budget transaction Expenses:Movies $-22 $-3569
09-Oct-01 Budget transaction Expenses:Food $-103 $-3672
09-Oct-01 Budget transaction Expenses:Movies $-23 $-3695
09-Nov-01 Budget transaction Expenses:Food $-100 $-3795
09-Nov-01 Budget transaction Expenses:Movies $-20 $-3815
09-Nov-01 Budget transaction Expenses:Food $-101 $-3916
09-Nov-01 Budget transaction Expenses:Movies $-21 $-3937
09-Nov-01 Budget transaction Expenses:Food $-102 $-4039
09-Nov-01 Budget transaction Expenses:Movies $-22 $-4061
09-Nov-01 Budget transaction Expenses:Food $-103 $-4164
09-Nov-01 Budget transaction Expenses:Movies $-23 $-4187
09-Dec-01 Budget transaction Expenses:Food $-100 $-4287
09-Dec-01 Budget transaction Expenses:Movies $-20 $-4307
09-Dec-01 Budget transaction Expenses:Food $-101 $-4408
09-Dec-01 Budget transaction Expenses:Movies $-21 $-4429
09-Dec-01 Budget transaction Expenses:Food $-102 $-4531
09-Dec-01 Budget transaction Expenses:Movies $-22 $-4553
09-Dec-01 Budget transaction Expenses:Food $-103 $-4656
09-Dec-01 Budget transaction Expenses:Movies $-23 $-4679
10-Jan-01 Budget transaction Expenses:Food $-100 $-4779
10-Jan-01 Budget transaction Expenses:Movies $-20 $-4799
10-Jan-01 Budget transaction Expenses:Food $-101 $-4900
10-Jan-01 Budget transaction Expenses:Movies $-21 $-4921
10-Feb-01 Budget transaction Expenses:Food $-100 $-5021
10-Feb-01 Budget transaction Expenses:Movies $-20 $-5041
10-Feb-01 Budget transaction Expenses:Food $-101 $-5142
10-Feb-01 Budget transaction Expenses:Movies $-21 $-5163

View file

@ -1,4 +1,4 @@
bal --flat food:out
bal --flat food:out --now=2009/12/31
<<<
~ Monthly
Expenses:Auto:Fuel $120.00
@ -13,8 +13,8 @@ bal --flat food:out
$50.00 Expenses:Food:Out
>>>2
=== 0
bal --flat --budget food:out
bal --flat --budget food:out --now=2009/12/31
>>>1
$-50.00 Expenses:Food:Out
$-150.00 Expenses:Food:Out
>>>2
=== 0