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:
parent
78e57ac4cf
commit
bfa6a643a1
3 changed files with 36 additions and 31 deletions
|
|
@ -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"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue