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.
This commit is contained in:
John Wiegley 2010-06-17 23:42:23 -04:00
parent f82ae73ecf
commit 31e8ed7587
6 changed files with 19 additions and 8 deletions

View file

@ -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());
}
}

View file

@ -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<subtotal_posts>(new subtotal_posts(handler, amount_expr)));
std::pair<payee_subtotals_map::iterator, bool> result
= payee_subtotals.insert(temp);

View file

@ -313,9 +313,9 @@ void report_payees::flush()
void report_payees::operator()(post_t& post)
{
std::map<string, std::size_t>::iterator i = payees.find(post.xact->payee);
std::map<string, std::size_t>::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++;
}

View file

@ -123,6 +123,14 @@ optional<date_t> post_t::effective_date() const
return date;
}
string post_t::payee() const
{
if (optional<value_t> 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) {

View file

@ -112,6 +112,8 @@ public:
virtual date_t actual_date() const;
virtual optional<date_t> effective_date() const;
string payee() const;
bool must_balance() const {
return ! has_flags(POST_VIRTUAL) || has_flags(POST_MUST_BALANCE);
}

View file

@ -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