mirror of
https://github.com/simonmichael/hledger.git
synced 2024-11-08 07:09:28 +03:00
zero amounts have no sign or commodity, and amounts with different prices are aggregated, like ledger
This commit is contained in:
parent
d9ee8b23a6
commit
b159f74a4c
@ -238,8 +238,7 @@ isNegativeAmount Amount{quantity=q} = q < 0
|
||||
amounts :: MixedAmount -> [Amount]
|
||||
amounts (Mixed as) = as
|
||||
|
||||
-- | Does this mixed amount appear to be zero - empty, or
|
||||
-- containing only simple amounts which appear to be zero ?
|
||||
-- | Does this mixed amount appear to be zero when displayed with its given precision ?
|
||||
isZeroMixedAmount :: MixedAmount -> Bool
|
||||
isZeroMixedAmount = all isZeroAmount . amounts . normaliseMixedAmount
|
||||
|
||||
@ -313,21 +312,19 @@ showMixedAmountOrZeroWithoutPrice a
|
||||
| isZeroMixedAmount a = "0"
|
||||
| otherwise = showMixedAmountWithoutPrice a
|
||||
|
||||
-- | Simplify a mixed amount by combining any component amounts which have
|
||||
-- the same commodity and the same price. Also removes zero amounts,
|
||||
-- or adds a single zero amount if there are no amounts at all.
|
||||
-- | Simplify a mixed amount by removing redundancy in its component amounts, as follows:
|
||||
-- 1. sum amounts which have the same commodity (ignoring their price)
|
||||
-- 2. remove zero amounts
|
||||
-- 3. if there are no amounts at all, add a single zero amount
|
||||
normaliseMixedAmount :: MixedAmount -> MixedAmount
|
||||
normaliseMixedAmount (Mixed as) = Mixed as''
|
||||
where
|
||||
as'' = map sumSamePricedAmountsPreservingPrice $ group $ sort as'
|
||||
sort = sortBy cmpsymbolandprice
|
||||
cmpsymbolandprice a1 a2 = compare (sym a1,price a1) (sym a2,price a2)
|
||||
group = groupBy samesymbolandprice
|
||||
samesymbolandprice a1 a2 = (sym a1 == sym a2) && (price a1 == price a2)
|
||||
as'' = if null nonzeros then [nullamt] else nonzeros
|
||||
(_,nonzeros) = partition (\a -> isReallyZeroAmount a && Mixed [a] /= missingamt) as'
|
||||
as' = map sumSamePricedAmountsPreservingPrice $ group $ sort as
|
||||
sort = sortBy (\a1 a2 -> compare (sym a1) (sym a2))
|
||||
group = groupBy (\a1 a2 -> sym a1 == sym a2)
|
||||
sym = symbol . commodity
|
||||
as' | null nonzeros = [head $ zeros ++ [nullamt]]
|
||||
| otherwise = nonzeros
|
||||
(zeros,nonzeros) = partition isReallyZeroAmount as
|
||||
|
||||
-- | Set a mixed amount's commodity to the canonicalised commodity from
|
||||
-- the provided commodity map.
|
||||
@ -427,8 +424,11 @@ missingamt = Mixed [Amount unknown{symbol="AUTO"} 0 Nothing]
|
||||
|
||||
tests_Hledger_Data_Amount = TestList [
|
||||
|
||||
"showMixedAmount" ~: do
|
||||
showMixedAmount (Mixed [Amount dollar 0 Nothing]) `is` "$0.00"
|
||||
"showAmount" ~: do
|
||||
showAmount (dollars 0 + pounds 0) `is` "0"
|
||||
|
||||
,"showMixedAmount" ~: do
|
||||
showMixedAmount (Mixed [Amount dollar 0 Nothing]) `is` "0"
|
||||
showMixedAmount (Mixed []) `is` "0"
|
||||
showMixedAmount missingamt `is` ""
|
||||
|
||||
@ -458,10 +458,15 @@ tests_Hledger_Data_Amount = TestList [
|
||||
[Amount dollar 1.25 Nothing,
|
||||
Amount dollar0 (-1) Nothing,
|
||||
Amount dollar (-0.25) Nothing])
|
||||
`is` Mixed [Amount dollar 0 Nothing]
|
||||
`is` Mixed [Amount unknown 0 Nothing]
|
||||
|
||||
,"normaliseMixedAmount" ~: do
|
||||
normaliseMixedAmount (Mixed []) ~?= Mixed [nullamt]
|
||||
normaliseMixedAmount (Mixed []) `is` Mixed [nullamt]
|
||||
assertBool "" $ isZeroMixedAmount $ normaliseMixedAmount (Mixed [Amount {commodity=dollar, quantity=10, price=Nothing}
|
||||
,Amount {commodity=dollar, quantity=10, price=Just (TotalPrice (Mixed [Amount {commodity=euro, quantity=7, price=Nothing}]))}
|
||||
,Amount {commodity=dollar, quantity=(-10), price=Nothing}
|
||||
,Amount {commodity=dollar, quantity=(-10), price=Just (TotalPrice (Mixed [Amount {commodity=euro, quantity=7, price=Nothing}]))}
|
||||
])
|
||||
|
||||
,"punctuatethousands 1" ~: punctuatethousands "" `is` ""
|
||||
|
||||
|
@ -112,7 +112,7 @@ tests_Hledger_Cli = TestList
|
||||
," $-1 salary"
|
||||
," $1 liabilities:debts"
|
||||
,"--------------------"
|
||||
," $0"
|
||||
," 0"
|
||||
]
|
||||
|
||||
,"balance report can be limited with --depth" ~:
|
||||
@ -122,7 +122,7 @@ tests_Hledger_Cli = TestList
|
||||
," $-2 income"
|
||||
," $1 liabilities"
|
||||
,"--------------------"
|
||||
," $0"
|
||||
," 0"
|
||||
]
|
||||
|
||||
,"balance report with account pattern o" ~:
|
||||
@ -167,7 +167,7 @@ tests_Hledger_Cli = TestList
|
||||
," $-1 salary"
|
||||
," $1 liabilities:debts"
|
||||
,"--------------------"
|
||||
," $0"
|
||||
," 0"
|
||||
]
|
||||
|
||||
,"balance report with unmatched parent of two matched subaccounts" ~:
|
||||
@ -216,7 +216,7 @@ tests_Hledger_Cli = TestList
|
||||
([SubTotal,Empty], ["assets"]) `gives`
|
||||
[" $-1 assets"
|
||||
," $1 bank"
|
||||
," $0 checking"
|
||||
," 0 checking"
|
||||
," $1 saving"
|
||||
," $-2 cash"
|
||||
,"--------------------"
|
||||
@ -236,7 +236,7 @@ tests_Hledger_Cli = TestList
|
||||
[" $500 a:b"
|
||||
," $-500 c:d"
|
||||
,"--------------------"
|
||||
," $0"
|
||||
," 0"
|
||||
]
|
||||
|
||||
,"balance report elides zero-balance root account(s)" ~: do
|
||||
|
@ -43,7 +43,7 @@ bin/hledger -f - balance
|
||||
EUR -1
|
||||
USD -1 c
|
||||
--------------------
|
||||
EUR 0
|
||||
0
|
||||
>>>=0
|
||||
|
||||
# 4. mixed amounts with prices
|
||||
|
@ -11,12 +11,12 @@ bin/hledger -f- print
|
||||
bin/hledger -f- print
|
||||
<<<
|
||||
2010-04-05 x
|
||||
a 10 "DE0002635307"
|
||||
a 10 "DE 0002 635307"
|
||||
b
|
||||
>>>
|
||||
2010/04/05 x
|
||||
a 10 "DE0002635307"
|
||||
b -10 "DE0002635307"
|
||||
a 10 "DE 0002 635307"
|
||||
b -10 "DE 0002 635307"
|
||||
|
||||
>>>=0
|
||||
|
||||
@ -30,5 +30,5 @@ bin/hledger -f- balance
|
||||
10 "DE0002635307" a
|
||||
-10 "DE0002635307" b
|
||||
--------------------
|
||||
0 "DE0002635307"
|
||||
0
|
||||
>>>=0
|
||||
|
@ -16,15 +16,13 @@ bin/hledger -f - balance
|
||||
# 2. Two commodities. As above, and the final total should be a single commodityless zero.
|
||||
bin/hledger -f - balance
|
||||
<<<
|
||||
2010/04/01 tr1
|
||||
2010/1/1
|
||||
a 16$ @@ 10€
|
||||
b -10€
|
||||
|
||||
2010/04/02 tr2
|
||||
2010/1/2
|
||||
a -16$
|
||||
b 10€ @@ 16$
|
||||
>>>
|
||||
--------------------
|
||||
0
|
||||
>>>=0
|
||||
|
||||
|
@ -49,7 +49,7 @@ bin/hledger -f - balance --no-total --cost --empty
|
||||
a 1C @ $1.0049
|
||||
a $-1.00
|
||||
>>>
|
||||
$0.00 a
|
||||
0 a
|
||||
>>>=0
|
||||
|
||||
# 5. avamk's 2011/1/19 example
|
||||
@ -62,7 +62,7 @@ bin/hledger -f - -B bal
|
||||
$3266.32 assets:investment:ACME
|
||||
$-3266.32 equity:opening balances
|
||||
--------------------
|
||||
$0.00
|
||||
0
|
||||
>>>=0
|
||||
# hledger 0.14pre: precision=2, presumably from price
|
||||
# $3266.32 assets:investment:ACME
|
||||
@ -91,7 +91,7 @@ D $1000.0
|
||||
$3266.32 assets:investment:ACME
|
||||
$-3266.32 equity:opening balances
|
||||
--------------------
|
||||
$0.00
|
||||
0
|
||||
>>>=0
|
||||
### hledger 0.14pre: precision=2, presumably from price, ignores D
|
||||
### $3266.32 assets:investment:ACME
|
||||
|
@ -132,7 +132,7 @@ bin/hledger -f - balance -B
|
||||
$-135 assets
|
||||
$135 expenses:foreign currency
|
||||
--------------------
|
||||
$0
|
||||
0
|
||||
>>>=0
|
||||
# 10. transaction in two commodities should balance out properly
|
||||
bin/hledger -f - balance --basis
|
||||
@ -144,6 +144,5 @@ bin/hledger -f - balance --basis
|
||||
16$ a
|
||||
-16$ b
|
||||
--------------------
|
||||
0$
|
||||
|
||||
0
|
||||
>>>=0
|
||||
|
@ -5,4 +5,4 @@ bin/hledger -f data/sample.journal balance --depth 1
|
||||
$-2 income
|
||||
$1 liabilities
|
||||
--------------------
|
||||
$0
|
||||
0
|
||||
|
@ -11,4 +11,4 @@ bin/hledger -f data/sample.journal balance
|
||||
$-1 salary
|
||||
$1 liabilities:debts
|
||||
--------------------
|
||||
$0
|
||||
0
|
||||
|
@ -7,4 +7,4 @@ bin/hledger -f - balance
|
||||
10 руб τράπεζα
|
||||
-10 руб नकद
|
||||
--------------------
|
||||
0 руб
|
||||
0
|
||||
|
Loading…
Reference in New Issue
Block a user