# Test generation of periodic transactions with --forecast. # Note periodic transaction tests should include a regular transaction # to pin the start date of forecasted transactions. < 2016/12/31 expenses:housing $600 assets:cash ~ monthly from 2016/1 income $-1000 expenses:food $20 expenses:leisure $15 expenses:grocery $30 assets:cash # 1. A balance report with forecasted transactions. $ hledger bal -M -b 2016-11 -e 2017-02 -f - --forecast Balance changes in 2016-11-01..2017-01-31: || 2016-11 2016-12 2017-01 ==================++=========================== assets:cash || 0 $-600 $935 expenses:food || 0 0 $20 expenses:grocery || 0 0 $30 expenses:housing || 0 $600 0 expenses:leisure || 0 0 $15 income || 0 0 $-1000 ------------------++--------------------------- || 0 0 0 >=0 < 2016/12/31 expenses:housing $600 assets:cash ~ monthly from 2016/1 * marked cleared, and with a description income $-1000 expenses:food $20 expenses:leisure $15 expenses:grocery $30 assets:cash # 2. print forecasted transactions, with status and description. $ hledger print -b 2016-11 -e 2017-02 -f - --forecast 2016-12-31 expenses:housing $600 assets:cash 2017-01-01 * marked cleared, and with a description ; generated-transaction: ~ monthly from 2016/1 income $-1000 expenses:food $20 expenses:leisure $15 expenses:grocery $30 assets:cash >=0 < 2016/12/31 expenses:housing $600 assets:cash ~ monthly from 2016/1 ; or a comment, maybe with a:tag income $-1000 expenses:food $20 expenses:leisure $15 expenses:grocery $30 assets:cash # 3. A register with forecasted transactions, with a comment and tag. $ hledger register -b 2016-11 -e 2017-02 -f - --forecast tag:a 2017-01-01 income $-1000 $-1000 expenses:food $20 $-980 expenses:leisure $15 $-965 expenses:grocery $30 $-935 assets:cash $935 0 >=0 < 2016/01/01 expenses:fun $10 ; more fireworks assets:cash 2016/12/02 expenses:housing $600 assets:cash ~ yearly from 2016 income $-10000 ; bonus assets:cash # 4. Check that --forecast generates transactions only after last transaction date in journal. $ hledger register -b 2015-12 -e 2017-02 -f - assets:cash --forecast 2016-01-01 assets:cash $-10 $-10 2016-12-02 assets:cash $-600 $-610 2017-01-01 assets:cash $10000 $9390 >=0 < Y 2000 ~ 2/1 forecast ; a real transaction to set the start of the forecast window 2000/1/1 real # 5. Y affects M/D partial dates in periodic transactions. # The recur tag shows the original period expression and is not modified. $ hledger -f - print --forecast desc:forecast 2000-02-01 forecast ; generated-transaction: ~ 2/1 >=0 < Y 2000 ~ 15 forecast ; a real transaction to set the start of the forecast window 2000/1/1 real # 6. Y also sets the month to 1, affecting D dates: $ hledger -f - print --forecast desc:forecast 2000-01-15 forecast ; generated-transaction: ~ 15 >=0 < Y 2000 ~ next month forecast ; a real transaction to set the start of the forecast window 2000/1/1 real # 7. Y also sets the day to 1, affecting relative dates: $ hledger -f - print --forecast desc:forecast 2000-02-01 forecast ; generated-transaction: ~ next month >=0 < 2016/12/31 expenses:housing $600 assets:cash ~ monthly from 2016/1 salary income $-1000 assets:cash # 8. A balance report with forecast-begin enabling transaction before report end $ hledger bal -M -b 2016-10 -e 2017-02 -f - --forecast=20160801- Balance changes in 2016-10-01..2017-01-31: || 2016-10 2016-11 2016-12 2017-01 ==================++==================================== assets:cash || $1000 $1000 $400 $1000 expenses:housing || 0 0 $600 0 income || $-1000 $-1000 $-1000 $-1000 ------------------++------------------------------------ || 0 0 0 0 >=0 # 9. Parse error in malformed forecast period expression $ hledger bal -M -b 2016-10 -e 2017-02 -f - --forecast=20160801-foobar > >2 hledger: could not parse forecast period : 1:10: | 1 | 20160801-foobar | ^ unexpected 'f' expecting end of input (use -h to see usage) >=1 < commodity 1,000.00 USD 2020-01-01 (a) 1,000.00 USD ~ every 28th day (a) 1000.00 USD # 10. Amount display style is applied to forecasted transactions. $ hledger -f - reg --forecast date:202001 2020-01-01 (a) 1,000.00 USD 1,000.00 USD 2020-01-28 (a) 1,000.00 USD 2,000.00 USD >=0 < 2021-09-01 Normal Balance Assertion Works Checking = -60 Costs ~ 2021-10-01 explicit forecasted assertion Checking = -100 Costs 40 ~ 2021-10-02 auto-deduced forecasted assertion Checking = -120 Costs # 11. Forecast transactions work with balance assignments $ hledger -f - print -x --forecast -e 2021-11 2021-09-01 Normal Balance Assertion Works Checking -60 = -60 Costs 60 2021-10-01 explicit forecasted assertion ; generated-transaction: ~ 2021-10-01 Checking -40 = -100 Costs 40 2021-10-02 auto-deduced forecasted assertion ; generated-transaction: ~ 2021-10-02 Checking -20 = -120 Costs 20 >=0 < 2021-08-01 (a) 0 ~ every weekday income:client1 -10 USD assets:receivables:contractor1 # 12. Generated forecast for weekday transactions $ hledger -f - reg --forecast -b "2021-09-01" -e "2021-09-15" --forecast -w 100 2021-09-01 income:client1 -10 USD -10 USD assets:receivables:contractor1 10 USD 0 2021-09-02 income:client1 -10 USD -10 USD assets:receivables:contractor1 10 USD 0 2021-09-03 income:client1 -10 USD -10 USD assets:receivables:contractor1 10 USD 0 2021-09-06 income:client1 -10 USD -10 USD assets:receivables:contractor1 10 USD 0 2021-09-07 income:client1 -10 USD -10 USD assets:receivables:contractor1 10 USD 0 2021-09-08 income:client1 -10 USD -10 USD assets:receivables:contractor1 10 USD 0 2021-09-09 income:client1 -10 USD -10 USD assets:receivables:contractor1 10 USD 0 2021-09-10 income:client1 -10 USD -10 USD assets:receivables:contractor1 10 USD 0 2021-09-13 income:client1 -10 USD -10 USD assets:receivables:contractor1 10 USD 0 2021-09-14 income:client1 -10 USD -10 USD assets:receivables:contractor1 10 USD 0 >=0 < 2021-08-01 (a) 0 ~ every weekendday income:client1 -10 USD assets:receivables:contractor1 # 13. Generated forecast for weekend transactions $ hledger -f - reg --forecast -b "2021-09-01" -e "2021-09-15" --forecast -w 100 2021-09-04 income:client1 -10 USD -10 USD assets:receivables:contractor1 10 USD 0 2021-09-05 income:client1 -10 USD -10 USD assets:receivables:contractor1 10 USD 0 2021-09-11 income:client1 -10 USD -10 USD assets:receivables:contractor1 10 USD 0 2021-09-12 income:client1 -10 USD -10 USD assets:receivables:contractor1 10 USD 0 >=0 < 2021-01-01 (a) 1000 ~ daily (a) 1 # 14. Arguments to --forecast take precedence over anything. Only generate up to the day before the end date. $ hledger -f - reg --forecast="2020-01-01..2020-01-05" -b 2019-12-01 -e 2020-02-01 -H 2020-01-01 (a) 1 1 2020-01-02 (a) 1 2 2020-01-03 (a) 1 3 2020-01-04 (a) 1 4 >=0 # 15. With no arguments to --forecast, we use the report start date if it's after the journal end date. $ hledger -f - reg --forecast -b 2021-02-01 -e 2021-02-05 -H 2021-02-01 (a) 1 1001 2021-02-02 (a) 1 1002 2021-02-03 (a) 1 1003 2021-02-04 (a) 1 1004 >=0 # 16. With no arguments to --forecast, we use journal end date if it's after the report start date. $ hledger -f - reg --forecast -b 2020-12-01 -e 2021-01-05 -H 2021-01-01 (a) 1000 1000 2021-01-02 (a) 1 1001 2021-01-03 (a) 1 1002 2021-01-04 (a) 1 1003 >=0 # 17. With no arguments to --forecast, and no report start, generate from journal end to 180 days from today. # We use here the fact that we are at least 180 days from 2021-01-01. This test will fail if you travel back in time! $ hledger -f - reg --forecast -H > /1 1360/ >=0 < ~ daily (a) 1 # 18. No real transactions. # Arguments to --forecast take precedence over anything. Only generate up to the day before the end date. $ hledger -f - reg --forecast="2020-01-01..2020-01-05" -b 2019-12-01 -e 2020-01-05 -H 2020-01-01 (a) 1 1 2020-01-02 (a) 1 2 2020-01-03 (a) 1 3 2020-01-04 (a) 1 4 >=0 # 19. No real transactions. # With no arguments to --forecast, we use the report start date. $ hledger -f - reg --forecast -b 2021-02-01 -e 2021-02-05 -H 2021-02-01 (a) 1 1 2021-02-02 (a) 1 2 2021-02-03 (a) 1 3 2021-02-04 (a) 1 4 >=0 # 20. No real transactions. # With no arguments to --forecast, and no report start, generate from today to 180 days from today. $ hledger -f - reg --forecast -H > /1 180/ >=0 # 21. Only today's date (or a Y year declaration) affects relative dates; # an explicit report period or forecast period does not. (#1845) # More explanation: # - "next quarter" is a relative date meaning "next quarter after the 1st of the current year" (a bug, see 21b). # - Current year is 2021 (because --today sets the current day to be in 2021, for a repeatable test). # - Neither the start or end year of the report or forecast periods (2020, 2022) are used. < ~ quarterly from next quarter (a) 1 $ hledger -f- --today=2021-05-01 reg --period=2020-2022 --forecast=2020-2022 2021-04-01 (a) 1 1 2021-07-01 (a) 1 2 2021-10-01 (a) 1 3 >=0 # 21b. Only a Y year declaration, or today's date, affects relative dates; # the report period or forecast period do not (#1845). # Also, without Y, relative dates should be relative to "today" (#1843, #1849). # Explanation of the below: "next quarter" is a relative date. # There's no Y, so it's relative to "today", which here is set to 2021-05-01 # with --today for repeatability. The "recurrence period" begins with the first # quarter after that, ie 2021-07-01. The report and forecast periods' # start/end dates (2020, 2022) do not affect the relative date. # < # ~ quarterly from next quarter # (a) 1 # $ hledger -f- --today=2021-05-01 reg --period=2020-2022 --forecast=2020-2022 # 2021-07-01 (a) 1 2 # 2021-10-01 (a) 1 3 # >=0