close: hide prices by default, show them with --show-costs (#1165)

close no longer preserves costs, generating huge entries when there
are many foreign currency/investment transactions, unless you ask it to.
This commit is contained in:
Simon Michael 2020-01-22 12:00:56 -08:00
parent 5f7ae2ced6
commit 2645b76ff0
3 changed files with 82 additions and 27 deletions

View File

@ -28,6 +28,7 @@ closemode = hledgerCommandMode
,flagReq ["close-to"] (\s opts -> Right $ setopt "close-to" s opts) "ACCT" ("account to transfer closing balances to (default: "++defclosingacct++")") ,flagReq ["close-to"] (\s opts -> Right $ setopt "close-to" s opts) "ACCT" ("account to transfer closing balances to (default: "++defclosingacct++")")
,flagReq ["open-from"] (\s opts -> Right $ setopt "open-from" s opts) "ACCT" ("account to transfer opening balances from (default: "++defopeningacct++")") ,flagReq ["open-from"] (\s opts -> Right $ setopt "open-from" s opts) "ACCT" ("account to transfer opening balances from (default: "++defopeningacct++")")
,flagNone ["interleaved"] (setboolopt "interleaved") "keep equity and non-equity postings adjacent" ,flagNone ["interleaved"] (setboolopt "interleaved") "keep equity and non-equity postings adjacent"
,flagNone ["show-costs"] (setboolopt "show-costs") "keep balances with different costs separate"
] ]
[generalflagsgroup1] [generalflagsgroup1]
hiddenflags hiddenflags
@ -54,22 +55,27 @@ close CliOpts{rawopts_=rawopts, reportopts_=ropts} j = do
(Nothing, Just o) -> (o, o) (Nothing, Just o) -> (o, o)
(Nothing, Nothing) -> (T.pack defclosingacct, T.pack defopeningacct) (Nothing, Nothing) -> (T.pack defclosingacct, T.pack defopeningacct)
-- interleave equity postings next to the corresponding closing posting, or put them all at the end ?
interleaved = boolopt "interleaved" rawopts
-- since balance assertion amounts are required to be exact, the
-- amounts in opening/closing transactions should be too (#941, #1137)
precise = setFullPrecision
-- dates of the closing and opening transactions -- dates of the closing and opening transactions
ropts_ = ropts{balancetype_=HistoricalBalance, accountlistmode_=ALFlat} ropts_ = ropts{balancetype_=HistoricalBalance, accountlistmode_=ALFlat}
q = queryFromOpts today ropts_ q = queryFromOpts today ropts_
openingdate = fromMaybe today $ queryEndDate False q openingdate = fromMaybe today $ queryEndDate False q
closingdate = addDays (-1) openingdate closingdate = addDays (-1) openingdate
-- should we preserve cost information ?
normalise = case boolopt "show-costs" rawopts of
True -> normaliseMixedAmount
False -> normaliseMixedAmount . mixedAmountStripPrices
-- the balances to close -- the balances to close
(acctbals,_) = balanceReportFromMultiBalanceReport ropts_ q j (acctbals,_) = balanceReportFromMultiBalanceReport ropts_ q j
totalamt = sum $ map (\(_,_,_,b) -> normaliseMixedAmount b) acctbals totalamt = sum $ map (\(_,_,_,b) -> normalise b) acctbals
-- since balance assertion amounts are required to be exact, the
-- amounts in opening/closing transactions should be too (#941, #1137)
precise = setFullPrecision
-- interleave equity postings next to the corresponding closing posting, or put them all at the end ?
interleaved = boolopt "interleaved" rawopts
-- the closing transaction -- the closing transaction
closingtxn = nulltransaction{tdate=closingdate, tdescription="closing balances", tpostings=closingps} closingtxn = nulltransaction{tdate=closingdate, tdescription="closing balances", tpostings=closingps}
@ -90,7 +96,7 @@ close CliOpts{rawopts_=rawopts, reportopts_=ropts} j = do
| -- get the balances for each commodity and transaction price | -- get the balances for each commodity and transaction price
(a,_,_,mb) <- acctbals (a,_,_,mb) <- acctbals
, let bs = amounts $ normaliseMixedAmount mb , let bs = amounts $ normalise mb
-- mark the last balance in each commodity with True -- mark the last balance in each commodity with True
, let bs' = concat [reverse $ zip (reverse bs) (True : repeat False) , let bs' = concat [reverse $ zip (reverse bs) (True : repeat False)
| bs <- groupBy ((==) `on` acommodity) bs] | bs <- groupBy ((==) `on` acommodity) bs]
@ -116,7 +122,7 @@ close CliOpts{rawopts_=rawopts, reportopts_=ropts} j = do
++ [posting{paccount=openingacct, pamount=Mixed [precise $ negate b]} | interleaved] ++ [posting{paccount=openingacct, pamount=Mixed [precise $ negate b]} | interleaved]
| (a,_,_,mb) <- acctbals | (a,_,_,mb) <- acctbals
, let bs = amounts $ normaliseMixedAmount mb , let bs = amounts $ normalise mb
-- mark the last balance in each commodity with the unpriced sum in that commodity (for a balance assertion) -- mark the last balance in each commodity with the unpriced sum in that commodity (for a balance assertion)
, let bs' = concat [reverse $ zip (reverse bs) (Just commoditysum : repeat Nothing) , let bs' = concat [reverse $ zip (reverse bs) (Just commoditysum : repeat Nothing)
| bs <- groupBy ((==) `on` acommodity) bs | bs <- groupBy ((==) `on` acommodity) bs

View File

@ -19,7 +19,15 @@ these, it is used for both.
The "equity" postings are shown at the end of the transaction The "equity" postings are shown at the end of the transaction
by default (and are combined when possible). by default (and are combined when possible).
With `--interleaved`, they are shown next to each posting they With `--interleaved`, they are shown next to each posting they
balance, instead (better for troubleshooting). balance, which is better for troubleshooting (and may generate more postings).
When the balances being closed have cost information (because
transaction prices were recorded), `--show-costs` will preserve it.
Balances with different costs are closed/reopened separately,
and balance -B reports will be unchanged after the transition.
Note this can generate many postings,
if you have a lot of foreign currency or investment transactions.
By default, transaction prices are ignored.
### close usage ### close usage
@ -53,10 +61,6 @@ the generated balance assertions will depend on these flags.
Likewise, if you run this command with --auto, the balance assertions Likewise, if you run this command with --auto, the balance assertions
will probably always require --auto. will probably always require --auto.
When account balances have cost information (transaction prices), the
closing/opening transactions will preserve it, so that eg balance -B reports
will not be affected.
Examples: Examples:
Carrying asset/liability balances into a new file for 2019, all from command line: Carrying asset/liability balances into a new file for 2019, all from command line:

View File

@ -139,9 +139,7 @@ $ hledger close -f- -p 2016 assets liabilities --opening --closing
>=0 >=0
# 6. Closing a multi-priced balance. The "lot" prices are preserved. # 6. Closing a multi-priced balance. By default the transaction prices are ignored.
# Only the last posting in each commodity gets a balance assertion (#1035).
# Balance assertion amounts do not have a price.
< <
2019/01/01 2019/01/01
assets 1A @ 1B assets 1A @ 1B
@ -149,6 +147,20 @@ $ hledger close -f- -p 2016 assets liabilities --opening --closing
equity equity
$ hledger -f- close assets -p 2019 $ hledger -f- close assets -p 2019
2019-12-31 closing balances
assets -2A = 0A
equity:closing balances 2A
2020-01-01 opening balances
assets 2A = 2A
equity:opening balances -2A
>=0
# 7. With --show-costs, the transaction prices are preserved.
# Only the last posting in each commodity gets a balance assertion (#1035).
# Balance assertion amounts do not have a price.
$ hledger -f- close assets -p 2019 --show-costs
2019-12-31 closing balances 2019-12-31 closing balances
assets -1A @ 1B assets -1A @ 1B
assets -1A @ 1C = 0A assets -1A @ 1C = 0A
@ -163,9 +175,8 @@ $ hledger -f- close assets -p 2019
>=0 >=0
# 7. Closing a multi-priced balance, slightly more complex # 8. Closing a multi-priced balance, slightly more complex
# (different price in each transaction). Hopefully # (different price in each transaction).
# equivalent to 8.
< <
2019/01/01 2019/01/01
(assets) 1A @ 1B (assets) 1A @ 1B
@ -174,6 +185,25 @@ $ hledger -f- close assets -p 2019
(assets) 1A @ 2B (assets) 1A @ 2B
$ hledger -f- close assets -p 2019 $ hledger -f- close assets -p 2019
2019-12-31 closing balances
assets -2A = 0A
equity:closing balances 2A
2020-01-01 opening balances
assets 2A = 2A
equity:opening balances -2A
>=0
# 9. The same, with costs.
<
2019/01/01
(assets) 1A @ 1B
2019/01/02
(assets) 1A @ 2B
$ hledger -f- close assets -p 2019 --show-costs
2019-12-31 closing balances 2019-12-31 closing balances
assets -1A @ 1B assets -1A @ 1B
assets -1A @ 2B = 0A assets -1A @ 2B = 0A
@ -188,7 +218,7 @@ $ hledger -f- close assets -p 2019
>=0 >=0
# 8. Closing a multi-priced balance, a more complex example. # 10. Closing a multi-priced balance, a more complex example.
# Decimal places specified by the amount display style should not be stripped # Decimal places specified by the amount display style should not be stripped
# even if they are zeros (#1137). # even if they are zeros (#1137).
< <
@ -212,7 +242,7 @@ $ hledger -f- close assets -p 2019
assets:bank 2,836.00 EUR assets:bank 2,836.00 EUR
liabilities:employer liabilities:employer
$ hledger -f- close -p 2016 assets liabilities $ hledger -f- close -p 2016 assets liabilities --show-costs
2016-12-31 closing balances 2016-12-31 closing balances
assets:bank -5,733.00 EUR = 0.00 EUR assets:bank -5,733.00 EUR = 0.00 EUR
liabilities:employer $-10,000.00 liabilities:employer $-10,000.00
@ -237,10 +267,10 @@ $ hledger -f- close -p 2016 assets liabilities
>=0 >=0
# 9. With --interleaved, each transfer's postings are adjacent. # 11. With --interleaved, each transfer's postings are adjacent.
# (And balances with the same cost are not necessarily combined into # (And balances with the same cost are not necessarily combined into
# a single posting. Eg the 5734 EUR above is 5733 EUR and 1 EUR below.) # a single posting. Eg the 5734 EUR above is 5733 EUR and 1 EUR below.)
$ hledger -f- close -p 2016 assets liabilities --interleaved $ hledger -f- close -p 2016 assets liabilities --interleaved --show-costs
2016-12-31 closing balances 2016-12-31 closing balances
assets:bank -5,733.00 EUR = 0.00 EUR assets:bank -5,733.00 EUR = 0.00 EUR
equity:closing balances 5,733.00 EUR equity:closing balances 5,733.00 EUR
@ -267,7 +297,7 @@ $ hledger -f- close -p 2016 assets liabilities --interleaved
>=0 >=0
# 10. A tricky case where a closing posting was rounded and failed to balance (#1164) # 12. A tricky case where a closing posting was rounded and failed to balance (#1164)
< <
commodity $0.00 commodity $0.00
commodity AAA 0.00000000 commodity AAA 0.00000000
@ -281,7 +311,7 @@ commodity AAA 0.00000000
assets:usd -$0.1280810 assets:usd -$0.1280810
expenses:banking $0.1280810 expenses:banking $0.1280810
$ hledger -f- close -p 2019 assets $ hledger -f- close -p 2019 assets --show-costs
2019-12-31 closing balances 2019-12-31 closing balances
assets:aaa AAA -510.00000000 = AAA 0.00000000 assets:aaa AAA -510.00000000 = AAA 0.00000000
assets:usd $-49.50 assets:usd $-49.50
@ -300,3 +330,18 @@ $ hledger -f- close -p 2019 assets
>=0 >=0
# 13. The same, without costs and with --interleaved.
$ hledger -f- close -p 2019 assets --interleaved
2019-12-31 closing balances
assets:aaa AAA -510.00000000 = AAA 0.00000000
equity:closing balances AAA 510.00000000
assets:usd $-0.109999 = $0.00
equity:closing balances $0.109999
2020-01-01 opening balances
assets:aaa AAA 510.00000000 = AAA 510.00000000
equity:opening balances AAA -510.00000000
assets:usd $0.109999 = $0.109999
equity:opening balances $-0.109999
>=0