diff --git a/hledger-lib/Hledger/Reports/BudgetReport.hs b/hledger-lib/Hledger/Reports/BudgetReport.hs index 40ca6156f..e37a56edc 100644 --- a/hledger-lib/Hledger/Reports/BudgetReport.hs +++ b/hledger-lib/Hledger/Reports/BudgetReport.hs @@ -65,11 +65,16 @@ type BudgetReportRow = PeriodicReportRow BudgetCell -- and compare these to get a 'BudgetReport'. -- Unbudgeted accounts may be hidden or renamed (see budgetRollup). budgetReport :: ReportOpts -> Bool -> Bool -> DateSpan -> Day -> Journal -> BudgetReport -budgetReport ropts assrt showunbudgeted reportspan d j = +budgetReport ropts' assrt showunbudgeted reportspan d j = let + -- Budget report demands ALTree mode to ensure subaccounts and subaccount budgets are properly handled + -- and that reports with and without --show-unbudgeted make sense when compared side by side + ropts = ropts' { accountlistmode_ = ALTree } q = queryFromOpts d ropts budgetedaccts = dbg2 "budgetedacctsinperiod" $ + nub $ + concatMap expandAccountName $ accountNamesFromPostings $ concatMap tpostings $ concatMap (flip runPeriodicTransaction reportspan) $ @@ -77,7 +82,7 @@ budgetReport ropts assrt showunbudgeted reportspan d j = actualj = dbg1 "actualj" $ budgetRollUp budgetedaccts showunbudgeted j budgetj = dbg1 "budgetj" $ budgetJournal assrt ropts reportspan j actualreport@(MultiBalanceReport (actualspans, _, _)) = dbg1 "actualreport" $ multiBalanceReport ropts q actualj - budgetgoalreport@(MultiBalanceReport (_, budgetgoalitems, budgetgoaltotals)) = dbg1 "budgetgoalreport" $ multiBalanceReport ropts q budgetj + budgetgoalreport@(MultiBalanceReport (_, budgetgoalitems, budgetgoaltotals)) = dbg1 "budgetgoalreport" $ multiBalanceReport (ropts{empty_=True}) q budgetj budgetgoalreport' -- If no interval is specified: -- budgetgoalreport's span might be shorter actualreport's due to periodic txns; diff --git a/hledger/hledger_balance.m4.md b/hledger/hledger_balance.m4.md index 008ea2f59..2f45c05ff 100644 --- a/hledger/hledger_balance.m4.md +++ b/hledger/hledger_balance.m4.md @@ -377,42 +377,149 @@ You can now see a monthly budget report: $ hledger balance -M --budget Budget performance in 2017/11/01-2017/12/31: - || 2017/11 2017/12 -======================++================================================= - || $20 $100 - assets:bank:checking || $-2445 [99% of $-2480] $-2665 [107% of $-2480] - expenses:bus || $49 [98% of $50] $53 [106% of $50] - expenses:food || $396 [99% of $400] $412 [103% of $400] - expenses:movies || $30 [100% of $30] 0 [0% of $30] - income || $1950 [98% of $2000] $2100 [105% of $2000] -----------------------++------------------------------------------------- - || 0 0 + || Nov Dec +======================++==================================================== + assets || $-2445 [ 99% of $-2480] $-2665 [ 107% of $-2480] + assets:bank || $-2445 [ 99% of $-2480] $-2665 [ 107% of $-2480] + assets:bank:checking || $-2445 [ 99% of $-2480] $-2665 [ 107% of $-2480] + expenses || $495 [ 103% of $480] $565 [ 118% of $480] + expenses:bus || $49 [ 98% of $50] $53 [ 106% of $50] + expenses:food || $396 [ 99% of $400] $412 [ 103% of $400] + expenses:movies || $30 [ 100% of $30] 0 [ 0% of $30] + income || $1950 [ 98% of $2000] $2100 [ 105% of $2000] +----------------------++---------------------------------------------------- + || 0 [ 0] 0 [ 0] ``` -By default, only accounts with budget goals during the report period are shown. -`--show-unbudgeted` shows unbudgeted accounts as well. -Top-level accounts with no budget goals anywhere below them are grouped under ``. + +By default, only accounts with budget goals during the report period are shown. In the example +above, transactions in `expenses:gifts` and `expenses:supplies` are counted towards `expenses` budget, +but accounts `expenses:gifts` and `expenses:supplies` are not shown, as they don't have any budgets. + + +You can use `--show-unbudgeted` shows unbudgeted accounts as well: +```shell +$ hledger balance -M --budget --show-unbudgeted +Budget performance in 2017/11/01-2017/12/31: + + || Nov Dec +======================++==================================================== + assets || $-2445 [ 99% of $-2480] $-2665 [ 107% of $-2480] + assets:bank || $-2445 [ 99% of $-2480] $-2665 [ 107% of $-2480] + assets:bank:checking || $-2445 [ 99% of $-2480] $-2665 [ 107% of $-2480] + expenses || $495 [ 103% of $480] $565 [ 118% of $480] + expenses:bus || $49 [ 98% of $50] $53 [ 106% of $50] + expenses:food || $396 [ 99% of $400] $412 [ 103% of $400] + expenses:gifts || 0 $100 + expenses:movies || $30 [ 100% of $30] 0 [ 0% of $30] + expenses:supplies || $20 0 + income || $1950 [ 98% of $2000] $2100 [ 105% of $2000] +----------------------++---------------------------------------------------- + || 0 [ 0] 0 [ 0] +``` + You can roll over unspent budgets to next period with `--cumulative`: ```shell $ hledger balance -M --budget --cumulative Budget performance in 2017/11/01-2017/12/31: - || 2017/11/30 2017/12/31 -======================++================================================= - || $20 $120 - assets:bank:checking || $-2445 [99% of $-2480] $-5110 [103% of $-4960] - expenses:bus || $49 [98% of $50] $102 [102% of $100] - expenses:food || $396 [99% of $400] $808 [101% of $800] - expenses:movies || $30 [100% of $30] $30 [50% of $60] - income || $1950 [98% of $2000] $4050 [101% of $4000] -----------------------++------------------------------------------------- - || 0 0 + || Nov Dec +======================++==================================================== + assets || $-2445 [ 99% of $-2480] $-5110 [ 103% of $-4960] + assets:bank || $-2445 [ 99% of $-2480] $-5110 [ 103% of $-4960] + assets:bank:checking || $-2445 [ 99% of $-2480] $-5110 [ 103% of $-4960] + expenses || $495 [ 103% of $480] $1060 [ 110% of $960] + expenses:bus || $49 [ 98% of $50] $102 [ 102% of $100] + expenses:food || $396 [ 99% of $400] $808 [ 101% of $800] + expenses:movies || $30 [ 100% of $30] $30 [ 50% of $60] + income || $1950 [ 98% of $2000] $4050 [ 101% of $4000] +----------------------++---------------------------------------------------- + || 0 [ 0] 0 [ 0] ``` Note, the `-S/--sort-amount` flag is not yet fully supported with `--budget`. For more examples, see [Budgeting and Forecasting](https://github.com/simonmichael/hledger/wiki/Budgeting and forecasting). +#### Nested budgets + +You can add budgets to any account in your account hierarchy. If you have budgets on both parent account and some of its children, then budget(s) +of the child account(s) would be added to the budget of their parent, much like account balances behave. + +In the most simple case this means that once you add a budget to any account, all its parents would have budget as well. + +To illustrate this, consider the following budget: +``` +~ monthly from 2019/01 + expenses:personal $1,000.00 + expenses:personal:electronics $100.00 + liabilities +``` + +With this, monthly budget for electronics is defined to be $100 and budget for personal expenses is an additional $1000, which implicity means +that budget for both `expenses:personal` and `expenses` is $1100. + +Transactions in `expenses:personal:electronics` will be counted both towards its $100 budget and $1100 of `expenses:personal` , and transactions in any other subaccount of `expenses:personal` would be +counted towards only towards the budget of `expenses:personal`. + +For example, let's consider these transactions: +```journal +~ monthly from 2019/01 + expenses:personal $1,000.00 + expenses:personal:electronics $100.00 + liabilities + +2019/01/01 Google home hub + expenses:personal:electronics $90.00 + liabilities $-90.00 + +2019/01/02 Phone screen protector + expenses:personal:electronics:upgrades $10.00 + liabilities + +2019/01/02 Weekly train ticket + expenses:personal:train tickets $153.00 + liabilities + +2019/01/03 Flowers + expenses:personal $30.00 + liabilities +``` + +As you can see, we have transactions in `expenses:personal:electronics:upgrades` and `expenses:personal:train tickets`, and since both of these accounts are without explicitly defined budget, +these transactions would be counted towards budgets of `expenses:personal:electronics` and `expenses:personal` accordingly: + +```shell +$ hledger balance --budget -M +Budget performance in 2019/01: + + || Jan +===============================++=============================== + expenses || $283.00 [ 26% of $1100.00] + expenses:personal || $283.00 [ 26% of $1100.00] + expenses:personal:electronics || $100.00 [ 100% of $100.00] + liabilities || $-283.00 [ 26% of $-1100.00] +-------------------------------++------------------------------- + || 0 [ 0] +``` + +And with `--show-unbudgeted`, we can get a better picture of budget allocation and consumption: +```shell +$ hledger balance --budget -M --show-unbudgeted +Budget performance in 2019/01: + + || Jan +========================================++=============================== + expenses || $283.00 [ 26% of $1100.00] + expenses:personal || $283.00 [ 26% of $1100.00] + expenses:personal:electronics || $100.00 [ 100% of $100.00] + expenses:personal:electronics:upgrades || $10.00 + expenses:personal:train tickets || $153.00 + liabilities || $-283.00 [ 26% of $-1100.00] +----------------------------------------++------------------------------- + || 0 [ 0] +``` + ### Output format The balance command supports [output destination](/manual.html#output-destination) and [output format](/manual.html#output-format) selection. diff --git a/tests/budget/budget.test b/tests/budget/budget.test index e62c0afec..289c83a59 100644 --- a/tests/budget/budget.test +++ b/tests/budget/budget.test @@ -34,28 +34,31 @@ $ hledger bal -D -b 2016-12-01 -e 2016-12-04 -f - --budget Budget performance in 2016/12/01-2016/12/03: - || 2016/12/01 2016/12/02 2016/12/03 -==================++============================================================================== - || 0 0 $40 - assets:cash || $-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] - expenses:leisure || 0 [ 0% of $15] $5 [ 33% of $15] 0 [ 0% of $15] -------------------++------------------------------------------------------------------------------ - || 0 [ 0] 0 [ 0] 0 [ 0] + || 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] + expenses:leisure || 0 [ 0% of $15] $5 [ 33% of $15] 0 [ 0% of $15] +------------------++------------------------------------------------------------------ + || 0 [ 0] 0 [ 0] 0 [ 0] # 2. --show-unbudgeted $ hledger bal -D -b 2016-12-01 -e 2016-12-04 -f - --budget --show-unbudgeted Budget performance in 2016/12/01-2016/12/03: - || 2016/12/01 2016/12/02 2016/12/03 -==============================++============================================================================== - :expenses:cab || 0 0 $15 - :expenses:movies || 0 0 $25 - assets:cash || $-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] - expenses:leisure || 0 [ 0% of $15] $5 [ 33% of $15] 0 [ 0% of $15] -------------------------------++------------------------------------------------------------------------------ - || 0 [ 0] 0 [ 0] 0 [ 0] + || 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 + expenses:food || $10 [ 100% of $10] $9 [ 90% of $10] $11 [ 110% of $10] + expenses:leisure || 0 [ 0% of $15] $5 [ 33% of $15] 0 [ 0% of $15] + expenses:movies || 0 0 $25 +------------------++------------------------------------------------------------------ + || 0 [ 0] 0 [ 0] 0 [ 0] # 3. Test that budget works with mix of commodities < @@ -95,14 +98,15 @@ Budget performance in 2016/12/01-2016/12/03: $ hledger bal -D -b 2016-12-01 -e 2016-12-04 -f - --budget Budget performance in 2016/12/01-2016/12/03: - || 2016/12/01 2016/12/02 2016/12/03 -==================++===================================================================================== - || 0 0 $40 - assets:cash || $-15 [ 60% of $-25] $-26 [ 104% of $-25] $-51 [ 204% of $-25] - expenses:food || £10 [ 150% of $10] 20 CAD [ 210% of $10] $11 [ 110% of $10] - expenses:leisure || 0 [ 0% of $15] $5 [ 33% of $15] 0 [ 0% of $15] -------------------++------------------------------------------------------------------------------------- - || $-15, £10 [ 0] $-21, 20 CAD [ 0] 0 [ 0] + || 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 [ 60% of $25] $5, 20 CAD [ 104% of $25] $51 [ 204% of $25] + expenses:food || £10 [ 150% of $10] 20 CAD [ 210% of $10] $11 [ 110% of $10] + expenses:leisure || 0 [ 0% of $15] $5 [ 33% of $15] 0 [ 0% of $15] +------------------++-------------------------------------------------------------------------------------- + || $-15, £10 [ 0] $-21, 20 CAD [ 0] 0 [ 0] < ~ daily @@ -129,13 +133,13 @@ Budget performance in 2016/12/01-2016/12/03: $ hledger -f- bal --budget Budget performance in 2018/01/01-2018/01/03: - || 2018/01/01-2018/01/03 -===++========================== - a || 2 [ 7% of 30] - b || 2 [ 2% of 100] - c || 2 [ 0% of 1000] ----++-------------------------- - || 6 [ 1% of 1130] + || 2018/01/01-2018/01/03 +===++======================= + a || 2 [ 7% of 30] + b || 2 [ 2% of 100] + c || 2 [ 0% of 1000] +---++----------------------- + || 6 [ 1% of 1130] # 5. Multiple periodic transactions with different intervals are combined. # Budget goals with lower frequency than the report are posted in the @@ -143,25 +147,25 @@ Budget performance in 2018/01/01-2018/01/03: $ hledger -f- bal --budget -D Budget performance in 2018/01/01-2018/01/03: - || 2018/01/01 2018/01/02 2018/01/03 -===++============================================================================== - a || 1 [ 10% of 10] 0 [ 0% of 10] 1 [ 10% of 10] - b || 1 [ 1% of 100] 0 [ 0] 1 [ 0] - c || 1 [ 0% of 1000] 0 [ 0] 1 [ 0] ----++------------------------------------------------------------------------------ - || 3 [ 0% of 1110] 0 [ 0% of 10] 3 [ 30% of 10] + || 2018/01/01 2018/01/02 2018/01/03 +===++========================================================= + a || 1 [ 10% of 10] 0 [ 0% of 10] 1 [ 10% of 10] + b || 1 [ 1% of 100] 0 [ 0] 1 [ 0] + c || 1 [ 0% of 1000] 0 [ 0] 1 [ 0] +---++--------------------------------------------------------- + || 3 [ 0% of 1110] 0 [ 0% of 10] 3 [ 30% of 10] # 6. Budget goals with higher frequency than the report get added up appropriately. $ hledger -f- bal --budget -W Budget performance in 2018/01/01w01: - || 2018/01/01w01 -===++========================== - a || 2 [ 7% of 30] - b || 2 [ 2% of 100] - c || 2 [ 0% of 1000] ----++-------------------------- - || 6 [ 1% of 1130] + || 2018/01/01w01 +===++=================== + a || 2 [ 7% of 30] + b || 2 [ 2% of 100] + c || 2 [ 0% of 1000] +---++------------------- + || 6 [ 1% of 1130] # 7. A bounded two day budget. The end date is exclusive as usual. < @@ -187,12 +191,12 @@ Budget performance in 2018/01/01w01: $ hledger -f- bal --budget -D Budget performance in 2018/01/01-2018/01/04: - || 2018/01/01 2018/01/02 2018/01/03 2018/01/04 -==============++======================================================================================================== - || 1 1 1 1 - a || 1 1 [ 100% of 1] 1 [ 100% of 1] 1 ---------------++-------------------------------------------------------------------------------------------------------- - || 2 2 [ 200% of 1] 2 [ 200% of 1] 2 + || 2018/01/01 2018/01/02 2018/01/03 2018/01/04 +==============++================================================================ + || 1 1 1 1 + a || 1 1 [ 100% of 1] 1 [ 100% of 1] 1 +--------------++---------------------------------------------------------------- + || 2 2 [ 200% of 1] 2 [ 200% of 1] 2 # 8. Multiple bounded budgets. < @@ -217,21 +221,21 @@ Budget performance in 2018/01/01-2018/01/04: $ hledger -f- bal --budget -D Budget performance in 2018/01/01-2018/01/04: - || 2018/01/01 2018/01/02 2018/01/03 2018/01/04 -===++======================================================================================================== - a || 1 [ 100% of 1] 1 [ 100% of 1] 1 [ 10% of 10] 1 [ 10% of 10] ----++-------------------------------------------------------------------------------------------------------- - || 1 [ 100% of 1] 1 [ 100% of 1] 1 [ 10% of 10] 1 [ 10% of 10] + || 2018/01/01 2018/01/02 2018/01/03 2018/01/04 +===++==================================================================== + a || 1 [ 100% of 1] 1 [ 100% of 1] 1 [ 10% of 10] 1 [ 10% of 10] +---++-------------------------------------------------------------------- + || 1 [ 100% of 1] 1 [ 100% of 1] 1 [ 10% of 10] 1 [ 10% of 10] # 9. A "from A to B" budget should not be included in a report beginning on B. $ hledger -f- bal --budget -D -b 2018/1/3 Budget performance in 2018/01/03-2018/01/04: - || 2018/01/03 2018/01/04 -===++==================================================== - a || 1 [ 10% of 10] 1 [ 10% of 10] ----++---------------------------------------------------- - || 1 [ 10% of 10] 1 [ 10% of 10] + || 2018/01/03 2018/01/04 +===++================================== + a || 1 [ 10% of 10] 1 [ 10% of 10] +---++---------------------------------- + || 1 [ 10% of 10] 1 [ 10% of 10] < ~ daily @@ -249,21 +253,21 @@ Budget performance in 2018/01/03-2018/01/04: $ hledger -f- bal --budget -D date:2018/1/1-2018/1/3 Budget performance in 2018/01/01-2018/01/02: - || 2018/01/01 2018/01/02 -===++==================================================== - a || 0 [ 0% of 1] 0 [ 0% of 1] ----++---------------------------------------------------- - || 0 [ 0% of 1] 0 [ 0% of 1] + || 2018/01/01 2018/01/02 +===++================================ + a || 0 [ 0% of 1] 0 [ 0% of 1] +---++-------------------------------- + || 0 [ 0% of 1] 0 [ 0% of 1] # 11. With -E, zeroes are shown $ hledger -f- bal --budget -D date:2018/1/1-2018/1/3 -E Budget performance in 2018/01/01-2018/01/02: - || 2018/01/01 2018/01/02 -===++==================================================== - a || 0 [ 0% of 1] 0 [ 0% of 1] ----++---------------------------------------------------- - || 0 [ 0% of 1] 0 [ 0% of 1] + || 2018/01/01 2018/01/02 +===++================================ + a || 0 [ 0% of 1] 0 [ 0% of 1] +---++-------------------------------- + || 0 [ 0% of 1] 0 [ 0% of 1] # 12. subaccounts of budgeted accounts count towards budget < @@ -276,9 +280,9 @@ Budget performance in 2018/01/01-2018/01/02: $ hledger -f- bal --budget -N Budget performance in 2018/01/01: - || 2018/01/01 -===++========================== - a || 1 [ 100% of 1] + || 2018/01/01 +===++================ + a || 1 [ 100% of 1] # 13. budget goals on both parent and subaccounts are counted < @@ -293,23 +297,24 @@ Budget performance in 2018/01/01: $ hledger -f- bal --budget Budget performance in 2018/01/01: - || 2018/01/01 -=======++========================== - a || 1 [ 1% of 100] - a:b:c || 1 [ 100% of 1] --------++-------------------------- - || 2 [ 2% of 101] + || 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] $ hledger -f- bal --budget --tree Budget performance in 2018/01/01: - || 2018/01/01 -=======++========================== - a || 2 [ 2% of 101] - b || 1 [ 100% of 1] - c || 1 [ 100% of 1] --------++-------------------------- - || 2 [ 2% of 101] + || 2018/01/01 +=======++================== + a || 2 [ 2% of 101] + b || 1 [ 100% of 1] + c || 1 [ 100% of 1] +-------++------------------ + || 2 [ 2% of 101] # TODO # 14. respect hierarchy when sorting in tree mode @@ -336,11 +341,205 @@ P 2018/01/26 SHARE €10 $ hledger -f - bal -M --budget --cumulative --forecast --value Budget performance in 2018/05/01-2018/06/30: - || May Jun -================++==================================================== - || €-10 €-10 - assets:bank || 0 €-1 [ 100% of €-1] - assets:pension || €10 €11 [1100% of €1] -----------------++---------------------------------------------------- - || 0 0 [ 0] + || May Jun +================++========================================== + || €-10 €-10 + assets || €10 €10 [ 0] + assets:bank || 0 €-1 [ 100% of €-1] + assets:pension || €10 €11 [1100% of €1] +----------------++------------------------------------------ + || 0 0 [ 0] + +# 17. With subaccounts, child accounts are properly included in the parent balance when budget is checked +< +~ monthly from 2019/01 + expenses:personal $1,000.00 + liabilities + +2019/01/01 Google home hub and home mini x2 + expenses:personal:electronics $10.00 + liabilities $-10.00 + +2019/01/02 Google Home Hub Permium Subscription + expenses:personal:electronics:upgrades $10.00 + liabilities $-10.00 + +2019/01/03 Something else + expenses:personal $30.00 + liabilities $-30.00 + +$ hledger -f- bal --budget +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] +-------------------++------------------------------ + || 0 [ 0] + +$ hledger -f- bal --budget --show-unbudgeted +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 + liabilities || $-50.00 [ 5% of $-1000.00] +----------------------------------------++------------------------------ + || 0 [ 0] + +$ 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] + +$ hledger -f- bal --budget --tree --show-unbudgeted +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] + +# 18. Subaccounts + nested budgets +< +~ monthly from 2019/01 + expenses:personal $1,000.00 + expenses:personal:electronics $100.00 + liabilities + +2019/01/01 Google home hub and home mini x2 + expenses:personal:electronics $10.00 + liabilities $-10.00 + +2019/01/02 Google Home Hub Permium Subscription + expenses:personal:electronics:upgrades $10.00 + liabilities $-10.00 + +2019/01/03 Something else + expenses:personal $30.00 + liabilities $-30.00 + +$ hledger -f- bal --budget +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] +-------------------------------++------------------------------ + || 0 [ 0] + +$ hledger -f- bal --budget --show-unbudgeted +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 + liabilities || $-50.00 [ 5% of $-1100.00] +----------------------------------------++------------------------------ + || 0 [ 0] + +$ 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] + +$ hledger -f- bal --budget --tree --show-unbudgeted +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] + +## Zero budget == no budget +< +~ monthly from 2019-01 + expenses:bills $100 ; bills has a $100 budget of its own, separate from subaccounts + expenses:bills:a $20 ; a has non-zero budget and non-zero posted amount + expenses:bills:b $200 ; b's budget is larger than bills'; we can see it's added to, not part of, that + expenses:bills:c $50 ; c has a budget but no postings + expenses:bills:f $0 ; f has an explicit zero budget + income:cash ; cash has a negative $370 budget balancing the above + +2019-01-01 transaction1 + income:cash + expenses:bills:a $10 + expenses:bills:b $40 + expenses:bills:d $20 ; d has postings but no budget + expenses:bills:e $10 ; e has postings summing to zero, and no budget + expenses:bills:f $10 + +2019-01-02 transaction2 + income:cash + expenses:bills:e -$10 + +# By default it hides d (because no budget) and e (because zero posted amount). +# f is shown though its budget is zero, it probably shouldn't be. +$ hledger bal -f- --budget +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] + +# --show-unbudgeted shows d +$ hledger bal -f- --budget --show-unbudgeted +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:d || $20 + expenses:bills:f || $10 [ 0] + income || $-80 [ 22% of $-370] + income:cash || $-80 [ 22% of $-370] +------------------++----------------------- + || 0 [ 0] diff --git a/tests/budget/sorting.test b/tests/budget/sorting.test index 7486d5eac..52cfd2858 100644 --- a/tests/budget/sorting.test +++ b/tests/budget/sorting.test @@ -38,12 +38,13 @@ $ hledger -f- bal --budget -DTN Budget performance in 2016/12/01-2016/12/03: - || 2016/12/01 2016/12/02 2016/12/03 Total -==================++======================================================================================================== - || 0 0 $40 $40 - assets:cash || $-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] + || 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] + expenses:leisure || 0 [ 0% of $15] $5 [ 33% of $15] 0 [ 0% of $15] $5 [ 11% of $45] #** Default sort with account declarations @@ -83,12 +84,13 @@ account expenses:leisure $ hledger -f- bal --budget -DTN Budget performance in 2016/12/01-2016/12/03: - || 2016/12/01 2016/12/02 2016/12/03 Total -==================++======================================================================================================== - || 0 0 $40 $40 - 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: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] + 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. --show-unbudgeted # $ hledger bal -D -b 2016-12-01 -e 2016-12-04 -f - --budget --show-unbudgeted @@ -156,26 +158,26 @@ Budget performance in 2016/12/01-2016/12/03: $ hledger -f- bal --budget -DTNS Budget performance in 2016/12/01-2016/12/03: - || 2016/12/01 2016/12/02 2016/12/03 Total -==================++======================================================================================================== - || 0 0 $40 $40 - 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: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] + 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. $ 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 -==============++======================================================================================================== - || 0 0 $40 $40 - expenses || $10 [ 40% of $25] $14 [ 56% of $25] $11 [ 44% of $25] $35 [ 47% 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 || $-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] #** other ? # with --show-unbudgeted