lib: Calculate value at posting date for register --value=then -M.

This commit is contained in:
Stephen Morgan 2021-01-11 16:29:36 +11:00 committed by Simon Michael
parent 07a9f11962
commit 2b545caae5
4 changed files with 18 additions and 17 deletions

View File

@ -560,14 +560,6 @@ subtractAcct :: Account -> Account -> Account
subtractAcct a@Account{aibalance=i1,aebalance=e1} Account{aibalance=i2,aebalance=e2} =
a{aibalance = i1 - i2, aebalance = e1 - e2}
-- | Whether the market price for postings might change when reported in
-- different report periods.
changingValuation :: ReportOpts -> Bool
changingValuation ropts = case value_ ropts of
Just (AtCost (Just _)) -> True
Just (AtEnd _) -> True
_ -> False
-- | Extract period changes from a cumulative list
periodChanges :: Account -> Map k Account -> Map k Account
periodChanges start amtmap =

View File

@ -80,12 +80,12 @@ postingsReport rspec@ReportSpec{rsOpts=ropts@ReportOpts{..}} j = items
-- Postings, or summary postings with their subperiod's end date, to be displayed.
displayps :: [(Posting, Maybe Day)]
| multiperiod =
let summaryps = summarisePostingsByInterval interval_ whichdate mdepth showempty reportspan reportps
in [(pvalue lastday p, Just periodend) | (p, periodend) <- summaryps, let lastday = addDays (-1) periodend]
| otherwise =
[(pvalue reportorjournallast p, Nothing) | p <- reportps]
| multiperiod && changingValuation ropts = [(pvalue lastday p, Just periodend) | (p, periodend) <- summariseps reportps, let lastday = addDays (-1) periodend]
| multiperiod = [(p, Just periodend) | (p, periodend) <- summariseps valuedps]
| otherwise = [(p, Nothing) | p <- valuedps]
where
summariseps = summarisePostingsByInterval interval_ whichdate mdepth showempty reportspan
valuedps = map (pvalue reportorjournallast) reportps
showempty = empty_ || average_
reportorjournallast =
fromMaybe (error' "postingsReport: expected a non-empty journal") $ -- PARTIAL: shouldn't happen

View File

@ -23,6 +23,7 @@ module Hledger.Reports.ReportOptions (
rawOptsToReportSpec,
flat_,
tree_,
changingValuation,
reportOptsToggleStatus,
simplifyStatuses,
whichDateFromOpts,
@ -471,6 +472,14 @@ queryFromFlags ReportOpts{..} = simplifyQuery $ And flagsq
consIf f b = if b then (f True:) else id
consJust f = maybe id ((:) . f)
-- | Whether the market price for postings might change when reported in
-- different report periods.
changingValuation :: ReportOpts -> Bool
changingValuation ropts = case value_ ropts of
Just (AtCost (Just _)) -> True
Just (AtEnd _) -> True
_ -> False
-- Report dates.
-- | The effective report span is the start and end dates specified by

View File

@ -603,8 +603,8 @@ $ hledger -f- reg --value=then -b 2020-03 -H
2020-04-01 (a) 4 B 10 B
>=0
# 52. --value=then with a report interval. How are the summary amounts valued ?
# Currently each interval's unvalued sum is valued on its first day.
# 52. --value=then with a report interval. Summary amounts are the sums of the
# values of each posting at their posting date.
<
P 2020-01-01 A 1 B
P 2020-02-01 A 2 B
@ -624,8 +624,8 @@ P 2020-04-01 A 4 B
(a) 1 A
$ hledger -f- reg --value=then -Q
2020Q1 a 3 B 3 B
2020Q2 a 4 B 7 B
2020Q1 a 6 B 6 B
2020Q2 a 4 B 10 B
>=0
# 53. print --value should affect all postings, including when there's an implicit transaction price