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
|
return $ TransactionModifier querytxt postings
|
||||||
|
|
||||||
-- | Parse a periodic transaction
|
-- | 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 :: MonadIO m => JournalParser m PeriodicTransaction
|
||||||
periodictransactionp = do
|
periodictransactionp = do
|
||||||
|
|
||||||
@ -477,8 +485,13 @@ periodictransactionp = do
|
|||||||
lift $ skipMany spacenonewline
|
lift $ skipMany spacenonewline
|
||||||
-- a period expression
|
-- a period expression
|
||||||
pos <- getPosition
|
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:
|
-- In periodic transactions, the period expression has an additional constraint:
|
||||||
case checkPeriodicTransactionStartDate interval span periodtxt of
|
case checkPeriodicTransactionStartDate interval span periodtxt of
|
||||||
Just e -> parseErrorAt pos e
|
Just e -> parseErrorAt pos e
|
||||||
@ -497,8 +510,8 @@ periodictransactionp = do
|
|||||||
return (s,c,desc,(cmt,ts))
|
return (s,c,desc,(cmt,ts))
|
||||||
)
|
)
|
||||||
|
|
||||||
-- next lines
|
-- next lines; use same year determined above
|
||||||
postings <- postingsp (Just $ first3 $ toGregorian d)
|
postings <- postingsp (Just $ first3 $ toGregorian refdate)
|
||||||
|
|
||||||
return $ nullperiodictransaction{
|
return $ nullperiodictransaction{
|
||||||
ptperiodexpr=periodtxt
|
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.
|
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.
|
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,
|
If you write a transaction description or same-line comment,
|
||||||
it must be separated from the period expression by **two or more spaces**. Eg:
|
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
|
>>>2
|
||||||
>>>=0
|
>>>=0
|
||||||
|
|
||||||
# TODO
|
# 5. Y affects M/D partial dates in periodic transactions.
|
||||||
# 5. Y should affect the partial date in this periodic transaction.
|
# The recur tag shows the original period expression and is not modified.
|
||||||
# Also the recur tag's value ?
|
hledger -f - print --forecast desc:forecast
|
||||||
#hledger -f - print --forecast desc:forecast
|
<<<
|
||||||
#<<<
|
Y 2000
|
||||||
#Y 2000
|
|
||||||
#
|
~ 2/1 forecast
|
||||||
#~ 2/1 forecast
|
|
||||||
#
|
; a real transaction to set the start of the forecast window
|
||||||
#; a real transaction to set --forecast's start date
|
2000/1/1 real
|
||||||
#2000/1/1 real
|
|
||||||
#
|
>>>
|
||||||
#>>>
|
2000/02/01 forecast
|
||||||
#2000/02/01 forecast
|
; recur: 2/1
|
||||||
# ; recur: 2000/2/1
|
|
||||||
#
|
>>>2
|
||||||
#>>>2
|
>>>=0
|
||||||
#>>>=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