ui: accounts: fix balances when there's only periodic txns
And clarify multiBalanceReport.
This commit is contained in:
parent
89a0c7a308
commit
74611a7be1
@ -48,6 +48,7 @@ module Hledger.Data.Dates (
|
|||||||
parsePeriodExpr,
|
parsePeriodExpr,
|
||||||
parsePeriodExpr',
|
parsePeriodExpr',
|
||||||
nulldatespan,
|
nulldatespan,
|
||||||
|
emptydatespan,
|
||||||
failIfInvalidYear,
|
failIfInvalidYear,
|
||||||
failIfInvalidMonth,
|
failIfInvalidMonth,
|
||||||
failIfInvalidDay,
|
failIfInvalidDay,
|
||||||
@ -1097,5 +1098,9 @@ mkdatespan b = DateSpan (Just $ parsedate b) . Just . parsedate
|
|||||||
nulldatespan :: DateSpan
|
nulldatespan :: DateSpan
|
||||||
nulldatespan = DateSpan Nothing Nothing
|
nulldatespan = DateSpan Nothing Nothing
|
||||||
|
|
||||||
|
-- | A datespan of zero length, that matches no date.
|
||||||
|
emptydatespan :: DateSpan
|
||||||
|
emptydatespan = DateSpan (Just $ addDays 1 nulldate) (Just nulldate)
|
||||||
|
|
||||||
nulldate :: Day
|
nulldate :: Day
|
||||||
nulldate = fromGregorian 0 1 1
|
nulldate = fromGregorian 0 1 1
|
||||||
|
|||||||
@ -93,15 +93,37 @@ multiBalanceReport opts q j =
|
|||||||
depthless = dbg1 "depthless" . filterQuery (not . queryIsDepth)
|
depthless = dbg1 "depthless" . filterQuery (not . queryIsDepth)
|
||||||
datelessq = dbg1 "datelessq" $ filterQuery (not . queryIsDateOrDate2) q
|
datelessq = dbg1 "datelessq" $ filterQuery (not . queryIsDateOrDate2) q
|
||||||
dateqcons = if date2_ opts then Date2 else Date
|
dateqcons = if date2_ opts then Date2 else Date
|
||||||
precedingq = dbg1 "precedingq" $ And [datelessq, dateqcons $ DateSpan Nothing (spanStart reportspan)]
|
-- The date span specified by -b/-e/-p options and query args if any.
|
||||||
requestedspan = dbg1 "requestedspan" $ queryDateSpan (date2_ opts) q -- span specified by -b/-e/-p options and query args
|
requestedspan = dbg1 "requestedspan" $ queryDateSpan (date2_ opts) q
|
||||||
requestedspan' = dbg1 "requestedspan'" $ requestedspan `spanDefaultsFrom` journalDateSpan (date2_ opts) j -- if open-ended, close it using the journal's end dates
|
-- If the requested span is open-ended, close it using the journal's end dates.
|
||||||
intervalspans = dbg1 "intervalspans" $ splitSpan (interval_ opts) requestedspan' -- interval spans enclosing it
|
-- This can still be the null (open) span if the journal is empty.
|
||||||
reportspan = dbg1 "reportspan" $ DateSpan (maybe Nothing spanStart $ headMay intervalspans) -- the requested span enlarged to a whole number of intervals
|
requestedspan' = dbg1 "requestedspan'" $ requestedspan `spanDefaultsFrom` journalDateSpan (date2_ opts) j
|
||||||
|
-- The list of interval spans enclosing the requested span.
|
||||||
|
-- This list can be empty if the journal was empty,
|
||||||
|
-- or if hledger-ui has added its special date:-tomorrow to the query
|
||||||
|
-- and all txns are in the future.
|
||||||
|
intervalspans = dbg1 "intervalspans" $ splitSpan (interval_ opts) requestedspan'
|
||||||
|
-- The requested span enlarged to enclose a whole number of intervals.
|
||||||
|
-- This can be the null span if there were no intervals.
|
||||||
|
reportspan = dbg1 "reportspan" $ DateSpan (maybe Nothing spanStart $ headMay intervalspans)
|
||||||
(maybe Nothing spanEnd $ lastMay intervalspans)
|
(maybe Nothing spanEnd $ lastMay intervalspans)
|
||||||
newdatesq = dbg1 "newdateq" $ dateqcons reportspan
|
-- The user's query with no depth limit, and expanded to the report span
|
||||||
reportq = dbg1 "reportq" $ depthless $ And [datelessq, newdatesq] -- user's query enlarged to whole intervals and with no depth limit
|
-- if there is one (otherwise any date queries are left as-is, which
|
||||||
|
-- handles the hledger-ui+future txns case above).
|
||||||
|
reportq = dbg1 "reportq" $ depthless $
|
||||||
|
if reportspan == nulldatespan
|
||||||
|
then q
|
||||||
|
else And [datelessq, reportspandatesq]
|
||||||
|
where
|
||||||
|
reportspandatesq = dbg1 "reportspandatesq" $ dateqcons reportspan
|
||||||
|
-- q projected back before the report start date, to calculate starting balances.
|
||||||
|
-- When there's no report start date, in case there are future txns (the hledger-ui case above),
|
||||||
|
-- we use emptydatespan to make sure they aren't counted as starting balance.
|
||||||
|
startbalq = dbg1 "startbalq" $ And [datelessq, dateqcons precedingspan]
|
||||||
|
where
|
||||||
|
precedingspan = case spanStart reportspan of
|
||||||
|
Just d -> DateSpan Nothing (Just d)
|
||||||
|
Nothing -> emptydatespan
|
||||||
ps :: [Posting] =
|
ps :: [Posting] =
|
||||||
dbg1 "ps" $
|
dbg1 "ps" $
|
||||||
journalPostings $
|
journalPostings $
|
||||||
@ -139,7 +161,7 @@ multiBalanceReport opts q j =
|
|||||||
-- starting balances and accounts from transactions before the report start date
|
-- starting balances and accounts from transactions before the report start date
|
||||||
startacctbals = dbg1 "startacctbals" $ map (\(a,_,_,b) -> (a,b)) startbalanceitems
|
startacctbals = dbg1 "startacctbals" $ map (\(a,_,_,b) -> (a,b)) startbalanceitems
|
||||||
where
|
where
|
||||||
(startbalanceitems,_) = dbg1 "starting balance report" $ balanceReport opts' precedingq j
|
(startbalanceitems,_) = dbg1 "starting balance report" $ balanceReport opts' startbalq j
|
||||||
where
|
where
|
||||||
opts' | tree_ opts = opts{no_elide_=True}
|
opts' | tree_ opts = opts{no_elide_=True}
|
||||||
| otherwise = opts{accountlistmode_=ALFlat}
|
| otherwise = opts{accountlistmode_=ALFlat}
|
||||||
|
|||||||
@ -82,6 +82,8 @@ asInit d reset ui@UIState{
|
|||||||
uopts' = uopts{cliopts_=copts{reportopts_=ropts'}}
|
uopts' = uopts{cliopts_=copts{reportopts_=ropts'}}
|
||||||
ropts' = ropts{accountlistmode_=if tree_ ropts then ALTree else ALFlat}
|
ropts' = ropts{accountlistmode_=if tree_ ropts then ALTree else ALFlat}
|
||||||
|
|
||||||
|
-- Add a date:-tomorrow to the query to exclude future txns, by default.
|
||||||
|
-- XXX this necessitates special handling in multiBalanceReport, at least
|
||||||
pfq | presentorfuture_ uopts == PFFuture = Any
|
pfq | presentorfuture_ uopts == PFFuture = Any
|
||||||
| otherwise = Date $ DateSpan Nothing (Just $ addDays 1 d)
|
| otherwise = Date $ DateSpan Nothing (Just $ addDays 1 d)
|
||||||
q = And [queryFromOpts d ropts, pfq]
|
q = And [queryFromOpts d ropts, pfq]
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user