ref!: postingDateOrDate2, transactionDateOrDate2, whichDateFromOpts -> whichDate (#1731)
This commit is contained in:
parent
9ff5ac1288
commit
b4c1188c26
@ -42,6 +42,7 @@ module Hledger.Data.Posting (
|
||||
-- * date operations
|
||||
postingDate,
|
||||
postingDate2,
|
||||
postingDateOrDate2,
|
||||
isPostingInDateSpan,
|
||||
isPostingInDateSpan',
|
||||
-- * account name operations
|
||||
@ -220,6 +221,11 @@ postingDate2 p = fromMaybe nulldate $ asum dates
|
||||
, tdate <$> ptransaction p
|
||||
]
|
||||
|
||||
-- | Get a posting's primary or secondary date, as specified.
|
||||
postingDateOrDate2 :: WhichDate -> Posting -> Day
|
||||
postingDateOrDate2 PrimaryDate = postingDate
|
||||
postingDateOrDate2 SecondaryDate = postingDate2
|
||||
|
||||
-- | Get a posting's status. This is cleared or pending if those are
|
||||
-- explicitly set on the posting, otherwise the status of its parent
|
||||
-- transaction, or unmarked if there is no parent transaction. (Note
|
||||
|
||||
@ -34,6 +34,7 @@ module Hledger.Data.Transaction
|
||||
-- nonzerobalanceerror
|
||||
-- * date operations
|
||||
, transactionDate2
|
||||
, transactionDateOrDate2
|
||||
-- * transaction description parts
|
||||
, transactionPayee
|
||||
, transactionNote
|
||||
@ -320,10 +321,15 @@ balancedVirtualPostings = filter isBalancedVirtual . tpostings
|
||||
transactionsPostings :: [Transaction] -> [Posting]
|
||||
transactionsPostings = concatMap tpostings
|
||||
|
||||
-- Get a transaction's secondary date, defaulting to the primary date.
|
||||
-- Get a transaction's secondary date, or the primary date if there is none.
|
||||
transactionDate2 :: Transaction -> Day
|
||||
transactionDate2 t = fromMaybe (tdate t) $ tdate2 t
|
||||
|
||||
-- Get a transaction's primary or secondary date, as specified.
|
||||
transactionDateOrDate2 :: WhichDate -> Transaction -> Day
|
||||
transactionDateOrDate2 PrimaryDate = tdate
|
||||
transactionDateOrDate2 SecondaryDate = transactionDate2
|
||||
|
||||
-- | Ensure a transaction's postings refer back to it, so that eg
|
||||
-- relatedPostings works right.
|
||||
txnTieKnot :: Transaction -> Transaction
|
||||
|
||||
@ -244,9 +244,7 @@ getPostingsByColumn rspec j priceoracle reportspan =
|
||||
ps = dbg5 "getPostingsByColumn" $ getPostings rspec j priceoracle
|
||||
-- The date spans to be included as report columns.
|
||||
colspans = dbg3 "colspans" $ splitSpan (interval_ $ _rsReportOpts rspec) reportspan
|
||||
getDate = case whichDateFromOpts (_rsReportOpts rspec) of
|
||||
PrimaryDate -> postingDate
|
||||
SecondaryDate -> postingDate2
|
||||
getDate = postingDateOrDate2 (whichDate (_rsReportOpts rspec))
|
||||
|
||||
-- | Gather postings matching the query within the report period.
|
||||
getPostings :: ReportSpec -> Journal -> PriceOracle -> [Posting]
|
||||
|
||||
@ -64,7 +64,7 @@ postingsReport :: ReportSpec -> Journal -> PostingsReport
|
||||
postingsReport rspec@ReportSpec{_rsReportOpts=ropts@ReportOpts{..}} j = items
|
||||
where
|
||||
reportspan = reportSpanBothDates j rspec
|
||||
whichdate = whichDateFromOpts ropts
|
||||
whichdate = whichDate ropts
|
||||
mdepth = queryDepth $ _rsQuery rspec
|
||||
multiperiod = interval_ /= NoInterval
|
||||
|
||||
@ -116,9 +116,11 @@ matchedPostingsBeforeAndDuring rspec@ReportSpec{_rsReportOpts=ropts,_rsQuery=q}
|
||||
dbg5 "beforeps, duringps" $ span (beforestartq `matchesPosting`) beforeandduringps
|
||||
where
|
||||
beforestartq = dbg3 "beforestartq" $ dateqtype $ DateSpan Nothing $ spanStart reportspan
|
||||
beforeandduringps = sortOn (if date2_ ropts then postingDate2 else postingDate) -- sort postings by date or date2
|
||||
. (if invert_ ropts then map negatePostingAmount else id) -- with --invert, invert amounts
|
||||
. journalPostings $ journalValueAndFilterPostings rspec{_rsQuery=beforeandduringq} j
|
||||
beforeandduringps =
|
||||
sortOn (postingDateOrDate2 (whichDate ropts)) -- sort postings by date or date2
|
||||
. (if invert_ ropts then map negatePostingAmount else id) -- with --invert, invert amounts
|
||||
. journalPostings
|
||||
$ journalValueAndFilterPostings rspec{_rsQuery=beforeandduringq} j
|
||||
|
||||
-- filter postings by the query, with no start date or depth limit
|
||||
beforeandduringq = dbg4 "beforeandduringq" $ And [depthless $ dateless q, beforeendq]
|
||||
@ -152,15 +154,12 @@ postingsReportItems ((p,mperiod):ps) (pprev,mperiodprev) wd d b runningcalcfn it
|
||||
-- the transaction description.
|
||||
mkpostingsReportItem :: Bool -> Bool -> WhichDate -> Maybe Period -> Posting -> MixedAmount -> PostingsReportItem
|
||||
mkpostingsReportItem showdate showdesc wd mperiod p b =
|
||||
(if showdate then Just date else Nothing
|
||||
(if showdate then Just $ postingDateOrDate2 wd p else Nothing
|
||||
,mperiod
|
||||
,if showdesc then tdescription <$> ptransaction p else Nothing
|
||||
,p
|
||||
,b
|
||||
)
|
||||
where
|
||||
date = case wd of PrimaryDate -> postingDate p
|
||||
SecondaryDate -> postingDate2 p
|
||||
|
||||
-- | Convert a list of postings into summary postings, one per interval,
|
||||
-- aggregated to the specified depth if any.
|
||||
@ -170,13 +169,10 @@ summarisePostingsByInterval interval wd mdepth showempty reportspan =
|
||||
concatMap (\(s,ps) -> summarisePostingsInDateSpan s wd mdepth showempty ps)
|
||||
-- Group postings into their columns. We try to be efficient, since
|
||||
-- there can possibly be a very large number of intervals (cf #1683)
|
||||
. groupByDateSpan showempty getDate colspans
|
||||
. groupByDateSpan showempty (postingDateOrDate2 wd) colspans
|
||||
where
|
||||
-- The date spans to be included as report columns.
|
||||
colspans = splitSpan interval reportspan
|
||||
getDate = case wd of
|
||||
PrimaryDate -> postingDate
|
||||
SecondaryDate -> postingDate2
|
||||
|
||||
-- | Given a date span (representing a report interval) and a list of
|
||||
-- postings within it, aggregate the postings into one summary posting per
|
||||
|
||||
@ -38,7 +38,7 @@ module Hledger.Reports.ReportOptions (
|
||||
tree_,
|
||||
reportOptsToggleStatus,
|
||||
simplifyStatuses,
|
||||
whichDateFromOpts,
|
||||
whichDate,
|
||||
journalValueAndFilterPostings,
|
||||
journalValueAndFilterPostingsWith,
|
||||
journalApplyValuationFromOpts,
|
||||
@ -486,8 +486,8 @@ postingDateFn :: ReportOpts -> (Posting -> Day)
|
||||
postingDateFn ReportOpts{..} = if date2_ then postingDate2 else postingDate
|
||||
|
||||
-- | Report which date we will report on based on --date2.
|
||||
whichDateFromOpts :: ReportOpts -> WhichDate
|
||||
whichDateFromOpts ReportOpts{..} = if date2_ then SecondaryDate else PrimaryDate
|
||||
whichDate :: ReportOpts -> WhichDate
|
||||
whichDate ReportOpts{..} = if date2_ then SecondaryDate else PrimaryDate
|
||||
|
||||
-- | Legacy-compatible convenience aliases for accountlistmode_.
|
||||
tree_ :: ReportOpts -> Bool
|
||||
|
||||
Loading…
Reference in New Issue
Block a user