fix: lib: Filter postings before performing valuation and costing in
MultiBalanceReport, PostingsReport, EntriesReport, and AccountTransactionsReport. (#1625, #1630)
This commit is contained in:
parent
4451d68a63
commit
6528f25593
@ -113,20 +113,21 @@ accountTransactionsReport rspec@ReportSpec{_rsReportOpts=ropts} j thisacctq = it
|
||||
-- sort by the transaction's register date, for accurate starting balance
|
||||
-- these are not yet filtered by tdate, we want to search them all for priorps
|
||||
transactions =
|
||||
ptraceAtWith 5 (("ts5:\n"++).pshowTransactions)
|
||||
ptraceAtWith 5 (("ts4:\n"++).pshowTransactions)
|
||||
. sortOn (transactionRegisterDate reportq thisacctq)
|
||||
. jtxns
|
||||
. ptraceAtWith 5 (("ts4:\n"++).pshowTransactions.jtxns)
|
||||
. ptraceAtWith 5 (("ts3:\n"++).pshowTransactions.jtxns)
|
||||
-- maybe convert these transactions to cost or value
|
||||
. journalApplyValuationFromOpts rspec
|
||||
. (if filtertxns then filterJournalTransactions reportq else id)
|
||||
-- keep just the transactions affecting this account (via possibly realness or status-filtered postings)
|
||||
. traceAt 3 ("thisacctq: "++show thisacctq)
|
||||
. ptraceAtWith 5 (("ts3:\n"++).pshowTransactions.jtxns)
|
||||
. ptraceAtWith 5 (("ts2:\n"++).pshowTransactions.jtxns)
|
||||
. filterJournalTransactions thisacctq
|
||||
. filterJournalPostings (And [realq, statusq])
|
||||
. ptraceAtWith 5 (("ts1:\n"++).pshowTransactions.jtxns)
|
||||
-- apply any cur:SYM filters in reportq
|
||||
. ptraceAtWith 5 (("ts2:\n"++).pshowTransactions.jtxns)
|
||||
. (if queryIsNull symq then id else filterJournalAmounts symq)
|
||||
-- maybe convert these transactions to cost or value
|
||||
$ journalApplyValuationFromOpts rspec j
|
||||
$ if queryIsNull symq then j else filterJournalAmounts symq j
|
||||
|
||||
startbal
|
||||
| balanceaccum_ ropts == Historical = sumPostings priorps
|
||||
@ -150,10 +151,7 @@ accountTransactionsReport rspec@ReportSpec{_rsReportOpts=ropts} j thisacctq = it
|
||||
-- Make it an option for now.
|
||||
filtertxns = txn_dates_ ropts
|
||||
|
||||
items = reverse $
|
||||
accountTransactionsReportItems reportq thisacctq startbal maNegate $
|
||||
(if filtertxns then filter (reportq `matchesTransaction`) else id) $
|
||||
transactions
|
||||
items = reverse $ accountTransactionsReportItems reportq thisacctq startbal maNegate transactions
|
||||
|
||||
pshowTransactions :: [Transaction] -> String
|
||||
pshowTransactions = pshow . map (\t -> unwords [show $ tdate t, T.unpack $ tdescription t])
|
||||
@ -172,8 +170,7 @@ accountTransactionsReportItem reportq thisacctq signfn bal torig = balItem
|
||||
-- 201407: I've lost my grip on this, let's just hope for the best
|
||||
-- 201606: we now calculate change and balance from filtered postings, check this still works well for all callers XXX
|
||||
where
|
||||
tfiltered@Transaction{tpostings=reportps} = filterTransactionPostings reportq torig
|
||||
tacct = tfiltered{tdate=transactionRegisterDate reportq thisacctq tfiltered}
|
||||
tacct@Transaction{tpostings=reportps} = torig{tdate=transactionRegisterDate reportq thisacctq torig}
|
||||
balItem = case reportps of
|
||||
[] -> (bal, Nothing) -- no matched postings in this transaction, skip it
|
||||
_ -> (b, Just (torig, tacct, numotheraccts > 1, otheracctstr, a, b))
|
||||
|
||||
@ -35,8 +35,9 @@ type EntriesReportItem = Transaction
|
||||
-- | Select transactions for an entries report.
|
||||
entriesReport :: ReportSpec -> Journal -> EntriesReport
|
||||
entriesReport rspec@ReportSpec{_rsReportOpts=ropts} =
|
||||
sortBy (comparing $ transactionDateFn ropts) . jtxns . filterJournalTransactions (_rsQuery rspec)
|
||||
sortBy (comparing $ transactionDateFn ropts) . jtxns
|
||||
. journalApplyValuationFromOpts rspec{_rsReportOpts=ropts{show_costs_=True}}
|
||||
. filterJournalTransactions (_rsQuery rspec)
|
||||
|
||||
tests_EntriesReport = tests "EntriesReport" [
|
||||
tests "entriesReport" [
|
||||
|
||||
@ -244,9 +244,9 @@ getPostings :: ReportSpec -> Journal -> PriceOracle -> [(Posting, Day)]
|
||||
getPostings rspec@ReportSpec{_rsQuery=query,_rsReportOpts=ropts} j priceoracle =
|
||||
map (\p -> (p, date p)) .
|
||||
journalPostings .
|
||||
filterJournalAmounts symq . -- remove amount parts excluded by cur:
|
||||
filterJournalPostings reportq $ -- remove postings not matched by (adjusted) query
|
||||
valuedJournal
|
||||
valueJournal .
|
||||
filterJournalAmounts symq $ -- remove amount parts excluded by cur:
|
||||
filterJournalPostings reportq j -- remove postings not matched by (adjusted) query
|
||||
where
|
||||
symq = dbg3 "symq" . filterQuery queryIsSym $ dbg3 "requested q" query
|
||||
-- The user's query with no depth limit, and expanded to the report span
|
||||
@ -254,8 +254,8 @@ getPostings rspec@ReportSpec{_rsQuery=query,_rsReportOpts=ropts} j priceoracle =
|
||||
-- handles the hledger-ui+future txns case above).
|
||||
reportq = dbg3 "reportq" $ depthless query
|
||||
depthless = dbg3 "depthless" . filterQuery (not . queryIsDepth)
|
||||
valuedJournal | isJust (valuationAfterSum ropts) = j
|
||||
| otherwise = journalApplyValuationFromOptsWith rspec j priceoracle
|
||||
valueJournal j' | isJust (valuationAfterSum ropts) = j'
|
||||
| otherwise = journalApplyValuationFromOptsWith rspec j' priceoracle
|
||||
|
||||
date = case whichDateFromOpts ropts of
|
||||
PrimaryDate -> postingDate
|
||||
|
||||
@ -121,11 +121,11 @@ matchedPostingsBeforeAndDuring rspec@ReportSpec{_rsReportOpts=ropts,_rsQuery=q}
|
||||
beforeandduringps =
|
||||
dbg5 "ps5" $ sortOn sortdate $ -- sort postings by date or date2
|
||||
dbg5 "ps4" $ (if invert_ ropts then map negatePostingAmount else id) $ -- with --invert, invert amounts
|
||||
dbg5 "ps3" $ map (filterPostingAmount symq) $ -- remove amount parts which the query's cur: terms would exclude
|
||||
dbg5 "ps2" $ (if related_ ropts then concatMap relatedPostings else id) $ -- with -r, replace each with its sibling postings
|
||||
dbg5 "ps1" $ filter (beforeandduringq `matchesPosting`) $ -- filter postings by the query, with no start date or depth limit
|
||||
journalPostings $
|
||||
journalApplyValuationFromOpts rspec j -- convert to cost and apply valuation
|
||||
dbg5 "ps3" $ (if related_ ropts then concatMap relatedPostings else id) $ -- with -r, replace each with its sibling postings
|
||||
journalPostings $
|
||||
journalApplyValuationFromOpts rspec $ -- convert to cost and apply valuation
|
||||
dbg5 "ps2" $ filterJournalAmounts symq $ -- remove amount parts which the query's cur: terms would exclude
|
||||
dbg5 "ps1" $ filterJournalPostings beforeandduringq j -- filter postings by the query, with no start date or depth limit
|
||||
where
|
||||
beforeandduringq = dbg4 "beforeandduringq" $ And [depthless $ dateless q, beforeendq]
|
||||
where
|
||||
|
||||
@ -297,3 +297,44 @@ $ hledger -f- print cur: amt:1112
|
||||
|
||||
>=
|
||||
|
||||
<
|
||||
P 2021-01-01 A 1000 B
|
||||
2021-01-01
|
||||
(a) 1 A
|
||||
|
||||
2021-01-02
|
||||
(a) 10 A
|
||||
|
||||
2021-01-03
|
||||
(a) 10 A @ 0.1 B
|
||||
|
||||
2021-01-04
|
||||
(a) 1 B @ 0.001 A
|
||||
|
||||
2021-01-05
|
||||
(a) 1 B
|
||||
|
||||
# 22. balance report cur: and amt: query matches currency before valuation/cost
|
||||
$ hledger -f- balance -N -V -B cur:A "amt:<5"
|
||||
1000 B a
|
||||
>=
|
||||
|
||||
# 23. register report cur: and amt: query matches currency before valuation/cost
|
||||
$ hledger -f- register -V -B cur:A "amt:<5"
|
||||
2021-01-01 (a) 1000 B 1000 B
|
||||
>=
|
||||
|
||||
# 24. aregister report cur: and amt: query matches currency before
|
||||
# valuation/cost (note that aregister currently only tests queries other than
|
||||
# "cur:" and the account query when given the --txn-dates option. Who knows why.
|
||||
$ hledger -f- aregister a -V -B cur:A "amt:<5" --txn-dates
|
||||
Transactions in a and subaccounts:
|
||||
2021-01-01 a 1000 B 1000 B
|
||||
>=
|
||||
|
||||
# 25. print report cur: and amt: query matches currency before valuation/cost
|
||||
$ hledger -f- print -V -B a cur:A "amt:<5"
|
||||
2021-01-01
|
||||
(a) 1000 B
|
||||
|
||||
>=
|
||||
|
||||
Loading…
Reference in New Issue
Block a user