areg: begin respecting --date2: show txns' date2 (#1731)
This commit is contained in:
parent
b4c1188c26
commit
e4263e69e1
@ -103,8 +103,9 @@ accountTransactionsReport rspec@ReportSpec{_rsReportOpts=ropts} j thisacctq = it
|
||||
periodq = Date . periodAsDateSpan $ period_ ropts
|
||||
amtq = filterQuery queryIsCurOrAmt $ _rsQuery rspec
|
||||
queryIsCurOrAmt q = queryIsSym q || queryIsAmt q
|
||||
wd = whichDate ropts
|
||||
|
||||
-- Note that within this functions, we are only allowed limited
|
||||
-- Note that within this function, we are only allowed limited
|
||||
-- transformation of the transaction postings: this is due to the need to
|
||||
-- pass the original transactions into accountTransactionsReportItem.
|
||||
-- Generally, we either include a transaction in full, or not at all.
|
||||
@ -112,6 +113,8 @@ accountTransactionsReport rspec@ReportSpec{_rsReportOpts=ropts} j thisacctq = it
|
||||
-- - filter them by the account query if any,
|
||||
-- - discard amounts not matched by the currency and amount query if any,
|
||||
-- - then apply valuation if any.
|
||||
-- Additional reportq filtering, such as date filtering, happens down in
|
||||
-- accountTransactionsReportItem, which discards transactions with no matched postings.
|
||||
acctJournal =
|
||||
ptraceAtWith 5 (("ts3:\n"++).pshowTransactions.jtxns)
|
||||
-- maybe convert these transactions to cost or value
|
||||
@ -149,7 +152,7 @@ accountTransactionsReport rspec@ReportSpec{_rsReportOpts=ropts} j thisacctq = it
|
||||
-- sort by the transaction's register date, then index, for accurate starting balance
|
||||
. ptraceAtWith 5 (("ts4:\n"++).pshowTransactions.map snd)
|
||||
. sortBy (comparing (Down . fst) <> comparing (Down . tindex . snd))
|
||||
. map (\t -> (transactionRegisterDate reportq thisacctq t, t))
|
||||
. map (\t -> (transactionRegisterDate wd reportq thisacctq t, t))
|
||||
$ jtxns acctJournal
|
||||
|
||||
pshowTransactions :: [Transaction] -> String
|
||||
@ -160,9 +163,8 @@ pshowTransactions = pshow . map (\t -> unwords [show $ tdate t, T.unpack $ tdesc
|
||||
-- which account to use as the focus, a starting balance, and a sign-setting
|
||||
-- function.
|
||||
-- Each transaction is accompanied by the date that should be shown for it
|
||||
-- in the report, which is not necessarily the transaction date; it is
|
||||
-- the earliest of the posting dates which match both thisacctq and reportq,
|
||||
-- otherwise the transaction's date if there are no matching postings.
|
||||
-- in the report. This is not necessarily the transaction date - see
|
||||
-- transactionRegisterDate.
|
||||
accountTransactionsReportItems :: Query -> Query -> MixedAmount -> (MixedAmount -> MixedAmount)
|
||||
-> [(Day, Transaction)] -> [AccountTransactionsReportItem]
|
||||
accountTransactionsReportItems reportq thisacctq bal signfn =
|
||||
@ -176,7 +178,7 @@ accountTransactionsReportItem reportq thisacctq signfn bal (d, torig)
|
||||
| null reportps = (bal, Nothing) -- no matched postings in this transaction, skip it
|
||||
| otherwise = (b, Just (torig, tacct{tdate=d}, numotheraccts > 1, otheracctstr, a, b))
|
||||
where
|
||||
tacct@Transaction{tpostings=reportps} = filterTransactionPostings reportq torig
|
||||
tacct@Transaction{tpostings=reportps} = filterTransactionPostings reportq torig -- TODO needs to consider --date2, #1731
|
||||
(thisacctps, otheracctps) = partition (matchesPosting thisacctq) reportps
|
||||
numotheraccts = length $ nub $ map paccount otheracctps
|
||||
otheracctstr | thisacctq == None = summarisePostingAccounts reportps -- no current account ? summarise all matched postings
|
||||
@ -185,16 +187,20 @@ accountTransactionsReportItem reportq thisacctq signfn bal (d, torig)
|
||||
a = signfn . maNegate $ sumPostings thisacctps
|
||||
b = bal `maPlus` a
|
||||
|
||||
-- | What is the transaction's date in the context of a particular account
|
||||
-- (specified with a query) and report query, as in an account register ?
|
||||
-- It's normally the transaction's general date, but if any posting(s)
|
||||
-- matched by the report query and affecting the matched account(s) have
|
||||
-- their own earlier dates, it's the earliest of these dates.
|
||||
-- Secondary transaction/posting dates are ignored.
|
||||
transactionRegisterDate :: Query -> Query -> Transaction -> Day
|
||||
transactionRegisterDate reportq thisacctq t
|
||||
| null thisacctps = tdate t
|
||||
| otherwise = minimum $ map postingDate thisacctps
|
||||
-- TODO needs checking, cf #1731
|
||||
-- | What date should be shown for a transaction in an account register report ?
|
||||
-- This will be in context of a particular account (the "this account" query)
|
||||
-- and any additional report query. It could be:
|
||||
--
|
||||
-- - if postings are matched by both thisacctq and reportq, the earliest of those
|
||||
-- matched postings' dates (or their secondary dates if --date2 was used)
|
||||
--
|
||||
-- - the transaction date, or its secondary date if --date2 was used.
|
||||
--
|
||||
transactionRegisterDate :: WhichDate -> Query -> Query -> Transaction -> Day
|
||||
transactionRegisterDate wd reportq thisacctq t
|
||||
| not $ null thisacctps = minimum $ map (postingDateOrDate2 wd) thisacctps
|
||||
| otherwise = transactionDateOrDate2 wd t
|
||||
where
|
||||
reportps = tpostings $ filterTransactionPostings reportq t
|
||||
thisacctps = filter (matchesPosting thisacctq) reportps
|
||||
|
||||
@ -88,6 +88,7 @@ aregister opts@CliOpts{rawopts_=rawopts,reportspec_=rspec} j = do
|
||||
, balanceaccum_= Historical
|
||||
, querystring_ = querystring
|
||||
}
|
||||
wd = whichDate ropts'
|
||||
-- and regenerate the ReportSpec, making sure to use the above
|
||||
rspec' <- either fail return $ updateReportSpec ropts' rspec
|
||||
let
|
||||
@ -98,7 +99,7 @@ aregister opts@CliOpts{rawopts_=rawopts,reportspec_=rspec} j = do
|
||||
reverse items
|
||||
-- select renderer
|
||||
render | fmt=="txt" = accountTransactionsReportAsText opts (_rsQuery rspec') thisacctq
|
||||
| fmt=="csv" = printCSV . accountTransactionsReportAsCsv (_rsQuery rspec') thisacctq
|
||||
| fmt=="csv" = printCSV . accountTransactionsReportAsCsv wd (_rsQuery rspec') thisacctq
|
||||
| fmt=="json" = toJsonText
|
||||
| otherwise = error' $ unsupportedOutputFormatError fmt -- PARTIAL:
|
||||
where
|
||||
@ -106,19 +107,19 @@ aregister opts@CliOpts{rawopts_=rawopts,reportspec_=rspec} j = do
|
||||
|
||||
writeOutputLazyText opts $ render items'
|
||||
|
||||
accountTransactionsReportAsCsv :: Query -> Query -> AccountTransactionsReport -> CSV
|
||||
accountTransactionsReportAsCsv reportq thisacctq is =
|
||||
accountTransactionsReportAsCsv :: WhichDate -> Query -> Query -> AccountTransactionsReport -> CSV
|
||||
accountTransactionsReportAsCsv wd reportq thisacctq is =
|
||||
["txnidx","date","code","description","otheraccounts","change","balance"]
|
||||
: map (accountTransactionsReportItemAsCsvRecord reportq thisacctq) is
|
||||
: map (accountTransactionsReportItemAsCsvRecord wd reportq thisacctq) is
|
||||
|
||||
accountTransactionsReportItemAsCsvRecord :: Query -> Query -> AccountTransactionsReportItem -> CsvRecord
|
||||
accountTransactionsReportItemAsCsvRecord :: WhichDate -> Query -> Query -> AccountTransactionsReportItem -> CsvRecord
|
||||
accountTransactionsReportItemAsCsvRecord
|
||||
reportq thisacctq
|
||||
wd reportq thisacctq
|
||||
(t@Transaction{tindex,tcode,tdescription}, _, _issplit, otheracctsstr, change, balance)
|
||||
= [idx,date,tcode,tdescription,otheracctsstr,amt,bal]
|
||||
where
|
||||
idx = T.pack $ show tindex
|
||||
date = showDate $ transactionRegisterDate reportq thisacctq t
|
||||
date = showDate $ transactionRegisterDate wd reportq thisacctq t
|
||||
amt = wbToText $ showMixedAmountB oneLine change
|
||||
bal = wbToText $ showMixedAmountB oneLine balance
|
||||
|
||||
@ -156,7 +157,7 @@ accountTransactionsReportAsText copts reportq thisacctq items = TB.toLazyText $
|
||||
--
|
||||
accountTransactionsReportItemAsText :: CliOpts -> Query -> Query -> Int -> Int -> AccountTransactionsReportItem -> TB.Builder
|
||||
accountTransactionsReportItemAsText
|
||||
copts@CliOpts{reportspec_=ReportSpec{_rsReportOpts=ReportOpts{color_}}}
|
||||
copts@CliOpts{reportspec_=ReportSpec{_rsReportOpts=ropts@ReportOpts{color_}}}
|
||||
reportq thisacctq preferredamtwidth preferredbalwidth
|
||||
(t@Transaction{tdescription}, _, _issplit, otheracctsstr, change, balance) =
|
||||
-- Transaction -- the transaction, unmodified
|
||||
@ -184,7 +185,8 @@ accountTransactionsReportItemAsText
|
||||
where w = fullwidth - wbWidth amt
|
||||
-- calculate widths
|
||||
(totalwidth,mdescwidth) = registerWidthsFromOpts copts
|
||||
(datewidth, date) = (10, showDate $ transactionRegisterDate reportq thisacctq t)
|
||||
(datewidth, date) = (10, showDate $ transactionRegisterDate wd reportq thisacctq t)
|
||||
where wd = whichDate ropts
|
||||
(amtwidth, balwidth)
|
||||
| shortfall <= 0 = (preferredamtwidth, preferredbalwidth)
|
||||
| otherwise = (adjustedamtwidth, adjustedbalwidth)
|
||||
|
||||
@ -100,3 +100,24 @@ Transactions in a and subaccounts:
|
||||
-1 B
|
||||
1 C
|
||||
|
||||
# aregister respects --date2 (#1731).
|
||||
<
|
||||
2021-01-01=2021-02-02
|
||||
(a) 1
|
||||
|
||||
# 7. With --date2, it should show the secondary transaction date.
|
||||
$ hledger -f- areg a --date2
|
||||
Transactions in a and subaccounts:
|
||||
2021-02-02 a 1 1
|
||||
|
||||
# # 8. With --date2, it should match on the secondary transaction date.
|
||||
# $ hledger -f- areg a --date2 date:202102
|
||||
# 2021-02-02 a 1 1
|
||||
|
||||
# # 9. ditto
|
||||
# $ hledger -f- areg a --date2 date2:202102
|
||||
# 2021-02-02 a 1 1
|
||||
|
||||
# # 10. should show the transaction, with the january date (?)
|
||||
# $ hledger -f- areg a date2:202102
|
||||
# 2021-01-01 a 1 1
|
||||
|
||||
Loading…
Reference in New Issue
Block a user