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:
parent
b819475a93
commit
6770380b6d
7 changed files with 164 additions and 16 deletions
|
|
@ -67,8 +67,8 @@ post_handler_ptr chain_pre_post_handlers(post_handler_ptr base_handler,
|
||||||
// future balance.
|
// future balance.
|
||||||
|
|
||||||
if (report.budget_flags != BUDGET_NO_BUDGET) {
|
if (report.budget_flags != BUDGET_NO_BUDGET) {
|
||||||
budget_posts * budget_handler = new budget_posts(handler,
|
budget_posts * budget_handler =
|
||||||
report.budget_flags);
|
new budget_posts(handler, report.terminus.date(), report.budget_flags);
|
||||||
budget_handler->add_period_xacts(report.session.journal->period_xacts);
|
budget_handler->add_period_xacts(report.session.journal->period_xacts);
|
||||||
handler.reset(budget_handler);
|
handler.reset(budget_handler);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1143,20 +1143,44 @@ void budget_posts::report_budget_items(const date_t& date)
|
||||||
|
|
||||||
bool reported;
|
bool reported;
|
||||||
do {
|
do {
|
||||||
|
std::list<pending_posts_list::iterator> posts_to_erase;
|
||||||
|
|
||||||
reported = false;
|
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;
|
optional<date_t> begin = pair.first.start;
|
||||||
if (! begin) {
|
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;
|
continue;
|
||||||
|
if (! pair.first.start)
|
||||||
|
throw_(std::logic_error,
|
||||||
|
_("Failed to find period for periodic transaction"));
|
||||||
begin = pair.first.start;
|
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 &&
|
if (*begin <= date &&
|
||||||
(! pair.first.finish || *begin < *pair.first.finish)) {
|
(! pair.first.finish || *begin < *pair.first.finish)) {
|
||||||
post_t& post = *pair.second;
|
post_t& post = *pair.second;
|
||||||
|
|
||||||
|
++pair.first;
|
||||||
|
if (! pair.first.start)
|
||||||
|
posts_to_erase.push_back(i);
|
||||||
|
|
||||||
DEBUG("budget.generate", "Reporting budget for "
|
DEBUG("budget.generate", "Reporting budget for "
|
||||||
<< post.reported_account()->fullname());
|
<< 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);
|
temp.xdata().add_flags(POST_EXT_COMPOUND);
|
||||||
}
|
}
|
||||||
|
|
||||||
++pair.first;
|
|
||||||
begin = *pair.first.start;
|
|
||||||
|
|
||||||
item_handler<post_t>::operator()(temp);
|
item_handler<post_t>::operator()(temp);
|
||||||
|
|
||||||
reported = true;
|
reported = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach (pending_posts_list::iterator& i, posts_to_erase)
|
||||||
|
pending_posts.erase(i);
|
||||||
} while (reported);
|
} while (reported);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1208,6 +1232,7 @@ void budget_posts::operator()(post_t& post)
|
||||||
handle:
|
handle:
|
||||||
if (post_in_budget && flags & BUDGET_BUDGETED) {
|
if (post_in_budget && flags & BUDGET_BUDGETED) {
|
||||||
report_budget_items(post.date());
|
report_budget_items(post.date());
|
||||||
|
count++;
|
||||||
item_handler<post_t>::operator()(post);
|
item_handler<post_t>::operator()(post);
|
||||||
}
|
}
|
||||||
else if (! post_in_budget && flags & BUDGET_UNBUDGETED) {
|
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)
|
void forecast_posts::add_post(const date_interval_t& period, post_t& post)
|
||||||
{
|
{
|
||||||
date_interval_t i(period);
|
date_interval_t i(period);
|
||||||
|
|
|
||||||
|
|
@ -882,14 +882,17 @@ class budget_posts : public generate_posts
|
||||||
#define BUDGET_WRAP_VALUES 0x04
|
#define BUDGET_WRAP_VALUES 0x04
|
||||||
|
|
||||||
uint_least8_t flags;
|
uint_least8_t flags;
|
||||||
|
date_t terminus;
|
||||||
|
std::size_t count;
|
||||||
|
|
||||||
budget_posts();
|
budget_posts();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
budget_posts(post_handler_ptr handler,
|
budget_posts(post_handler_ptr handler,
|
||||||
|
date_t _terminus,
|
||||||
uint_least8_t _flags = BUDGET_BUDGETED)
|
uint_least8_t _flags = BUDGET_BUDGETED)
|
||||||
: generate_posts(handler), flags(_flags) {
|
: generate_posts(handler), flags(_flags), terminus(_terminus), count(0) {
|
||||||
TRACE_CTOR(budget_posts, "post_handler_ptr, uint_least8_t");
|
TRACE_CTOR(budget_posts, "post_handler_ptr, date_t, uint_least8_t");
|
||||||
}
|
}
|
||||||
virtual ~budget_posts() throw() {
|
virtual ~budget_posts() throw() {
|
||||||
TRACE_DTOR(budget_posts);
|
TRACE_DTOR(budget_posts);
|
||||||
|
|
@ -897,6 +900,7 @@ public:
|
||||||
|
|
||||||
void report_budget_items(const date_t& date);
|
void report_budget_items(const date_t& date);
|
||||||
|
|
||||||
|
virtual void flush();
|
||||||
virtual void operator()(post_t& post);
|
virtual void operator()(post_t& post);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
reg --add-budget books cards
|
reg --add-budget books cards --now=2009/12/31
|
||||||
<<<
|
<<<
|
||||||
~ monthly
|
~ monthly
|
||||||
Expenses:Books $10.00
|
Expenses:Books $10.00
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
reg --budget books
|
reg --budget books --now=2009/12/31
|
||||||
<<<
|
<<<
|
||||||
~ monthly
|
~ monthly
|
||||||
Expenses:Books $10.00
|
Expenses:Books $10.00
|
||||||
|
|
|
||||||
111
test/baseline/opt-budget_range.test
Normal file
111
test/baseline/opt-budget_range.test
Normal 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
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
bal --flat food:out
|
bal --flat food:out --now=2009/12/31
|
||||||
<<<
|
<<<
|
||||||
~ Monthly
|
~ Monthly
|
||||||
Expenses:Auto:Fuel $120.00
|
Expenses:Auto:Fuel $120.00
|
||||||
|
|
@ -13,8 +13,8 @@ bal --flat food:out
|
||||||
$50.00 Expenses:Food:Out
|
$50.00 Expenses:Food:Out
|
||||||
>>>2
|
>>>2
|
||||||
=== 0
|
=== 0
|
||||||
bal --flat --budget food:out
|
bal --flat --budget food:out --now=2009/12/31
|
||||||
>>>1
|
>>>1
|
||||||
$-50.00 Expenses:Food:Out
|
$-150.00 Expenses:Food:Out
|
||||||
>>>2
|
>>>2
|
||||||
=== 0
|
=== 0
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue