fix: bal: Allow cumulative gain and valuechange reports
Previously, --cumulative with --gain or --valuechange would produce an empty report. This fixes this issue to produce a reasonable report.
This commit is contained in:
parent
dd14f9c822
commit
3e60e784f3
@ -315,20 +315,22 @@ calculateReportMatrix rspec@ReportSpec{_rsReportOpts=ropts} j priceoracle startb
|
||||
-- The valued row amounts to be displayed: per-period changes,
|
||||
-- zero-based cumulative totals, or
|
||||
-- starting-balance-based historical balances.
|
||||
rowbals name changes = dbg5 "rowbals" $ case balanceaccum_ ropts of
|
||||
PerPeriod -> changeamts
|
||||
rowbals name unvaluedChanges = dbg5 "rowbals" $ case balanceaccum_ ropts of
|
||||
PerPeriod -> changes
|
||||
Cumulative -> cumulative
|
||||
Historical -> historical
|
||||
where
|
||||
-- changes to report on: usually just the changes itself, but use the
|
||||
-- differences in the historical amount for ValueChangeReports.
|
||||
changeamts = case balancecalc_ ropts of
|
||||
CalcChange -> M.mapWithKey avalue changes
|
||||
CalcBudget -> M.mapWithKey avalue changes
|
||||
-- changes to report on: usually just the valued changes themselves, but use the
|
||||
-- differences in the valued historical amount for CalcValueChange and CalcGain.
|
||||
changes = case balancecalc_ ropts of
|
||||
CalcChange -> M.mapWithKey avalue unvaluedChanges
|
||||
CalcBudget -> M.mapWithKey avalue unvaluedChanges
|
||||
CalcValueChange -> periodChanges valuedStart historical
|
||||
CalcGain -> periodChanges valuedStart historical
|
||||
cumulative = cumulativeSum avalue nullacct changeamts
|
||||
historical = cumulativeSum avalue startingBalance changes
|
||||
-- the historical balance is the valued cumulative sum of all unvalued changes
|
||||
historical = M.mapWithKey avalue $ cumulativeSum startingBalance unvaluedChanges
|
||||
-- since this is a cumulative sum of valued amounts, it should not be valued again
|
||||
cumulative = cumulativeSum nullacct changes
|
||||
startingBalance = HM.lookupDefault nullacct name startbals
|
||||
valuedStart = avalue (DateSpan Nothing historicalDate) startingBalance
|
||||
|
||||
@ -580,11 +582,9 @@ periodChanges start amtmap =
|
||||
M.fromDistinctAscList . zip dates $ zipWith subtractAcct amts (start:amts)
|
||||
where (dates, amts) = unzip $ M.toAscList amtmap
|
||||
|
||||
-- | Calculate a cumulative sum from a list of period changes and a valuation
|
||||
-- function.
|
||||
cumulativeSum :: (DateSpan -> Account -> Account) -> Account -> Map DateSpan Account -> Map DateSpan Account
|
||||
cumulativeSum value start = snd . M.mapAccumWithKey accumValued start
|
||||
where accumValued startAmt date newAmt = let s = sumAcct startAmt newAmt in (s, value date s)
|
||||
-- | Calculate a cumulative sum from a list of period changes.
|
||||
cumulativeSum :: Account -> Map DateSpan Account -> Map DateSpan Account
|
||||
cumulativeSum start = snd . M.mapAccum (\a b -> let s = sumAcct a b in (s, s)) start
|
||||
|
||||
-- | Given a table representing a multi-column balance report (for example,
|
||||
-- made using 'balanceReportAsTable'), render it in a format suitable for
|
||||
|
||||
@ -49,7 +49,17 @@ Historical gain in 2000-01-01..2000-02-29, valued at period ends:
|
||||
assets:new || -1 A 0
|
||||
assets:old || 0 2 A
|
||||
|
||||
# 4. use a different valuation strategy
|
||||
# 4. cumulative gain report
|
||||
$ hledger -f- bal -M --gain -b 2000 --no-total --cumulative
|
||||
Cumulative gain in 2000-01-01..2000-02-29, valued at period ends:
|
||||
|
||||
|| 2000-01-31 2000-02-29
|
||||
============++========================
|
||||
assets:b || -13 A -15 A
|
||||
assets:new || -1 A 0
|
||||
assets:old || 2 A 4 A
|
||||
|
||||
# 5. use a different valuation strategy
|
||||
$ hledger -f- bal -M --gain --no-total --value=2000-02-01
|
||||
Incremental gain in 1999-12-01..2000-01-31, valued at 2000-02-01:
|
||||
|
||||
@ -58,7 +68,7 @@ Incremental gain in 1999-12-01..2000-01-31, valued at 2000-02-01:
|
||||
assets:b || 0 -15 A
|
||||
assets:old || 2 A 0
|
||||
|
||||
# 5. use a different valuation strategy for historical
|
||||
# 6. use a different valuation strategy for historical
|
||||
$ hledger -f- bal -M --gain --no-total --value=2000-02-01 -b 2000 --historical
|
||||
Historical gain in 2000-01, valued at 2000-02-01:
|
||||
|
||||
@ -67,7 +77,7 @@ Historical gain in 2000-01, valued at 2000-02-01:
|
||||
assets:b || -15 A
|
||||
assets:old || 2 A
|
||||
|
||||
# 6. also works in balancesheet
|
||||
# 7. also works in balancesheet
|
||||
$ hledger -f- bs -M --gain --no-total
|
||||
Balance Sheet 1999-12-31..2000-02-29 (Historical Gain), valued at period ends
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user