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 | ||||
| 
 | ||||
| import Data.Time.Calendar | ||||
| import Safe (headDef) | ||||
| 
 | ||||
| import Hledger.Data | ||||
| import Hledger.Read (mamountp') | ||||
| import Hledger.Query | ||||
| import Hledger.Utils | ||||
| import Hledger.Reports.MultiBalanceReport (multiBalanceReportWith) | ||||
| import Hledger.Reports.ReportOptions | ||||
| import Hledger.Reports.MultiBalanceReport (balanceReportFromMultiBalanceReport) | ||||
| import Hledger.Reports.ReportTypes | ||||
| 
 | ||||
| 
 | ||||
| -- | A simple balance report. It has: | ||||
| @ -58,10 +60,21 @@ flatShowsExclusiveBalance    = True | ||||
| 
 | ||||
| -- | Generate a simple balance report, containing the matched accounts and | ||||
| -- their balances (change of balance) during the specified period. | ||||
| -- This is like PeriodChangeReport with a single column (but more mature, | ||||
| -- eg this can do hierarchical display). | ||||
| -- If the normalbalance_ option is set, it adjusts the sorting and sign of | ||||
| -- amounts (see ReportOpts and CompoundBalanceCommand). | ||||
| 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 | ||||
| @ -106,6 +119,19 @@ tests_BalanceReport = tests "BalanceReport" [ | ||||
| 
 | ||||
|     ,test "no args, sample journal" $ | ||||
|      (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:bank","bank",1, mamountp' "$2.00") | ||||
| @ -139,8 +165,7 @@ tests_BalanceReport = tests "BalanceReport" [ | ||||
| 
 | ||||
|     ,test "with date:" $ | ||||
|      (defreportopts{query_="date:'in 2009'"}, samplejournal2) `gives` | ||||
|       ([], | ||||
|        Mixed []) | ||||
|       ([], Mixed [num 0]) | ||||
| 
 | ||||
|     ,test "with date2:" $ | ||||
|      (defreportopts{query_="date2:'in 2009'"}, samplejournal2) `gives` | ||||
| @ -161,12 +186,10 @@ tests_BalanceReport = tests "BalanceReport" [ | ||||
|     ,test "with not:desc:" $ | ||||
|      (defreportopts{query_="not:desc:income"}, samplejournal) `gives` | ||||
|       ([ | ||||
|         ("assets","assets",0, mamountp' "$-1.00") | ||||
|        ,("assets:bank:saving","bank:saving",1, mamountp' "$1.00") | ||||
|        ,("assets:cash","cash",1, mamountp' "$-2.00") | ||||
|        ,("expenses","expenses",0, mamountp' "$2.00") | ||||
|        ,("expenses:food","food",1, mamountp' "$1.00") | ||||
|        ,("expenses:supplies","supplies",1, 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") | ||||
|        ], | ||||
|        Mixed [usd 0]) | ||||
| @ -182,7 +205,7 @@ tests_BalanceReport = tests "BalanceReport" [ | ||||
| 
 | ||||
|      ,test "with period on an unpopulated period" $ | ||||
|       (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, | ||||
|   multiBalanceReportWith, | ||||
|   balanceReportFromMultiBalanceReport, | ||||
| 
 | ||||
|   CompoundBalanceReport, | ||||
|   compoundBalanceReport, | ||||
| @ -45,7 +44,7 @@ import Data.Semigroup ((<>)) | ||||
| #endif | ||||
| import Data.Semigroup (sconcat) | ||||
| import Data.Time.Calendar (Day, addDays, fromGregorian) | ||||
| import Safe (headDef, headMay, lastMay) | ||||
| import Safe (headMay, lastMay) | ||||
| import Text.Tabular as T | ||||
| import Text.Tabular.AsciiWide (render) | ||||
| 
 | ||||
| @ -108,16 +107,15 @@ multiBalanceReportWith :: ReportOpts -> Query -> Journal -> PriceOracle -> Multi | ||||
| multiBalanceReportWith ropts q j priceoracle = report | ||||
|   where | ||||
|     -- Queries, report/column dates. | ||||
|     ropts'     = dbg "ropts'"     $ setDefaultAccountListMode ALFlat ropts | ||||
|     reportspan = dbg "reportspan" $ calculateReportSpan ropts' q j | ||||
|     reportq    = dbg "reportq"    $ makeReportQuery ropts' reportspan q | ||||
|     reportspan = dbg "reportspan" $ calculateReportSpan ropts q j | ||||
|     reportq    = dbg "reportq"    $ makeReportQuery ropts reportspan q | ||||
| 
 | ||||
|     -- 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 | ||||
| 
 | ||||
|     -- 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 | ||||
| -- shares postings between the subreports. | ||||
| @ -135,12 +133,11 @@ compoundBalanceReportWith :: ReportOpts -> Query -> Journal -> PriceOracle | ||||
| compoundBalanceReportWith ropts q j priceoracle subreportspecs = cbr | ||||
|   where | ||||
|     -- Queries, report/column dates. | ||||
|     ropts'     = dbg "ropts'"     $ setDefaultAccountListMode ALFlat ropts | ||||
|     reportspan = dbg "reportspan" $ calculateReportSpan ropts' q j | ||||
|     reportq    = dbg "reportq"    $ makeReportQuery ropts' reportspan q | ||||
|     reportspan = dbg "reportspan" $ calculateReportSpan ropts q j | ||||
|     reportq    = dbg "reportq"    $ makeReportQuery ropts reportspan q | ||||
| 
 | ||||
|     -- 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 | ||||
| 
 | ||||
|     -- Filter the column postings according to each subreport | ||||
| @ -153,11 +150,11 @@ compoundBalanceReportWith ropts q j priceoracle subreportspecs = cbr | ||||
|             ( cbcsubreporttitle | ||||
|             -- Postprocess the report, negating balances and taking percentages if needed | ||||
|             , prNormaliseSign cbcsubreportnormalsign $ | ||||
|                 generateMultiBalanceReport ropts'' reportq j priceoracle reportspan colspans colps' | ||||
|                 generateMultiBalanceReport ropts' reportq j priceoracle reportspan colspans colps' | ||||
|             , cbcsubreportincreasestotal | ||||
|             ) | ||||
|           where | ||||
|             ropts'' = ropts'{normalbalance_=Just cbcsubreportnormalsign} | ||||
|             ropts' = ropts{normalbalance_=Just cbcsubreportnormalsign} | ||||
| 
 | ||||
|     -- Sum the subreport totals by column. Handle these cases: | ||||
|     -- - no subreports | ||||
| @ -173,14 +170,6 @@ compoundBalanceReportWith ropts q j priceoracle subreportspecs = cbr | ||||
|     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 | ||||
| -- | ||||
| -- 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] | ||||
|     datelessq = dbg "datelessq" $ filterQuery (not . queryIsDateOrDate2) q | ||||
| 
 | ||||
|     ropts' | tree_ ropts = ropts{no_elide_=True, period_=precedingperiod} | ||||
|            | otherwise   = ropts{accountlistmode_=ALFlat, period_=precedingperiod} | ||||
|     ropts' = case accountlistmode_ ropts of | ||||
|         ALTree -> ropts{no_elide_=True, period_=precedingperiod} | ||||
|         ALFlat -> ropts{period_=precedingperiod} | ||||
| 
 | ||||
|     precedingperiod = dateSpanAsPeriod . spanIntersect precedingspan . | ||||
|                          periodAsDateSpan $ period_ ropts | ||||
| @ -296,9 +286,9 @@ acctChangesFromPostings :: ReportOpts -> Query -> [Posting] -> HashMap ClippedAc | ||||
| acctChangesFromPostings ropts q ps = HM.fromList [(aname a, a) | a <- as] | ||||
|   where | ||||
|     as = filterAccounts . drop 1 $ accountsFromPostings ps | ||||
|     filterAccounts | ||||
|       | tree_ ropts = filter ((depthq `matchesAccount`) . aname)      -- exclude deeper balances | ||||
|       | otherwise   = clipAccountsAndAggregate (queryDepth depthq) .  -- aggregate deeper balances at the depth limit. | ||||
|     filterAccounts = case accountlistmode_ ropts of | ||||
|         ALTree -> filter ((depthq `matchesAccount`) . aname)      -- exclude deeper balances | ||||
|         ALFlat -> clipAccountsAndAggregate (queryDepth depthq) .  -- aggregate deeper balances at the depth limit. | ||||
|                       filter ((0<) . anumpostings) | ||||
|     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 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 | ||||
| -- their name and depth | ||||
| @ -432,9 +422,9 @@ displayedAccounts ropts q valuedaccts | ||||
|       where | ||||
|         keep name amts = isInteresting name amts || name `HM.member` interestingParents | ||||
| 
 | ||||
|     displayedName name | ||||
|         | flat_ ropts = DisplayName name droppedName 1 | ||||
|         | otherwise   = DisplayName name leaf . max 0 $ level - boringParents | ||||
|     displayedName name = case accountlistmode_ ropts of | ||||
|         ALTree -> DisplayName name leaf . max 0 $ level - boringParents | ||||
|         ALFlat -> DisplayName name droppedName 1 | ||||
|       where | ||||
|         droppedName = accountNameDrop (drop_ ropts) name | ||||
|         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 | ||||
|       where | ||||
|         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 | ||||
|     interestingParents = dbg'' "interestingParents" $ HM.filterWithKey keepParent tallies | ||||
|       where | ||||
|         keepParent name subaccts | ||||
|             | flat_ ropts     = False | ||||
|             | ALFlat <- accountlistmode_ ropts = False | ||||
|             | no_elide_ ropts = subaccts > 0 && accountNameLevel name > drop_ ropts | ||||
|             | otherwise       = subaccts > 1 && accountNameLevel name > drop_ ropts | ||||
|         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 | ||||
| 
 | ||||
|     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 | ||||
|     -- column of zeros? | ||||
| @ -547,25 +538,6 @@ postprocessReport ropts displaynames = | ||||
|                 (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. | ||||
| -- | ||||
| -- 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 | ||||
| 
 | ||||
| -- | 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. | ||||
| -- Most of these correspond to standard hledger command-line options | ||||
| @ -225,7 +225,7 @@ checkReportOpts ropts@ReportOpts{..} = | ||||
| 
 | ||||
| accountlistmodeopt :: RawOpts -> AccountListMode | ||||
| accountlistmodeopt = | ||||
|   fromMaybe ALDefault . choiceopt parse where | ||||
|   fromMaybe ALFlat . choiceopt parse where | ||||
|     parse = \case | ||||
|       "tree" -> Just ALTree | ||||
|       "flat" -> Just ALFlat | ||||
| @ -423,10 +423,11 @@ whichDateFromOpts ReportOpts{..} = if date2_ then SecondaryDate else PrimaryDate | ||||
| 
 | ||||
| -- | Legacy-compatible convenience aliases for accountlistmode_. | ||||
| tree_ :: ReportOpts -> Bool | ||||
| tree_ = (==ALTree) . accountlistmode_ | ||||
| tree_ ReportOpts{accountlistmode_ = ALTree} = True | ||||
| tree_ ReportOpts{accountlistmode_ = ALFlat} = False | ||||
| 
 | ||||
| flat_ :: ReportOpts -> Bool | ||||
| flat_ = (==ALFlat) . accountlistmode_ | ||||
| flat_ = not . tree_ | ||||
| 
 | ||||
| -- depthFromOpts :: ReportOpts -> Int | ||||
| -- depthFromOpts opts = min (fromMaybe 99999 $ depth_ opts) (queryDepth $ queryFromOpts nulldate opts) | ||||
|  | ||||
| @ -94,14 +94,7 @@ asInit d reset ui@UIState{ | ||||
|           ] | ||||
| 
 | ||||
|     -- run the report | ||||
|     (items,_total) = report 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 | ||||
| 
 | ||||
|     (items,_total) = balanceReport ropts' q j | ||||
| 
 | ||||
|     -- pre-render the list items | ||||
|     displayitem (fullacct, shortacct, indent, bal) = | ||||
|  | ||||
| @ -86,7 +86,7 @@ close CliOpts{rawopts_=rawopts, reportopts_=ropts} j = do | ||||
|                   False -> normaliseMixedAmount . mixedAmountStripPrices | ||||
| 
 | ||||
|     -- the balances to close | ||||
|     (acctbals,_) = balanceReportFromMultiBalanceReport ropts_ q j | ||||
|     (acctbals,_) = balanceReport ropts_ q j | ||||
|     totalamt = sum $ map (\(_,_,_,b) -> normalise b) acctbals | ||||
| 
 | ||||
|     -- since balance assertion amounts are required to be exact, the | ||||
|  | ||||
| @ -101,14 +101,8 @@ compoundBalanceCommand CompoundBalanceCommandSpec{..} opts@CliOpts{reportopts_=r | ||||
|             _            -> Nothing | ||||
|       balancetype = fromMaybe cbctype mBalanceTypeOverride | ||||
|       -- 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{ | ||||
|         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_ | ||||
|       } | ||||
| 
 | ||||
|  | ||||
| @ -63,7 +63,7 @@ hledger -f- print --explicit --empty | ||||
| # When preserving a zero amount's commodity, we should also preserve | ||||
| # the amount style, such as where to place the symbol. | ||||
| # https://github.com/simonmichael/hledger/issues/230 | ||||
| hledger -f- balance | ||||
| hledger -f- balance --tree | ||||
| <<< | ||||
| D 1000,00€ | ||||
| 
 | ||||
|  | ||||
| @ -22,7 +22,7 @@ | ||||
| #                   1    4:5 | ||||
| #-------------------- | ||||
| #                   0 | ||||
| $ hledger -f - bal | ||||
| $ hledger -f - bal --tree | ||||
|                    0  1:2 | ||||
|                    1    3 | ||||
|                    0      4 | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| # 1. | ||||
| hledger -f sample.journal balance | ||||
| hledger -f sample.journal balance --tree | ||||
| >>> | ||||
|                  $-1  assets | ||||
|                   $1    bank:saving | ||||
| @ -16,7 +16,7 @@ hledger -f sample.journal balance | ||||
| >>>=0 | ||||
| 
 | ||||
| # 2. | ||||
| hledger -f sample.journal balance o | ||||
| hledger -f sample.journal balance --tree o | ||||
| >>> | ||||
|                   $1  expenses:food | ||||
|                  $-2  income | ||||
| @ -58,7 +58,7 @@ hledger -f - balance -b 2016 -e 2017 | ||||
| >>>= 0 | ||||
| 
 | ||||
| # 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 | ||||
|     assets:receivables      $10,000.00 | ||||
| @ -91,7 +91,7 @@ hledger -f - balance -b 2015 -e 2017 | ||||
| >>>= 0 | ||||
| 
 | ||||
| # 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 | ||||
|     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 | ||||
|                    bank:saving $1 | ||||
|  | ||||
| @ -24,7 +24,7 @@ hledger -f - balance --no-total | ||||
| >>>=0 | ||||
| 
 | ||||
| # 3. But not with --no-elide | ||||
| hledger -f - balance --no-total --no-elide | ||||
| hledger -f - balance --no-total --tree --no-elide | ||||
| <<< | ||||
| 1/1 | ||||
|   (a:b)   1 | ||||
| @ -34,7 +34,7 @@ hledger -f - balance --no-total --no-elide | ||||
| >>>=0 | ||||
| 
 | ||||
| # 4. Nor when it has more than one subaccount | ||||
| hledger -f - balance --no-total | ||||
| hledger -f - balance --tree --no-total | ||||
| <<< | ||||
| 1/1 | ||||
|   (a:b)    1 | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| #!/usr/bin/env shelltest | ||||
| # 1. Single column percent | ||||
| hledger -f sample.journal balance expenses -% | ||||
| hledger -f sample.journal balance expenses -% --tree | ||||
| >>> | ||||
|              100.0 %  expenses | ||||
|               50.0 %    food | ||||
|  | ||||
| @ -223,7 +223,7 @@ Balance changes in 2018: | ||||
| 2018/1/1 | ||||
|   (a:k)  1 | ||||
| 
 | ||||
| $ hledger -f- bal -N | ||||
| $ hledger -f- bal -N --tree | ||||
|                    1  a:k | ||||
|                    2  b | ||||
|                    1    i | ||||
| @ -268,7 +268,7 @@ account d | ||||
| 2018/1/1 | ||||
|   (d)    1 | ||||
| 
 | ||||
| $ hledger -f- bal -N | ||||
| $ hledger -f- bal -N --tree | ||||
|                    1  d | ||||
|                    1  a:l | ||||
|                    3  b | ||||
| @ -358,7 +358,7 @@ $ hledger -f- bal -N --sort-amount --flat | ||||
|     (a:ab)                                         3 | ||||
|     (b)                                            2 | ||||
| 
 | ||||
| $ hledger -f- bal -N -S | ||||
| $ hledger -f- bal -N -S --tree | ||||
|                    4  a | ||||
|                    3    ab | ||||
|                    1    aa | ||||
|  | ||||
| @ -240,7 +240,7 @@ Balance Sheet 2016-01-31 | ||||
| 
 | ||||
| # 9. Check that accounts brought to zero by subaccount balances | ||||
| # are not erased from balancesheet | ||||
| hledger -f - balancesheet | ||||
| hledger -f - balancesheet --tree | ||||
| <<< | ||||
| 2018-10-01 | ||||
|    income:whatever | ||||
|  | ||||
| @ -47,7 +47,7 @@ hledger -f chinese.journal register --width 80 | ||||
| >>>=0 | ||||
| 
 | ||||
| # 3. | ||||
| hledger -f chinese.journal balance | ||||
| hledger -f chinese.journal balance --tree | ||||
| >>> | ||||
|                    0  㐀:㐁 | ||||
|                  1 A    㐂 | ||||
|  | ||||
| @ -38,7 +38,7 @@ $ hledger register -f- --auto | ||||
| >= | ||||
| 
 | ||||
| # 3. balance | ||||
| $ hledger balance -f- --auto | ||||
| $ hledger balance -f- --auto --tree | ||||
|                 $115  assets | ||||
|                  $95    bank | ||||
|                  $20    cash | ||||
|  | ||||
| @ -35,7 +35,7 @@ hledger -f- print | ||||
| >>>=0 | ||||
| # | ||||
| # 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 | ||||
|   a  1 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user