diff options
author | John Wiegley <johnw@newartisans.com> | 2010-05-23 15:24:02 -0600 |
---|---|---|
committer | John Wiegley <johnw@newartisans.com> | 2010-05-23 15:45:51 -0600 |
commit | 7bddcd676bc53c6caad7dd283be362fcd53d5721 (patch) | |
tree | d76464891f208aa9e97e21e3ee89360964fe4046 | |
parent | 847a5e4e73afd1c959f7211ceb67d6b9ab0f95d0 (diff) | |
download | fork-ledger-7bddcd676bc53c6caad7dd283be362fcd53d5721.tar.gz fork-ledger-7bddcd676bc53c6caad7dd283be362fcd53d5721.tar.bz2 fork-ledger-7bddcd676bc53c6caad7dd283be362fcd53d5721.zip |
Added --rounding option, which is off by default
The purpose of this option is to add special "<Rounding>" postings, to
ensure that a regiter's running total is *always* the sum of its
postings. Within --rounding, these adjustment postings are missing,
which was the behavior in Ledger 2.x. It can be orders of magnitude
slower to turn it on for large reports with many commodities.
-rw-r--r-- | src/chain.cc | 3 | ||||
-rw-r--r-- | src/filters.cc | 13 | ||||
-rw-r--r-- | src/filters.h | 4 | ||||
-rw-r--r-- | src/report.cc | 1 | ||||
-rw-r--r-- | src/report.h | 2 | ||||
-rwxr-xr-x | test/ConfirmTests.py | 2 |
6 files changed, 17 insertions, 8 deletions
diff --git a/src/chain.cc b/src/chain.cc index 86f639ad..44133391 100644 --- a/src/chain.cc +++ b/src/chain.cc @@ -86,7 +86,8 @@ post_handler_ptr chain_post_handlers(report_t& report, report.HANDLED(unrealized))) handler.reset(new changed_value_posts(handler, report, for_accounts_report, - report.HANDLED(unrealized))); + report.HANDLED(unrealized), + report.HANDLED(rounding))); // calc_posts computes the running total. When this appears will determine, // for example, whether filtered posts are included or excluded from the diff --git a/src/filters.cc b/src/filters.cc index 13e188b1..57c95cd3 100644 --- a/src/filters.cc +++ b/src/filters.cc @@ -420,10 +420,12 @@ void related_posts::flush() changed_value_posts::changed_value_posts(post_handler_ptr handler, report_t& _report, bool _for_accounts_report, - bool _show_unrealized) + bool _show_unrealized, + bool _show_rounding) : item_handler<post_t>(handler), report(_report), for_accounts_report(_for_accounts_report), - show_unrealized(_show_unrealized), last_post(NULL), + show_unrealized(_show_unrealized), + show_rounding(_show_rounding), last_post(NULL), revalued_account(temps.create_account(_("<Revalued>"))), rounding_account(temps.create_account(_("<Rounding>"))) { @@ -505,9 +507,10 @@ void changed_value_posts::output_revaluation(post_t& post, const date_t& date) /* total= */ repriced_total, /* direct_amount= */ false, /* mark_visited= */ false, - /* functor= */ (optional<post_functor_t> + /* functor= */ (show_rounding ? + optional<post_functor_t> (bind(&changed_value_posts::output_rounding, - this, _1)))); + this, _1)) : none)); } else if (show_unrealized) { handle_value @@ -572,7 +575,7 @@ void changed_value_posts::operator()(post_t& post) if (changed_values_only) post.xdata().add_flags(POST_EXT_DISPLAYED); - if (! for_accounts_report) + if (! for_accounts_report && show_rounding) output_rounding(post); item_handler<post_t>::operator()(post); diff --git a/src/filters.h b/src/filters.h index 82fbf687..ced51f3f 100644 --- a/src/filters.h +++ b/src/filters.h @@ -381,6 +381,7 @@ class changed_value_posts : public item_handler<post_t> bool changed_values_only; bool for_accounts_report; bool show_unrealized; + bool show_rounding; post_t * last_post; value_t last_total; value_t last_display_total; @@ -396,7 +397,8 @@ public: changed_value_posts(post_handler_ptr handler, report_t& _report, bool _for_accounts_report, - bool _show_unrealized); + bool _show_unrealized, + bool _show_rounding); virtual ~changed_value_posts() { TRACE_DTOR(changed_value_posts); diff --git a/src/report.cc b/src/report.cc index dfdc77cc..486c0fdf 100644 --- a/src/report.cc +++ b/src/report.cc @@ -954,6 +954,7 @@ option_t<report_t> * report_t::lookup_option(const char * p) else OPT(revalued); else OPT(revalued_only); else OPT(revalued_total_); + else OPT(rounding); break; case 's': OPT(sort_); diff --git a/src/report.h b/src/report.h index aff4af91..aa72832c 100644 --- a/src/report.h +++ b/src/report.h @@ -295,6 +295,7 @@ public: HANDLER(revalued).report(out); HANDLER(revalued_only).report(out); HANDLER(revalued_total_).report(out); + HANDLER(rounding).report(out); HANDLER(seed_).report(out); HANDLER(sort_).report(out); HANDLER(sort_all_).report(out); @@ -818,6 +819,7 @@ public: set_expr(args[0].to_string(), args[1].to_string()); }); + OPTION(report_t, rounding); OPTION(report_t, seed_); OPTION_(report_t, sort_, DO_(args) { // -S diff --git a/test/ConfirmTests.py b/test/ConfirmTests.py index 901ae7cd..6fc04336 100755 --- a/test/ConfirmTests.py +++ b/test/ConfirmTests.py @@ -84,7 +84,7 @@ def confirm_report(command): return not failure for cmd in commands: - if confirm_report('$ledger $cmd ' + re.sub('\$tests', tests, cmd)): + if confirm_report('$ledger --rounding $cmd ' + re.sub('\$tests', tests, cmd)): harness.success() else: harness.failure() |