preliminary single-account register report

This commit is contained in:
Simon Michael 2011-06-11 16:11:38 +00:00
parent d2e6b8cbae
commit 94709e5139
2 changed files with 34 additions and 9 deletions

View File

@ -119,6 +119,9 @@ virtualPostings = filter isVirtual . tpostings
balancedVirtualPostings :: Transaction -> [Posting] balancedVirtualPostings :: Transaction -> [Posting]
balancedVirtualPostings = filter isBalancedVirtual . tpostings balancedVirtualPostings = filter isBalancedVirtual . tpostings
transactionsPostings :: [Transaction] -> [Posting]
transactionsPostings = concat . map tpostings
-- | Get the sums of a transaction's real, virtual, and balanced virtual postings. -- | Get the sums of a transaction's real, virtual, and balanced virtual postings.
transactionPostingBalances :: Transaction -> (MixedAmount,MixedAmount,MixedAmount) transactionPostingBalances :: Transaction -> (MixedAmount,MixedAmount,MixedAmount)
transactionPostingBalances t = (sumPostings $ realPostings t transactionPostingBalances t = (sumPostings $ realPostings t

View File

@ -10,6 +10,7 @@ module Hledger.Cli.Register (
,RegisterReportItem ,RegisterReportItem
,register ,register
,registerReport ,registerReport
,accountRegisterReport
,registerReportAsText ,registerReportAsText
,showPostingWithBalanceForVty ,showPostingWithBalanceForVty
,tests_Hledger_Cli_Register ,tests_Hledger_Cli_Register
@ -79,8 +80,11 @@ registerReportItemAsText _ (dd, p, b) = concatTopPadded [datedesc, pstr, " ", ba
showPostingWithBalanceForVty showtxninfo p b = registerReportItemAsText [] $ mkitem showtxninfo p b showPostingWithBalanceForVty showtxninfo p b = registerReportItemAsText [] $ mkitem showtxninfo p b
-- | Get a register report with the specified options for this journal. -- | Get a register report with the specified options for this journal.
-- This is a journal register report, covering the whole journal like
-- ledger's register command; for an account-specific register see
-- accountRegisterReport.
registerReport :: [Opt] -> FilterSpec -> Journal -> RegisterReport registerReport :: [Opt] -> FilterSpec -> Journal -> RegisterReport
registerReport opts fspec j = getitems ps nullposting startbal registerReport opts fspec j = postingsToRegisterReportItems ps nullposting startbal (+)
where where
ps | interval == NoInterval = displayableps ps | interval == NoInterval = displayableps
| otherwise = summarisePostingsByInterval interval depth empty filterspan displayableps | otherwise = summarisePostingsByInterval interval depth empty filterspan displayableps
@ -95,14 +99,36 @@ registerReport opts fspec j = getitems ps nullposting startbal
filterspan = datespan fspec filterspan = datespan fspec
(interval, depth, empty) = (intervalFromOpts opts, depthFromOpts opts, Empty `elem` opts) (interval, depth, empty) = (intervalFromOpts opts, depthFromOpts opts, Empty `elem` opts)
-- | Get an account register report with the specified options for this
-- journal. An account register report is like a postings register report
-- except it is focussed on one account only, it shows the other postings
-- in the transactions for this account, and it shows the accurate
-- historic balance for this account.
-- Does not yet handle reporting intervals.
accountRegisterReport :: [Opt] -> Journal -> Matcher -> AccountName -> RegisterReport
accountRegisterReport _ j m a = postingsToRegisterReportItems ps nullposting startbal (-)
where
ps = displayps
-- ps | interval == NoInterval = displayps
-- | otherwise = summarisePostingsByInterval interval depth empty filterspan displayps
-- postings to display: this account's transactions' "other" postings, filtered
-- same matcher used on transactions then again on postings, ok I think
ts = filter (matchesTransaction (MatchInAcct True a)) $ jtxns j
displayps = filter (matchesPosting (MatchAnd [MatchAcct False a, m])) $ transactionsPostings ts
-- starting balance: sum of this account's unfiltered postings prior to the specified start date, if any
startdate = matcherStartDate m
priormatcher = MatchAnd [MatchDate True (DateSpan Nothing startdate), MatchAcct True a]
priorps = filter (matchesPosting priormatcher) $ journalPostings j
startbal = sumPostings priorps
-- | Generate register report line items. -- | Generate register report line items.
getitems :: [Posting] -> Posting -> MixedAmount -> [RegisterReportItem] postingsToRegisterReportItems :: [Posting] -> Posting -> MixedAmount -> (MixedAmount -> MixedAmount -> MixedAmount) -> [RegisterReportItem]
getitems [] _ _ = [] postingsToRegisterReportItems [] _ _ _ = []
getitems (p:ps) pprev b = i:(getitems ps p b') postingsToRegisterReportItems (p:ps) pprev b sumfn = i:(postingsToRegisterReportItems ps p b' sumfn)
where where
i = mkitem isfirst p b' i = mkitem isfirst p b'
isfirst = ptransaction p /= ptransaction pprev isfirst = ptransaction p /= ptransaction pprev
b' = b + pamount p b' = b `sumfn` pamount p
-- | Generate one register report line item, from a flag indicating -- | Generate one register report line item, from a flag indicating
-- whether to include transaction info, a posting, and the current running -- whether to include transaction info, a posting, and the current running
@ -252,7 +278,3 @@ tests_Hledger_Cli_Register = TestList
-- ] -- ]
] ]
--------------------------------------------------------------------------------
-- register mode 2: realistic account register