mirror of
https://github.com/simonmichael/hledger.git
synced 2024-09-19 10:17:35 +03:00
54 lines
1.9 KiB
Haskell
54 lines
1.9 KiB
Haskell
{-|
|
|
|
|
A ledger-compatible @register@ command.
|
|
|
|
-}
|
|
|
|
module RegisterCommand
|
|
where
|
|
import Ledger
|
|
import Options
|
|
|
|
|
|
-- | Print a register report.
|
|
register :: [Opt] -> [String] -> Ledger -> IO ()
|
|
register opts args l = putStr $ showRegisterReport opts args l
|
|
|
|
{- |
|
|
Generate the register report. Each ledger entry is displayed as two or
|
|
more lines like this:
|
|
|
|
@
|
|
date (10) description (20) account (22) amount (11) balance (12)
|
|
DDDDDDDDDD dddddddddddddddddddd aaaaaaaaaaaaaaaaaaaaaa AAAAAAAAAAA AAAAAAAAAAAA
|
|
aaaaaaaaaaaaaaaaaaaaaa AAAAAAAAAAA AAAAAAAAAAAA
|
|
... ... ...
|
|
@
|
|
-}
|
|
showRegisterReport :: [Opt] -> [String] -> Ledger -> String
|
|
showRegisterReport opts args l = showtxns ts nulltxn nullamt
|
|
where
|
|
ts = filter matchtxn $ ledgerTransactions l
|
|
matchtxn Transaction{account=a} = matchpats apats a
|
|
apats = fst $ parseAccountDescriptionArgs args
|
|
|
|
-- show transactions, one per line, with a running balance
|
|
showtxns [] _ _ = ""
|
|
showtxns (t@Transaction{amount=a}:ts) tprev bal =
|
|
(if isZeroMixedAmount a then "" else this) ++ showtxns ts t bal'
|
|
where
|
|
this = showtxn (t `issame` tprev) t bal'
|
|
issame t1 t2 = entryno t1 == entryno t2
|
|
bal' = bal + amount t
|
|
|
|
-- show one transaction line, with or without the entry details
|
|
showtxn :: Bool -> Transaction -> MixedAmount -> String
|
|
showtxn omitdesc t b = entrydesc ++ txn ++ bal ++ "\n"
|
|
where
|
|
entrydesc = if omitdesc then replicate 32 ' ' else printf "%s %s " date desc
|
|
date = showDate $ da
|
|
desc = printf "%-20s" $ elideRight 20 de :: String
|
|
txn = showRawTransaction $ RawTransaction a amt "" tt
|
|
bal = printf " %12s" (showMixedAmountOrZero b)
|
|
Transaction{date=da,description=de,account=a,amount=amt,ttype=tt} = t
|