fix: bal: budget goals were ignoring rule-specified start date
This commit is contained in:
parent
b606d8de02
commit
7068517f2c
@ -26,7 +26,7 @@ import Data.Decimal (roundTo)
|
|||||||
import Data.Function (on)
|
import Data.Function (on)
|
||||||
import Data.HashMap.Strict (HashMap)
|
import Data.HashMap.Strict (HashMap)
|
||||||
import qualified Data.HashMap.Strict as HM
|
import qualified Data.HashMap.Strict as HM
|
||||||
import Data.List (find, partition, transpose, foldl')
|
import Data.List (find, partition, transpose, foldl', maximumBy)
|
||||||
import Data.List.Extra (nubSort)
|
import Data.List.Extra (nubSort)
|
||||||
import Data.Maybe (fromMaybe, catMaybes, isJust)
|
import Data.Maybe (fromMaybe, catMaybes, isJust)
|
||||||
import Data.Map (Map)
|
import Data.Map (Map)
|
||||||
@ -36,7 +36,7 @@ import Data.Text (Text)
|
|||||||
import qualified Data.Text as T
|
import qualified Data.Text as T
|
||||||
import qualified Data.Text.Lazy as TL
|
import qualified Data.Text.Lazy as TL
|
||||||
import qualified Data.Text.Lazy.Builder as TB
|
import qualified Data.Text.Lazy.Builder as TB
|
||||||
import Safe (maximumDef, minimumDef)
|
import Safe (minimumDef)
|
||||||
--import System.Console.CmdArgs.Explicit as C
|
--import System.Console.CmdArgs.Explicit as C
|
||||||
--import Lucid as L
|
--import Lucid as L
|
||||||
import qualified Text.Tabular.AsciiWide as Tab
|
import qualified Text.Tabular.AsciiWide as Tab
|
||||||
@ -46,6 +46,7 @@ import Hledger.Utils
|
|||||||
import Hledger.Reports.ReportOptions
|
import Hledger.Reports.ReportOptions
|
||||||
import Hledger.Reports.ReportTypes
|
import Hledger.Reports.ReportTypes
|
||||||
import Hledger.Reports.MultiBalanceReport
|
import Hledger.Reports.MultiBalanceReport
|
||||||
|
import Data.Ord (comparing)
|
||||||
|
|
||||||
|
|
||||||
type BudgetGoal = Change
|
type BudgetGoal = Change
|
||||||
@ -113,19 +114,34 @@ journalAddBudgetGoalTransactions bopts ropts reportspan j =
|
|||||||
where
|
where
|
||||||
mbudgetgoalsstartdate =
|
mbudgetgoalsstartdate =
|
||||||
-- We want to also generate budget goal txns before the report start date, in case -H is used.
|
-- We want to also generate budget goal txns before the report start date, in case -H is used.
|
||||||
-- What should the actual starting date for goal txns be ? This gets a little tricky: consider a
|
-- What should the actual starting date for goal txns be ? This gets tricky.
|
||||||
-- journal with a "~ monthly" periodic transaction rule, where the first transaction is on 1/5.
|
-- Consider a journal with a "~ monthly" periodic transaction rule, where the first transaction is on 1/5.
|
||||||
-- Users will certainly expect a budget goal for january, but "~ monthly" generates transactions
|
-- Users will certainly expect a budget goal for january, but "~ monthly" generates transactions
|
||||||
-- on the first of month, and starting from 1/5 would exclude 1/1.
|
-- on the first of month, and starting from 1/5 would exclude 1/1.
|
||||||
-- Hopefully the following procedure will produce intuitive behaviour in general:
|
-- Secondly, consider a rule like "~ every february 2nd from 2020/01"; we should not start that
|
||||||
|
-- before 2020-02-02.
|
||||||
|
-- Hopefully the following algorithm produces intuitive behaviour in general:
|
||||||
-- from the earlier of the journal start date and the report start date,
|
-- from the earlier of the journal start date and the report start date,
|
||||||
-- move backward to the nearest natural start date of the largest period seen among the
|
-- move backward to the nearest natural start date of the largest period seen among the
|
||||||
-- active periodic transactions (so here: monthly, 1/5 -> 1/1).
|
-- active periodic transactions, unless that is disallowed by a start date in the periodic rule.
|
||||||
|
-- (Do we need to pay attention to an end date in the rule ? Don't think so.)
|
||||||
|
-- (So with "~ monthly", the journal start date 1/5 is adjusted to 1/1.)
|
||||||
case minimumDef Nothing $ filter isJust [journalStartDate False j, spanStart reportspan] of
|
case minimumDef Nothing $ filter isJust [journalStartDate False j, spanStart reportspan] of
|
||||||
Nothing -> Nothing
|
Nothing -> Nothing
|
||||||
Just d -> Just $ intervalStartBefore biggestinterval d
|
Just d -> Just d'
|
||||||
where
|
where
|
||||||
biggestinterval = maximumDef (Days 1) $ map ptinterval budgetpts
|
-- the interval and any date span of the periodic transaction with longest period
|
||||||
|
(interval, span) =
|
||||||
|
case budgetpts of
|
||||||
|
[] -> (Days 1, nulldatespan)
|
||||||
|
pts -> (ptinterval pt, ptspan pt)
|
||||||
|
where pt = maximumBy (comparing ptinterval) pts -- PARTIAL: maximumBy won't fail
|
||||||
|
-- the natural start of this interval on or before the journal/report start
|
||||||
|
intervalstart = intervalStartBefore interval d
|
||||||
|
-- the natural interval start before the journal/report start,
|
||||||
|
-- or the rule-specified start if later,
|
||||||
|
-- but no later than the journal/report start.
|
||||||
|
d' = min d $ maybe intervalstart (max intervalstart) $ spanStart span
|
||||||
|
|
||||||
-- select periodic transactions matching a pattern
|
-- select periodic transactions matching a pattern
|
||||||
-- (the argument of the (final) --budget option).
|
-- (the argument of the (final) --budget option).
|
||||||
|
|||||||
@ -620,7 +620,7 @@ Budget performance in 2020Q1:
|
|||||||
---------------++-----------------------------------------------------------
|
---------------++-----------------------------------------------------------
|
||||||
|| 0 [ 0% of $500] 0 [0% of $500] 0 [ 0% of $500]
|
|| 0 [ 0% of $500] 0 [0% of $500] 0 [ 0% of $500]
|
||||||
|
|
||||||
# 32. Select from multiple named budgets.
|
# 32, 33. Select from multiple named budgets.
|
||||||
<
|
<
|
||||||
~ weekly weekly budget
|
~ weekly weekly budget
|
||||||
(aaa) 1
|
(aaa) 1
|
||||||
@ -636,7 +636,7 @@ $ hledger -f- bal --budget=monthly -p 2021-01
|
|||||||
> !/aaa/
|
> !/aaa/
|
||||||
>=
|
>=
|
||||||
|
|
||||||
# 33. Cumulative budget report.
|
# 34. Cumulative budget report.
|
||||||
<
|
<
|
||||||
~ monthly
|
~ monthly
|
||||||
(a) 10
|
(a) 10
|
||||||
@ -656,8 +656,8 @@ Budget performance in 2022-01-01..2022-02-28:
|
|||||||
---++---------------------------------
|
---++---------------------------------
|
||||||
|| 10 [100% of 10] 15 [75% of 20]
|
|| 10 [100% of 10] 15 [75% of 20]
|
||||||
|
|
||||||
# 34. Historical budget report.
|
# 35. Historical budget report.
|
||||||
$ hledger -f- bal --budget -M --historical -b 2022-02-01
|
$ hledger -f- bal --budget -MH -b 2022-02-01
|
||||||
Budget performance in 2022-02:
|
Budget performance in 2022-02:
|
||||||
|
|
||||||
|| 2022-02-28
|
|| 2022-02-28
|
||||||
@ -665,3 +665,17 @@ Budget performance in 2022-02:
|
|||||||
a || 15 [75% of 20]
|
a || 15 [75% of 20]
|
||||||
---++----------------
|
---++----------------
|
||||||
|| 15 [75% of 20]
|
|| 15 [75% of 20]
|
||||||
|
|
||||||
|
# 36. Historical budget report where the periodic transaction has date bounds.
|
||||||
|
<
|
||||||
|
~ every february 2nd from 2020/01
|
||||||
|
(a) 1
|
||||||
|
|
||||||
|
$ hledger -f- bal --budget -MH -p 2020q1
|
||||||
|
Budget performance in 2020Q1:
|
||||||
|
|
||||||
|
|| 2020-01-31 2020-02-29 2020-03-31
|
||||||
|
===++======================================
|
||||||
|
a || 0 [0] 0 [0% of 1] 0 [0% of 1]
|
||||||
|
---++--------------------------------------
|
||||||
|
|| 0 [0] 0 [0% of 1] 0 [0% of 1]
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user