refactor: move stuff
This commit is contained in:
parent
224cab068f
commit
69744730cd
@ -100,73 +100,6 @@ showPostingWithBalanceForVty showtxninfo p b = postingRegisterReportItemAsText [
|
||||
totallabel = "Total"
|
||||
balancelabel = "Balance"
|
||||
|
||||
-- | Get a quicken/gnucash-style account register report, with the
|
||||
-- specified options, for the currently focussed account (or possibly the
|
||||
-- focussed account plus sub-accounts.) This differs from
|
||||
-- "postingRegisterReport" in several ways:
|
||||
--
|
||||
-- 1. it shows transactions, from the point of view of the focussed
|
||||
-- account. The other account's name and posted amount is displayed,
|
||||
-- aggregated if there is more than one other account posting.
|
||||
--
|
||||
-- 2. With no transaction filtering in effect other than a start date, it
|
||||
-- shows the accurate historical running balance for this
|
||||
-- account. Otherwise it shows a running total starting at 0 like the posting register report.
|
||||
--
|
||||
-- 3. Currently this report does not handle reporting intervals.
|
||||
--
|
||||
-- 4. Report items will be most recent first.
|
||||
--
|
||||
accountRegisterReport :: [Opt] -> Journal -> Matcher -> Matcher -> AccountRegisterReport
|
||||
accountRegisterReport opts j m thisacctmatcher = (label, items)
|
||||
where
|
||||
-- transactions affecting this account, in date order
|
||||
ts = sortBy (comparing tdate) $ filter (matchesTransaction thisacctmatcher) $ jtxns j
|
||||
|
||||
-- starting balance: if we are filtering by a start date and nothing else,
|
||||
-- the sum of postings to this account before that date; otherwise zero.
|
||||
(startbal,label, sumfn) | matcherIsNull m = (nullmixedamt,balancelabel,(-))
|
||||
| matcherIsStartDateOnly effective m = (sumPostings priorps,balancelabel,(-))
|
||||
| otherwise = (nullmixedamt,totallabel,(+))
|
||||
where
|
||||
priorps = -- ltrace "priorps" $
|
||||
filter (matchesPosting
|
||||
(-- ltrace "priormatcher" $
|
||||
MatchAnd [thisacctmatcher, tostartdatematcher]))
|
||||
$ transactionsPostings ts
|
||||
tostartdatematcher = MatchDate True (DateSpan Nothing startdate)
|
||||
startdate = matcherStartDate effective m
|
||||
effective = Effective `elem` opts
|
||||
|
||||
displaymatcher = -- ltrace "displaymatcher" $
|
||||
MatchAnd [negateMatcher thisacctmatcher, m]
|
||||
|
||||
items = reverse $ accountRegisterReportItems ts displaymatcher nulltransaction startbal sumfn
|
||||
|
||||
-- | Generate account register line items from a list of transactions,
|
||||
-- using the provided matcher (postings not matching this will not affect
|
||||
-- the displayed item), starting transaction, starting balance, and
|
||||
-- balance summing function.
|
||||
accountRegisterReportItems :: [Transaction] -> Matcher -> Transaction -> MixedAmount -> (MixedAmount -> MixedAmount -> MixedAmount) -> [AccountRegisterReportItem]
|
||||
accountRegisterReportItems [] _ _ _ _ = []
|
||||
accountRegisterReportItems (t@Transaction{tpostings=ps}:ts) displaymatcher _ bal sumfn =
|
||||
case i of Just i' -> i':is
|
||||
Nothing -> is
|
||||
where
|
||||
(i,bal'') = case filter (displaymatcher `matchesPosting`) ps of
|
||||
[] -> (Nothing,bal) -- maybe a virtual transaction, or transfer to self
|
||||
[p] -> (Just (t, acct, amt, bal'), bal')
|
||||
where
|
||||
acct = paccount p
|
||||
amt = pamount p
|
||||
bal' = bal `sumfn` amt
|
||||
ps' -> (Just (t,acct,amt,bal'), bal')
|
||||
where
|
||||
acct = "SPLIT ("++intercalate ", " (map (accountLeafName . paccount) ps')++")"
|
||||
amt = sum $ map pamount ps'
|
||||
bal' = bal `sumfn` amt
|
||||
is = (accountRegisterReportItems ts displaymatcher t bal'' sumfn)
|
||||
|
||||
-- | Get a ledger-style posting register report, with the specified options,
|
||||
-- for the whole journal. See also "accountRegisterReport".
|
||||
postingRegisterReport :: [Opt] -> FilterSpec -> Journal -> PostingRegisterReport
|
||||
@ -240,6 +173,73 @@ datedisplayexpr = do
|
||||
where
|
||||
compareop = choice $ map (try . string) ["<=",">=","==","<","=",">"]
|
||||
|
||||
-- | Get a quicken/gnucash-style account register report, with the
|
||||
-- specified options, for the currently focussed account (or possibly the
|
||||
-- focussed account plus sub-accounts.) This differs from
|
||||
-- "postingRegisterReport" in several ways:
|
||||
--
|
||||
-- 1. it shows transactions, from the point of view of the focussed
|
||||
-- account. The other account's name and posted amount is displayed,
|
||||
-- aggregated if there is more than one other account posting.
|
||||
--
|
||||
-- 2. With no transaction filtering in effect other than a start date, it
|
||||
-- shows the accurate historical running balance for this
|
||||
-- account. Otherwise it shows a running total starting at 0 like the posting register report.
|
||||
--
|
||||
-- 3. Currently this report does not handle reporting intervals.
|
||||
--
|
||||
-- 4. Report items will be most recent first.
|
||||
--
|
||||
accountRegisterReport :: [Opt] -> Journal -> Matcher -> Matcher -> AccountRegisterReport
|
||||
accountRegisterReport opts j m thisacctmatcher = (label, items)
|
||||
where
|
||||
-- transactions affecting this account, in date order
|
||||
ts = sortBy (comparing tdate) $ filter (matchesTransaction thisacctmatcher) $ jtxns j
|
||||
|
||||
-- starting balance: if we are filtering by a start date and nothing else,
|
||||
-- the sum of postings to this account before that date; otherwise zero.
|
||||
(startbal,label, sumfn) | matcherIsNull m = (nullmixedamt,balancelabel,(-))
|
||||
| matcherIsStartDateOnly effective m = (sumPostings priorps,balancelabel,(-))
|
||||
| otherwise = (nullmixedamt,totallabel,(+))
|
||||
where
|
||||
priorps = -- ltrace "priorps" $
|
||||
filter (matchesPosting
|
||||
(-- ltrace "priormatcher" $
|
||||
MatchAnd [thisacctmatcher, tostartdatematcher]))
|
||||
$ transactionsPostings ts
|
||||
tostartdatematcher = MatchDate True (DateSpan Nothing startdate)
|
||||
startdate = matcherStartDate effective m
|
||||
effective = Effective `elem` opts
|
||||
|
||||
displaymatcher = -- ltrace "displaymatcher" $
|
||||
MatchAnd [negateMatcher thisacctmatcher, m]
|
||||
|
||||
items = reverse $ accountRegisterReportItems ts displaymatcher nulltransaction startbal sumfn
|
||||
|
||||
-- | Generate account register line items from a list of transactions,
|
||||
-- using the provided matcher (postings not matching this will not affect
|
||||
-- the displayed item), starting transaction, starting balance, and
|
||||
-- balance summing function.
|
||||
accountRegisterReportItems :: [Transaction] -> Matcher -> Transaction -> MixedAmount -> (MixedAmount -> MixedAmount -> MixedAmount) -> [AccountRegisterReportItem]
|
||||
accountRegisterReportItems [] _ _ _ _ = []
|
||||
accountRegisterReportItems (t@Transaction{tpostings=ps}:ts) displaymatcher _ bal sumfn =
|
||||
case i of Just i' -> i':is
|
||||
Nothing -> is
|
||||
where
|
||||
(i,bal'') = case filter (displaymatcher `matchesPosting`) ps of
|
||||
[] -> (Nothing,bal) -- maybe a virtual transaction, or transfer to self
|
||||
[p] -> (Just (t, acct, amt, bal'), bal')
|
||||
where
|
||||
acct = paccount p
|
||||
amt = pamount p
|
||||
bal' = bal `sumfn` amt
|
||||
ps' -> (Just (t,acct,amt,bal'), bal')
|
||||
where
|
||||
acct = "SPLIT ("++intercalate ", " (map (accountLeafName . paccount) ps')++")"
|
||||
amt = sum $ map pamount ps'
|
||||
bal' = bal `sumfn` amt
|
||||
is = (accountRegisterReportItems ts displaymatcher t bal'' sumfn)
|
||||
|
||||
-- XXX confusing, refactor
|
||||
|
||||
-- | Convert a list of postings into summary postings. Summary postings
|
||||
|
||||
Loading…
Reference in New Issue
Block a user