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