diff --git a/hledger-lib/Hledger/Reports/MultiBalanceReport.hs b/hledger-lib/Hledger/Reports/MultiBalanceReport.hs index edb409480..7c5810091 100644 --- a/hledger-lib/Hledger/Reports/MultiBalanceReport.hs +++ b/hledger-lib/Hledger/Reports/MultiBalanceReport.hs @@ -426,7 +426,7 @@ displayedAccounts ropts q valuedaccts | otherwise = HM.mapWithKey (\a _ -> displayedName a) displayedAccts where -- Accounts which are to be displayed - displayedAccts = HM.filterWithKey keep valuedaccts + displayedAccts = (if depth == 0 then id else HM.filterWithKey keep) valuedaccts where keep name amts = isInteresting name amts || name `HM.member` interestingParents @@ -445,24 +445,25 @@ displayedAccounts ropts q valuedaccts -- Accounts interesting for their own sake isInteresting name amts = - d <= depth -- Throw out anything too deep - && (empty_ ropts || depth == 0 || not (isZeroRow balance amts)) -- Boring because has only zero entries + d <= depth -- Throw out anything too deep + && ((empty_ ropts && all (null . asubs) amts) -- Keep all leaves when using empty_ + || not (isZeroRow balance amts)) -- Throw out anything with zero balance where d = accountNameLevel name 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 + interestingParents = dbg'' "interestingParents" $ case accountlistmode_ ropts of + ALTree -> HM.filterWithKey hasEnoughSubs numSubs + ALFlat -> mempty where - keepParent name subaccts - | 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 + hasEnoughSubs name nsubs = nsubs >= minSubs && accountNameLevel name > drop_ ropts + minSubs = if no_elide_ ropts then 1 else 2 isZeroRow balance = all (mixedAmountLooksZero . balance) depth = fromMaybe maxBound $ queryDepth q + numSubs = subaccountTallies . HM.keys $ HM.filterWithKey isInteresting valuedaccts -- | Sort the rows by amount or by account declaration order. sortRows :: ReportOpts -> Journal -> [MultiBalanceReportRow] -> [MultiBalanceReportRow] @@ -560,9 +561,8 @@ sortRowsLike sortedas rows = mapMaybe (`HM.lookup` rowMap) sortedas -- | Given a list of account names, find all forking parent accounts, i.e. -- those which fork between different branches subaccountTallies :: [AccountName] -> HashMap AccountName Int -subaccountTallies as = foldr incrementParent mempty allaccts +subaccountTallies = foldr incrementParent mempty . expandAccountNames where - allaccts = expandAccountNames as incrementParent a = HM.insertWith (+) (parentAccountName a) 1 -- | A helper: what percentage is the second mixed amount of the first ? diff --git a/tests/balance/budget-sorting.test b/tests/balance/budget-sorting.test index b9e39ae7e..4e5d8b4a7 100644 --- a/tests/balance/budget-sorting.test +++ b/tests/balance/budget-sorting.test @@ -40,7 +40,6 @@ Budget performance in 2016-12-01..2016-12-03: || 2016-12-01 2016-12-02 2016-12-03 Total ==================++======================================================================================== - assets || $-10 [ 40% of $-25] $-14 [ 56% of $-25] $-51 [ 204% of $-25] $-75 [ 100% of $-75] assets:cash || $-10 [ 40% of $-25] $-14 [ 56% of $-25] $-51 [ 204% of $-25] $-75 [ 100% of $-75] expenses || $10 [ 40% of $25] $14 [ 56% of $25] $51 [ 204% of $25] $75 [ 100% of $75] expenses:food || $10 [ 100% of $10] $9 [ 90% of $10] $11 [ 110% of $10] $30 [ 100% of $30] @@ -89,7 +88,6 @@ Budget performance in 2016-12-01..2016-12-03: expenses || $10 [ 40% of $25] $14 [ 56% of $25] $51 [ 204% of $25] $75 [ 100% of $75] expenses:leisure || 0 [ 0% of $15] $5 [ 33% of $15] 0 [ 0% of $15] $5 [ 11% of $45] expenses:food || $10 [ 100% of $10] $9 [ 90% of $10] $11 [ 110% of $10] $30 [ 100% of $30] - assets || $-10 [ 40% of $-25] $-14 [ 56% of $-25] $-51 [ 204% of $-25] $-75 [ 100% of $-75] assets:cash || $-10 [ 40% of $-25] $-14 [ 56% of $-25] $-51 [ 204% of $-25] $-75 [ 100% of $-75] # # 2. -E @@ -163,7 +161,6 @@ Budget performance in 2016-12-01..2016-12-03: expenses || $10 [ 40% of $25] $14 [ 56% of $25] $51 [ 204% of $25] $75 [ 100% of $75] expenses:food || $10 [ 100% of $10] $9 [ 90% of $10] $11 [ 110% of $10] $30 [ 100% of $30] expenses:leisure || 0 [ 0% of $15] $5 [ 33% of $15] 0 [ 0% of $15] $5 [ 11% of $45] - assets || $-10 [ 40% of $-25] $-14 [ 56% of $-25] $-51 [ 204% of $-25] $-75 [ 100% of $-75] assets:cash || $-10 [ 40% of $-25] $-14 [ 56% of $-25] $-51 [ 204% of $-25] $-75 [ 100% of $-75] #** Sort by actual amount, tree mode. @@ -171,13 +168,12 @@ Budget performance in 2016-12-01..2016-12-03: $ hledger -f- bal --budget -DTNS --tree Budget performance in 2016-12-01..2016-12-03: - || 2016-12-01 2016-12-02 2016-12-03 Total -===========++======================================================================================== - expenses || $10 [ 40% of $25] $14 [ 56% of $25] $51 [ 204% of $25] $75 [ 100% of $75] - food || $10 [ 100% of $10] $9 [ 90% of $10] $11 [ 110% of $10] $30 [ 100% of $30] - leisure || 0 [ 0% of $15] $5 [ 33% of $15] 0 [ 0% of $15] $5 [ 11% of $45] - assets || $-10 [ 40% of $-25] $-14 [ 56% of $-25] $-51 [ 204% of $-25] $-75 [ 100% of $-75] - cash || $-10 [ 40% of $-25] $-14 [ 56% of $-25] $-51 [ 204% of $-25] $-75 [ 100% of $-75] + || 2016-12-01 2016-12-02 2016-12-03 Total +=============++======================================================================================== + expenses || $10 [ 40% of $25] $14 [ 56% of $25] $51 [ 204% of $25] $75 [ 100% of $75] + food || $10 [ 100% of $10] $9 [ 90% of $10] $11 [ 110% of $10] $30 [ 100% of $30] + leisure || 0 [ 0% of $15] $5 [ 33% of $15] 0 [ 0% of $15] $5 [ 11% of $45] + assets:cash || $-10 [ 40% of $-25] $-14 [ 56% of $-25] $-51 [ 204% of $-25] $-75 [ 100% of $-75] #** other ? # with -E diff --git a/tests/balance/budget.test b/tests/balance/budget.test index 9448fc157..37fa83468 100644 --- a/tests/balance/budget.test +++ b/tests/balance/budget.test @@ -36,7 +36,6 @@ Budget performance in 2016-12-01..2016-12-03: || 2016-12-01 2016-12-02 2016-12-03 ==================++================================================================== - assets || $-10 [ 40% of $-25] $-14 [ 56% of $-25] $-51 [ 204% of $-25] assets:cash || $-10 [ 40% of $-25] $-14 [ 56% of $-25] $-51 [ 204% of $-25] expenses || $10 [ 40% of $25] $14 [ 56% of $25] $51 [ 204% of $25] expenses:food || $10 [ 100% of $10] $9 [ 90% of $10] $11 [ 110% of $10] @@ -50,7 +49,6 @@ Budget performance in 2016-12-01..2016-12-03: || 2016-12-01 2016-12-02 2016-12-03 ==================++================================================================== - assets || $-10 [ 40% of $-25] $-14 [ 56% of $-25] $-51 [ 204% of $-25] assets:cash || $-10 [ 40% of $-25] $-14 [ 56% of $-25] $-51 [ 204% of $-25] expenses || $10 [ 40% of $25] $14 [ 56% of $25] $51 [ 204% of $25] expenses:cab || 0 0 $15 @@ -100,7 +98,6 @@ Budget performance in 2016-12-01..2016-12-03: || 2016-12-01 2016-12-02 2016-12-03 ==================++====================================================================================== - assets || $-15 [ 60% of $-25] $-26 [ 104% of $-25] $-51 [ 204% of $-25] assets:cash || $-15 [ 60% of $-25] $-26 [ 104% of $-25] $-51 [ 204% of $-25] expenses || £10 [ $25] $5, 20 CAD [ $25] $51 [ 204% of $25] expenses:food || £10 [ $10] 20 CAD [ $10] $11 [ 110% of $10] @@ -300,7 +297,6 @@ Budget performance in 2018-01-01: || 2018-01-01 =======++================== a || 2 [ 2% of 101] - a:b || 1 [ 100% of 1] a:b:c || 1 [ 100% of 1] -------++------------------ || 2 [ 2% of 101] @@ -312,8 +308,7 @@ Budget performance in 2018-01-01: || 2018-01-01 =======++================== a || 2 [ 2% of 101] - b || 1 [ 100% of 1] - c || 1 [ 100% of 1] + b:c || 1 [ 100% of 1] -------++------------------ || 2 [ 2% of 101] @@ -372,7 +367,6 @@ Budget performance in 2019-01-01..2019-01-03: || 2019-01-01..2019-01-03 ===================++============================== - expenses || $50.00 [ 5% of $1,000.00] expenses:personal || $50.00 [ 5% of $1,000.00] liabilities || $-50.00 [ 5% of $-1000.00] -------------------++------------------------------ @@ -384,7 +378,6 @@ Budget performance in 2019-01-01..2019-01-03: || 2019-01-01..2019-01-03 ========================================++============================== - expenses || $50.00 [ 5% of $1,000.00] expenses:personal || $50.00 [ 5% of $1,000.00] expenses:personal:electronics || $20.00 expenses:personal:electronics:upgrades || $10.00 @@ -396,27 +389,25 @@ Budget performance in 2019-01-01..2019-01-03: $ hledger -f- bal --budget --tree Budget performance in 2019-01-01..2019-01-03: - || 2019-01-01..2019-01-03 -=============++============================== - expenses || $50.00 [ 5% of $1,000.00] - personal || $50.00 [ 5% of $1,000.00] - liabilities || $-50.00 [ 5% of $-1000.00] --------------++------------------------------ - || 0 [ 0] + || 2019-01-01..2019-01-03 +===================++============================== + expenses:personal || $50.00 [ 5% of $1,000.00] + liabilities || $-50.00 [ 5% of $-1000.00] +-------------------++------------------------------ + || 0 [ 0] # 19. $ hledger -f- bal --budget --tree -E Budget performance in 2019-01-01..2019-01-03: - || 2019-01-01..2019-01-03 -=================++============================== - expenses || $50.00 [ 5% of $1,000.00] - personal || $50.00 [ 5% of $1,000.00] - electronics || $20.00 - upgrades || $10.00 - liabilities || $-50.00 [ 5% of $-1000.00] ------------------++------------------------------ - || 0 [ 0] + || 2019-01-01..2019-01-03 +===================++============================== + expenses:personal || $50.00 [ 5% of $1,000.00] + electronics || $20.00 + upgrades || $10.00 + liabilities || $-50.00 [ 5% of $-1000.00] +-------------------++------------------------------ + || 0 [ 0] # 20. Subaccounts + nested budgets < @@ -442,7 +433,6 @@ Budget performance in 2019-01-01..2019-01-03: || 2019-01-01..2019-01-03 ===============================++============================== - expenses || $50.00 [ 5% of $1100.00] expenses:personal || $50.00 [ 5% of $1100.00] expenses:personal:electronics || $20.00 [ 20% of $100.00] liabilities || $-50.00 [ 5% of $-1100.00] @@ -455,7 +445,6 @@ Budget performance in 2019-01-01..2019-01-03: || 2019-01-01..2019-01-03 ========================================++============================== - expenses || $50.00 [ 5% of $1100.00] expenses:personal || $50.00 [ 5% of $1100.00] expenses:personal:electronics || $20.00 [ 20% of $100.00] expenses:personal:electronics:upgrades || $10.00 @@ -467,28 +456,26 @@ Budget performance in 2019-01-01..2019-01-03: $ hledger -f- bal --budget --tree Budget performance in 2019-01-01..2019-01-03: - || 2019-01-01..2019-01-03 -=================++============================== - expenses || $50.00 [ 5% of $1100.00] - personal || $50.00 [ 5% of $1100.00] - electronics || $20.00 [ 20% of $100.00] - liabilities || $-50.00 [ 5% of $-1100.00] ------------------++------------------------------ - || 0 [ 0] + || 2019-01-01..2019-01-03 +===================++============================== + expenses:personal || $50.00 [ 5% of $1100.00] + electronics || $20.00 [ 20% of $100.00] + liabilities || $-50.00 [ 5% of $-1100.00] +-------------------++------------------------------ + || 0 [ 0] # 23. $ hledger -f- bal --budget --tree -E Budget performance in 2019-01-01..2019-01-03: - || 2019-01-01..2019-01-03 -=================++============================== - expenses || $50.00 [ 5% of $1100.00] - personal || $50.00 [ 5% of $1100.00] - electronics || $20.00 [ 20% of $100.00] - upgrades || $10.00 - liabilities || $-50.00 [ 5% of $-1100.00] ------------------++------------------------------ - || 0 [ 0] + || 2019-01-01..2019-01-03 +===================++============================== + expenses:personal || $50.00 [ 5% of $1100.00] + electronics || $20.00 [ 20% of $100.00] + upgrades || $10.00 + liabilities || $-50.00 [ 5% of $-1100.00] +-------------------++------------------------------ + || 0 [ 0] ## 24. Zero budget == no budget < @@ -519,13 +506,11 @@ Budget performance in 2019-01-01..2019-01-02: || 2019-01-01..2019-01-02 ==================++======================== - expenses || $80 [ 22% of $370] expenses:bills || $80 [ 22% of $370] expenses:bills:a || $10 [ 50% of $20] expenses:bills:b || $40 [ 20% of $200] expenses:bills:c || 0 [ 0% of $50] expenses:bills:f || $10 [ 0] - income || $-80 [ 22% of $-370] income:cash || $-80 [ 22% of $-370] ------------------++------------------------ || 0 [ 0] @@ -536,7 +521,6 @@ Budget performance in 2019-01-01..2019-01-02: || 2019-01-01..2019-01-02 ==================++======================== - expenses || $80 [ 22% of $370] expenses:bills || $80 [ 22% of $370] expenses:bills:a || $10 [ 50% of $20] expenses:bills:b || $40 [ 20% of $200] @@ -544,7 +528,6 @@ Budget performance in 2019-01-01..2019-01-02: expenses:bills:d || $20 expenses:bills:e || 0 expenses:bills:f || $10 [ 0] - income || $-80 [ 22% of $-370] income:cash || $-80 [ 22% of $-370] ------------------++------------------------ || 0 [ 0] diff --git a/tests/balance/no-total-no-elide.test b/tests/balance/no-total-no-elide.test index 0bd79a26f..6ee628e9f 100644 --- a/tests/balance/no-total-no-elide.test +++ b/tests/balance/no-total-no-elide.test @@ -1,7 +1,6 @@ #!/usr/bin/env shelltest -# 1. One commodity. Zero accounts should be elided but the final total should not. -hledger -f - balance -<<< +# +< 2010/04/01 tr1 a 16$ b -16$ @@ -9,52 +8,93 @@ hledger -f - balance 2010/04/02 tr2 a -16$ b 16$ ->>> + +# 1. One commodity. Zero accounts should be elided but the final total should not. +$ hledger -f - balance +> -------------------- 0 ->>>=0 +>=0 + +< +1/1 + (a:b) 1 # 2. An uninteresting parent account (with same balance as its single subaccount) is elided by default, like ledger -hledger -f - balance --no-total -<<< -1/1 - (a:b) 1 ->>> +$ hledger -f - balance --no-total +> 1 a:b ->>>=0 +>=0 # 3. But not with --no-elide -hledger -f - balance --no-total --tree --no-elide -<<< -1/1 - (a:b) 1 ->>> +$ hledger -f - balance --no-total --tree --no-elide +> 1 a 1 b ->>>=0 +>=0 -# 4. Nor when it has more than one subaccount -hledger -f - balance --tree --no-total -<<< +< 1/1 (a:b) 1 (a:c) -1 ->>> + +# 4. Nor when it has more than one subaccount +$ hledger -f - balance --tree --no-total +> 0 a 1 b -1 c ->>>2 ->>>=0 +>2 +>=0 -# 5. Zero-balance leaves should also be hidden by default. -hledger -f - balance --no-total -<<< +< 1/1 (a) 1 (a:aa) 1 (a:aa) -1 (a:aa:aaa) 1 (a:aa:aaa) -1 ->>> + +# 5. Zero-balance leaves should also be hidden by default. +$ hledger -f - balance --tree --no-total 1 a ->>>=0 + +# 6. Zero-balance leaves should be displayed in tree mode when --empty +# is called, but zero-balance uninteresting parent accounts are elided +# by default. +$ hledger -f - balance --tree --no-total --empty + 1 a + 0 aa:aaa + +# 7. But displayed with --no-elide +$ hledger -f - balance --tree --no-total --empty --no-elide + 1 a + 0 aa + 0 aaa + +# 8. Same as 5 for multiperiod +$ hledger -f - balance --tree --no-total -Y +Balance changes in 2020: + + || 2020 +===++====== + a || 1 + +# 9. Same as 6 for mulitperiod +$ hledger -f - balance --tree --no-total -Y --empty +Balance changes in 2020: + + || 2020 +==========++====== + a || 1 + aa:aaa || 0 + +# 10. Same as 7 for multiperiod +$ hledger -f - balance --tree --no-total -Y --empty --no-elide +Balance changes in 2020: + + || 2020 +=========++====== + a || 1 + aa || 0 + aaa || 0 diff --git a/tests/balance/transpose.test b/tests/balance/transpose.test index 58b5f7870..f1a450650 100644 --- a/tests/balance/transpose.test +++ b/tests/balance/transpose.test @@ -57,7 +57,6 @@ Budget performance in 2016-12-01..2016-12-03: || 2016-12-01 2016-12-02 2016-12-03 ==================++================================================================== - assets || $-10 [ 40% of $-25] $-14 [ 56% of $-25] $-51 [ 204% of $-25] assets:cash || $-10 [ 40% of $-25] $-14 [ 56% of $-25] $-51 [ 204% of $-25] expenses || $10 [ 40% of $25] $14 [ 56% of $25] $51 [ 204% of $25] expenses:food || $10 [ 100% of $10] $9 [ 90% of $10] $11 [ 110% of $10]