Improved handling of --empty option

For example, in period reports null transactions are only generated for
empty periods if --empty is used.  Otherwise, the presence of such
transactions can get confusing.
This commit is contained in:
John Wiegley 2009-02-15 20:59:13 -04:00
parent 78e57ac4cf
commit bfa6a643a1
3 changed files with 36 additions and 31 deletions

View file

@ -113,7 +113,8 @@ xact_handler_ptr chain_xact_handlers(report_t& report,
if (report.HANDLED(period_)) { if (report.HANDLED(period_)) {
handler.reset(new interval_xacts(handler, expr, handler.reset(new interval_xacts(handler, expr,
report.HANDLER(period_).str(), report.HANDLER(period_).str(),
report.session.master.get())); report.session.master.get(),
report.HANDLED(empty)));
handler.reset(new sort_xacts(handler, "date")); handler.reset(new sort_xacts(handler, "date"));
} }

View file

@ -476,28 +476,29 @@ void interval_xacts::operator()(xact_t& xact)
(is_valid(interval.end) && date >= interval.end)) (is_valid(interval.end) && date >= interval.end))
return; return;
if (interval) { if (! started) {
if (! started) { if (! is_valid(interval.begin))
if (! is_valid(interval.begin)) interval.set_start(date);
interval.set_start(date); start = interval.begin;
start = interval.begin; started = true;
started = true; }
}
date_t quant = interval.increment(interval.begin); date_t quant = interval.increment(interval.begin);
if (date >= quant) { if (date >= quant) {
if (last_xact) if (last_xact)
report_subtotal(quant); report_subtotal(quant);
date_t temp; date_t temp;
while (date >= (temp = interval.increment(quant))) { while (date >= (temp = interval.increment(quant))) {
if (quant == temp) if (quant == temp)
break; break;
interval.begin = quant; interval.begin = quant;
quant = temp; quant = temp;
// Generate a null transaction, so the intervening periods can be seen if (generate_empty_xacts) {
// when -E is used, or if the calculated amount ends up being non-zero // Generate a null transaction, so the intervening periods can be
// seen when -E is used, or if the calculated amount ends up being
// non-zero
entry_temps.push_back(entry_t()); entry_temps.push_back(entry_t());
entry_t& null_entry = entry_temps.back(); entry_t& null_entry = entry_temps.back();
null_entry.add_flags(ITEM_TEMP); null_entry.add_flags(ITEM_TEMP);
@ -511,16 +512,15 @@ void interval_xacts::operator()(xact_t& xact)
last_xact = &null_xact; last_xact = &null_xact;
subtotal_xacts::operator()(null_xact); subtotal_xacts::operator()(null_xact);
report_subtotal(quant); report_subtotal(quant);
} }
start = interval.begin = quant;
} }
start = interval.begin = quant;
subtotal_xacts::operator()(xact);
} else {
item_handler<xact_t>::operator()(xact);
} }
subtotal_xacts::operator()(xact);
last_xact = &xact; last_xact = &xact;
} }

View file

@ -498,6 +498,9 @@ public:
*/ */
class subtotal_xacts : public item_handler<xact_t> class subtotal_xacts : public item_handler<xact_t>
{ {
subtotal_xacts();
protected:
class acct_value_t class acct_value_t
{ {
acct_value_t(); acct_value_t();
@ -524,8 +527,6 @@ class subtotal_xacts : public item_handler<xact_t>
typedef std::map<string, acct_value_t> values_map; typedef std::map<string, acct_value_t> values_map;
typedef std::pair<string, acct_value_t> values_pair; typedef std::pair<string, acct_value_t> values_pair;
subtotal_xacts();
protected: protected:
expr_t& amount_expr; expr_t& amount_expr;
values_map values; values_map values;
@ -568,21 +569,24 @@ class interval_xacts : public subtotal_xacts
{ {
interval_t interval; interval_t interval;
xact_t * last_xact; xact_t * last_xact;
bool started; bool started;
std::list<entry_t> entry_temps; std::list<entry_t> entry_temps;
std::list<xact_t> xact_temps; std::list<xact_t> xact_temps;
account_t empty_account; account_t empty_account;
bool generate_empty_xacts;
interval_xacts(); interval_xacts();
public: public:
interval_xacts(xact_handler_ptr _handler, expr_t& amount_expr, interval_xacts(xact_handler_ptr _handler, expr_t& amount_expr,
const interval_t& _interval, account_t * master = NULL) const interval_t& _interval, account_t * master = NULL,
bool _generate_empty_xacts = false)
: subtotal_xacts(_handler, amount_expr), interval(_interval), : subtotal_xacts(_handler, amount_expr), interval(_interval),
last_xact(NULL), started(false), empty_account(master, "<Empty>") { last_xact(NULL), started(false), empty_account(master, "<None>"),
generate_empty_xacts(_generate_empty_xacts) {
TRACE_CTOR(interval_xacts, TRACE_CTOR(interval_xacts,
"xact_handler_ptr, const interval_t&, bool"); "xact_handler_ptr, expr_t&, const interval_t&, account_t *, bool");
} }
virtual ~interval_xacts() throw() { virtual ~interval_xacts() throw() {
TRACE_DTOR(interval_xacts); TRACE_DTOR(interval_xacts);