inferred amounts use the cost commodity if known, like ledger (#69)
This commit is contained in:
parent
470155dc63
commit
9bdb170a0a
@ -141,17 +141,20 @@ isTransactionBalanced canonicalcommoditymap t =
|
||||
bvsum' = canonicaliseMixedAmountCommodity canonicalcommoditymap $ costOfMixedAmount bvsum
|
||||
|
||||
-- | Ensure this transaction is balanced, possibly inferring a missing
|
||||
-- amount or a conversion price first, or return an error message.
|
||||
-- amount or conversion price, or return an error message.
|
||||
--
|
||||
-- Balancing is affected by the provided commodities' display precisions.
|
||||
-- Balancing is affected by commodity display precisions, so those may
|
||||
-- be provided.
|
||||
--
|
||||
-- We can infer an amount when there are multiple real postings and
|
||||
-- exactly one of them is amountless; likewise for balanced virtual
|
||||
-- postings. Inferred amounts are converted to cost basis when possible.
|
||||
-- We can infer a missing real amount when there are multiple real
|
||||
-- postings and exactly one of them is amountless (likewise for
|
||||
-- balanced virtual postings). Inferred amounts are converted to cost
|
||||
-- basis when possible.
|
||||
--
|
||||
-- We can infer a price when all amounts were specified and the sum of
|
||||
-- real postings' amounts is exactly two non-explicitly-priced amounts in
|
||||
-- different commodities; likewise for balanced virtual postings.
|
||||
-- We can infer a conversion price when all real amounts are specified
|
||||
-- and the sum of real postings' amounts is exactly two
|
||||
-- non-explicitly-priced amounts in different commodities (likewise
|
||||
-- for balanced virtual postings).
|
||||
balanceTransaction :: Maybe (Map.Map String Commodity) -> Transaction -> Either String Transaction
|
||||
balanceTransaction canonicalcommoditymap t@Transaction{tpostings=ps}
|
||||
| length rwithoutamounts > 1 || length bvwithoutamounts > 1
|
||||
@ -166,8 +169,8 @@ balanceTransaction canonicalcommoditymap t@Transaction{tpostings=ps}
|
||||
bvamounts = map pamount bvwithamounts
|
||||
t' = t{tpostings=map inferamount ps}
|
||||
where
|
||||
inferamount p | not (hasAmount p) && isReal p = p{pamount = (- sum ramounts)}
|
||||
| not (hasAmount p) && isBalancedVirtual p = p{pamount = (- sum bvamounts)}
|
||||
inferamount p | not (hasAmount p) && isReal p = p{pamount = costOfMixedAmount (- sum ramounts)}
|
||||
| not (hasAmount p) && isBalancedVirtual p = p{pamount = costOfMixedAmount (- sum bvamounts)}
|
||||
| otherwise = p
|
||||
|
||||
-- maybe infer conversion prices, for real postings
|
||||
|
||||
@ -1,21 +1,35 @@
|
||||
# http://code.google.com/p/hledger/issues/detail?id=23
|
||||
#
|
||||
# 1. with explicit price:
|
||||
# prices' commodities are unobserved, so $'s display precision here should be 2 not 4
|
||||
bin/hledger -f - print --cost
|
||||
# 1. original test case, this should balance since price precisions do
|
||||
# not affect the canonical display precisions used for display and balancing
|
||||
bin/hledger -f - print
|
||||
<<<
|
||||
2010/1/1
|
||||
a $0.00
|
||||
a 1C @ $1.0049
|
||||
a
|
||||
2010/1/1 x
|
||||
A 55.3653 C @ 30.92189512 D
|
||||
A -1712 D
|
||||
>>>
|
||||
2010/01/01
|
||||
a 0
|
||||
a $1.00
|
||||
a $-1.00
|
||||
2010/01/01 x
|
||||
A 55.3653 C @ 30.92189512 D
|
||||
A -1712 D
|
||||
|
||||
>>>=0
|
||||
|
||||
## 1b. here $'s canonical display precision should be 2 not 4
|
||||
## XXX no, because the inferred amount $1.0049 is observed
|
||||
# bin/hledger -f - print --cost
|
||||
# <<<
|
||||
# 2010/1/1
|
||||
# a $0.00
|
||||
# a 1C @ $1.0049
|
||||
# a
|
||||
# >>>
|
||||
# 2010/01/01
|
||||
# a 0
|
||||
# a $1.00
|
||||
# a $-1.00
|
||||
#
|
||||
# >>>=0
|
||||
|
||||
# 2. and here the price should be printed with its original precision, not
|
||||
# the canonical display precision
|
||||
bin/hledger -f - print
|
||||
@ -28,7 +42,7 @@ bin/hledger -f - print
|
||||
2010/01/01
|
||||
a 0
|
||||
a 1C @ $1.0049
|
||||
a -1C @ $1.0049
|
||||
a $-1.0049
|
||||
|
||||
>>>=0
|
||||
|
||||
|
||||
@ -8,7 +8,7 @@ bin/hledger -f- print
|
||||
>>>
|
||||
2011/01/01
|
||||
expenses:foreign currency €100 @ $1.35
|
||||
assets €-100 @ $1.35
|
||||
assets $-135.00
|
||||
|
||||
>>>=0
|
||||
|
||||
@ -50,7 +50,7 @@ bin/hledger -f - print
|
||||
>>>
|
||||
2011/01/01
|
||||
expenses:foreign currency €100 @@ $135
|
||||
assets €-100 @@ $135
|
||||
assets $-135
|
||||
|
||||
>>>=0
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user