From 33a1c6533bbac237da77e86b81c385771f9978f0 Mon Sep 17 00:00:00 2001 From: Simon Michael Date: Fri, 24 Jun 2011 02:44:31 +0000 Subject: [PATCH] refactor: clarify the two register types, "posting register" and "account register" See the docstrings for details. Possibly temporary names, but at least make the naming consistent and distinct. --- hledger-vty/Hledger/Vty/Main.hs | 2 +- ...rt.hamlet => accountregisterreport.hamlet} | 2 +- ...amlet => accountregisterreportitem.hamlet} | 0 ...t2.hamlet => postingregisterreport.hamlet} | 2 +- ...amlet => postingregisterreportitem.hamlet} | 0 hledger-web/Handlers.hs | 77 +++++------ hledger/Hledger/Cli.hs | 26 ++-- hledger/Hledger/Cli/Add.hs | 4 +- hledger/Hledger/Cli/Register.hs | 126 +++++++++--------- 9 files changed, 119 insertions(+), 120 deletions(-) rename hledger-web/.hledger/web/templates/{registerreport.hamlet => accountregisterreport.hamlet} (81%) rename hledger-web/.hledger/web/templates/{registerreport2item.hamlet => accountregisterreportitem.hamlet} (100%) rename hledger-web/.hledger/web/templates/{registerreport2.hamlet => postingregisterreport.hamlet} (81%) rename hledger-web/.hledger/web/templates/{registerreportitem.hamlet => postingregisterreportitem.hamlet} (100%) diff --git a/hledger-vty/Hledger/Vty/Main.hs b/hledger-vty/Hledger/Vty/Main.hs index ba53f40b6..a42a61851 100644 --- a/hledger-vty/Hledger/Vty/Main.hs +++ b/hledger-vty/Hledger/Vty/Main.hs @@ -270,7 +270,7 @@ updateData :: Day -> AppState -> AppState updateData d a@AppState{aopts=opts,ajournal=j} = case screen a of BalanceScreen -> a{abuf=balanceReportAsText opts $ balanceReport opts fspec j} - RegisterScreen -> a{abuf=lines $ registerReportAsText opts $ registerReport opts fspec j} + RegisterScreen -> a{abuf=lines $ postingRegisterReportAsText opts $ postingRegisterReport opts fspec j} PrintScreen -> a{abuf=lines $ showTransactions opts fspec j} where fspec = optsToFilterSpec opts (currentArgs a) d diff --git a/hledger-web/.hledger/web/templates/registerreport.hamlet b/hledger-web/.hledger/web/templates/accountregisterreport.hamlet similarity index 81% rename from hledger-web/.hledger/web/templates/registerreport.hamlet rename to hledger-web/.hledger/web/templates/accountregisterreport.hamlet index ef5123414..cae990efb 100644 --- a/hledger-web/.hledger/web/templates/registerreport.hamlet +++ b/hledger-web/.hledger/web/templates/accountregisterreport.hamlet @@ -6,5 +6,5 @@ Amount #{balancelabel} - $forall i <- numberTransactions items + $forall i <- numberAccountRegisterReportItems items ^{itemAsHtml vd i} diff --git a/hledger-web/.hledger/web/templates/registerreport2item.hamlet b/hledger-web/.hledger/web/templates/accountregisterreportitem.hamlet similarity index 100% rename from hledger-web/.hledger/web/templates/registerreport2item.hamlet rename to hledger-web/.hledger/web/templates/accountregisterreportitem.hamlet diff --git a/hledger-web/.hledger/web/templates/registerreport2.hamlet b/hledger-web/.hledger/web/templates/postingregisterreport.hamlet similarity index 81% rename from hledger-web/.hledger/web/templates/registerreport2.hamlet rename to hledger-web/.hledger/web/templates/postingregisterreport.hamlet index 98b023072..0941a1d12 100644 --- a/hledger-web/.hledger/web/templates/registerreport2.hamlet +++ b/hledger-web/.hledger/web/templates/postingregisterreport.hamlet @@ -6,5 +6,5 @@ Amount #{balancelabel} - $forall i <- numberRegisterReport2Items items + $forall i <- numberPostingRegisterReportItems items ^{itemAsHtml vd i} diff --git a/hledger-web/.hledger/web/templates/registerreportitem.hamlet b/hledger-web/.hledger/web/templates/postingregisterreportitem.hamlet similarity index 100% rename from hledger-web/.hledger/web/templates/registerreportitem.hamlet rename to hledger-web/.hledger/web/templates/postingregisterreportitem.hamlet diff --git a/hledger-web/Handlers.hs b/hledger-web/Handlers.hs index b6dc347b4..570d08753 100644 --- a/hledger-web/Handlers.hs +++ b/hledger-web/Handlers.hs @@ -64,8 +64,8 @@ getRegisterR = do vd@VD{opts=opts,qopts=qopts,m=m,j=j} <- getViewData let sidecontent = balanceReportAsHtml opts vd{q=""} $ balanceReport opts nullfilterspec j maincontent = - case inAccountMatcher qopts of Just m' -> registerReport2AsHtml opts vd $ accountRegisterReport opts j m m' - Nothing -> registerReportAsHtml opts vd $ registerReport opts nullfilterspec $ filterJournalPostings2 m j + case inAccountMatcher qopts of Just m' -> accountRegisterReportAsHtml opts vd $ accountRegisterReport opts j m m' + Nothing -> postingRegisterReportAsHtml opts vd $ postingRegisterReport opts nullfilterspec $ filterJournalPostings2 m j editform' = editform vd defaultLayout $ do setTitle "hledger-web register" @@ -92,18 +92,12 @@ getRegisterOnlyR = do defaultLayout $ do setTitle "hledger-web register only" addHamlet $ - case inAccountMatcher qopts of Just m' -> registerReport2AsHtml opts vd $ accountRegisterReport opts j m m' - Nothing -> registerReportAsHtml opts vd $ registerReport opts nullfilterspec $ filterJournalPostings2 m j + case inAccountMatcher qopts of Just m' -> accountRegisterReportAsHtml opts vd $ accountRegisterReport opts j m m' + Nothing -> postingRegisterReportAsHtml opts vd $ postingRegisterReport opts nullfilterspec $ filterJournalPostings2 m j postRegisterOnlyR :: Handler RepPlain postRegisterOnlyR = handlePost --- -- temporary helper - use the new account register report when in:ACCT is specified. --- accountOrJournalRegisterReport :: ViewData -> Journal -> RegisterReport --- accountOrJournalRegisterReport VD{opts=opts,m=m,qopts=qopts} j = --- case inAccountMatcher qopts of Just m' -> accountRegisterReport opts j m m' --- Nothing -> registerReport opts nullfilterspec $ filterJournalPostings2 m j - -- | A simple accounts view, like hledger balance. If the Accept header -- specifies json, returns the chart of accounts as json. getAccountsR :: Handler RepHtmlJson @@ -155,11 +149,12 @@ journalReportAsHtml _ vd items = $(Settings.hamletFile "journalreport") txn = trimnl $ showTransaction t where trimnl = reverse . dropWhile (=='\n') . reverse -- | Render a register report as HTML. -registerReportAsHtml :: [Opt] -> ViewData -> RegisterReport -> Hamlet AppRoute -registerReportAsHtml _ vd (balancelabel,items) = $(Settings.hamletFile "registerreport") +-- Journal-wide postings register, when no account has focus. +postingRegisterReportAsHtml :: [Opt] -> ViewData -> PostingRegisterReport -> Hamlet AppRoute +postingRegisterReportAsHtml _ vd (balancelabel,items) = $(Settings.hamletFile "postingregisterreport") where - itemAsHtml :: ViewData -> (Int, Bool, Bool, Bool, RegisterReportItem) -> Hamlet AppRoute - itemAsHtml VD{here=here} (n, newd, newm, newy, (ds, posting, b)) = $(Settings.hamletFile "registerreportitem") + itemAsHtml :: ViewData -> (Int, Bool, Bool, Bool, PostingRegisterReportItem) -> Hamlet AppRoute + itemAsHtml VD{here=here} (n, newd, newm, newy, (ds, posting, b)) = $(Settings.hamletFile "postingregisterreportitem") where evenodd = if even n then "even" else "odd" :: String datetransition -- | newy && n > 1 = "newyear" @@ -171,12 +166,30 @@ registerReportAsHtml _ vd (balancelabel,items) = $(Settings.hamletFile "register acct = paccount posting accturl = (here, [("q", pack $ accountUrl acct)]) --- mark II -registerReport2AsHtml :: [Opt] -> ViewData -> RegisterReport2 -> Hamlet AppRoute -registerReport2AsHtml _ vd (balancelabel,items) = $(Settings.hamletFile "registerreport2") +-- Add incrementing transaction numbers to a list of register report items +-- starting at 1. Also add three flags that are true if the date, month, +-- and year is different from the previous item's. +numberPostingRegisterReportItems :: [PostingRegisterReportItem] -> [(Int,Bool,Bool,Bool,PostingRegisterReportItem)] +numberPostingRegisterReportItems [] = [] +numberPostingRegisterReportItems is = number 0 nulldate is + where + number :: Int -> Day -> [PostingRegisterReportItem] -> [(Int,Bool,Bool,Bool,PostingRegisterReportItem)] + number _ _ [] = [] + number n prevd (i@(Nothing, _, _) :is) = (n,False,False,False,i) :(number n prevd is) + number n prevd (i@(Just (d,_), _, _):is) = (n+1,newday,newmonth,newyear,i):(number (n+1) d is) + where + newday = d/=prevd + newmonth = dm/=prevdm || dy/=prevdy + newyear = dy/=prevdy + (dy,dm,_) = toGregorian d + (prevdy,prevdm,_) = toGregorian prevd + +-- Account-specific transaction register, when an account is focussed. +accountRegisterReportAsHtml :: [Opt] -> ViewData -> AccountRegisterReport -> Hamlet AppRoute +accountRegisterReportAsHtml _ vd (balancelabel,items) = $(Settings.hamletFile "accountregisterreport") where - itemAsHtml :: ViewData -> (Int, Bool, Bool, Bool, RegisterReport2Item) -> Hamlet AppRoute - itemAsHtml VD{here=here} (n, newd, newm, newy, (t, acct, amt, bal)) = $(Settings.hamletFile "registerreport2item") + itemAsHtml :: ViewData -> (Int, Bool, Bool, Bool, AccountRegisterReportItem) -> Hamlet AppRoute + itemAsHtml VD{here=here} (n, newd, newm, newy, (t, acct, amt, bal)) = $(Settings.hamletFile "accountregisterreportitem") where evenodd = if even n then "even" else "odd" :: String datetransition | newm = "newmonth" @@ -185,11 +198,11 @@ registerReport2AsHtml _ vd (balancelabel,items) = $(Settings.hamletFile "registe (firstposting, date, desc) = (False, show $ tdate t, tdescription t) accturl = (here, [("q", pack $ accountUrl acct)]) -numberRegisterReport2Items :: [RegisterReport2Item] -> [(Int,Bool,Bool,Bool,RegisterReport2Item)] -numberRegisterReport2Items [] = [] -numberRegisterReport2Items is = number 0 nulldate is +numberAccountRegisterReportItems :: [AccountRegisterReportItem] -> [(Int,Bool,Bool,Bool,AccountRegisterReportItem)] +numberAccountRegisterReportItems [] = [] +numberAccountRegisterReportItems is = number 0 nulldate is where - number :: Int -> Day -> [RegisterReport2Item] -> [(Int,Bool,Bool,Bool,RegisterReport2Item)] + number :: Int -> Day -> [AccountRegisterReportItem] -> [(Int,Bool,Bool,Bool,AccountRegisterReportItem)] number _ _ [] = [] number n prevd (i@(Transaction{tdate=d},_,_,_):is) = (n+1,newday,newmonth,newyear,i):(number (n+1) d is) where @@ -483,21 +496,3 @@ getMessageOr mnewmsg = do numbered = zip [1..] --- Add incrementing transaction numbers to a list of register report items --- starting at 1. Also add three flags that are true if the date, month, --- and year is different from the previous item's. -numberTransactions :: [RegisterReportItem] -> [(Int,Bool,Bool,Bool,RegisterReportItem)] -numberTransactions [] = [] -numberTransactions is = number 0 nulldate is - where - number :: Int -> Day -> [RegisterReportItem] -> [(Int,Bool,Bool,Bool,RegisterReportItem)] - number _ _ [] = [] - number n prevd (i@(Nothing, _, _) :is) = (n,False,False,False,i) :(number n prevd is) - number n prevd (i@(Just (d,_), _, _):is) = (n+1,newday,newmonth,newyear,i):(number (n+1) d is) - where - newday = d/=prevd - newmonth = dm/=prevdm || dy/=prevdy - newyear = dy/=prevdy - (dy,dm,_) = toGregorian d - (prevdy,prevdm,_) = toGregorian prevd - diff --git a/hledger/Hledger/Cli.hs b/hledger/Hledger/Cli.hs index ece77d9aa..7c1299035 100644 --- a/hledger/Hledger/Cli.hs +++ b/hledger/Hledger/Cli.hs @@ -338,7 +338,7 @@ tests_Hledger_Cli = TestList "register report with no args" ~: do j <- samplejournal - (registerReportAsText [] $ registerReport [] (optsToFilterSpec [] [] date1) j) `is` unlines + (postingRegisterReportAsText [] $ postingRegisterReport [] (optsToFilterSpec [] [] date1) j) `is` unlines ["2008/01/01 income assets:bank:checking $1 $1" ," income:salary $-1 0" ,"2008/06/01 gift assets:bank:checking $1 $1" @@ -356,7 +356,7 @@ tests_Hledger_Cli = TestList do let opts = [Cleared] j <- readJournal' sample_journal_str - (registerReportAsText opts $ registerReport opts (optsToFilterSpec opts [] date1) j) `is` unlines + (postingRegisterReportAsText opts $ postingRegisterReport opts (optsToFilterSpec opts [] date1) j) `is` unlines ["2008/06/03 eat & shop expenses:food $1 $1" ," expenses:supplies $1 $2" ," assets:cash $-2 0" @@ -368,7 +368,7 @@ tests_Hledger_Cli = TestList do let opts = [UnCleared] j <- readJournal' sample_journal_str - (registerReportAsText opts $ registerReport opts (optsToFilterSpec opts [] date1) j) `is` unlines + (postingRegisterReportAsText opts $ postingRegisterReport opts (optsToFilterSpec opts [] date1) j) `is` unlines ["2008/01/01 income assets:bank:checking $1 $1" ," income:salary $-1 0" ,"2008/06/01 gift assets:bank:checking $1 $1" @@ -388,19 +388,19 @@ tests_Hledger_Cli = TestList ," e 1" ," f" ] - registerdates (registerReportAsText [] $ registerReport [] (optsToFilterSpec [] [] date1) j) `is` ["2008/01/01","2008/02/02"] + registerdates (postingRegisterReportAsText [] $ postingRegisterReport [] (optsToFilterSpec [] [] date1) j) `is` ["2008/01/01","2008/02/02"] ,"register report with account pattern" ~: do j <- samplejournal - (registerReportAsText [] $ registerReport [] (optsToFilterSpec [] ["cash"] date1) j) `is` unlines + (postingRegisterReportAsText [] $ postingRegisterReport [] (optsToFilterSpec [] ["cash"] date1) j) `is` unlines ["2008/06/03 eat & shop assets:cash $-2 $-2" ] ,"register report with account pattern, case insensitive" ~: do j <- samplejournal - (registerReportAsText [] $ registerReport [] (optsToFilterSpec [] ["cAsH"] date1) j) `is` unlines + (postingRegisterReportAsText [] $ postingRegisterReport [] (optsToFilterSpec [] ["cAsH"] date1) j) `is` unlines ["2008/06/03 eat & shop assets:cash $-2 $-2" ] @@ -408,7 +408,7 @@ tests_Hledger_Cli = TestList do j <- samplejournal let gives displayexpr = - (registerdates (registerReportAsText opts $ registerReport opts (optsToFilterSpec opts [] date1) j) `is`) + (registerdates (postingRegisterReportAsText opts $ postingRegisterReport opts (optsToFilterSpec opts [] date1) j) `is`) where opts = [Display displayexpr] "d<[2008/6/2]" `gives` ["2008/01/01","2008/06/01"] "d<=[2008/6/2]" `gives` ["2008/01/01","2008/06/01","2008/06/02"] @@ -421,7 +421,7 @@ tests_Hledger_Cli = TestList j <- samplejournal let periodexpr `gives` dates = do j' <- samplejournal - registerdates (registerReportAsText opts $ registerReport opts (optsToFilterSpec opts [] date1) j') `is` dates + registerdates (postingRegisterReportAsText opts $ postingRegisterReport opts (optsToFilterSpec opts [] date1) j') `is` dates where opts = [Period periodexpr] "" `gives` ["2008/01/01","2008/06/01","2008/06/02","2008/06/03","2008/12/31"] "2008" `gives` ["2008/01/01","2008/06/01","2008/06/02","2008/06/03","2008/12/31"] @@ -430,7 +430,7 @@ tests_Hledger_Cli = TestList "monthly" `gives` ["2008/01/01","2008/06/01","2008/12/01"] "quarterly" `gives` ["2008/01/01","2008/04/01","2008/10/01"] let opts = [Period "yearly"] - (registerReportAsText opts $ registerReport opts (optsToFilterSpec opts [] date1) j) `is` unlines + (postingRegisterReportAsText opts $ postingRegisterReport opts (optsToFilterSpec opts [] date1) j) `is` unlines ["2008/01/01 - 2008/12/31 assets:bank:saving $1 $1" ," assets:cash $-2 $-1" ," expenses:food $1 0" @@ -440,9 +440,9 @@ tests_Hledger_Cli = TestList ," liabilities:debts $1 0" ] let opts = [Period "quarterly"] - registerdates (registerReportAsText opts $ registerReport opts (optsToFilterSpec opts [] date1) j) `is` ["2008/01/01","2008/04/01","2008/10/01"] + registerdates (postingRegisterReportAsText opts $ postingRegisterReport opts (optsToFilterSpec opts [] date1) j) `is` ["2008/01/01","2008/04/01","2008/10/01"] let opts = [Period "quarterly",Empty] - registerdates (registerReportAsText opts $ registerReport opts (optsToFilterSpec opts [] date1) j) `is` ["2008/01/01","2008/04/01","2008/07/01","2008/10/01"] + registerdates (postingRegisterReportAsText opts $ postingRegisterReport opts (optsToFilterSpec opts [] date1) j) `is` ["2008/01/01","2008/04/01","2008/07/01","2008/10/01"] ] @@ -450,7 +450,7 @@ tests_Hledger_Cli = TestList do j <- samplejournal let opts = [Depth "2"] - (registerReportAsText opts $ registerReport opts (optsToFilterSpec opts [] date1) j) `is` unlines + (postingRegisterReportAsText opts $ postingRegisterReport opts (optsToFilterSpec opts [] date1) j) `is` unlines ["2008/01/01 income assets:bank $1 $1" ," income:salary $-1 0" ,"2008/06/01 gift assets:bank $1 $1" @@ -481,7 +481,7 @@ tests_Hledger_Cli = TestList ,"unicode in register layout" ~: do j <- readJournal' "2009/01/01 * медвежья шкура\n расходы:покупки 100\n актив:наличные\n" - (registerReportAsText [] $ registerReport [] (optsToFilterSpec [] [] date1) j) `is` unlines + (postingRegisterReportAsText [] $ postingRegisterReport [] (optsToFilterSpec [] [] date1) j) `is` unlines ["2009/01/01 медвежья шкура расходы:покупки 100 100" ," актив:наличные -100 0"] diff --git a/hledger/Hledger/Cli/Add.hs b/hledger/Hledger/Cli/Add.hs index c54cca52b..bb53a6028 100644 --- a/hledger/Hledger/Cli/Add.hs +++ b/hledger/Hledger/Cli/Add.hs @@ -29,7 +29,7 @@ import qualified Data.Foldable as Foldable (find) import qualified Data.Set as Set import Hledger.Cli.Options -import Hledger.Cli.Register (registerReport, registerReportAsText) +import Hledger.Cli.Register (postingRegisterReport, postingRegisterReportAsText) import Hledger.Cli.Utils import Hledger.Data import Hledger.Read.JournalReader (someamount) @@ -220,7 +220,7 @@ registerFromString :: String -> IO String registerFromString s = do d <- getCurrentDay j <- readJournal' s - return $ registerReportAsText opts $ registerReport opts (optsToFilterSpec opts [] d) j + return $ postingRegisterReportAsText opts $ postingRegisterReport opts (optsToFilterSpec opts [] d) j where opts = [Empty] -- | Return a similarity measure, from 0 to 1, for two strings. diff --git a/hledger/Hledger/Cli/Register.hs b/hledger/Hledger/Cli/Register.hs index e81f6756a..6f8b9b26b 100644 --- a/hledger/Hledger/Cli/Register.hs +++ b/hledger/Hledger/Cli/Register.hs @@ -6,14 +6,14 @@ A ledger-compatible @register@ command. -} module Hledger.Cli.Register ( - RegisterReport - ,RegisterReportItem - ,RegisterReport2 - ,RegisterReport2Item + PostingRegisterReport + ,PostingRegisterReportItem + ,AccountRegisterReport + ,AccountRegisterReportItem ,register - ,registerReport + ,postingRegisterReport ,accountRegisterReport - ,registerReportAsText + ,postingRegisterReportAsText ,showPostingWithBalanceForVty ,tests_Hledger_Cli_Register ) where @@ -36,40 +36,42 @@ import Prelude hiding (putStr) import Hledger.Utils.UTF8 (putStr) --- | A register report is a list of postings to an account or set of --- accounts, with a running total. Postings may be actual postings, or --- virtual postings aggregated over a reporting interval. --- And also some heading info. -type RegisterReport = (String -- a possibly null label for the running balance column - ,[RegisterReportItem] -- line items, one per posting - ) +-- | A posting register report lists postings to one or more accounts, +-- with a running total. Postings may be actual postings, or aggregate +-- postings corresponding to a reporting interval. +type PostingRegisterReport = (String -- label for the running balance column XXX remove + ,[PostingRegisterReportItem] -- line items, one per posting + ) --- | The data for a single register report line item, representing one posting. -type RegisterReportItem = (Maybe (Day, String) -- transaction date and description if this is the first posting - ,Posting -- the posting - ,MixedAmount -- balance so far - ) +-- | A single posting register line item, representing one posting. +type PostingRegisterReportItem = (Maybe (Day, String) -- transaction date and description if this is the first posting + ,Posting -- the posting + ,MixedAmount -- the running total after this posting + ) --- | Register report mark II, used in hledger-web's account register (see "accountRegisterReport". -type RegisterReport2 = (String -- a possibly null label for the running balance column - ,[RegisterReport2Item] -- line items, one per transaction - ) --- | A single register report 2 line item, representing one transaction to/from the focussed account. -type RegisterReport2Item = (Transaction -- the corresponding transaction - ,String -- the (possibly aggregated) account info to display - ,MixedAmount -- the (possibly aggregated) amount to display (sum of the other-account postings) - ,MixedAmount -- the running balance for the focussed account after this transaction - ) +-- | An account register report lists transactions to a single account (or +-- possibly subs as well), with the accurate running account balance when +-- possible (otherwise, a running total.) +type AccountRegisterReport = (String -- label for the balance column, eg "balance" or "total" + ,[AccountRegisterReportItem] -- line items, one per transaction + ) --- | Print a register report. +-- | A single account register line item, representing one transaction to/from the focussed account. +type AccountRegisterReportItem = (Transaction -- the corresponding transaction + ,String -- the (possibly aggregated) account info to display + ,MixedAmount -- the (possibly aggregated) amount to display (sum of the other-account postings) + ,MixedAmount -- the running balance for the focussed account after this transaction + ) + +-- | Print a (posting) register report. register :: [Opt] -> [String] -> Journal -> IO () register opts args j = do d <- getCurrentDay - putStr $ registerReportAsText opts $ registerReport opts (optsToFilterSpec opts args d) j + putStr $ postingRegisterReportAsText opts $ postingRegisterReport opts (optsToFilterSpec opts args d) j -- | Render a register report as plain text suitable for console output. -registerReportAsText :: [Opt] -> RegisterReport -> String -registerReportAsText opts = unlines . map (registerReportItemAsText opts) . snd +postingRegisterReportAsText :: [Opt] -> PostingRegisterReport -> String +postingRegisterReportAsText opts = unlines . map (postingRegisterReportItemAsText opts) . snd -- | Render one register report line item as plain text. Eg: -- @ @@ -78,8 +80,8 @@ registerReportAsText opts = unlines . map (registerReportItemAsText opts) . snd -- ^ displayed for first postings^ -- only, otherwise blank -- @ -registerReportItemAsText :: [Opt] -> RegisterReportItem -> String -registerReportItemAsText _ (dd, p, b) = concatTopPadded [datedesc, pstr, " ", bal] +postingRegisterReportItemAsText :: [Opt] -> PostingRegisterReportItem -> String +postingRegisterReportItemAsText _ (dd, p, b) = concatTopPadded [datedesc, pstr, " ", bal] where datedesc = case dd of Nothing -> replicate datedescwidth ' ' Just (da, de) -> printf "%s %s " date desc @@ -93,27 +95,31 @@ registerReportItemAsText _ (dd, p, b) = concatTopPadded [datedesc, pstr, " ", ba pstr = showPostingForRegister p bal = padleft 12 (showMixedAmountOrZeroWithoutPrice b) -showPostingWithBalanceForVty showtxninfo p b = registerReportItemAsText [] $ mkitem showtxninfo p b +showPostingWithBalanceForVty showtxninfo p b = postingRegisterReportItemAsText [] $ mkitem showtxninfo p b totallabel = "Total" balancelabel = "Balance" --- | Get an account register report with the specified options for this --- journal. An account register report is like the traditional account --- register seen in bank statements and personal finance programs. It is --- focussed on one account only; it shows this account's transactions' --- postings to other accounts; and if there is no transaction filtering in --- effect other than a start date, it shows a historically-accurate --- running balance for this account. Once additional filters are applied, --- the running balance reverts to a running total starting at 0. --- Does not handle reporting intervals. --- Items are returned most recent first. -accountRegisterReport :: [Opt] -> Journal -> Matcher -> Matcher -> RegisterReport2 +-- | 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 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 - -- interval == NoInterval = items - -- otherwise = summarisePostingsByInterval interval depth empty filterspan displayps - -- transactions affecting this account, in date order ts = sortBy (comparing tdate) $ filter (matchesTransaction thisacctmatcher) $ jtxns j @@ -141,7 +147,7 @@ accountRegisterReport opts j m thisacctmatcher = (label, items) -- 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) -> [RegisterReport2Item] +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 @@ -161,12 +167,10 @@ accountRegisterReportItems (t@Transaction{tpostings=ps}:ts) displaymatcher _ bal bal' = bal `sumfn` amt is = (accountRegisterReportItems ts displaymatcher t bal'' sumfn) --- | Get a traditional 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 opts fspec j = (totallabel,postingsToRegisterReportItems ps nullposting startbal (+)) +-- | Get a ledger-style posting register report, with the specified options, +-- for the whole journal. See also "accountRegisterReport". +postingRegisterReport :: [Opt] -> FilterSpec -> Journal -> PostingRegisterReport +postingRegisterReport opts fspec j = (totallabel,postingRegisterItems ps nullposting startbal (+)) where ps | interval == NoInterval = displayableps | otherwise = summarisePostingsByInterval interval depth empty filterspan displayableps @@ -181,10 +185,10 @@ registerReport opts fspec j = (totallabel,postingsToRegisterReportItems ps nullp filterspan = datespan fspec (interval, depth, empty) = (intervalFromOpts opts, depthFromOpts opts, Empty `elem` opts) --- | Generate register report line items. -postingsToRegisterReportItems :: [Posting] -> Posting -> MixedAmount -> (MixedAmount -> MixedAmount -> MixedAmount) -> [RegisterReportItem] -postingsToRegisterReportItems [] _ _ _ = [] -postingsToRegisterReportItems (p:ps) pprev b sumfn = i:(postingsToRegisterReportItems ps p b' sumfn) +-- | Generate posting register report line items. +postingRegisterItems :: [Posting] -> Posting -> MixedAmount -> (MixedAmount -> MixedAmount -> MixedAmount) -> [PostingRegisterReportItem] +postingRegisterItems [] _ _ _ = [] +postingRegisterItems (p:ps) pprev b sumfn = i:(postingRegisterItems ps p b' sumfn) where i = mkitem isfirst p b' isfirst = ptransaction p /= ptransaction pprev @@ -193,7 +197,7 @@ postingsToRegisterReportItems (p:ps) pprev b sumfn = i:(postingsToRegisterReport -- | Generate one register report line item, from a flag indicating -- whether to include transaction info, a posting, and the current running -- balance. -mkitem :: Bool -> Posting -> MixedAmount -> RegisterReportItem +mkitem :: Bool -> Posting -> MixedAmount -> PostingRegisterReportItem mkitem False p b = (Nothing, p, b) mkitem True p b = (ds, p, b) where ds = case ptransaction p of Just (Transaction{tdate=da,tdescription=de}) -> Just (da,de)