budget: show a budget report even with no interval (for whole journal period)

This commit is contained in:
Simon Michael 2018-04-24 23:00:05 -07:00
parent 568a442307
commit 9151f5004e
3 changed files with 39 additions and 27 deletions

View File

@ -66,18 +66,24 @@ budgetReport :: ReportOpts -> Bool -> Bool -> DateSpan -> Day -> Journal -> Budg
budgetReport ropts assrt showunbudgeted reportspan d j = budgetReport ropts assrt showunbudgeted reportspan d j =
let let
q = queryFromOpts d ropts q = queryFromOpts d ropts
budgetj = budgetJournal assrt ropts reportspan j
budgetedaccts = budgetedaccts =
dbg2 "budgetedacctsinperiod" $ dbg2 "budgetedacctsinperiod" $
accountNamesFromPostings $ accountNamesFromPostings $
concatMap tpostings $ concatMap tpostings $
concatMap (flip runPeriodicTransaction reportspan) $ concatMap (flip runPeriodicTransaction reportspan) $
jperiodictxns j jperiodictxns j
actualj = budgetRollUp budgetedaccts showunbudgeted j actualj = dbg1 "actualj" $ budgetRollUp budgetedaccts showunbudgeted j
budgetgoalreport = dbg1 "budgetgoalreport" $ multiBalanceReport ropts q budgetj budgetj = dbg1 "budgetj" $ budgetJournal assrt ropts reportspan j
actualreport = dbg1 "actualreport" $ multiBalanceReport ropts q actualj actualreport@(MultiBalanceReport (actualspans, _, _)) = dbg1 "actualreport" $ multiBalanceReport ropts q actualj
budgetgoalreport@(MultiBalanceReport (_, budgetgoalitems, budgetgoaltotals)) = dbg1 "budgetgoalreport" $ multiBalanceReport ropts q budgetj
budgetgoalreport'
-- If no interval is specified:
-- budgetgoalreport's span might be shorter actualreport's due to periodic txns;
-- it should be safe to replace it with the latter, so they combine well.
| interval_ ropts == NoInterval = MultiBalanceReport (actualspans, budgetgoalitems, budgetgoaltotals)
| otherwise = budgetgoalreport
in in
dbg1 "budgetreport" $ combineBudgetAndActual budgetgoalreport actualreport dbg1 "budgetreport" $ combineBudgetAndActual budgetgoalreport' actualreport
-- | Use all periodic transactions in the journal to generate -- | Use all periodic transactions in the journal to generate
-- budget transactions in the specified report period. -- budget transactions in the specified report period.

View File

@ -308,9 +308,23 @@ balance opts@CliOpts{rawopts_=rawopts,reportopts_=ropts} j = do
Left err -> error' $ unlines [err] Left err -> error' $ unlines [err]
Right _ -> do Right _ -> do
let format = outputFormatFromOpts opts let format = outputFormatFromOpts opts
budget = boolopt "budget" rawopts
interval = interval_ ropts interval = interval_ ropts
case interval of case (budget, interval) of
NoInterval -> do (True, _) -> do
-- single or multicolumn budget report
reportspan <- reportSpan j ropts
let budgetreport = dbg1 "budgetreport" $ budgetReport ropts assrt showunbudgeted reportspan d j
where
showunbudgeted = boolopt "show-unbudgeted" rawopts
assrt = not $ ignore_assertions_ $ inputopts_ opts
render = case format of
"csv" -> const $ error' "Sorry, CSV output is not yet implemented for this kind of report." -- TODO
"html" -> const $ error' "Sorry, HTML output is not yet implemented for this kind of report." -- TODO
_ -> budgetReportAsText ropts
writeOutput opts $ render budgetreport
(False, NoInterval) -> do
-- single column balance report -- single column balance report
let report let report
| balancetype_ ropts `elem` [HistoricalBalance, CumulativeChange] | balancetype_ ropts `elem` [HistoricalBalance, CumulativeChange]
@ -325,20 +339,7 @@ balance opts@CliOpts{rawopts_=rawopts,reportopts_=ropts} j = do
_ -> balanceReportAsText _ -> balanceReportAsText
writeOutput opts $ render ropts report writeOutput opts $ render ropts report
_ | boolopt "budget" rawopts -> do _ -> do
-- multi column budget report
reportspan <- reportSpan j ropts
let budgetreport = dbg1 "budgetreport" $ budgetReport ropts assrt showunbudgeted reportspan d j
where
showunbudgeted = boolopt "show-unbudgeted" rawopts
assrt = not $ ignore_assertions_ $ inputopts_ opts
render = case format of
"csv" -> const $ error' "Sorry, CSV output is not yet implemented for this kind of report." -- TODO
"html" -> const $ error' "Sorry, HTML output is not yet implemented for this kind of report." -- TODO
_ -> budgetReportAsText ropts
writeOutput opts $ render budgetreport
| otherwise -> do
-- multi column balance report -- multi column balance report
let report = multiBalanceReport ropts (queryFromOpts d ropts) j let report = multiBalanceReport ropts (queryFromOpts d ropts) j
render = case format of render = case format of

View File

@ -124,13 +124,18 @@ Budget performance in 2016/12/01-2016/12/03:
(b) 1 (b) 1
(c) 1 (c) 1
# 4. --budget with no interval has no effect. # 4. --budget with no interval shows total budget for the journal period
# (in tabular format).
$ hledger -f- bal --budget $ hledger -f- bal --budget
2 a Budget performance in 2018/01/01-2018/01/03:
2 b
2 c || 2018/01/01-2018/01/03
-------------------- ===++==========================
6 a || 2 [ 7% of 30]
b || 2 [ 2% of 100]
c || 2 [ 0% of 1000]
---++--------------------------
|| 6 [ 1% of 1130]
# 5. Multiple periodic transactions with different intervals are combined. # 5. Multiple periodic transactions with different intervals are combined.
# Budget goals with lower frequency than the report are posted in the # Budget goals with lower frequency than the report are posted in the