cli: added --transpose to "balance" command
This commit is contained in:
parent
f3366c7256
commit
5711cdf9ba
@ -270,7 +270,7 @@ budgetReportAsText :: ReportOpts -> BudgetReport -> String
|
||||
budgetReportAsText ropts budgetr@(PeriodicReport ( _, rows, _)) =
|
||||
printf "Budget performance in %s:\n\n" (showDateSpan $ budgetReportSpan budgetr)
|
||||
++
|
||||
tableAsText ropts showcell (budgetReportAsTable ropts budgetr)
|
||||
tableAsText ropts showcell (maybetranspose $ budgetReportAsTable ropts budgetr)
|
||||
where
|
||||
actualwidth =
|
||||
maximum [ maybe 0 (length . showMixedAmountOneLineWithoutPrice) amt
|
||||
@ -319,6 +319,9 @@ budgetReportAsText ropts budgetr@(PeriodicReport ( _, rows, _)) =
|
||||
-- don't show the budget amount in color, it messes up alignment
|
||||
showbudgetamt = showMixedAmountOneLineWithoutPrice
|
||||
|
||||
maybetranspose | transpose_ ropts = \(Table rh ch vals) -> Table ch rh (transpose vals)
|
||||
| otherwise = id
|
||||
|
||||
-- | Build a 'Table' from a multi-column balance report.
|
||||
budgetReportAsTable :: ReportOpts -> BudgetReport -> Table String String (Maybe MixedAmount, Maybe MixedAmount)
|
||||
budgetReportAsTable
|
||||
|
||||
@ -112,6 +112,7 @@ data ReportOpts = ReportOpts {
|
||||
-- normally positive for a more conventional display.
|
||||
,color_ :: Bool
|
||||
,forecast_ :: Bool
|
||||
,transpose_ :: Bool
|
||||
} deriving (Show, Data, Typeable)
|
||||
|
||||
instance Default ReportOpts where def = defreportopts
|
||||
@ -144,6 +145,7 @@ defreportopts = ReportOpts
|
||||
def
|
||||
def
|
||||
def
|
||||
def
|
||||
|
||||
rawOptsToReportOpts :: RawOpts -> IO ReportOpts
|
||||
rawOptsToReportOpts rawopts = checkReportOpts <$> do
|
||||
@ -176,6 +178,7 @@ rawOptsToReportOpts rawopts = checkReportOpts <$> do
|
||||
,pretty_tables_ = boolopt "pretty-tables" rawopts'
|
||||
,color_ = color
|
||||
,forecast_ = boolopt "forecast" rawopts'
|
||||
,transpose_ = boolopt "transpose" rawopts'
|
||||
}
|
||||
|
||||
-- | Do extra validation of raw option values, raising an error if there's a problem.
|
||||
|
||||
@ -291,6 +291,7 @@ balancemode = (defCommandMode $ ["balance"] ++ aliases) { -- also accept but don
|
||||
,flagNone ["budget"] (setboolopt "budget") "show performance compared to budget goals defined by periodic transactions"
|
||||
,flagNone ["show-unbudgeted"] (setboolopt "show-unbudgeted") "with --budget, show unbudgeted accounts also"
|
||||
,flagNone ["invert"] (setboolopt "invert") "display all amounts with reversed sign"
|
||||
,flagNone ["transpose"] (setboolopt "transpose") "transpose rows and columns"
|
||||
]
|
||||
++ outputflags
|
||||
,groupHidden = []
|
||||
@ -469,6 +470,7 @@ renderComponent1 opts (acctname, depth, total) (FormatField ljust min max field)
|
||||
-- and will include the final totals row unless --no-total is set.
|
||||
multiBalanceReportAsCsv :: ReportOpts -> MultiBalanceReport -> CSV
|
||||
multiBalanceReportAsCsv opts (MultiBalanceReport (colspans, items, (coltotals,tot,avg))) =
|
||||
maybetranspose $
|
||||
("Account" : map showDateSpan colspans
|
||||
++ (if row_total_ opts then ["Total"] else [])
|
||||
++ (if average_ opts then ["Average"] else [])
|
||||
@ -488,7 +490,10 @@ multiBalanceReportAsCsv opts (MultiBalanceReport (colspans, items, (coltotals,to
|
||||
++ (if row_total_ opts then [tot] else [])
|
||||
++ (if average_ opts then [avg] else [])
|
||||
)]
|
||||
|
||||
where
|
||||
maybetranspose | transpose_ opts = transpose
|
||||
| otherwise = id
|
||||
|
||||
-- | Render a multi-column balance report as HTML.
|
||||
multiBalanceReportAsHtml :: ReportOpts -> MultiBalanceReport -> Html ()
|
||||
multiBalanceReportAsHtml ropts mbr =
|
||||
@ -505,7 +510,8 @@ multiBalanceReportAsHtml ropts mbr =
|
||||
multiBalanceReportHtmlRows :: ReportOpts -> MultiBalanceReport -> (Html (), [Html ()], Maybe (Html ()))
|
||||
multiBalanceReportHtmlRows ropts mbr =
|
||||
let
|
||||
headingsrow:rest = multiBalanceReportAsCsv ropts mbr
|
||||
headingsrow:rest | transpose_ ropts = error' "Sorry, --transpose is not supported with HTML output yet"
|
||||
| otherwise = multiBalanceReportAsCsv ropts mbr
|
||||
(bodyrows, mtotalsrow) | no_total_ ropts = (rest, Nothing)
|
||||
| otherwise = (init rest, Just $ last rest)
|
||||
in
|
||||
@ -592,6 +598,7 @@ multiBalanceReportAsText opts r =
|
||||
-- | Build a 'Table' from a multi-column balance report.
|
||||
balanceReportAsTable :: ReportOpts -> MultiBalanceReport -> Table String String MixedAmount
|
||||
balanceReportAsTable opts (MultiBalanceReport (colspans, items, (coltotals,tot,avg))) =
|
||||
maybetranspose $
|
||||
addtotalrow $
|
||||
Table
|
||||
(T.Group NoLine $ map Header accts)
|
||||
@ -617,7 +624,9 @@ balanceReportAsTable opts (MultiBalanceReport (colspans, items, (coltotals,tot,a
|
||||
++ (if row_total_ opts && not (null coltotals) then [tot] else [])
|
||||
++ (if average_ opts && not (null coltotals) then [avg] else [])
|
||||
))
|
||||
|
||||
maybetranspose | transpose_ opts = \(Table rh ch vals) -> Table ch rh (transpose vals)
|
||||
| otherwise = id
|
||||
|
||||
-- | Given a table representing a multi-column balance report (for example,
|
||||
-- made using 'balanceReportAsTable'), render it in a format suitable for
|
||||
-- console output.
|
||||
|
||||
@ -38,6 +38,10 @@ Show accounts and their balances. Aliases: b, bal.
|
||||
: select the output format. Supported formats:
|
||||
txt, csv, html.
|
||||
|
||||
`--transpose`
|
||||
: transposes rows and columns in multi-column reports. Supported formats:
|
||||
txt, csv
|
||||
|
||||
`-o FILE --output-file=FILE`
|
||||
: write output to FILE. A file extension matching one of the above formats selects that format.
|
||||
|
||||
|
||||
67
tests/balance/transpose.test
Normal file
67
tests/balance/transpose.test
Normal file
@ -0,0 +1,67 @@
|
||||
hledger -f balance-multicol.journal balance -M -A --transpose
|
||||
>>>
|
||||
Balance changes in 2012/12/01-2013/03/31:
|
||||
|
||||
|| assets assets:cash assets:checking |
|
||||
=========++======================================+====
|
||||
Dec || 0 0 10 | 10
|
||||
Jan || 0 0 0 | 0
|
||||
Feb || 1 1 0 | 2
|
||||
Mar || 0 0 1 | 1
|
||||
Average || 0 0 3 | 3
|
||||
>>>=0
|
||||
|
||||
hledger -f balance-multicol.journal balance -M -A -O csv --transpose
|
||||
>>>
|
||||
"Account","assets","assets:cash","assets:checking","Total:"
|
||||
"2012/12","0","0","10","10"
|
||||
"2013/01","0","0","0","0"
|
||||
"2013/02","1","1","0","2"
|
||||
"2013/03","0","0","1","1"
|
||||
"Average","0","0","3","3"
|
||||
>>>=0
|
||||
|
||||
|
||||
hledger bal -D -b 2016-12-01 -e 2016-12-04 -f - --budget
|
||||
<<<
|
||||
2016/12/01
|
||||
expenses:food $10
|
||||
assets:cash
|
||||
|
||||
2016/12/02
|
||||
expenses:food $9
|
||||
assets:cash
|
||||
|
||||
2016/12/03
|
||||
expenses:food $11
|
||||
assets:cash
|
||||
|
||||
2016/12/02
|
||||
expenses:leisure $5
|
||||
assets:cash
|
||||
|
||||
2016/12/03
|
||||
expenses:movies $25
|
||||
assets:cash
|
||||
|
||||
2016/12/03
|
||||
expenses:cab $15
|
||||
assets:cash
|
||||
|
||||
~ daily from 2016/1/1
|
||||
expenses:food $10
|
||||
expenses:leisure $15
|
||||
assets:cash
|
||||
>>>
|
||||
Budget performance in 2016/12/01-2016/12/03:
|
||||
|
||||
|| 2016/12/01 2016/12/02 2016/12/03
|
||||
==================++==================================================================
|
||||
assets || $-10 [ 40% of $-25] $-14 [ 56% of $-25] $-51 [ 204% of $-25]
|
||||
assets:cash || $-10 [ 40% of $-25] $-14 [ 56% of $-25] $-51 [ 204% of $-25]
|
||||
expenses || $10 [ 40% of $25] $14 [ 56% of $25] $51 [ 204% of $25]
|
||||
expenses:food || $10 [ 100% of $10] $9 [ 90% of $10] $11 [ 110% of $10]
|
||||
expenses:leisure || 0 [ 0% of $15] $5 [ 33% of $15] 0 [ 0% of $15]
|
||||
------------------++------------------------------------------------------------------
|
||||
|| 0 [ 0] 0 [ 0] 0 [ 0]
|
||||
>>>=0
|
||||
Loading…
Reference in New Issue
Block a user