lib, cli: Use --flat as the default mode for all reports.
This commit is contained in:
parent
df84a417d7
commit
1425301a8c
@ -18,13 +18,15 @@ module Hledger.Reports.BalanceReport (
|
|||||||
where
|
where
|
||||||
|
|
||||||
import Data.Time.Calendar
|
import Data.Time.Calendar
|
||||||
|
import Safe (headDef)
|
||||||
|
|
||||||
import Hledger.Data
|
import Hledger.Data
|
||||||
import Hledger.Read (mamountp')
|
import Hledger.Read (mamountp')
|
||||||
import Hledger.Query
|
import Hledger.Query
|
||||||
import Hledger.Utils
|
import Hledger.Utils
|
||||||
|
import Hledger.Reports.MultiBalanceReport (multiBalanceReportWith)
|
||||||
import Hledger.Reports.ReportOptions
|
import Hledger.Reports.ReportOptions
|
||||||
import Hledger.Reports.MultiBalanceReport (balanceReportFromMultiBalanceReport)
|
import Hledger.Reports.ReportTypes
|
||||||
|
|
||||||
|
|
||||||
-- | A simple balance report. It has:
|
-- | A simple balance report. It has:
|
||||||
@ -58,10 +60,21 @@ flatShowsExclusiveBalance = True
|
|||||||
|
|
||||||
-- | Generate a simple balance report, containing the matched accounts and
|
-- | Generate a simple balance report, containing the matched accounts and
|
||||||
-- their balances (change of balance) during the specified period.
|
-- their balances (change of balance) during the specified period.
|
||||||
-- This is like PeriodChangeReport with a single column (but more mature,
|
-- If the normalbalance_ option is set, it adjusts the sorting and sign of
|
||||||
-- eg this can do hierarchical display).
|
-- amounts (see ReportOpts and CompoundBalanceCommand).
|
||||||
balanceReport :: ReportOpts -> Query -> Journal -> BalanceReport
|
balanceReport :: ReportOpts -> Query -> Journal -> BalanceReport
|
||||||
balanceReport = balanceReportFromMultiBalanceReport
|
balanceReport ropts q j = (rows, total)
|
||||||
|
where
|
||||||
|
report = multiBalanceReportWith ropts q j (journalPriceOracle (infer_value_ ropts) j)
|
||||||
|
rows = [( prrFullName row
|
||||||
|
, prrDisplayName row
|
||||||
|
, prrDepth row - 1 -- BalanceReport uses 0-based account depths
|
||||||
|
, headAmt row
|
||||||
|
) | row <- prRows report]
|
||||||
|
total = headAmt $ prTotals report
|
||||||
|
headAmt = headDef nullmixedamt . prrAmounts
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
-- tests
|
-- tests
|
||||||
@ -106,6 +119,19 @@ tests_BalanceReport = tests "BalanceReport" [
|
|||||||
|
|
||||||
,test "no args, sample journal" $
|
,test "no args, sample journal" $
|
||||||
(defreportopts, samplejournal) `gives`
|
(defreportopts, samplejournal) `gives`
|
||||||
|
([
|
||||||
|
("assets:bank:checking","assets:bank:checking",0, mamountp' "$1.00")
|
||||||
|
,("assets:bank:saving","assets:bank:saving",0, mamountp' "$1.00")
|
||||||
|
,("assets:cash","assets:cash",0, mamountp' "$-2.00")
|
||||||
|
,("expenses:food","expenses:food",0, mamountp' "$1.00")
|
||||||
|
,("expenses:supplies","expenses:supplies",0, mamountp' "$1.00")
|
||||||
|
,("income:gifts","income:gifts",0, mamountp' "$-1.00")
|
||||||
|
,("income:salary","income:salary",0, mamountp' "$-1.00")
|
||||||
|
],
|
||||||
|
Mixed [usd 0])
|
||||||
|
|
||||||
|
,test "with --tree" $
|
||||||
|
(defreportopts{accountlistmode_=ALTree}, samplejournal) `gives`
|
||||||
([
|
([
|
||||||
("assets","assets",0, mamountp' "$0.00")
|
("assets","assets",0, mamountp' "$0.00")
|
||||||
,("assets:bank","bank",1, mamountp' "$2.00")
|
,("assets:bank","bank",1, mamountp' "$2.00")
|
||||||
@ -139,8 +165,7 @@ tests_BalanceReport = tests "BalanceReport" [
|
|||||||
|
|
||||||
,test "with date:" $
|
,test "with date:" $
|
||||||
(defreportopts{query_="date:'in 2009'"}, samplejournal2) `gives`
|
(defreportopts{query_="date:'in 2009'"}, samplejournal2) `gives`
|
||||||
([],
|
([], Mixed [num 0])
|
||||||
Mixed [])
|
|
||||||
|
|
||||||
,test "with date2:" $
|
,test "with date2:" $
|
||||||
(defreportopts{query_="date2:'in 2009'"}, samplejournal2) `gives`
|
(defreportopts{query_="date2:'in 2009'"}, samplejournal2) `gives`
|
||||||
@ -161,12 +186,10 @@ tests_BalanceReport = tests "BalanceReport" [
|
|||||||
,test "with not:desc:" $
|
,test "with not:desc:" $
|
||||||
(defreportopts{query_="not:desc:income"}, samplejournal) `gives`
|
(defreportopts{query_="not:desc:income"}, samplejournal) `gives`
|
||||||
([
|
([
|
||||||
("assets","assets",0, mamountp' "$-1.00")
|
("assets:bank:saving","assets:bank:saving",0, mamountp' "$1.00")
|
||||||
,("assets:bank:saving","bank:saving",1, mamountp' "$1.00")
|
,("assets:cash","assets:cash",0, mamountp' "$-2.00")
|
||||||
,("assets:cash","cash",1, mamountp' "$-2.00")
|
,("expenses:food","expenses:food",0, mamountp' "$1.00")
|
||||||
,("expenses","expenses",0, mamountp' "$2.00")
|
,("expenses:supplies","expenses:supplies",0, mamountp' "$1.00")
|
||||||
,("expenses:food","food",1, mamountp' "$1.00")
|
|
||||||
,("expenses:supplies","supplies",1, mamountp' "$1.00")
|
|
||||||
,("income:gifts","income:gifts",0, mamountp' "$-1.00")
|
,("income:gifts","income:gifts",0, mamountp' "$-1.00")
|
||||||
],
|
],
|
||||||
Mixed [usd 0])
|
Mixed [usd 0])
|
||||||
@ -182,7 +205,7 @@ tests_BalanceReport = tests "BalanceReport" [
|
|||||||
|
|
||||||
,test "with period on an unpopulated period" $
|
,test "with period on an unpopulated period" $
|
||||||
(defreportopts{period_= PeriodBetween (fromGregorian 2008 1 2) (fromGregorian 2008 1 3)}, samplejournal) `gives`
|
(defreportopts{period_= PeriodBetween (fromGregorian 2008 1 2) (fromGregorian 2008 1 3)}, samplejournal) `gives`
|
||||||
([],Mixed [])
|
([], Mixed [num 0])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -15,7 +15,6 @@ module Hledger.Reports.MultiBalanceReport (
|
|||||||
|
|
||||||
multiBalanceReport,
|
multiBalanceReport,
|
||||||
multiBalanceReportWith,
|
multiBalanceReportWith,
|
||||||
balanceReportFromMultiBalanceReport,
|
|
||||||
|
|
||||||
CompoundBalanceReport,
|
CompoundBalanceReport,
|
||||||
compoundBalanceReport,
|
compoundBalanceReport,
|
||||||
@ -45,7 +44,7 @@ import Data.Semigroup ((<>))
|
|||||||
#endif
|
#endif
|
||||||
import Data.Semigroup (sconcat)
|
import Data.Semigroup (sconcat)
|
||||||
import Data.Time.Calendar (Day, addDays, fromGregorian)
|
import Data.Time.Calendar (Day, addDays, fromGregorian)
|
||||||
import Safe (headDef, headMay, lastMay)
|
import Safe (headMay, lastMay)
|
||||||
import Text.Tabular as T
|
import Text.Tabular as T
|
||||||
import Text.Tabular.AsciiWide (render)
|
import Text.Tabular.AsciiWide (render)
|
||||||
|
|
||||||
@ -108,16 +107,15 @@ multiBalanceReportWith :: ReportOpts -> Query -> Journal -> PriceOracle -> Multi
|
|||||||
multiBalanceReportWith ropts q j priceoracle = report
|
multiBalanceReportWith ropts q j priceoracle = report
|
||||||
where
|
where
|
||||||
-- Queries, report/column dates.
|
-- Queries, report/column dates.
|
||||||
ropts' = dbg "ropts'" $ setDefaultAccountListMode ALFlat ropts
|
reportspan = dbg "reportspan" $ calculateReportSpan ropts q j
|
||||||
reportspan = dbg "reportspan" $ calculateReportSpan ropts' q j
|
reportq = dbg "reportq" $ makeReportQuery ropts reportspan q
|
||||||
reportq = dbg "reportq" $ makeReportQuery ropts' reportspan q
|
|
||||||
|
|
||||||
-- Group postings into their columns.
|
-- Group postings into their columns.
|
||||||
colps = dbg'' "colps" $ getPostingsByColumn ropts' reportq j reportspan
|
colps = dbg'' "colps" $ getPostingsByColumn ropts reportq j reportspan
|
||||||
colspans = dbg "colspans" $ M.keys colps
|
colspans = dbg "colspans" $ M.keys colps
|
||||||
|
|
||||||
-- Postprocess the report, negating balances and taking percentages if needed
|
-- Postprocess the report, negating balances and taking percentages if needed
|
||||||
report = dbg' "report" $ generateMultiBalanceReport ropts' reportq j priceoracle reportspan colspans colps
|
report = dbg' "report" $ generateMultiBalanceReport ropts reportq j priceoracle reportspan colspans colps
|
||||||
|
|
||||||
-- | Generate a compound balance report from a list of CBCSubreportSpec. This
|
-- | Generate a compound balance report from a list of CBCSubreportSpec. This
|
||||||
-- shares postings between the subreports.
|
-- shares postings between the subreports.
|
||||||
@ -135,12 +133,11 @@ compoundBalanceReportWith :: ReportOpts -> Query -> Journal -> PriceOracle
|
|||||||
compoundBalanceReportWith ropts q j priceoracle subreportspecs = cbr
|
compoundBalanceReportWith ropts q j priceoracle subreportspecs = cbr
|
||||||
where
|
where
|
||||||
-- Queries, report/column dates.
|
-- Queries, report/column dates.
|
||||||
ropts' = dbg "ropts'" $ setDefaultAccountListMode ALFlat ropts
|
reportspan = dbg "reportspan" $ calculateReportSpan ropts q j
|
||||||
reportspan = dbg "reportspan" $ calculateReportSpan ropts' q j
|
reportq = dbg "reportq" $ makeReportQuery ropts reportspan q
|
||||||
reportq = dbg "reportq" $ makeReportQuery ropts' reportspan q
|
|
||||||
|
|
||||||
-- Group postings into their columns.
|
-- Group postings into their columns.
|
||||||
colps = dbg'' "colps" $ getPostingsByColumn ropts'{empty_=True} reportq j reportspan
|
colps = dbg'' "colps" $ getPostingsByColumn ropts{empty_=True} reportq j reportspan
|
||||||
colspans = dbg "colspans" $ M.keys colps
|
colspans = dbg "colspans" $ M.keys colps
|
||||||
|
|
||||||
-- Filter the column postings according to each subreport
|
-- Filter the column postings according to each subreport
|
||||||
@ -153,11 +150,11 @@ compoundBalanceReportWith ropts q j priceoracle subreportspecs = cbr
|
|||||||
( cbcsubreporttitle
|
( cbcsubreporttitle
|
||||||
-- Postprocess the report, negating balances and taking percentages if needed
|
-- Postprocess the report, negating balances and taking percentages if needed
|
||||||
, prNormaliseSign cbcsubreportnormalsign $
|
, prNormaliseSign cbcsubreportnormalsign $
|
||||||
generateMultiBalanceReport ropts'' reportq j priceoracle reportspan colspans colps'
|
generateMultiBalanceReport ropts' reportq j priceoracle reportspan colspans colps'
|
||||||
, cbcsubreportincreasestotal
|
, cbcsubreportincreasestotal
|
||||||
)
|
)
|
||||||
where
|
where
|
||||||
ropts'' = ropts'{normalbalance_=Just cbcsubreportnormalsign}
|
ropts' = ropts{normalbalance_=Just cbcsubreportnormalsign}
|
||||||
|
|
||||||
-- Sum the subreport totals by column. Handle these cases:
|
-- Sum the subreport totals by column. Handle these cases:
|
||||||
-- - no subreports
|
-- - no subreports
|
||||||
@ -173,14 +170,6 @@ compoundBalanceReportWith ropts q j priceoracle subreportspecs = cbr
|
|||||||
cbr = CompoundPeriodicReport "" colspans subreports overalltotals
|
cbr = CompoundPeriodicReport "" colspans subreports overalltotals
|
||||||
|
|
||||||
|
|
||||||
-- | Calculate the span of the report to be generated.
|
|
||||||
setDefaultAccountListMode :: AccountListMode -> ReportOpts -> ReportOpts
|
|
||||||
setDefaultAccountListMode def ropts = ropts{accountlistmode_=mode}
|
|
||||||
where
|
|
||||||
mode = case accountlistmode_ ropts of
|
|
||||||
ALDefault -> def
|
|
||||||
a -> a
|
|
||||||
|
|
||||||
-- | Calculate starting balances, if needed for -H
|
-- | Calculate starting balances, if needed for -H
|
||||||
--
|
--
|
||||||
-- Balances at report start date, from all earlier postings which otherwise match the query.
|
-- Balances at report start date, from all earlier postings which otherwise match the query.
|
||||||
@ -200,8 +189,9 @@ startingBalances ropts q j reportspan = acctchanges
|
|||||||
startbalq = dbg'' "startbalq" $ And [datelessq, precedingspanq]
|
startbalq = dbg'' "startbalq" $ And [datelessq, precedingspanq]
|
||||||
datelessq = dbg "datelessq" $ filterQuery (not . queryIsDateOrDate2) q
|
datelessq = dbg "datelessq" $ filterQuery (not . queryIsDateOrDate2) q
|
||||||
|
|
||||||
ropts' | tree_ ropts = ropts{no_elide_=True, period_=precedingperiod}
|
ropts' = case accountlistmode_ ropts of
|
||||||
| otherwise = ropts{accountlistmode_=ALFlat, period_=precedingperiod}
|
ALTree -> ropts{no_elide_=True, period_=precedingperiod}
|
||||||
|
ALFlat -> ropts{period_=precedingperiod}
|
||||||
|
|
||||||
precedingperiod = dateSpanAsPeriod . spanIntersect precedingspan .
|
precedingperiod = dateSpanAsPeriod . spanIntersect precedingspan .
|
||||||
periodAsDateSpan $ period_ ropts
|
periodAsDateSpan $ period_ ropts
|
||||||
@ -296,9 +286,9 @@ acctChangesFromPostings :: ReportOpts -> Query -> [Posting] -> HashMap ClippedAc
|
|||||||
acctChangesFromPostings ropts q ps = HM.fromList [(aname a, a) | a <- as]
|
acctChangesFromPostings ropts q ps = HM.fromList [(aname a, a) | a <- as]
|
||||||
where
|
where
|
||||||
as = filterAccounts . drop 1 $ accountsFromPostings ps
|
as = filterAccounts . drop 1 $ accountsFromPostings ps
|
||||||
filterAccounts
|
filterAccounts = case accountlistmode_ ropts of
|
||||||
| tree_ ropts = filter ((depthq `matchesAccount`) . aname) -- exclude deeper balances
|
ALTree -> filter ((depthq `matchesAccount`) . aname) -- exclude deeper balances
|
||||||
| otherwise = clipAccountsAndAggregate (queryDepth depthq) . -- aggregate deeper balances at the depth limit.
|
ALFlat -> clipAccountsAndAggregate (queryDepth depthq) . -- aggregate deeper balances at the depth limit.
|
||||||
filter ((0<) . anumpostings)
|
filter ((0<) . anumpostings)
|
||||||
depthq = dbg "depthq" $ filterQuery queryIsDepth q
|
depthq = dbg "depthq" $ filterQuery queryIsDepth q
|
||||||
|
|
||||||
@ -416,7 +406,7 @@ buildReportRows ropts acctvalues =
|
|||||||
, let rowtot = if balancetype_ ropts == PeriodChange then sum rowbals else 0
|
, let rowtot = if balancetype_ ropts == PeriodChange then sum rowbals else 0
|
||||||
, let rowavg = averageMixedAmounts rowbals
|
, let rowavg = averageMixedAmounts rowbals
|
||||||
]
|
]
|
||||||
where balance = if tree_ ropts then aibalance else aebalance
|
where balance = case accountlistmode_ ropts of ALTree -> aibalance; ALFlat -> aebalance
|
||||||
|
|
||||||
-- | Calculate accounts which are to be displayed in the report, as well as
|
-- | Calculate accounts which are to be displayed in the report, as well as
|
||||||
-- their name and depth
|
-- their name and depth
|
||||||
@ -432,9 +422,9 @@ displayedAccounts ropts q valuedaccts
|
|||||||
where
|
where
|
||||||
keep name amts = isInteresting name amts || name `HM.member` interestingParents
|
keep name amts = isInteresting name amts || name `HM.member` interestingParents
|
||||||
|
|
||||||
displayedName name
|
displayedName name = case accountlistmode_ ropts of
|
||||||
| flat_ ropts = DisplayName name droppedName 1
|
ALTree -> DisplayName name leaf . max 0 $ level - boringParents
|
||||||
| otherwise = DisplayName name leaf . max 0 $ level - boringParents
|
ALFlat -> DisplayName name droppedName 1
|
||||||
where
|
where
|
||||||
droppedName = accountNameDrop (drop_ ropts) name
|
droppedName = accountNameDrop (drop_ ropts) name
|
||||||
leaf = accountNameFromComponents . reverse . map accountLeafName $
|
leaf = accountNameFromComponents . reverse . map accountLeafName $
|
||||||
@ -451,13 +441,14 @@ displayedAccounts ropts q valuedaccts
|
|||||||
&& (empty_ ropts || depth == 0 || not (isZeroRow balance amts)) -- Boring because has only zero entries
|
&& (empty_ ropts || depth == 0 || not (isZeroRow balance amts)) -- Boring because has only zero entries
|
||||||
where
|
where
|
||||||
d = accountNameLevel name
|
d = accountNameLevel name
|
||||||
balance = if tree_ ropts && d == depth then aibalance else aebalance
|
balance | ALTree <- accountlistmode_ ropts, d == depth = aibalance
|
||||||
|
| otherwise = aebalance
|
||||||
|
|
||||||
-- Accounts interesting because they are a fork for interesting subaccounts
|
-- Accounts interesting because they are a fork for interesting subaccounts
|
||||||
interestingParents = dbg'' "interestingParents" $ HM.filterWithKey keepParent tallies
|
interestingParents = dbg'' "interestingParents" $ HM.filterWithKey keepParent tallies
|
||||||
where
|
where
|
||||||
keepParent name subaccts
|
keepParent name subaccts
|
||||||
| flat_ ropts = False
|
| ALFlat <- accountlistmode_ ropts = False
|
||||||
| no_elide_ ropts = subaccts > 0 && accountNameLevel name > drop_ ropts
|
| no_elide_ ropts = subaccts > 0 && accountNameLevel name > drop_ ropts
|
||||||
| otherwise = subaccts > 1 && accountNameLevel name > drop_ ropts
|
| otherwise = subaccts > 1 && accountNameLevel name > drop_ ropts
|
||||||
tallies = subaccountTallies . HM.keys $ HM.filterWithKey isInteresting valuedaccts
|
tallies = subaccountTallies . HM.keys $ HM.filterWithKey isInteresting valuedaccts
|
||||||
@ -515,7 +506,7 @@ calculateTotalsRow ropts displayaccts rows =
|
|||||||
where isHighest = not . any (`HM.member` displayaccts) . init . expandAccountName
|
where isHighest = not . any (`HM.member` displayaccts) . init . expandAccountName
|
||||||
|
|
||||||
colamts = transpose . map prrAmounts $ filter isHighest rows
|
colamts = transpose . map prrAmounts $ filter isHighest rows
|
||||||
where isHighest row = not (tree_ ropts) || prrFullName row `HM.member` highestlevelaccts
|
where isHighest row = flat_ ropts || prrFullName row `HM.member` highestlevelaccts
|
||||||
|
|
||||||
-- TODO: If colamts is null, then this is empty. Do we want it to be a full
|
-- TODO: If colamts is null, then this is empty. Do we want it to be a full
|
||||||
-- column of zeros?
|
-- column of zeros?
|
||||||
@ -547,25 +538,6 @@ postprocessReport ropts displaynames =
|
|||||||
(perdivide rowavg $ prrAverage totalrow)
|
(perdivide rowavg $ prrAverage totalrow)
|
||||||
|
|
||||||
|
|
||||||
-- | Generates a simple non-columnar BalanceReport, but using multiBalanceReport,
|
|
||||||
-- in order to support --historical. If the normalbalance_ option is set, it
|
|
||||||
-- adjusts the sorting and sign of amounts (see ReportOpts and
|
|
||||||
-- CompoundBalanceCommand).
|
|
||||||
balanceReportFromMultiBalanceReport :: ReportOpts -> Query -> Journal
|
|
||||||
-> ([(AccountName, AccountName, Int, MixedAmount)], MixedAmount)
|
|
||||||
balanceReportFromMultiBalanceReport ropts q j = (rows', total)
|
|
||||||
where
|
|
||||||
PeriodicReport _ rows (PeriodicReportRow _ totals _ _) =
|
|
||||||
multiBalanceReportWith ropts' q j (journalPriceOracle (infer_value_ ropts) j)
|
|
||||||
rows' = [( displayFull a
|
|
||||||
, displayName a
|
|
||||||
, if tree_ ropts' then displayDepth a - 1 else 0 -- BalanceReport uses 0-based account depths
|
|
||||||
, headDef nullmixedamt amts -- 0 columns is illegal, should not happen, return zeroes if it does
|
|
||||||
) | PeriodicReportRow a amts _ _ <- rows]
|
|
||||||
total = headDef nullmixedamt totals
|
|
||||||
ropts' = setDefaultAccountListMode ALTree ropts
|
|
||||||
|
|
||||||
|
|
||||||
-- | Transpose a Map of HashMaps to a HashMap of Maps.
|
-- | Transpose a Map of HashMaps to a HashMap of Maps.
|
||||||
--
|
--
|
||||||
-- Makes sure that all DateSpans are present in all rows.
|
-- Makes sure that all DateSpans are present in all rows.
|
||||||
|
|||||||
@ -76,9 +76,9 @@ data BalanceType = PeriodChange -- ^ The change of balance in each period.
|
|||||||
instance Default BalanceType where def = PeriodChange
|
instance Default BalanceType where def = PeriodChange
|
||||||
|
|
||||||
-- | Should accounts be displayed: in the command's default style, hierarchically, or as a flat list ?
|
-- | Should accounts be displayed: in the command's default style, hierarchically, or as a flat list ?
|
||||||
data AccountListMode = ALDefault | ALTree | ALFlat deriving (Eq, Show, Data, Typeable)
|
data AccountListMode = ALFlat | ALTree deriving (Eq, Show, Data, Typeable)
|
||||||
|
|
||||||
instance Default AccountListMode where def = ALDefault
|
instance Default AccountListMode where def = ALFlat
|
||||||
|
|
||||||
-- | Standard options for customising report filtering and output.
|
-- | Standard options for customising report filtering and output.
|
||||||
-- Most of these correspond to standard hledger command-line options
|
-- Most of these correspond to standard hledger command-line options
|
||||||
@ -225,7 +225,7 @@ checkReportOpts ropts@ReportOpts{..} =
|
|||||||
|
|
||||||
accountlistmodeopt :: RawOpts -> AccountListMode
|
accountlistmodeopt :: RawOpts -> AccountListMode
|
||||||
accountlistmodeopt =
|
accountlistmodeopt =
|
||||||
fromMaybe ALDefault . choiceopt parse where
|
fromMaybe ALFlat . choiceopt parse where
|
||||||
parse = \case
|
parse = \case
|
||||||
"tree" -> Just ALTree
|
"tree" -> Just ALTree
|
||||||
"flat" -> Just ALFlat
|
"flat" -> Just ALFlat
|
||||||
@ -423,10 +423,11 @@ whichDateFromOpts ReportOpts{..} = if date2_ then SecondaryDate else PrimaryDate
|
|||||||
|
|
||||||
-- | Legacy-compatible convenience aliases for accountlistmode_.
|
-- | Legacy-compatible convenience aliases for accountlistmode_.
|
||||||
tree_ :: ReportOpts -> Bool
|
tree_ :: ReportOpts -> Bool
|
||||||
tree_ = (==ALTree) . accountlistmode_
|
tree_ ReportOpts{accountlistmode_ = ALTree} = True
|
||||||
|
tree_ ReportOpts{accountlistmode_ = ALFlat} = False
|
||||||
|
|
||||||
flat_ :: ReportOpts -> Bool
|
flat_ :: ReportOpts -> Bool
|
||||||
flat_ = (==ALFlat) . accountlistmode_
|
flat_ = not . tree_
|
||||||
|
|
||||||
-- depthFromOpts :: ReportOpts -> Int
|
-- depthFromOpts :: ReportOpts -> Int
|
||||||
-- depthFromOpts opts = min (fromMaybe 99999 $ depth_ opts) (queryDepth $ queryFromOpts nulldate opts)
|
-- depthFromOpts opts = min (fromMaybe 99999 $ depth_ opts) (queryDepth $ queryFromOpts nulldate opts)
|
||||||
|
|||||||
@ -94,14 +94,7 @@ asInit d reset ui@UIState{
|
|||||||
]
|
]
|
||||||
|
|
||||||
-- run the report
|
-- run the report
|
||||||
(items,_total) = report ropts' q j
|
(items,_total) = balanceReport ropts' q j
|
||||||
where
|
|
||||||
-- XXX in historical mode, --forecast throws off the starting balances
|
|
||||||
report | balancetype_ ropts == HistoricalBalance = balanceReportFromMultiBalanceReport
|
|
||||||
| otherwise = balanceReport
|
|
||||||
-- still using the old balanceReport for change reports as it
|
|
||||||
-- does not include every account from before the report period
|
|
||||||
|
|
||||||
|
|
||||||
-- pre-render the list items
|
-- pre-render the list items
|
||||||
displayitem (fullacct, shortacct, indent, bal) =
|
displayitem (fullacct, shortacct, indent, bal) =
|
||||||
|
|||||||
@ -86,7 +86,7 @@ close CliOpts{rawopts_=rawopts, reportopts_=ropts} j = do
|
|||||||
False -> normaliseMixedAmount . mixedAmountStripPrices
|
False -> normaliseMixedAmount . mixedAmountStripPrices
|
||||||
|
|
||||||
-- the balances to close
|
-- the balances to close
|
||||||
(acctbals,_) = balanceReportFromMultiBalanceReport ropts_ q j
|
(acctbals,_) = balanceReport ropts_ q j
|
||||||
totalamt = sum $ map (\(_,_,_,b) -> normalise b) acctbals
|
totalamt = sum $ map (\(_,_,_,b) -> normalise b) acctbals
|
||||||
|
|
||||||
-- since balance assertion amounts are required to be exact, the
|
-- since balance assertion amounts are required to be exact, the
|
||||||
|
|||||||
@ -101,14 +101,8 @@ compoundBalanceCommand CompoundBalanceCommandSpec{..} opts@CliOpts{reportopts_=r
|
|||||||
_ -> Nothing
|
_ -> Nothing
|
||||||
balancetype = fromMaybe cbctype mBalanceTypeOverride
|
balancetype = fromMaybe cbctype mBalanceTypeOverride
|
||||||
-- Set balance type in the report options.
|
-- Set balance type in the report options.
|
||||||
-- Also, use tree mode (by default, at least?) if --cumulative/--historical
|
|
||||||
-- are used in single column mode, since in that situation we will be using
|
|
||||||
-- balanceReportFromMultiBalanceReport which does not support eliding boring parents,
|
|
||||||
-- and tree mode hides this.. or something.. XXX
|
|
||||||
-- This limitation on longer exists. Should this be changed?
|
|
||||||
ropts' = ropts{
|
ropts' = ropts{
|
||||||
balancetype_=balancetype,
|
balancetype_=balancetype,
|
||||||
accountlistmode_=if not (flat_ ropts) && interval_==NoInterval && balancetype `elem` [CumulativeChange, HistoricalBalance] then ALTree else accountlistmode_,
|
|
||||||
no_total_=if percent_ && length cbcqueries > 1 then True else no_total_
|
no_total_=if percent_ && length cbcqueries > 1 then True else no_total_
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -63,7 +63,7 @@ hledger -f- print --explicit --empty
|
|||||||
# When preserving a zero amount's commodity, we should also preserve
|
# When preserving a zero amount's commodity, we should also preserve
|
||||||
# the amount style, such as where to place the symbol.
|
# the amount style, such as where to place the symbol.
|
||||||
# https://github.com/simonmichael/hledger/issues/230
|
# https://github.com/simonmichael/hledger/issues/230
|
||||||
hledger -f- balance
|
hledger -f- balance --tree
|
||||||
<<<
|
<<<
|
||||||
D 1000,00€
|
D 1000,00€
|
||||||
|
|
||||||
|
|||||||
@ -22,7 +22,7 @@
|
|||||||
# 1 4:5
|
# 1 4:5
|
||||||
#--------------------
|
#--------------------
|
||||||
# 0
|
# 0
|
||||||
$ hledger -f - bal
|
$ hledger -f - bal --tree
|
||||||
0 1:2
|
0 1:2
|
||||||
1 3
|
1 3
|
||||||
0 4
|
0 4
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
# 1.
|
# 1.
|
||||||
hledger -f sample.journal balance
|
hledger -f sample.journal balance --tree
|
||||||
>>>
|
>>>
|
||||||
$-1 assets
|
$-1 assets
|
||||||
$1 bank:saving
|
$1 bank:saving
|
||||||
@ -16,7 +16,7 @@ hledger -f sample.journal balance
|
|||||||
>>>=0
|
>>>=0
|
||||||
|
|
||||||
# 2.
|
# 2.
|
||||||
hledger -f sample.journal balance o
|
hledger -f sample.journal balance --tree o
|
||||||
>>>
|
>>>
|
||||||
$1 expenses:food
|
$1 expenses:food
|
||||||
$-2 income
|
$-2 income
|
||||||
@ -58,7 +58,7 @@ hledger -f - balance -b 2016 -e 2017
|
|||||||
>>>= 0
|
>>>= 0
|
||||||
|
|
||||||
# 4. Period reporting works for two years
|
# 4. Period reporting works for two years
|
||||||
hledger -f - balance -b 2015 -e 2017
|
hledger -f - balance --tree -b 2015 -e 2017
|
||||||
<<<
|
<<<
|
||||||
2015/10/10 Client A | Invoice #1
|
2015/10/10 Client A | Invoice #1
|
||||||
assets:receivables $10,000.00
|
assets:receivables $10,000.00
|
||||||
@ -91,7 +91,7 @@ hledger -f - balance -b 2015 -e 2017
|
|||||||
>>>= 0
|
>>>= 0
|
||||||
|
|
||||||
# 5. Period reporting works for one month
|
# 5. Period reporting works for one month
|
||||||
hledger -f - balance -b 2015/11 -e 2015/12
|
hledger -f - balance --tree -b 2015/11 -e 2015/12
|
||||||
<<<
|
<<<
|
||||||
2015/10/10 Client A | Invoice #1
|
2015/10/10 Client A | Invoice #1
|
||||||
assets:receivables $10,000.00
|
assets:receivables $10,000.00
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
hledger -f sample.journal balance --format="%30(account) %-.20(total)"
|
hledger -f sample.journal balance --tree --format="%30(account) %-.20(total)"
|
||||||
>>>
|
>>>
|
||||||
assets $-1
|
assets $-1
|
||||||
bank:saving $1
|
bank:saving $1
|
||||||
|
|||||||
@ -24,7 +24,7 @@ hledger -f - balance --no-total
|
|||||||
>>>=0
|
>>>=0
|
||||||
|
|
||||||
# 3. But not with --no-elide
|
# 3. But not with --no-elide
|
||||||
hledger -f - balance --no-total --no-elide
|
hledger -f - balance --no-total --tree --no-elide
|
||||||
<<<
|
<<<
|
||||||
1/1
|
1/1
|
||||||
(a:b) 1
|
(a:b) 1
|
||||||
@ -34,7 +34,7 @@ hledger -f - balance --no-total --no-elide
|
|||||||
>>>=0
|
>>>=0
|
||||||
|
|
||||||
# 4. Nor when it has more than one subaccount
|
# 4. Nor when it has more than one subaccount
|
||||||
hledger -f - balance --no-total
|
hledger -f - balance --tree --no-total
|
||||||
<<<
|
<<<
|
||||||
1/1
|
1/1
|
||||||
(a:b) 1
|
(a:b) 1
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
#!/usr/bin/env shelltest
|
#!/usr/bin/env shelltest
|
||||||
# 1. Single column percent
|
# 1. Single column percent
|
||||||
hledger -f sample.journal balance expenses -%
|
hledger -f sample.journal balance expenses -% --tree
|
||||||
>>>
|
>>>
|
||||||
100.0 % expenses
|
100.0 % expenses
|
||||||
50.0 % food
|
50.0 % food
|
||||||
|
|||||||
@ -223,7 +223,7 @@ Balance changes in 2018:
|
|||||||
2018/1/1
|
2018/1/1
|
||||||
(a:k) 1
|
(a:k) 1
|
||||||
|
|
||||||
$ hledger -f- bal -N
|
$ hledger -f- bal -N --tree
|
||||||
1 a:k
|
1 a:k
|
||||||
2 b
|
2 b
|
||||||
1 i
|
1 i
|
||||||
@ -268,7 +268,7 @@ account d
|
|||||||
2018/1/1
|
2018/1/1
|
||||||
(d) 1
|
(d) 1
|
||||||
|
|
||||||
$ hledger -f- bal -N
|
$ hledger -f- bal -N --tree
|
||||||
1 d
|
1 d
|
||||||
1 a:l
|
1 a:l
|
||||||
3 b
|
3 b
|
||||||
@ -358,7 +358,7 @@ $ hledger -f- bal -N --sort-amount --flat
|
|||||||
(a:ab) 3
|
(a:ab) 3
|
||||||
(b) 2
|
(b) 2
|
||||||
|
|
||||||
$ hledger -f- bal -N -S
|
$ hledger -f- bal -N -S --tree
|
||||||
4 a
|
4 a
|
||||||
3 ab
|
3 ab
|
||||||
1 aa
|
1 aa
|
||||||
|
|||||||
@ -240,7 +240,7 @@ Balance Sheet 2016-01-31
|
|||||||
|
|
||||||
# 9. Check that accounts brought to zero by subaccount balances
|
# 9. Check that accounts brought to zero by subaccount balances
|
||||||
# are not erased from balancesheet
|
# are not erased from balancesheet
|
||||||
hledger -f - balancesheet
|
hledger -f - balancesheet --tree
|
||||||
<<<
|
<<<
|
||||||
2018-10-01
|
2018-10-01
|
||||||
income:whatever
|
income:whatever
|
||||||
|
|||||||
@ -47,7 +47,7 @@ hledger -f chinese.journal register --width 80
|
|||||||
>>>=0
|
>>>=0
|
||||||
|
|
||||||
# 3.
|
# 3.
|
||||||
hledger -f chinese.journal balance
|
hledger -f chinese.journal balance --tree
|
||||||
>>>
|
>>>
|
||||||
0 㐀:㐁
|
0 㐀:㐁
|
||||||
1 A 㐂
|
1 A 㐂
|
||||||
|
|||||||
@ -38,7 +38,7 @@ $ hledger register -f- --auto
|
|||||||
>=
|
>=
|
||||||
|
|
||||||
# 3. balance
|
# 3. balance
|
||||||
$ hledger balance -f- --auto
|
$ hledger balance -f- --auto --tree
|
||||||
$115 assets
|
$115 assets
|
||||||
$95 bank
|
$95 bank
|
||||||
$20 cash
|
$20 cash
|
||||||
|
|||||||
@ -35,7 +35,7 @@ hledger -f- print
|
|||||||
>>>=0
|
>>>=0
|
||||||
#
|
#
|
||||||
# 5. real and balanced virtual postings are balanced separately, and multiple blank virtuals are ok
|
# 5. real and balanced virtual postings are balanced separately, and multiple blank virtuals are ok
|
||||||
hledger -f- balance
|
hledger -f- balance --tree
|
||||||
<<<
|
<<<
|
||||||
2010/1/1 x
|
2010/1/1 x
|
||||||
a 1
|
a 1
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user