Added a new --collapse-if-zero option.
This commit is contained in:
parent
11dc80b618
commit
37a1989ca0
5 changed files with 28 additions and 6 deletions
|
|
@ -92,7 +92,8 @@ xact_handler_ptr chain_xact_handlers(report_t& report,
|
||||||
// collapse_xacts causes entries with multiple xacts to appear as entries
|
// collapse_xacts causes entries with multiple xacts to appear as entries
|
||||||
// with a subtotaled xact for each commodity used.
|
// with a subtotaled xact for each commodity used.
|
||||||
if (report.HANDLED(collapse))
|
if (report.HANDLED(collapse))
|
||||||
handler.reset(new collapse_xacts(handler, expr));
|
handler.reset(new collapse_xacts(handler, expr,
|
||||||
|
report.HANDLED(collapse_if_zero)));
|
||||||
|
|
||||||
// subtotal_xacts combines all the xacts it receives into one subtotal
|
// subtotal_xacts combines all the xacts it receives into one subtotal
|
||||||
// entry, which has one xact for each commodity in each account.
|
// entry, which has one xact for each commodity in each account.
|
||||||
|
|
|
||||||
|
|
@ -284,7 +284,16 @@ void collapse_xacts::report_subtotal()
|
||||||
|
|
||||||
if (count == 1) {
|
if (count == 1) {
|
||||||
item_handler<xact_t>::operator()(*last_xact);
|
item_handler<xact_t>::operator()(*last_xact);
|
||||||
} else {
|
}
|
||||||
|
else if (only_collapse_if_zero && ! subtotal.is_zero()) {
|
||||||
|
foreach (xact_t * xact, component_xacts)
|
||||||
|
item_handler<xact_t>::operator()(*xact);
|
||||||
|
component_xacts.clear();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (only_collapse_if_zero)
|
||||||
|
component_xacts.clear();
|
||||||
|
|
||||||
entry_temps.push_back(entry_t());
|
entry_temps.push_back(entry_t());
|
||||||
entry_t& entry = entry_temps.back();
|
entry_t& entry = entry_temps.back();
|
||||||
entry.payee = last_entry->payee;
|
entry.payee = last_entry->payee;
|
||||||
|
|
@ -311,6 +320,9 @@ void collapse_xacts::operator()(xact_t& xact)
|
||||||
xact.add_to_value(subtotal, amount_expr);
|
xact.add_to_value(subtotal, amount_expr);
|
||||||
count++;
|
count++;
|
||||||
|
|
||||||
|
if (only_collapse_if_zero)
|
||||||
|
component_xacts.push_back(&xact);
|
||||||
|
|
||||||
last_entry = xact.entry;
|
last_entry = xact.entry;
|
||||||
last_xact = &xact;
|
last_xact = &xact;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -381,17 +381,21 @@ class collapse_xacts : public item_handler<xact_t>
|
||||||
entry_t * last_entry;
|
entry_t * last_entry;
|
||||||
xact_t * last_xact;
|
xact_t * last_xact;
|
||||||
account_t totals_account;
|
account_t totals_account;
|
||||||
|
bool only_collapse_if_zero;
|
||||||
|
|
||||||
std::list<entry_t> entry_temps;
|
std::list<entry_t> entry_temps;
|
||||||
std::list<xact_t> xact_temps;
|
std::list<xact_t> xact_temps;
|
||||||
|
std::list<xact_t *> component_xacts;
|
||||||
|
|
||||||
collapse_xacts();
|
collapse_xacts();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
collapse_xacts(xact_handler_ptr handler, expr_t& _amount_expr)
|
collapse_xacts(xact_handler_ptr handler, expr_t& _amount_expr,
|
||||||
|
bool _only_collapse_if_zero = false)
|
||||||
: item_handler<xact_t>(handler), amount_expr(_amount_expr),
|
: item_handler<xact_t>(handler), amount_expr(_amount_expr),
|
||||||
count(0), last_entry(NULL), last_xact(NULL),
|
count(0), last_entry(NULL), last_xact(NULL),
|
||||||
totals_account(NULL, "<Total>") {
|
totals_account(NULL, "<Total>"),
|
||||||
|
only_collapse_if_zero(_only_collapse_if_zero) {
|
||||||
TRACE_CTOR(collapse_xacts, "xact_handler_ptr");
|
TRACE_CTOR(collapse_xacts, "xact_handler_ptr");
|
||||||
}
|
}
|
||||||
virtual ~collapse_xacts() {
|
virtual ~collapse_xacts() {
|
||||||
|
|
|
||||||
|
|
@ -388,6 +388,7 @@ option_t<report_t> * report_t::lookup_option(const char * p)
|
||||||
else OPT(cleared);
|
else OPT(cleared);
|
||||||
else OPT(code_as_payee);
|
else OPT(code_as_payee);
|
||||||
else OPT(collapse);
|
else OPT(collapse);
|
||||||
|
else OPT(collapse_if_zero);
|
||||||
else OPT(comm_as_payee);
|
else OPT(comm_as_payee);
|
||||||
else OPT(cost);
|
else OPT(cost);
|
||||||
else OPT_(current);
|
else OPT_(current);
|
||||||
|
|
|
||||||
|
|
@ -229,6 +229,10 @@ public:
|
||||||
parent->append_display_predicate("depth<=1");
|
parent->append_display_predicate("depth<=1");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
OPTION_(report_t, collapse_if_zero, DO() {
|
||||||
|
parent->HANDLER(collapse).on();
|
||||||
|
});
|
||||||
|
|
||||||
OPTION(report_t, comm_as_payee); // -x
|
OPTION(report_t, comm_as_payee); // -x
|
||||||
OPTION(report_t, cost);
|
OPTION(report_t, cost);
|
||||||
OPTION(report_t, csv_format_);
|
OPTION(report_t, csv_format_);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue