diff --git a/hledger-lib/Hledger/Reports/MultiBalanceReports.hs b/hledger-lib/Hledger/Reports/MultiBalanceReports.hs index e3016b6fa..63cf5b36c 100644 --- a/hledger-lib/Hledger/Reports/MultiBalanceReports.hs +++ b/hledger-lib/Hledger/Reports/MultiBalanceReports.hs @@ -18,6 +18,7 @@ where import Data.List import Data.Maybe import Data.Ord +import Safe -- import Test.HUnit import Hledger.Data @@ -64,7 +65,7 @@ type ClippedAccountName = AccountName -- showing the change of balance, accumulated balance, or historical balance -- in each of the specified periods. multiBalanceReport :: ReportOpts -> Query -> Journal -> MultiBalanceReport -multiBalanceReport opts q j = MultiBalanceReport (spans, items, totals) +multiBalanceReport opts q j = MultiBalanceReport (displayspans, items, totals) where -- dbg = const id -- exclude from debug output dbg s = let p = "multiBalanceReport" in Hledger.Utils.dbg (p++" "++s) -- add prefix in debug output @@ -75,7 +76,12 @@ multiBalanceReport opts q j = MultiBalanceReport (spans, items, totals) depthless = dbg "depthless" . filterQuery (not . queryIsDepth) datelessq = dbg "datelessq" $ filterQuery (not . queryIsDate) q precedingq = dbg "precedingq" $ And [datelessq, Date $ DateSpan Nothing (spanStart reportspan)] - reportq = dbg "reportq" $ depthless q -- $ And [datelessq, Date reportspan] -- laziness at work -- XXX no good, works only in GHCI + requestedspan = dbg "requestedspan" $ queryDateSpan (date2_ opts) q -- span specified by -b/-e/-p options and query args + requestedspan' = dbg "requestedspan'" $ requestedspan `spanDefaultsFrom` journalDateSpan j -- if open-ended, close it using the journal's end dates + intervalspans = dbg "intervalspans" $ splitSpan (intervalFromOpts opts) requestedspan' -- interval spans enclosing it + reportspan = dbg "reportspan" $ DateSpan (maybe Nothing spanStart $ headMay intervalspans) -- the requested span enlarged to a whole number of intervals + (maybe Nothing spanEnd $ lastMay intervalspans) + reportq = dbg "reportq" $ depthless $ And [datelessq, Date reportspan] -- user's query enlarged to whole intervals and with no depth limit ps :: [Posting] = dbg "ps" $ @@ -84,11 +90,16 @@ multiBalanceReport opts q j = MultiBalanceReport (spans, items, totals) filterJournalPostings reportq $ -- remove postings not matched by (adjusted) query journalSelectingAmountFromOpts opts j - (reportspan, spans) = dbg "report spans" $ reportSpans opts q j ps + displayspans = dbg "displayspans" $ splitSpan (intervalFromOpts opts) displayspan + where + displayspan + | empty_ opts = dbg "displayspan (-E)" $ reportspan -- all the requested intervals + | otherwise = dbg "displayspan" $ requestedspan `spanIntersect` matchedspan -- exclude leading/trailing empty intervals + matchedspan = dbg "matchedspan" $ postingsDateSpan' (whichDateFromOpts opts) ps psPerSpan :: [[Posting]] = dbg "psPerSpan" $ - [filter (isPostingInDateSpan' (whichDateFromOpts opts) s) ps | s <- spans] + [filter (isPostingInDateSpan' (whichDateFromOpts opts) s) ps | s <- displayspans] postedAcctBalChangesPerSpan :: [[(ClippedAccountName, MixedAmount)]] = dbg "postedAcctBalChangesPerSpan" $ diff --git a/hledger-lib/Hledger/Reports/ReportOptions.hs b/hledger-lib/Hledger/Reports/ReportOptions.hs index 5ab3a07e8..6cf8c4b05 100644 --- a/hledger-lib/Hledger/Reports/ReportOptions.hs +++ b/hledger-lib/Hledger/Reports/ReportOptions.hs @@ -19,7 +19,6 @@ module Hledger.Reports.ReportOptions ( queryFromOpts, queryFromOptsOnly, queryOptsFromOpts, - reportSpans, transactionDateFn, postingDateFn, @@ -290,45 +289,6 @@ tests_queryOptsFromOpts = [ }) ] --- | Calculate the overall and (if a reporting interval is specified) --- per-interval date spans for a report, based on command-line --- options, the search query, and the journal data. --- --- The basic overall report span is: --- without -E: the intersection of the requested span and the matched data's span. --- with -E: the full requested span, including leading/trailing intervals that are empty. --- If the begin or end date is not specified, those of the journal are used. --- --- The report span will be enlarged if necessary to include a whole --- number of report periods, when a reporting interval is specified. --- -reportSpans :: ReportOpts -> Query -> Journal -> [Posting] -> (DateSpan, [DateSpan]) -reportSpans opts q j matchedps = (reportspan, spans) - where - (reportspan, spans) - | empty_ opts = (dbg "reportspan1" $ enlargedrequestedspan, sps) - | otherwise = (dbg "reportspan2" $ requestedspan `spanIntersect` matchedspan, sps) - where - sps = dbg "spans" $ splitSpan (intervalFromOpts opts) reportspan - - -- the requested span specified by the query (-b/-e/-p options and query args); - -- might be open-ended - requestedspan = dbg "requestedspan" $ queryDateSpan (date2_ opts) q - - -- the requested span with unspecified dates filled from the journal data - finiterequestedspan = dbg "finiterequestedspan" $ requestedspan `orDatesFrom` journalDateSpan j - - -- enlarge the requested span to a whole number of periods - enlargedrequestedspan = dbg "enlargedrequestedspan" $ - DateSpan (maybe Nothing spanStart $ headMay requestedspans) - (maybe Nothing spanEnd $ lastMay requestedspans) - where - -- spans of the requested report interval which enclose the requested span - requestedspans = dbg "requestedspans" $ splitSpan (intervalFromOpts opts) finiterequestedspan - - -- earliest and latest dates of matched postings - matchedspan = dbg "matchedspan" $ postingsDateSpan' (whichDateFromOpts opts) matchedps - tests_Hledger_Reports_ReportOptions :: Test tests_Hledger_Reports_ReportOptions = TestList $ diff --git a/tests/balance-multicol.test b/tests/balance-multicol.test index 23d41a5b7..ccaf7074d 100644 --- a/tests/balance-multicol.test +++ b/tests/balance-multicol.test @@ -257,3 +257,28 @@ Change of balance (flow): || 2 >>>=0 + +# 18. All matched postings in the displayed intervals should be reported on. +hledgerdev -f- balance -p 'monthly 2014/1/10-2014/2/20' +<<< +2014/1/5 + (before) 1 + +2014/2/1 + (within) 1 + +2014/2/25 + (after) 1 + +>>> +Change of balance (flow): + + || 2014/01/01-2014/01/31 2014/02/01-2014/02/28 +========++=============================================== + after || 0 1 + before || 1 0 + within || 0 1 +--------++----------------------------------------------- + || 1 2 + +>>>=0