bal: --invert flag to flip all signs

This commit is contained in:
Simon Michael 2018-01-29 14:52:03 -08:00
parent a26647f49d
commit d3fde29b36
6 changed files with 35 additions and 19 deletions

View File

@ -77,7 +77,9 @@ flatShowsExclusiveBalance = True
-- This is like PeriodChangeReport with a single column (but more mature, -- This is like PeriodChangeReport with a single column (but more mature,
-- eg this can do hierarchical display). -- eg this can do hierarchical display).
balanceReport :: ReportOpts -> Query -> Journal -> BalanceReport balanceReport :: ReportOpts -> Query -> Journal -> BalanceReport
balanceReport opts q j = (items, total) balanceReport opts q j =
(if invert_ opts then brNegate else id) $
(items, total)
where where
-- dbg1 = const id -- exclude from debug output -- dbg1 = const id -- exclude from debug output
dbg1 s = let p = "balanceReport" in Hledger.Utils.dbg1 (p++" "++s) -- add prefix in debug output dbg1 s = let p = "balanceReport" in Hledger.Utils.dbg1 (p++" "++s) -- add prefix in debug output
@ -148,6 +150,11 @@ balanceReportItem opts q a
-- items = [(a,a',n, headDef 0 bs) | ((a,a',n), bs) <- mbrrows] -- items = [(a,a',n, headDef 0 bs) | ((a,a',n), bs) <- mbrrows]
-- total = headDef 0 mbrtotals -- total = headDef 0 mbrtotals
-- | Flip the sign of all amounts in a BalanceReport.
brNegate :: BalanceReport -> BalanceReport
brNegate (is, tot) = (map brItemNegate is, -tot)
where
brItemNegate (a, a', d, amt) = (a, a', d, -amt)
tests_balanceReport = tests_balanceReport =
let let

View File

