bal: support CSV output for --budget reports (#1155)
This commit is contained in:
parent
211ae7742c
commit
5bb9006b6c
@ -18,6 +18,7 @@ module Hledger.Reports.BudgetReport (
|
||||
budgetReport,
|
||||
budgetReportAsTable,
|
||||
budgetReportAsText,
|
||||
budgetReportAsCsv,
|
||||
-- * Helpers
|
||||
reportPeriodName,
|
||||
-- * Tests
|
||||
@ -44,12 +45,14 @@ import qualified Data.Text as T
|
||||
--import qualified Data.Text.Lazy as TL
|
||||
--import System.Console.CmdArgs.Explicit as C
|
||||
--import Lucid as L
|
||||
|
||||
import Text.Printf (printf)
|
||||
import Text.Tabular as T
|
||||
import Text.Tabular.AsciiWide as T
|
||||
|
||||
import Hledger.Data
|
||||
import Hledger.Utils
|
||||
import Hledger.Read.CsvReader (CSV)
|
||||
import Hledger.Reports.ReportOptions
|
||||
import Hledger.Reports.ReportTypes
|
||||
import Hledger.Reports.MultiBalanceReport
|
||||
@ -335,6 +338,45 @@ reportPeriodName balancetype spans =
|
||||
multiyear = (>1) $ length $ nubSort $ map spanStartYear spans
|
||||
_ -> maybe "" (showDate . prevday) . spanEnd
|
||||
|
||||
-- XXX generalise this with multiBalanceReportAsCsv ?
|
||||
-- | Render a budget report as CSV. Like multiBalanceReportAsCsv,
|
||||
-- but includes alternating actual and budget amount columns.
|
||||
budgetReportAsCsv :: ReportOpts -> BudgetReport -> CSV
|
||||
budgetReportAsCsv
|
||||
ReportOpts{average_, row_total_, no_total_, transpose_}
|
||||
(PeriodicReport colspans items (PeriodicReportRow _ abtotals (magrandtot,mbgrandtot) (magrandavg,mbgrandavg)))
|
||||
= (if transpose_ then transpose else id) $
|
||||
|
||||
-- heading row
|
||||
("Account" :
|
||||
concatMap (\span -> [showDateSpan span, "budget"]) colspans
|
||||
++ concat [["Total" ,"budget"] | row_total_]
|
||||
++ concat [["Average","budget"] | average_]
|
||||
) :
|
||||
|
||||
-- account rows
|
||||
[T.unpack (displayFull a) :
|
||||
map showmamt (flattentuples abamts)
|
||||
++ concat [[showmamt mactualrowtot, showmamt mbudgetrowtot] | row_total_]
|
||||
++ concat [[showmamt mactualrowavg, showmamt mbudgetrowavg] | average_]
|
||||
| PeriodicReportRow a abamts (mactualrowtot,mbudgetrowtot) (mactualrowavg,mbudgetrowavg) <- items
|
||||
]
|
||||
|
||||
-- totals row
|
||||
++ concat [
|
||||
[
|
||||
"Total:" :
|
||||
map showmamt (flattentuples abtotals)
|
||||
++ concat [[showmamt magrandtot,showmamt mbgrandtot] | row_total_]
|
||||
++ concat [[showmamt magrandavg,showmamt mbgrandavg] | average_]
|
||||
]
|
||||
| not no_total_
|
||||
]
|
||||
|
||||
where
|
||||
flattentuples abs = concat [[a,b] | (a,b) <- abs]
|
||||
showmamt = maybe "" (showMixedAmountOneLineWithoutPrice False)
|
||||
|
||||
-- tests
|
||||
|
||||
tests_BudgetReport = tests "BudgetReport" [
|
||||
|
||||
@ -273,6 +273,7 @@ import Hledger
|
||||
import Hledger.Cli.CliOptions
|
||||
import Hledger.Cli.Utils
|
||||
import Hledger.Read.CsvReader (CSV, printCSV)
|
||||
import Hledger.Reports.BudgetReport (budgetReportAsCsv)
|
||||
|
||||
|
||||
-- | Command line options for this command.
|
||||
@ -322,6 +323,7 @@ balance opts@CliOpts{rawopts_=rawopts,reportspec_=rspec} j = do
|
||||
render = case fmt of
|
||||
"txt" -> budgetReportAsText ropts
|
||||
"json" -> (++"\n") . TL.unpack . toJsonText
|
||||
"csv" -> (++"\n") . printCSV . budgetReportAsCsv ropts
|
||||
_ -> const $ error' $ unsupportedOutputFormatError fmt
|
||||
writeOutput opts $ render budgetreport
|
||||
|
||||
@ -345,6 +347,10 @@ balance opts@CliOpts{rawopts_=rawopts,reportspec_=rspec} j = do
|
||||
_ -> const $ error' $ unsupportedOutputFormatError fmt -- PARTIAL:
|
||||
writeOutput opts $ render ropts report
|
||||
|
||||
|
||||
-- XXX should all the per-report, per-format rendering code live in the command module,
|
||||
-- like the below, or in the report module, like budgetReportAsText/budgetReportAsCsv ?
|
||||
|
||||
-- rendering single-column balance reports
|
||||
|
||||
-- | Render a single-column balance report as CSV.
|
||||
|
||||
@ -531,4 +531,4 @@ This command also supports the
|
||||
[output destination](hledger.html#output-destination) and
|
||||
[output format](hledger.html#output-format) options
|
||||
The output formats supported are
|
||||
`txt`, `csv`, (multicolumn non-budget reports only) `html`, and (experimental) `json`.
|
||||
`txt`, `csv`, `html`, and `json`.
|
||||
|
||||
@ -515,7 +515,7 @@ Budget performance in 2019-01-01..2019-01-02:
|
||||
------------------++------------------------
|
||||
|| 0 [ 0]
|
||||
|
||||
# 25. -E shows d
|
||||
# 25. -E shows d and e
|
||||
$ hledger bal -f- --budget -E
|
||||
Budget performance in 2019-01-01..2019-01-02:
|
||||
|
||||
@ -532,3 +532,27 @@ Budget performance in 2019-01-01..2019-01-02:
|
||||
------------------++------------------------
|
||||
|| 0 [ 0]
|
||||
|
||||
# 26. The totals row shows correct totals.
|
||||
# -T/--total and -A/--average adds those columns.
|
||||
$ hledger bal -f- --budget -TA not:income
|
||||
Budget performance in 2019-01-01..2019-01-02:
|
||||
|
||||
|| 2019-01-01..2019-01-02 Total Average
|
||||
==================++==============================================================
|
||||
expenses:bills || $80 [22% of $370] $80 [22% of $370] $80 [22% of $370]
|
||||
expenses:bills:a || $10 [50% of $20] $10 [50% of $20] $10 [50% of $20]
|
||||
expenses:bills:b || $40 [20% of $200] $40 [20% of $200] $40 [20% of $200]
|
||||
expenses:bills:c || 0 [ 0% of $50] 0 [ 0% of $50] 0 [ 0% of $50]
|
||||
expenses:bills:f || $10 [ 0] $10 [ 0] $10 [ 0]
|
||||
------------------++--------------------------------------------------------------
|
||||
|| $80 [22% of $370] $80 [22% of $370] $80 [22% of $370]
|
||||
|
||||
# 27. CSV output works.
|
||||
$ hledger bal -f- --budget -TA not:income -O csv
|
||||
"Account","2019-01-01..2019-01-02","budget","Total","budget","Average","budget"
|
||||
"expenses:bills","$80","$370","$80","$370","$80","$370"
|
||||
"expenses:bills:a","$10","$20","$10","$20","$10","$20"
|
||||
"expenses:bills:b","$40","$200","$40","$200","$40","$200"
|
||||
"expenses:bills:c","","$50","","$50","","$50"
|
||||
"expenses:bills:f","$10","0","$10","0","$10","0"
|
||||
"Total:","$80","$370","$80","$370","$80","$370"
|
||||
|
||||
Loading…
Reference in New Issue
Block a user