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, |     -- The valued row amounts to be displayed: per-period changes, | ||||||
|     -- zero-based cumulative totals, or |     -- zero-based cumulative totals, or | ||||||
|     -- starting-balance-based historical balances. |     -- starting-balance-based historical balances. | ||||||
|     rowbals name changes = dbg5 "rowbals" $ case balanceaccum_ ropts of |     rowbals name unvaluedChanges = dbg5 "rowbals" $ case balanceaccum_ ropts of | ||||||
|         PerPeriod  -> changeamts |         PerPeriod  -> changes | ||||||
|         Cumulative -> cumulative |         Cumulative -> cumulative | ||||||
|         Historical -> historical |         Historical -> historical | ||||||
|       where |       where | ||||||
|         -- changes to report on: usually just the changes itself, but use the |         -- changes to report on: usually just the valued changes themselves, but use the | ||||||
|         -- differences in the historical amount for ValueChangeReports. |         -- differences in the valued historical amount for CalcValueChange and CalcGain. | ||||||
|         changeamts = case balancecalc_ ropts of |         changes = case balancecalc_ ropts of | ||||||
|             CalcChange      -> M.mapWithKey avalue changes |             CalcChange      -> M.mapWithKey avalue unvaluedChanges | ||||||
|             CalcBudget      -> M.mapWithKey avalue changes |             CalcBudget      -> M.mapWithKey avalue unvaluedChanges | ||||||
|             CalcValueChange -> periodChanges valuedStart historical |             CalcValueChange -> periodChanges valuedStart historical | ||||||
|             CalcGain        -> periodChanges valuedStart historical |             CalcGain        -> periodChanges valuedStart historical | ||||||
|         cumulative = cumulativeSum avalue nullacct changeamts |         -- the historical balance is the valued cumulative sum of all unvalued changes | ||||||
|         historical = cumulativeSum avalue startingBalance 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 |         startingBalance = HM.lookupDefault nullacct name startbals | ||||||
|         valuedStart = avalue (DateSpan Nothing historicalDate) startingBalance |         valuedStart = avalue (DateSpan Nothing historicalDate) startingBalance | ||||||
| 
 | 
 | ||||||
| @ -580,11 +582,9 @@ periodChanges start amtmap = | |||||||
|     M.fromDistinctAscList . zip dates $ zipWith subtractAcct amts (start:amts) |     M.fromDistinctAscList . zip dates $ zipWith subtractAcct amts (start:amts) | ||||||
|   where (dates, amts) = unzip $ M.toAscList amtmap |   where (dates, amts) = unzip $ M.toAscList amtmap | ||||||
| 
 | 
 | ||||||
| -- | Calculate a cumulative sum from a list of period changes and a valuation | -- | Calculate a cumulative sum from a list of period changes. | ||||||
| -- function. | cumulativeSum :: Account -> Map DateSpan Account -> Map DateSpan Account | ||||||
| cumulativeSum :: (DateSpan -> Account -> Account) -> Account -> Map DateSpan Account -> Map DateSpan Account | cumulativeSum start = snd . M.mapAccum (\a b -> let s = sumAcct a b in (s, s)) start | ||||||
| cumulativeSum value start = snd . M.mapAccumWithKey accumValued start |  | ||||||
|   where accumValued startAmt date newAmt = let s = sumAcct startAmt newAmt in (s, value date s) |  | ||||||
| 
 | 
 | ||||||
| -- | Given a table representing a multi-column balance report (for example, | -- | Given a table representing a multi-column balance report (for example, | ||||||
| -- made using 'balanceReportAsTable'), render it in a format suitable for | -- 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:new ||       -1 A           0  | ||||||
|  assets:old ||          0         2 A  |  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 | $ 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: | 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:b   ||       0    -15 A  | ||||||
|  assets:old ||     2 A        0  |  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 | $ hledger -f- bal -M --gain --no-total --value=2000-02-01 -b 2000 --historical | ||||||
| Historical gain in 2000-01, valued at 2000-02-01: | 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:b   ||      -15 A  | ||||||
|  assets:old ||        2 A  |  assets:old ||        2 A  | ||||||
| 
 | 
 | ||||||
| # 6. also works in balancesheet | # 7. also works in balancesheet | ||||||
| $ hledger -f- bs -M --gain --no-total | $ hledger -f- bs -M --gain --no-total | ||||||
| Balance Sheet 1999-12-31..2000-02-29 (Historical Gain), valued at period ends | Balance Sheet 1999-12-31..2000-02-29 (Historical Gain), valued at period ends | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user