mirror of
https://github.com/simonmichael/hledger.git
synced 2024-09-20 02:37:12 +03:00
bal: --invert flag to flip all signs
This commit is contained in:
parent
a26647f49d
commit
d3fde29b36
@ -77,7 +77,9 @@ flatShowsExclusiveBalance = True
|
||||
-- This is like PeriodChangeReport with a single column (but more mature,
|
||||
-- eg this can do hierarchical display).
|
||||
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
|
||||
-- dbg1 = const id -- exclude from 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]
|
||||
-- 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 =
|
||||
let
|
||||
|
@ -10,8 +10,8 @@ module Hledger.Reports.MultiBalanceReports (
|
||||
MultiBalanceReportRow,
|
||||
multiBalanceReport,
|
||||
balanceReportFromMultiBalanceReport,
|
||||
-- mbrNegate,
|
||||
-- mbrNormaliseSign,
|
||||
mbrNegate,
|
||||
mbrNormaliseSign,
|
||||
|
||||
-- -- * Tests
|
||||
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
|
||||
-- (see ReportOpts and CompoundBalanceCommand).
|
||||
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
|
||||
symq = dbg1 "symq" $ filterQuery queryIsSym $ dbg1 "requested q" 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 = 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,
|
||||
-- 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
|
||||
|
@ -102,6 +102,7 @@ data ReportOpts = ReportOpts {
|
||||
,value_ :: Bool
|
||||
,pretty_tables_ :: Bool
|
||||
,sort_amount_ :: Bool
|
||||
,invert_ :: Bool -- ^ if true, flip all amount signs in reports
|
||||
,normalbalance_ :: Maybe NormalSign
|
||||
-- ^ 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).
|
||||
@ -145,6 +146,7 @@ defreportopts = ReportOpts
|
||||
def
|
||||
def
|
||||
def
|
||||
def
|
||||
|
||||
rawOptsToReportOpts :: RawOpts -> IO ReportOpts
|
||||
rawOptsToReportOpts rawopts = checkReportOpts <$> do
|
||||
@ -173,6 +175,7 @@ rawOptsToReportOpts rawopts = checkReportOpts <$> do
|
||||
,no_total_ = boolopt "no-total" rawopts'
|
||||
,value_ = boolopt "value" rawopts'
|
||||
,sort_amount_ = boolopt "sort-amount" rawopts'
|
||||
,invert_ = boolopt "invert" rawopts'
|
||||
,pretty_tables_ = boolopt "pretty-tables" rawopts'
|
||||
,color_ = color
|
||||
,forecast_ = boolopt "forecast" rawopts'
|
||||
|
@ -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 ["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"
|
||||
]
|
||||
++ outputflags
|
||||
,groupHidden = []
|
||||
@ -701,11 +702,11 @@ renderBalanceReportTable ropts =
|
||||
| otherwise = showMixedAmountOneLineWithoutPrice
|
||||
|
||||
renderBalanceReportTable' :: ReportOpts -> (a -> String) -> Table String String a -> String
|
||||
renderBalanceReportTable' (ReportOpts { pretty_tables_ = pretty}) showCell =
|
||||
renderBalanceReportTable' (ReportOpts { pretty_tables_ = pretty}) showamt =
|
||||
unlines
|
||||
. trimborder
|
||||
. lines
|
||||
. render pretty id id showCell
|
||||
. render pretty id id showamt
|
||||
. align
|
||||
where
|
||||
trimborder = drop 1 . init . map (drop 1 . init)
|
||||
|
@ -209,19 +209,6 @@ compoundBalanceCommand CompoundBalanceCommandSpec{..} opts@CliOpts{reportopts_=r
|
||||
"html" -> (++ "\n") $ TL.unpack $ L.renderText $ compoundBalanceReportAsHtml 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.
|
||||
-- This returns a MultiBalanceReport.
|
||||
compoundBalanceSubreport :: ReportOpts -> Query -> Journal -> (Journal -> Query) -> NormalSign -> MultiBalanceReport
|
||||
|
@ -47,6 +47,9 @@ txt, csv, html.
|
||||
`--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.
|
||||
|
||||
`--invert`
|
||||
: display all amounts with reversed sign
|
||||
|
||||
`--budget`
|
||||
: show performance compared to budget goals defined by [periodic transactions](journal.html#periodic-transactions)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user