From a7ef0ba8dd46a68eb3c50cff477c52f74d12edc8 Mon Sep 17 00:00:00 2001 From: Simon Michael Date: Sat, 14 Apr 2012 01:12:42 +0000 Subject: [PATCH] basic understanding of balance sheet vs. profit & loss accounts --- hledger-lib/Hledger/Data/Journal.hs | 62 ++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 2 deletions(-) diff --git a/hledger-lib/Hledger/Data/Journal.hs b/hledger-lib/Hledger/Data/Journal.hs index 48ecf8f5e..ad46ac398 100644 --- a/hledger-lib/Hledger/Data/Journal.hs +++ b/hledger-lib/Hledger/Data/Journal.hs @@ -34,6 +34,9 @@ module Hledger.Data.Journal ( journalFilePath, journalFilePaths, journalPostings, + -- * Standard account types + journalBalanceSheetAccountMatcher, + journalProfitAndLossAccountMatcher, -- * Misc groupPostings, matchpats, @@ -62,7 +65,7 @@ import Hledger.Data.AccountName import Hledger.Data.Amount import Hledger.Data.Commodity (canonicaliseCommodities) import Hledger.Data.Dates (nulldatespan) -import Hledger.Data.Transaction (journalTransactionWithDate,balanceTransaction) +import Hledger.Data.Transaction (journalTransactionWithDate,balanceTransaction) -- nulltransaction, import Hledger.Data.Posting import Hledger.Data.TimeLog import Hledger.Data.Query @@ -154,6 +157,24 @@ journalAccountNames = sort . expandAccountNames . journalAccountNamesUsed journalAccountNameTree :: Journal -> Tree AccountName journalAccountNameTree = accountNameTreeFrom . journalAccountNames +-- standard account types + +balanceSheetAccountRegex, profitAndLossAccountRegex :: String +balanceSheetAccountRegex = "^(assets?|liabilit(y|ies)|equity)(:|$)" +profitAndLossAccountRegex = "^(income|expenses?|profits?|loss(es)?)(:|$)" + +-- | A matcher for Asset, Liability & Equity accounts in this journal. +-- Cf . +-- This is currently hard-coded to the case-insensitive regex @^(assets?|liabilit(y|ies)|equity)(:|$)@. +journalBalanceSheetAccountMatcher :: Journal -> Matcher +journalBalanceSheetAccountMatcher _ = MatchAcct balanceSheetAccountRegex + +-- | A matcher for Profit & Loss accounts in this journal. +-- Cf . +-- This is currently hard-coded to the case-insensitive regex @^(income|expenses?|profits?|loss(es)?)(:|$)@. +journalProfitAndLossAccountMatcher :: Journal -> Matcher +journalProfitAndLossAccountMatcher _ = MatchAcct profitAndLossAccountRegex + -- Various kinds of filtering on journals. We do it differently depending -- on the command. @@ -298,7 +319,9 @@ journalApplyAliases aliases j@Journal{jtxns=ts} = j{jtxns=map fixtransaction ts} fixtransaction t@Transaction{tpostings=ps} = t{tpostings=map fixposting ps} fixposting p@Posting{paccount=a} = p{paccount=accountNameApplyAliases aliases a} --- | Do post-parse processing on a journal, to make it ready for use. +-- | Do post-parse processing on a journal to make it ready for use: check +-- all transactions balance, canonicalise amount formats, close any open +-- timelog entries and so on. journalFinalise :: ClockTime -> LocalTime -> FilePath -> String -> JournalContext -> Journal -> Either String Journal journalFinalise tclock tlocal path txt ctx j@Journal{files=fs} = journalBalanceTransactions $ @@ -397,6 +420,8 @@ journalDateSpan j where ts = sortBy (comparing tdate) $ jtxns j +-- Misc helpers + -- | Check if a set of hledger account/description filter patterns matches the -- given account name or entry description. Patterns are case-insensitive -- regular expressions. Prefixed with not:, they become anti-patterns. @@ -466,6 +491,39 @@ postingsByAccount ps = m' -- traceAmountPrecision a = trace (show $ map (precision . commodity) $ amounts a) a -- tracePostingsCommodities ps = trace (show $ map ((map (precision . commodity) . amounts) . pamount) ps) ps +-- tests + tests_Hledger_Data_Journal = TestList [ + -- "query standard account types" ~: + -- do + -- let j = journal1 + -- journalBalanceSheetAccountNames j `is` ["assets","assets:a","equity","equity:q","equity:q:qq","liabilities","liabilities:l"] + -- journalProfitAndLossAccountNames j `is` ["expenses","expenses:e","income","income:i"] + ] +-- journal1 = +-- Journal +-- [] +-- [] +-- [ +-- nulltransaction{ +-- tpostings=[ +-- nullposting{paccount="liabilities:l"} +-- ,nullposting{paccount="expenses:e"} +-- ] +-- } +-- ,nulltransaction{ +-- tpostings=[ +-- nullposting{paccount="income:i"} +-- ,nullposting{paccount="assets:a"} +-- ,nullposting{paccount="equity:q:qq"} +-- ] +-- } +-- ] +-- [] +-- [] +-- "" +-- nullctx +-- [] +-- (TOD 0 0)