@ -10,8 +10,8 @@ module Hledger.Reports.MultiBalanceReports (
MultiBalanceReportRow, MultiBalanceReportRow,
multiBalanceReport, multiBalanceReport,
balanceReportFromMultiBalanceReport, balanceReportFromMultiBalanceReport,
-- mbrNegate, mbrNegate,
-- mbrNormaliseSign, mbrNormaliseSign,
-- -- * Tests -- -- * Tests
tests_Hledger_Reports_MultiBalanceReport tests_Hledger_Reports_MultiBalanceReport
@ -80,7 +80,9 @@ type ClippedAccountName = AccountName
-- If the normalbalance_ option is set, it adjusts the sorting and sign of amounts -- If the normalbalance_ option is set, it adjusts the sorting and sign of amounts
-- (see ReportOpts and CompoundBalanceCommand). -- (see ReportOpts and CompoundBalanceCommand).
multiBalanceReport :: ReportOpts -> Query -> Journal -> MultiBalanceReport multiBalanceReport :: ReportOpts -> Query -> Journal -> MultiBalanceReport
multiBalanceReport opts q j = MultiBalanceReport (displayspans, sorteditems, totalsrow) multiBalanceReport opts q j =
(if invert_ opts then mbrNegate else id) $
MultiBalanceReport (displayspans, sorteditems, totalsrow)
where where
symq = dbg1 "symq" $ filterQuery queryIsSym $ dbg1 "requested q" q symq = dbg1 "symq" $ filterQuery queryIsSym $ dbg1 "requested q" q
depthq = dbg1 "depthq" $ filterQuery queryIsDepth q depthq = dbg1 "depthq" $ filterQuery queryIsDepth q
@ -244,6 +246,19 @@ multiBalanceReport opts q j = MultiBalanceReport (displayspans, sorteditems, tot
dbg1 s = let p = "multiBalanceReport" in Hledger.Utils.dbg1 (p++" "++s) -- add prefix in this function's debug output dbg1 s = let p = "multiBalanceReport" in Hledger.Utils.dbg1 (p++" "++s) -- add prefix in this function's debug output
-- dbg1 = const id -- exclude this function from debug output -- dbg1 = const id -- exclude this function from debug output
-- | Given a MultiBalanceReport and its normal balance sign,
-- if it is known to be normally negative, convert it to normally positive.
mbrNormaliseSign :: NormalSign -> MultiBalanceReport -> MultiBalanceReport
mbrNormaliseSign NormallyNegative = mbrNegate
mbrNormaliseSign _ = id
-- | Flip the sign of all amounts in a MultiBalanceReport.
mbrNegate (MultiBalanceReport (colspans, rows, totalsrow)) =
MultiBalanceReport (colspans, map mbrRowNegate rows, mbrTotalsRowNegate totalsrow)
where
mbrRowNegate (acct,shortacct,indent,amts,tot,avg) = (acct,shortacct,indent,map negate amts,-tot,-avg)
mbrTotalsRowNegate (amts,tot,avg) = (map negate amts,-tot,-avg)
-- | Generates a simple non-columnar BalanceReport, but using multiBalanceReport, -- | Generates a simple non-columnar BalanceReport, but using multiBalanceReport,
-- in order to support --historical. Does not support tree-mode boring parent eliding. -- in order to support --historical. Does not support tree-mode boring parent eliding.
-- If the normalbalance_ option is set, it adjusts the sorting and sign of amounts -- If the normalbalance_ option is set, it adjusts the sorting and sign of amounts

View File

@ -102,6 +102,7 @@ data ReportOpts = ReportOpts {
,value_ :: Bool ,value_ :: Bool
,pretty_tables_ :: Bool ,pretty_tables_ :: Bool
,sort_amount_ :: Bool ,sort_amount_ :: Bool
,invert_ :: Bool -- ^ if true, flip all amount signs in reports
,normalbalance_ :: Maybe NormalSign ,normalbalance_ :: Maybe NormalSign
-- ^ This can be set when running balance reports on a set of accounts -- ^ This can be set when running balance reports on a set of accounts
-- with the same normal balance type (eg all assets, or all incomes). -- with the same normal balance type (eg all assets, or all incomes).
@ -145,6 +146,7 @@ defreportopts = ReportOpts
def def
def def
def def
def
rawOptsToReportOpts :: RawOpts -> IO ReportOpts rawOptsToReportOpts :: RawOpts -> IO ReportOpts
rawOptsToReportOpts rawopts = checkReportOpts <$> do rawOptsToReportOpts rawopts = checkReportOpts <$> do
@ -173,6 +175,7 @@ rawOptsToReportOpts rawopts = checkReportOpts <$> do
,no_total_ = boolopt "no-total" rawopts' ,no_total_ = boolopt "no-total" rawopts'
,value_ = boolopt "value" rawopts' ,value_ = boolopt "value" rawopts'
,sort_amount_ = boolopt "sort-amount" rawopts' ,sort_amount_ = boolopt "sort-amount" rawopts'
,invert_ = boolopt "invert" rawopts'
,pretty_tables_ = boolopt "pretty-tables" rawopts' ,pretty_tables_ = boolopt "pretty-tables" rawopts'
,color_ = color ,color_ = color
,forecast_ = boolopt "forecast" rawopts' ,forecast_ = boolopt "forecast" rawopts'

View File

@ -292,6 +292,7 @@ balancemode = (defCommandMode $ ["balance"] ++ aliases) { -- also accept but don
,flagNone ["sort-amount","S"] (\opts -> setboolopt "sort-amount" opts) "sort by amount instead of account code/name (in flat mode). With multiple columns, sorts by the row total, or by row average if that is displayed." ,flagNone ["sort-amount","S"] (\opts -> setboolopt "sort-amount" opts) "sort by amount instead of account code/name (in flat mode). With multiple columns, sorts by the row total, or by row average if that is displayed."
,flagNone ["budget"] (setboolopt "budget") "show performance compared to budget goals defined by periodic transactions" ,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 ["show-unbudgeted"] (setboolopt "show-unbudgeted") "with --budget, show unbudgeted accounts also"
,flagNone ["invert"] (setboolopt "invert") "display all amounts with reversed sign"
] ]
++ outputflags ++ outputflags
,groupHidden = [] ,groupHidden = []
@ -701,11 +702,11 @@ renderBalanceReportTable ropts =
| otherwise = showMixedAmountOneLineWithoutPrice | otherwise = showMixedAmountOneLineWithoutPrice
renderBalanceReportTable' :: ReportOpts -> (a -> String) -> Table String String a -> String renderBalanceReportTable' :: ReportOpts -> (a -> String) -> Table String String a -> String
renderBalanceReportTable' (ReportOpts { pretty_tables_ = pretty}) showCell = renderBalanceReportTable' (ReportOpts { pretty_tables_ = pretty}) showamt =
unlines unlines
. trimborder . trimborder
. lines . lines
. render pretty id id showCell . render pretty id id showamt
. align . align
where where
trimborder = drop 1 . init . map (drop 1 . init) trimborder = drop 1 . init . map (drop 1 . init)

View File

@ -209,19 +209,6 @@ compoundBalanceCommand CompoundBalanceCommandSpec{..} opts@CliOpts{reportopts_=r
"html" -> (++ "\n") $ TL.unpack $ L.renderText $ compoundBalanceReportAsHtml ropts cbr "html" -> (++ "\n") $ TL.unpack $ L.renderText $ compoundBalanceReportAsHtml ropts cbr
_ -> compoundBalanceReportAsText ropts' cbr _ -> compoundBalanceReportAsText ropts' cbr
-- | Given a MultiBalanceReport and its normal balance sign,
-- if it is known to be normally negative, convert it to normally positive.
mbrNormaliseSign :: NormalSign -> MultiBalanceReport -> MultiBalanceReport
mbrNormaliseSign NormallyNegative = mbrNegate
mbrNormaliseSign _ = id
-- | Flip the sign of all amounts in a MultiBalanceReport.
mbrNegate (MultiBalanceReport (colspans, rows, totalsrow)) =
MultiBalanceReport (colspans, map mbrRowNegate rows, mbrTotalsRowNegate totalsrow)
where
mbrRowNegate (acct,shortacct,indent,amts,tot,avg) = (acct,shortacct,indent,map negate amts,-tot,-avg)
mbrTotalsRowNegate (amts,tot,avg) = (map negate amts,-tot,-avg)
-- | Run one subreport for a compound balance command in multi-column mode. -- | Run one subreport for a compound balance command in multi-column mode.
-- This returns a MultiBalanceReport. -- This returns a MultiBalanceReport.
compoundBalanceSubreport :: ReportOpts -> Query -> Journal -> (Journal -> Query) -> NormalSign -> MultiBalanceReport compoundBalanceSubreport :: ReportOpts -> Query -> Journal -> (Journal -> Query) -> NormalSign -> MultiBalanceReport

View File

@ -47,6 +47,9 @@ txt, csv, html.
`--sort-amount` `--sort-amount`
: sort by amount instead of account code/name (in flat mode). With multiple columns, sorts by the row total, or by row average if that is displayed. : sort by amount instead of account code/name (in flat mode). With multiple columns, sorts by the row total, or by row average if that is displayed.
`--invert`
: display all amounts with reversed sign
`--budget` `--budget`
: show performance compared to budget goals defined by [periodic transactions](journal.html#periodic-transactions) : show performance compared to budget goals defined by [periodic transactions](journal.html#periodic-transactions)