summaryrefslogtreecommitdiff
path: root/report.cc
diff options
context:
space:
mode:
authorJohn Wiegley <johnw@newartisans.com>2008-08-05 13:17:04 -0400
committerJohn Wiegley <johnw@newartisans.com>2008-08-05 18:05:49 -0400
commitf6f4a46cf5b14f9a2170cd6475958efbf320caec (patch)
tree05bc1defcdebc201de3dd10477483d906a842821 /report.cc
parentb7970b29855563e4c67f85af8b31233eda80c22a (diff)
downloadfork-ledger-f6f4a46cf5b14f9a2170cd6475958efbf320caec.tar.gz
fork-ledger-f6f4a46cf5b14f9a2170cd6475958efbf320caec.tar.bz2
fork-ledger-f6f4a46cf5b14f9a2170cd6475958efbf320caec.zip
Moved around most of the files so that source code is in src/, documentation
is in doc/, etc.
Diffstat (limited to 'report.cc')
-rw-r--r--report.cc432
1 files changed, 0 insertions, 432 deletions
diff --git a/report.cc b/report.cc
deleted file mode 100644
index 92f20d4f..00000000
--- a/report.cc
+++ /dev/null
@@ -1,432 +0,0 @@
-/*
- * Copyright (c) 2003-2008, John Wiegley. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * - Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * - Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * - Neither the name of New Artisans LLC nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "report.h"
-#include "reconcile.h"
-
-namespace ledger {
-
-#if 0
-void report_t::process_options(const std::string& command,
- strings_list::iterator arg,
- strings_list::iterator args_end)
-{
- // Configure some other options depending on report type
-
- if (command == "p" || command == "e" || command == "w") {
- show_related =
- show_all_related = true;
- }
- else if (command == "E") {
- show_subtotal = true;
- }
- else if (show_related) {
- if (command == "r") {
- show_inverted = true;
- } else {
- show_subtotal = true;
- show_all_related = true;
- }
- }
-
- if (command != "b" && command != "r")
- amount_t::keep_base = true;
-
- // Process remaining command-line arguments
-
- if (command != "e") {
- // Treat the remaining command-line arguments as regular
- // expressions, used for refining report results.
-
- std::list<std::string>::iterator i = arg;
- for (; i != args_end; i++)
- if (*i == "--")
- break;
-
- if (i != arg)
- regexps_to_predicate(command, arg, i, true,
- (command == "b" && ! show_subtotal &&
- display_predicate.empty()));
- if (i != args_end && ++i != args_end)
- regexps_to_predicate(command, i, args_end);
- }
-
- // Setup the default value for the display predicate
-
- if (display_predicate.empty()) {
- if (command == "b") {
- if (! show_empty)
- display_predicate = "T";
- if (! show_subtotal) {
- if (! display_predicate.empty())
- display_predicate += "&";
- display_predicate += "l<=1";
- }
- }
- else if (command == "E") {
- display_predicate = "t";
- }
- else if (command == "r" && ! show_empty) {
- display_predicate = "a";
- }
- }
-
- DEBUG_PRINT("ledger.config.predicates", "Predicate: " << predicate);
- DEBUG_PRINT("ledger.config.predicates", "Display P: " << display_predicate);
-
- // Setup the values of %t and %T, used in format strings
-
- if (! amount_expr.empty())
- ledger::amount_expr = amount_expr;
- if (! total_expr.empty())
- ledger::total_expr = total_expr;
-
- // Now setup the various formatting strings
-
- if (! date_output_format.empty())
- date_t::output_format = date_output_format;
-
- amount_t::keep_price = keep_price;
- amount_t::keep_date = keep_date;
- amount_t::keep_tag = keep_tag;
-
- if (! report_period.empty() && ! sort_all)
- entry_sort = true;
-}
-#endif
-
-xact_handler_ptr
-report_t::chain_xact_handlers(xact_handler_ptr base_handler,
- const bool handle_individual_xacts)
-{
- bool remember_components = false;
-
- xact_handler_ptr handler(base_handler);
-
- // format_xacts write each xact received to the
- // output stream.
- if (handle_individual_xacts) {
- // truncate_entries cuts off a certain number of _entries_ from
- // being displayed. It does not affect calculation.
- if (head_entries || tail_entries)
- handler.reset(new truncate_entries(handler, head_entries, tail_entries));
-
- // filter_xacts will only pass through xacts
- // matching the `display_predicate'.
- if (! display_predicate.empty())
- handler.reset(new filter_xacts(handler, display_predicate));
-
- // calc_xacts computes the running total. When this
- // appears will determine, for example, whether filtered
- // xacts are included or excluded from the running total.
- handler.reset(new calc_xacts(handler));
-
- // component_xacts looks for reported xact that
- // match the given `descend_expr', and then reports the
- // xacts which made up the total for that reported
- // xact.
- if (! descend_expr.empty()) {
- std::list<std::string> descend_exprs;
-
- std::string::size_type beg = 0;
- for (std::string::size_type pos = descend_expr.find(';');
- pos != std::string::npos;
- beg = pos + 1, pos = descend_expr.find(';', beg))
- descend_exprs.push_back(std::string(descend_expr, beg, pos - beg));
- descend_exprs.push_back(std::string(descend_expr, beg));
-
- for (std::list<std::string>::reverse_iterator i =
- descend_exprs.rbegin();
- i != descend_exprs.rend();
- i++)
- handler.reset(new component_xacts(handler, *i));
-
- remember_components = true;
- }
-
- // reconcile_xacts will pass through only those
- // xacts which can be reconciled to a given balance
- // (calculated against the xacts which it receives).
- if (! reconcile_balance.empty()) {
- date_t cutoff = current_date;
- if (! reconcile_date.empty())
- cutoff = parse_date(reconcile_date);
- handler.reset(new reconcile_xacts
- (handler, value_t(reconcile_balance), cutoff));
- }
-
- // filter_xacts will only pass through xacts
- // matching the `secondary_predicate'.
- if (! secondary_predicate.empty())
- handler.reset(new filter_xacts(handler, secondary_predicate));
-
- // sort_xacts will sort all the xacts it sees, based
- // on the `sort_order' value expression.
- if (! sort_string.empty()) {
- if (entry_sort)
- handler.reset(new sort_entries(handler, sort_string));
- else
- handler.reset(new sort_xacts(handler, sort_string));
- }
-
- // changed_value_xacts adds virtual xacts to the
- // list to account for changes in market value of commodities,
- // which otherwise would affect the running total unpredictably.
- if (show_revalued)
- handler.reset(new changed_value_xacts(handler, show_revalued_only));
-
- // collapse_xacts causes entries with multiple xacts
- // to appear as entries with a subtotaled xact for each
- // commodity used.
- if (show_collapsed)
- handler.reset(new collapse_xacts(handler));
-
- // subtotal_xacts combines all the xacts it receives
- // into one subtotal entry, which has one xact for each
- // commodity in each account.
- //
- // period_xacts is like subtotal_xacts, but it
- // subtotals according to time periods rather than totalling
- // everything.
- //
- // dow_xacts is like period_xacts, except that it
- // reports all the xacts that fall on each subsequent day
- // of the week.
- if (show_subtotal)
- handler.reset(new subtotal_xacts(handler, remember_components));
-
- if (days_of_the_week)
- handler.reset(new dow_xacts(handler, remember_components));
- else if (by_payee)
- handler.reset(new by_payee_xacts(handler, remember_components));
-
- // interval_xacts groups xacts together based on a
- // time period, such as weekly or monthly.
- if (! report_period.empty()) {
- handler.reset(new interval_xacts(handler, report_period,
- remember_components));
- handler.reset(new sort_xacts(handler, "d"));
- }
- }
-
- // invert_xacts inverts the value of the xacts it
- // receives.
- if (show_inverted)
- handler.reset(new invert_xacts(handler));
-
- // related_xacts will pass along all xacts related
- // to the xact received. If `show_all_related' is true,
- // then all the entry's xacts are passed; meaning that if
- // one xact of an entry is to be printed, all the
- // xact for that entry will be printed.
- if (show_related)
- handler.reset(new related_xacts(handler, show_all_related));
-
- // This filter_xacts will only pass through xacts
- // matching the `predicate'.
- if (! predicate.empty()) {
- DEBUG("report.predicate",
- "Report predicate expression = " << predicate);
- handler.reset(new filter_xacts(handler, predicate));
- }
-
-#if 0
- // budget_xacts takes a set of xacts from a data
- // file and uses them to generate "budget xacts" which
- // balance against the reported xacts.
- //
- // forecast_xacts is a lot like budget_xacts, except
- // that it adds entries only for the future, and does not balance
- // them against anything but the future balance.
-
- if (budget_flags) {
- budget_xacts * budget_handler
- = new budget_xacts(handler, budget_flags);
- budget_handler->add_period_entries(journal->period_entries);
- handler.reset(budget_handler);
-
- // Apply this before the budget handler, so that only matching
- // xacts are calculated toward the budget. The use of
- // filter_xacts above will further clean the results so
- // that no automated xacts that don't match the filter get
- // reported.
- if (! predicate.empty())
- handler.reset(new filter_xacts(handler, predicate));
- }
- else if (! forecast_limit.empty()) {
- forecast_xacts * forecast_handler
- = new forecast_xacts(handler, forecast_limit);
- forecast_handler->add_period_entries(journal->period_entries);
- handler.reset(forecast_handler);
-
- // See above, under budget_xacts.
- if (! predicate.empty())
- handler.reset(new filter_xacts(handler, predicate));
- }
-#endif
-
- if (comm_as_payee)
- handler.reset(new set_comm_as_payee(handler));
- else if (code_as_payee)
- handler.reset(new set_code_as_payee(handler));
-
- return handler;
-}
-
-void report_t::xacts_report(xact_handler_ptr handler)
-{
- session_xacts_iterator walker(session);
- pass_down_xacts(chain_xact_handlers(handler), walker);
- handler->flush();
-
- if (DO_VERIFY())
- session.clean_xacts();
-}
-
-void report_t::entry_report(xact_handler_ptr handler, entry_t& entry)
-{
- entry_xacts_iterator walker(entry);
- pass_down_xacts(chain_xact_handlers(handler), walker);
- handler->flush();
-
- if (DO_VERIFY())
- session.clean_xacts(entry);
-}
-
-void report_t::sum_all_accounts()
-{
- session_xacts_iterator walker(session);
- pass_down_xacts
- (chain_xact_handlers(xact_handler_ptr(new set_account_value), false),
- walker);
- // no flush() needed with set_account_value
- session.master->calculate_sums();
-}
-
-void report_t::accounts_report(acct_handler_ptr handler)
-{
- sum_all_accounts();
-
- if (sort_string.empty()) {
- basic_accounts_iterator walker(*session.master);
- pass_down_accounts(handler, walker);
- } else {
- sorted_accounts_iterator walker(*session.master, sort_string);
- pass_down_accounts(handler, walker);
- }
- handler->flush();
-
- if (DO_VERIFY()) {
- session.clean_xacts();
- session.clean_accounts();
- }
-}
-
-void report_t::commodities_report(const string& format)
-{
-}
-
-value_t report_t::get_amount_expr(call_scope_t& scope)
-{
- return amount_expr.calc(scope);
-}
-
-value_t report_t::get_total_expr(call_scope_t& scope)
-{
- return total_expr.calc(scope);
-}
-
-expr_t::ptr_op_t report_t::lookup(const string& name)
-{
- const char * p = name.c_str();
- switch (*p) {
- case 'f':
- if (std::strncmp(p, "fmt_", 4) == 0) {
- p = p + 4;
- switch (*p) {
- case 't':
- return MAKE_FUNCTOR(report_t::get_amount_expr);
- case 'T':
- return MAKE_FUNCTOR(report_t::get_total_expr);
- }
- }
- break;
-
- case 'o':
- if (std::strncmp(p, "opt_", 4) == 0) {
- p = p + 4;
- switch (*p) {
- case 'a':
- if (std::strcmp(p, "amount_") == 0)
- return MAKE_FUNCTOR(report_t::option_amount_);
- break;
-
- case 'f':
- if (std::strcmp(p, "F_") == 0 ||
- std::strcmp(p, "format_") == 0)
- return MAKE_FUNCTOR(report_t::option_format_);
- break;
-
- case 'j':
- if (! (*p + 1))
- return MAKE_FUNCTOR(report_t::option_amount_data);
- break;
-
- case 'J':
- if (! (*p + 1))
- return MAKE_FUNCTOR(report_t::option_total_data);
- break;
-
- case 'l':
- if (std::strcmp(p, "l_") || std::strcmp(p, "limit_"))
- return MAKE_FUNCTOR(report_t::option_limit_);
- break;
-
- case 't':
- if (std::strcmp(p, "t_"))
- return MAKE_FUNCTOR(report_t::option_amount_);
- else if (std::strcmp(p, "total_") == 0)
- return MAKE_FUNCTOR(report_t::option_total_);
- break;
-
- case 'T':
- if (std::strcmp(p, "T_"))
- return MAKE_FUNCTOR(report_t::option_total_);
- break;
- }
- }
- break;
- }
-
- return session.lookup(name);
-}
-
-} // namespace ledger