I was revisiting some of my accounts hierarchy as part of doing some cleanup and
had some thoughts I thought I'd share here about it for discussion.
One of the topics we've discussed in the past is regarding the use of
subaccounts over payees. For example, consider this transaction imported from a
credit card:
2018-05-01 * "VISIT
PATREON.COM/INSAN FRANCISCO CA" "OPSNT_CMEVT 1234567890"
Liabilities:US:Amex -10.00 USD
Expenses:Online:Media
The problem is that there is no breakdown of the bill into its individual
component parts, which in this case are donations to multiple content creators.
You also can't easily override the payee field for it: the payee for the whole
transaction (Patreon) should be preserved as well, we might want that
information (e.g., the same "channel" might change which service it uses to
receive a donation, thus changing payee for the same channel).
One way I've been getting around this is by using dedicated subaccounts for each
part of the breakdown (in this example they are content creators):
2018-05-01 * "VISIT
PATREON.COM/INSAN FRANCISCO CA" "OPSNT_CMEVT 1234567890"
Liabilities:US:Amex -10.00 USD
Expenses:Online:Media:Safecast 3.00 USD
Expenses:Online:Media:AbroadInJapan 3.00 USD
Expenses:Online:Media:OnlyInJapan 2.00 USD
Some people have in the past expressed disapproval of this method because it
pollutes the expense report with a potentially large number of unnecessary
subaccounts. It was also perceived as unnecessary because the context of our
discussion was limited to that of a single transaction, e.g.,
2018-05-01 * "VISIT
PATREON.COM/INSAN FRANCISCO CA" "OPSNT_CMEVT 1234567890"
Liabilities:US:Amex -3.00 USD
Expenses:Online:Media:AbroadInJapan 3.00 USD
which could be trivial translated to:
2018-05-01 * "AbroadInJapan" "VISIT
PATREON.COM/INSAN FRANCISCO CA - OPSNT_CMEVT 1234567890"
Liabilities:US:Amex -3.00 USD
Expenses:Online:Media 3.00 USD
At the time, we discussed ideas around identifying the parent account as such
(perhaps with metadata on the Open directive) and having the various reporting
codes honor this and aggregate at that level. This was never implemented: it's
unclear how it would generalize to both the SQL tools and all custom scripts,
not elegant.
Another idea is to use metadata to breakdown the parts into what I'll call here
"channels":
2018-05-01 * "VISIT
PATREON.COM/INSAN FRANCISCO CA" "OPSNT_CMEVT 1234567890"
Liabilities:US:Amex -10.00 USD
Expenses:Online:Media 3.00 USD
channel: "Safecast"
Expenses:Online:Media 3.00 USD
channel: "AbroadInJapan"
Expenses:Online:Media 2.00 USD
channel: "OnlyInJapan"
The bean-query/SQL tool has the ability to pull and insert per-posting metadata,
so this fulfills the purpose. Note that this transformation could be done
elegantly entirely by a plugin filtering and transforming select postings.
Another idea, one that we never discussed, is the idea to have a special marker
as part of the account name, marker which would automatically identify a portion
of an account name as being a leaf, e.g.,
2018-05-01 * "VISIT
PATREON.COM/INSAN FRANCISCO CA" "OPSNT_CMEVT 1234567890"
Liabilities:US:Amex -10.00 USD
Expenses:Online:Media/Safecast 3.00 USD
Expenses:Online:Media/AbroadInJapan 3.00 USD
Expenses:Online:Media/OnlyInJapan 2.00 USD
This would probably also be best translated to metadata as in the above. I'm not
sure I like this design because this would require core modifications and
creating a new concept (thus adding complexity to the core); though I have mixed
feelings about not doing something to handle this, because I suspect this use
case is pretty common, e.g., donations, online content, apps from app stores,
etc.
Any further thoughts and discussion appreciated,