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