From 31e8ed7587f6c7dc54e9623dd6a4e09ad5b6b017 Mon Sep 17 00:00:00 2001 From: John Wiegley Date: Thu, 17 Jun 2010 23:42:23 -0400 Subject: Individual postings may each have their own payee If a posting has the metadata field "Payee" set to a string, that will be used as the payee name for that posting. This affects the register report, the payees report, and the --by-payee option. This is useful because sometimes I send, say, 4 checks at a time to my bank. So on my bank statement, this is all just one amount: 2010-06-17 Sample Assets:Bank $400.00 Income:Check1 $-100.00 Income:Check2 $-100.00 Income:Check3 $-100.00 Income:Check4 $-100.00 Though it's important that the Assets:Bank posting be a single posting of $400 value, I'd like for income reports to show whom each check came from. Now I can say: 2010-06-17 Sample Assets:Bank $400.00 Income:Check1 $-100.00 ; Payee: Person One Income:Check2 $-100.00 ; Payee: Person Two Income:Check3 $-100.00 ; Payee: Person Three Income:Check4 $-100.00 ; Payee: Person Four When I report this, it appears as: 10-Jun-17 Sample Assets:Bank $400.00 $400.00 Person One Income:Check1 $-100.00 $300.00 Person Two Income:Check2 $-100.00 $200.00 Person Three Income:Check3 $-100.00 $100.00 Person Four Income:Check4 $-100.00 0 This shows that they are all in the same transaction (which is why the date is not repeated), but they have different payees. --- src/account.cc | 2 +- src/filters.cc | 4 ++-- src/output.cc | 4 ++-- src/post.cc | 10 +++++++++- src/post.h | 2 ++ src/report.h | 5 +++-- 6 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/account.cc b/src/account.cc index ceeb1c12..3e0ad086 100644 --- a/src/account.cc +++ b/src/account.cc @@ -626,7 +626,7 @@ void account_t::xdata_t::details_t::update(post_t& post, if (gather_all) { accounts_referenced.insert(post.account->fullname()); - payees_referenced.insert(post.xact->payee); + payees_referenced.insert(post.payee()); } } diff --git a/src/filters.cc b/src/filters.cc index 03baadc6..f60ce062 100644 --- a/src/filters.cc +++ b/src/filters.cc @@ -1042,10 +1042,10 @@ void by_payee_posts::flush() void by_payee_posts::operator()(post_t& post) { - payee_subtotals_map::iterator i = payee_subtotals.find(post.xact->payee); + payee_subtotals_map::iterator i = payee_subtotals.find(post.payee()); if (i == payee_subtotals.end()) { payee_subtotals_pair - temp(post.xact->payee, + temp(post.payee(), shared_ptr(new subtotal_posts(handler, amount_expr))); std::pair result = payee_subtotals.insert(temp); diff --git a/src/output.cc b/src/output.cc index de0444cf..cc4845a3 100644 --- a/src/output.cc +++ b/src/output.cc @@ -313,9 +313,9 @@ void report_payees::flush() void report_payees::operator()(post_t& post) { - std::map::iterator i = payees.find(post.xact->payee); + std::map::iterator i = payees.find(post.payee()); if (i == payees.end()) - payees.insert(payees_pair(post.xact->payee, 1)); + payees.insert(payees_pair(post.payee(), 1)); else (*i).second++; } diff --git a/src/post.cc b/src/post.cc index 675749fc..7c42e3c5 100644 --- a/src/post.cc +++ b/src/post.cc @@ -123,6 +123,14 @@ optional post_t::effective_date() const return date; } +string post_t::payee() const +{ + if (optional post_payee = get_tag(_("Payee"))) + return post_payee->as_string(); + else + return xact->payee; +} + namespace { value_t get_this(post_t& post) { return scope_value(&post); @@ -160,7 +168,7 @@ namespace { } value_t get_payee(post_t& post) { - return string_value(post.xact->payee); + return string_value(post.payee()); } value_t get_note(post_t& post) { diff --git a/src/post.h b/src/post.h index aec81e89..7111ddef 100644 --- a/src/post.h +++ b/src/post.h @@ -112,6 +112,8 @@ public: virtual date_t actual_date() const; virtual optional effective_date() const; + string payee() const; + bool must_balance() const { return ! has_flags(POST_VIRTUAL) || has_flags(POST_MUST_BALANCE); } diff --git a/src/report.h b/src/report.h index eff375cc..a453d351 100644 --- a/src/report.h +++ b/src/report.h @@ -816,8 +816,9 @@ public: " %(justify(scrub(display_total), total_width, " " 4 + meta_width + date_width + payee_width + account_width" " + amount_width + total_width + prepend_width, true, color))\n%/" - "%(justify(\" \", 2 + date_width + payee_width))" - "%$3 %$4 %$5\n"); + "%(justify(\" \", date_width))" + " %(justify((has_tag(\"Payee\") ? payee : \" \"), payee_width))" + " %$3 %$4 %$5\n"); }); OPTION(report_t, related); // -r -- cgit v1.2.3