journal: Y affects dates in periodic transactions (fix #892)
This commit is contained in:
parent
ab26220b23
commit
278802e648
@ -469,6 +469,14 @@ transactionmodifierp = do
|
||||
return $ TransactionModifier querytxt postings
|
||||
|
||||
-- | Parse a periodic transaction
|
||||
--
|
||||
-- This reuses periodexprp which parses period expressions on the command line.
|
||||
-- This is awkward because periodexprp supports relative and partial dates,
|
||||
-- which we don't really need here, and it doesn't support the notion of a
|
||||
-- default year set by a Y directive, which we do need to consider here.
|
||||
-- We resolve it as follows: in periodic transactions' period expressions,
|
||||
-- if there is a default year Y in effect, partial/relative dates are calculated
|
||||
-- relative to Y/1/1. If not, they are calculated related to today as usual.
|
||||
periodictransactionp :: MonadIO m => JournalParser m PeriodicTransaction
|
||||
periodictransactionp = do
|
||||
|
||||
@ -477,8 +485,13 @@ periodictransactionp = do
|
||||
lift $ skipMany spacenonewline
|
||||
-- a period expression
|
||||
pos <- getPosition
|
||||
d <- liftIO getCurrentDay
|
||||
(periodtxt, (interval, span)) <- lift $ first T.strip <$> match (periodexprp d)
|
||||
|
||||
today <- liftIO getCurrentDay
|
||||
mdefaultyear <- getYear
|
||||
let refdate = case mdefaultyear of
|
||||
Nothing -> today
|
||||
Just y -> fromGregorian y 1 1
|
||||
(periodtxt, (interval, span)) <- lift $ first T.strip <$> match (periodexprp refdate)
|
||||
-- In periodic transactions, the period expression has an additional constraint:
|
||||
case checkPeriodicTransactionStartDate interval span periodtxt of
|
||||
Just e -> parseErrorAt pos e
|
||||
@ -497,8 +510,8 @@ periodictransactionp = do
|
||||
return (s,c,desc,(cmt,ts))
|
||||
)
|
||||
|
||||
-- next lines
|
||||
postings <- postingsp (Just $ first3 $ toGregorian d)
|
||||
-- next lines; use same year determined above
|
||||
postings <- postingsp (Just $ first3 $ toGregorian refdate)
|
||||
|
||||
return $ nullperiodictransaction{
|
||||
ptperiodexpr=periodtxt
|
||||
|
||||
@ -1019,6 +1019,10 @@ There is an additional constraint on the period expression:
|
||||
the start date must fall on a natural boundary of the interval.
|
||||
Eg `monthly from 2018/1/1` is valid, but `monthly from 2018/1/15` is not.
|
||||
|
||||
Partial or relative dates (M/D, D, tomorrow, last week) in the period expression
|
||||
can work (useful or not). They will be relative to today's date, unless
|
||||
a Y default year directive is in effect, in which case they will be relative to Y/1/1.
|
||||
|
||||
If you write a transaction description or same-line comment,
|
||||
it must be separated from the period expression by **two or more spaces**. Eg:
|
||||
|
||||
|
||||
@ -105,21 +105,54 @@ hledger register -b 2015-12 -e 2017-02 -f - assets:cash --forecast
|
||||
>>>2
|
||||
>>>=0
|
||||
|
||||
# TODO
|
||||
# 5. Y should affect the partial date in this periodic transaction.
|
||||
# Also the recur tag's value ?
|
||||
#hledger -f - print --forecast desc:forecast
|
||||
#<<<
|
||||
#Y 2000
|
||||
#
|
||||
#~ 2/1 forecast
|
||||
#
|
||||
#; a real transaction to set --forecast's start date
|
||||
#2000/1/1 real
|
||||
#
|
||||
#>>>
|
||||
#2000/02/01 forecast
|
||||
# ; recur: 2000/2/1
|
||||
#
|
||||
#>>>2
|
||||
#>>>=0
|
||||
# 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
|
||||
<<<
|
||||
Y 2000
|
||||
|
||||
~ 2/1 forecast
|
||||
|
||||
; a real transaction to set the start of the forecast window
|
||||
2000/1/1 real
|
||||
|
||||
>>>
|
||||
2000/02/01 forecast
|
||||
; recur: 2/1
|
||||
|
||||
>>>2
|
||||
>>>=0
|
||||
|
||||
# 6. Y also sets the month to 1, affecting D dates:
|
||||
hledger -f - print --forecast desc:forecast
|
||||
<<<
|
||||
Y 2000
|
||||
|
||||
~ 15 forecast
|
||||
|
||||
; a real transaction to set the start of the forecast window
|
||||
2000/1/1 real
|
||||
|
||||
>>>
|
||||
2000/01/15 forecast
|
||||
; recur: 15
|
||||
|
||||
>>>2
|
||||
>>>=0
|
||||
|
||||
# 7. Y also sets the day to 1, affecting relative dates:
|
||||
hledger -f - print --forecast desc:forecast
|
||||
<<<
|
||||
Y 2000
|
||||
|
||||
~ next month forecast
|
||||
|
||||
; a real transaction to set the start of the forecast window
|
||||
2000/1/1 real
|
||||
|
||||
>>>
|
||||
2000/02/01 forecast
|
||||
; recur: next month
|
||||
|
||||
>>>2
|
||||
>>>=0
|
||||
|
||||
Loading…
Reference in New Issue
Block a user