balance: make -H work with single-column reports #392
-H/--historical now makes a single-column balance report with a start date show historical balances reflecting earlier postings. This is equivalent to specifying no start date, but it's more consistent.
This commit is contained in:
		
							parent
							
								
									156922e419
								
							
						
					
					
						commit
						39c5eb9801
					
				| @ -9,7 +9,8 @@ module Hledger.Reports.MultiBalanceReports ( | ||||
|   MultiBalanceReport(..), | ||||
|   MultiBalanceReportRow, | ||||
|   multiBalanceReport, | ||||
|   multiBalanceReportValue | ||||
|   multiBalanceReportValue, | ||||
|   singleBalanceReport | ||||
| 
 | ||||
|   -- -- * Tests | ||||
|   -- tests_Hledger_Reports_MultiBalanceReport | ||||
| @ -71,6 +72,20 @@ instance Show MultiBalanceReport where | ||||
| -- type alias just to remind us which AccountNames might be depth-clipped, below. | ||||
| type ClippedAccountName = AccountName | ||||
| 
 | ||||
| -- | Generates a single column BalanceReport like balanceReport, but uses | ||||
| -- multiBalanceReport, so supports --historical. Does not support | ||||
| -- boring parent eliding yet. | ||||
| singleBalanceReport :: ReportOpts -> Query -> Journal -> BalanceReport | ||||
| singleBalanceReport opts q j = (rows', total) | ||||
|   where | ||||
|     MultiBalanceReport (_, rows, (totals, _, _)) = multiBalanceReport opts q j | ||||
|     rows' = [(a | ||||
|              ,if tree_ opts then a' else a   -- BalanceReport expects full account name here with --flat | ||||
|              ,if tree_ opts then d-1 else 0  -- BalanceReport uses 0-based account depths | ||||
|              , headDef nullmixedamt amts     -- 0 columns is illegal, should not happen, return zeroes if it does | ||||
|              ) | (a,a',d, amts, _, _) <- rows] | ||||
|     total = headDef nullmixedamt totals | ||||
| 
 | ||||
| -- | Generate a multicolumn balance report for the matched accounts, | ||||
| -- showing the change of balance, accumulated balance, or historical balance | ||||
| -- in each of the specified periods. | ||||
|  | ||||
| @ -272,8 +272,8 @@ balancemode = (defCommandMode $ ["balance"] ++ aliases) { -- also accept but don | ||||
|      ,flagReq  ["drop"] (\s opts -> Right $ setopt "drop" s opts) "N" "flat mode: omit N leading account name parts" | ||||
|      ,flagReq  ["format"] (\s opts -> Right $ setopt "format" s opts) "FORMATSTR" "singlecolumn mode: use this custom line format" | ||||
|      ,flagNone ["no-elide"] (\opts -> setboolopt "no-elide" opts) "tree mode: don't squash boring parent accounts" | ||||
|      ,flagNone ["historical","H"] (\opts -> setboolopt "historical" opts) "multicolumn mode: show historical ending balances" | ||||
|      ,flagNone ["cumulative"] (\opts -> setboolopt "cumulative" opts) "multicolumn mode: show accumulated ending balances" | ||||
|      ,flagNone ["historical","H"] (\opts -> setboolopt "historical" opts) "show historical ending balances, reflecting postings before report start" | ||||
|      ,flagNone ["cumulative"] (\opts -> setboolopt "cumulative" opts) "in multicolumn mode: show ending balances accumulated from 0 at report start" | ||||
|      ,flagNone ["average","A"] (\opts -> setboolopt "average" opts) "multicolumn mode: show a row average column" | ||||
|      ,flagNone ["row-total","T"] (\opts -> setboolopt "row-total" opts) "multicolumn mode: show a row total column" | ||||
|      ,flagNone ["no-total","N"] (\opts -> setboolopt "no-total" opts) "don't show the final total row" | ||||
| @ -297,9 +297,19 @@ balance opts@CliOpts{reportopts_=ropts} j = do | ||||
|           interval = interval_ ropts | ||||
|           baltype  = balancetype_ ropts | ||||
|           valuedate = fromMaybe d $ queryEndDate False $ queryFromOpts d ropts | ||||
|       -- shenanigans: use single/multiBalanceReport when we must, | ||||
|       -- ie when there's a report interval, or --historical or -- cumulative. | ||||
|       -- Otherwise prefer the older balanceReport since it can elide boring parents. | ||||
|       case interval of | ||||
|         NoInterval -> do | ||||
|           let report = balanceReport ropts (queryFromOpts d ropts) j | ||||
|           let report | ||||
|                 -- For --historical/--cumulative, we must use multiBalanceReport. | ||||
|                 -- (This forces --no-elide.) | ||||
|                 | balancetype_ ropts `elem` [HistoricalBalance, CumulativeBalance] | ||||
|                   = let ropts' | flat_ ropts = ropts | ||||
|                                | otherwise   = ropts{accountlistmode_=ALTree} | ||||
|                     in singleBalanceReport ropts' (queryFromOpts d ropts) j | ||||
|                 | otherwise = balanceReport ropts (queryFromOpts d ropts) j | ||||
|               convert | value_ ropts = balanceReportValue j valuedate | ||||
|                       | otherwise    = id | ||||
|               render = case format of | ||||
|  | ||||
| @ -17,10 +17,10 @@ Show accounts and their balances. Alias: bal. | ||||
| : in tree mode: don't squash boring parent accounts | ||||
| 
 | ||||
| `-H --historical` | ||||
| : in multicolumn mode: show historical ending balances | ||||
| : show historical ending balances, reflecting postings before report start | ||||
| 
 | ||||
| `--cumulative` | ||||
| : in multicolumn mode: show accumulated ending balances | ||||
| : in multicolumn mode: show ending balances accumulated from 0 at report start | ||||
| 
 | ||||
| `-A --average` | ||||
| : in multicolumn mode: show a row average column | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user