From 57603db7b9efb6f08dd071e286a4a25937c799f7 Mon Sep 17 00:00:00 2001 From: Simon Michael Date: Thu, 16 Oct 2008 09:04:44 +0000 Subject: [PATCH] support -C/--cleared flag to filter by entry status (not transaction status) --- Ledger/RawLedger.hs | 13 ++++++++++--- Options.hs | 2 ++ Utils.hs | 4 ++-- hledger.hs | 3 ++- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/Ledger/RawLedger.hs b/Ledger/RawLedger.hs index 2f7a3652b..afbda3035 100644 --- a/Ledger/RawLedger.hs +++ b/Ledger/RawLedger.hs @@ -43,9 +43,10 @@ rawLedgerAccountNameTree l = accountNameTreeFrom $ rawLedgerAccountNames l -- | Remove ledger entries we are not interested in. -- Keep only those which fall between the begin and end dates, and match --- the description pattern. -filterRawLedger :: String -> String -> [String] -> RawLedger -> RawLedger -filterRawLedger begin end pats = +-- the description pattern, and match the cleared flag. +filterRawLedger :: String -> String -> [String] -> Bool -> RawLedger -> RawLedger +filterRawLedger begin end pats clearedonly = + filterRawLedgerEntriesByClearedStatus clearedonly . filterRawLedgerEntriesByDate begin end . filterRawLedgerEntriesByDescription pats @@ -67,6 +68,12 @@ filterRawLedgerEntriesByDate begin end (RawLedger ms ps es f) = matchdate e = (null begin || d >= d1) && (null end || d < d2) where d = parsedate $ edate e +-- | Keep only entries with cleared status, if the flag is true, otherwise +-- do no filtering. +filterRawLedgerEntriesByClearedStatus :: Bool -> RawLedger -> RawLedger +filterRawLedgerEntriesByClearedStatus False l = l +filterRawLedgerEntriesByClearedStatus True (RawLedger ms ps es f) = + RawLedger ms ps (filter estatus es) f -- | Check if a set of ledger account/description patterns matches the -- given account name or entry description, applying ledger's special diff --git a/Options.hs b/Options.hs index 761788f90..5e14b00b8 100644 --- a/Options.hs +++ b/Options.hs @@ -25,6 +25,7 @@ options = [ Option ['f'] ["file"] (ReqArg File "FILE") "ledger file; - means use standard input", Option ['b'] ["begin"] (ReqArg Begin "YYYY/MM/DD") "report on entries on or after this date", Option ['e'] ["end"] (ReqArg End "YYYY/MM/DD") "report on entries prior to this date", + Option ['C'] ["cleared"] (NoArg Cleared) "report only on cleared transactions", Option ['s'] ["showsubs"] (NoArg ShowSubs) "in the balance report, include subaccounts", Option ['h'] ["help","usage"] (NoArg Help) "show this help", Option ['V'] ["version"] (NoArg Version) "show version" @@ -35,6 +36,7 @@ data Opt = File String | Begin String | End String | + Cleared | ShowSubs | Help | Version diff --git a/Utils.hs b/Utils.hs index 15264ab9d..d5c4f82cc 100644 --- a/Utils.hs +++ b/Utils.hs @@ -21,7 +21,7 @@ rawledgerfromfile f = do ledgerfromfile :: FilePath -> IO Ledger ledgerfromfile f = do l <- rawledgerfromfile f - return $ cacheLedger $ filterRawLedger "" "" [] l + return $ cacheLedger $ filterRawLedger "" "" [] False l -- | get a RawLedger from the file your LEDGER environment variable -- variable points to or (WARNING) an empty one if there was a problem. @@ -35,7 +35,7 @@ myrawledger = do myledger :: IO Ledger myledger = do l <- myrawledger - return $ cacheLedger $ filterRawLedger "" "" [] l + return $ cacheLedger $ filterRawLedger "" "" [] False l -- | get a named account from your ledger file myaccount :: AccountName -> IO Account diff --git a/hledger.hs b/hledger.hs index f253c305d..13bc2f77b 100644 --- a/hledger.hs +++ b/hledger.hs @@ -70,8 +70,9 @@ parseLedgerAndDo :: [Opt] -> [String] -> ([Opt] -> [String] -> Ledger -> IO ()) parseLedgerAndDo opts args cmd = ledgerFilePathFromOpts opts >>= parseLedgerFile >>= either printParseError runthecommand where - runthecommand = cmd opts args . cacheLedger . normaliseRawLedgerAmounts . filterRawLedger begin end descpats + runthecommand = cmd opts args . cacheLedger . normaliseRawLedgerAmounts . filterRawLedger begin end descpats cleared begin = beginDateFromOpts opts end = endDateFromOpts opts + cleared = Cleared `elem` opts descpats = snd $ parseAccountDescriptionArgs args