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
|
||||
// with a subtotaled xact for each commodity used.
|
||||
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
|
||||
// entry, which has one xact for each commodity in each account.
|
||||
|
|
|
|||
|
|
@ -284,7 +284,16 @@ void collapse_xacts::report_subtotal()
|
|||
|
||||
if (count == 1) {
|
||||
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_t& entry = entry_temps.back();
|
||||
entry.payee = last_entry->payee;
|
||||
|
|
@ -311,6 +320,9 @@ void collapse_xacts::operator()(xact_t& xact)
|
|||
xact.add_to_value(subtotal, amount_expr);
|
||||
count++;
|
||||
|
||||
if (only_collapse_if_zero)
|
||||
component_xacts.push_back(&xact);
|
||||
|
||||
last_entry = xact.entry;
|
||||
last_xact = &xact;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -381,17 +381,21 @@ class collapse_xacts : public item_handler<xact_t>
|
|||
entry_t * last_entry;
|
||||
xact_t * last_xact;
|
||||
account_t totals_account;
|
||||
bool only_collapse_if_zero;
|
||||
|
||||
std::list<entry_t> entry_temps;
|
||||
std::list<xact_t> xact_temps;
|
||||
std::list<entry_t> entry_temps;
|
||||
std::list<xact_t> xact_temps;
|
||||
std::list<xact_t *> component_xacts;
|
||||
|
||||
collapse_xacts();
|
||||
|
||||
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),
|
||||
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");
|
||||
}
|
||||
virtual ~collapse_xacts() {
|
||||
|
|
|
|||
|
|
@ -388,6 +388,7 @@ option_t<report_t> * report_t::lookup_option(const char * p)
|
|||
else OPT(cleared);
|
||||
else OPT(code_as_payee);
|
||||
else OPT(collapse);
|
||||
else OPT(collapse_if_zero);
|
||||
else OPT(comm_as_payee);
|
||||
else OPT(cost);
|
||||
else OPT_(current);
|
||||
|
|
|
|||
|
|
@ -229,6 +229,10 @@ public:
|
|||
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, cost);
|
||||
OPTION(report_t, csv_format_);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue