journal: txn modifier multipliers multiply total-priced amounts (#928)

A different approach: instead of converting to unit prices and fiddling
with the display precision, just multiply the total prices by the same
multiplier (and keep them positive).

This seems a little more natural. I'm not sure if one of these will be
more robust than the other.
This commit is contained in:
Simon Michael 2018-11-13 17:50:30 -08:00
parent d7919003ae
commit b00aa32d7b
2 changed files with 19 additions and 10 deletions

View File

@ -92,12 +92,14 @@ tmPostingRuleToFunction pr =
Nothing -> const $ pamount pr
Just n -> \p ->
-- Multiply the old posting's amount by the posting rule's multiplier.
-- Its display precision will be increased if needed to show all digits.
let
pramount = dbg6 "pramount" $ head $ amounts $ pamount pr
matchedamount = dbg6 "matchedamount" $ pamount p
unitpricedmatchedamount = dbg6 "unitpricedmatchedamount" $ mixedAmountTotalPriceToUnitPrice matchedamount
Mixed as = dbg6 "scaledmatchedamount" $ n `multiplyMixedAmount` unitpricedmatchedamount
-- Handle a matched amount with a total price carefully so as to keep the transaction balanced (#928).
-- Approach 1: convert to a unit price and increase the display precision slightly
-- Mixed as = dbg6 "multipliedamount" $ n `multiplyMixedAmount` mixedAmountTotalPriceToUnitPrice matchedamount
-- Approach 2: multiply the total price (keeping it positive) as well as the quantity
Mixed as = dbg6 "multipliedamount" $ n `multiplyMixedAmountAndPrice` matchedamount
in
case acommodity pramount of
"" -> Mixed as

View File

@ -35,14 +35,21 @@ $ hledger -f- print --auto
$ hledger -f- print --auto
2018/01/01
Expenses:Joint:Widgets $100.00 @@ £50
Expenses:Joint $-100.00 @ £0.5
Liabilities:Joint:Bob $50.00 @ £0.5
Liabilities:Joint:Bill $50.00 @ £0.5
Expenses:Joint $-100.00 @@ £50
Liabilities:Joint:Bob $50.00 @@ £25
Liabilities:Joint:Bill $50.00 @@ £25
Assets:Joint:Bank £-50.00
>=0
# alternate approach: convert to unit prices
#2018/01/01
# Expenses:Joint:Widgets $100.00 @@ £50
# Expenses:Joint $-100.00 @ £0.5
# Liabilities:Joint:Bob $50.00 @ £0.5
# Liabilities:Joint:Bill $50.00 @ £0.5
# Assets:Joint:Bank £-50.00
# Generating auto postings from an implicitly-priced amount. Same as above.
# Generating auto postings from an implicitly-priced amount. Should work like the above.
<
= ^Expenses:Joint
Expenses:Joint *-1
@ -56,9 +63,9 @@ $ hledger -f- print --auto
$ hledger -f- print --auto
2018/01/01
Expenses:Joint:Widgets $100.00
Expenses:Joint $-100.00 @ £0.5
Liabilities:Joint:Bob $50.00 @ £0.5
Liabilities:Joint:Bill $50.00 @ £0.5
Expenses:Joint $-100.00 @@ £50
Liabilities:Joint:Bob $50.00 @@ £25
Liabilities:Joint:Bill $50.00 @@ £25
Assets:Joint:Bank £-50.00
>=0