sample Ledger for testing, get account list from a ledger

This commit is contained in:
Simon Michael 2007-02-10 05:09:42 +00:00
parent cf953b442d
commit e5cf68bf0f
4 changed files with 118 additions and 23 deletions

12
TODO
View File

@ -1,22 +1,20 @@
testing testing
more, easy tests
get quickcheck working get quickcheck working
consider hunit dsl consider hunit dsl
ledger regression/compatibility tests ledger regression/compatibility tests
features features
auto transaction amounts
parse , thousand separator
register
show running total
balance balance
show balances, summarized or in depth show final balance
show per-account balances
print print
more directives, especially include
matching by account/description regexp matching by account/description regexp
more directives, eg include
read timelog files
-p period expressions -p period expressions
-d display expressions -d display expressions
-j and -J graph data output -j and -J graph data output
graph automation
auto entry generation auto entry generation
read gnucash files read gnucash files

View File

@ -110,6 +110,88 @@ sample_ledger6 = "\
\; equity:opening balances \n\ \; equity:opening balances \n\
\\n" --" \\n" --"
sample_ledger7 = "\
\2007/01/01 * opening balance\n\
\ assets:cash $4.82\n\
\ equity:opening balances \n\
\\n\
\2007/01/02 * ayres suites\n\
\ expenses:vacation $179.92\n\
\ assets:checking \n\
\\n\
\2007/01/02 * auto transfer to savings\n\
\ assets:saving $200.00\n\
\ assets:checking \n\
\\n\
\2007/01/03 * poquito mas\n\
\ expenses:food:dining $4.82\n\
\ assets:cash \n\
\\n\
\2007/01/03 * verizon\n\
\ expenses:phone $95.11\n\
\ assets:checking \n\
\\n\
\2007/01/03 * discover\n\
\ liabilities:credit cards:discover $80.00\n\
\ assets:checking \n\
\\n\
\2007/01/04 * blue cross\n\
\ expenses:health:insurance $90.00\n\
\ assets:checking \n\
\\n\
\2007/01/05 * village market liquor\n\
\ expenses:food:dining $6.48\n\
\ assets:checking \n\
\\n" --"
ledger7 = Ledger [] []
[
Entry {
date="2007/01/01", status=False, code="*", description="opening balance",
transactions=[
Transaction {account="assets:cash",
amount=Amount {currency="$", quantity=4.82}},
Transaction {account="equity:opening balances",
amount=Amount {currency="$", quantity=(-4.82)}}
]
},
Entry {
date="2007/02/01", status=False, code="*", description="ayres suites",
transactions=[
Transaction {account="expenses:vacation",
amount=Amount {currency="$", quantity=179.92}},
Transaction {account="assets:checking",
amount=Amount {currency="$", quantity=(-179.92)}}
]
}
]
-- 2007/01/02 * auto transfer to savings
-- assets:saving $200.00
-- assets:checking
-- 2007/01/03 * poquito mas
-- expenses:food:dining $4.82
-- assets:cash
-- 2007/01/03 * verizon
-- expenses:phone $95.11
-- assets:checking
-- 2007/01/03 * discover
-- liabilities:credit cards:discover $80.00
-- assets:checking
-- 2007/01/04 * blue cross
-- expenses:health:insurance $90.00
-- assets:checking
-- 2007/01/05 * village market liquor
-- expenses:food:dining $6.48
-- assets:checking
-- utils -- utils
assertParseEqual :: (Show a, Eq a) => a -> (Either ParseError a) -> Assertion assertParseEqual :: (Show a, Eq a) => a -> (Either ParseError a) -> Assertion

View File

@ -2,6 +2,7 @@
module Types where module Types where
import Text.Printf import Text.Printf
import List
data Ledger = Ledger { data Ledger = Ledger {
modifier_entries :: [ModifierEntry], modifier_entries :: [ModifierEntry],
@ -134,9 +135,6 @@ printRegister l = putStr $ showRegisterEntries (entries l) 0
-- misc -- misc
transactionsFrom :: [Entry] -> [Transaction]
transactionsFrom es = concat $ map transactions es
-- fill in missing amounts etc., as far as possible -- fill in missing amounts etc., as far as possible
autofill :: Entry -> Entry autofill :: Entry -> Entry
autofill e = Entry (date e) (status e) (code e) (description e) autofill e = Entry (date e) (status e) (code e) (description e)
@ -147,10 +145,7 @@ autofillTransactions ts =
let (ns,as) = normalAndAutoTransactions ts in let (ns,as) = normalAndAutoTransactions ts in
case (length as) of case (length as) of
0 -> ns 0 -> ns
1 -> let t = head as 1 -> ns ++ [Transaction (account (head as)) (-(sumTransactions ns))]
newamt = -(sumTransactions ns)
in
ns ++ [Transaction (account t) newamt]
otherwise -> error "too many blank transactions in this entry" otherwise -> error "too many blank transactions in this entry"
normalAndAutoTransactions :: [Transaction] -> ([Transaction], [Transaction]) normalAndAutoTransactions :: [Transaction] -> ([Transaction], [Transaction])
@ -159,4 +154,14 @@ normalAndAutoTransactions ts =
[t | t <- ts, (currency $ amount t) == "AUTO"]) [t | t <- ts, (currency $ amount t) == "AUTO"])
sumTransactions :: [Transaction] -> Amount sumTransactions :: [Transaction] -> Amount
sumTransactions ts = sum [amount t | t <- ts] sumTransactions ts = sum [amount t | t <- ts]
transactionsFrom :: [Entry] -> [Transaction]
transactionsFrom es = concat $ map transactions es
accountsFrom :: [Transaction] -> [Account]
accountsFrom ts = nub $ map account ts
accountList :: Ledger -> [Account]
accountList l = accountsFrom $ transactionsFrom $ entries l

View File

@ -4,6 +4,7 @@
-- John Wiegley's ledger is at http://newartisans.com/ledger.html . -- John Wiegley's ledger is at http://newartisans.com/ledger.html .
import System (getArgs) import System (getArgs)
import Data.List (isPrefixOf)
import Options import Options
import Types import Types
@ -12,18 +13,27 @@ import Tests
main :: IO () main :: IO ()
main = do main = do
(opts, args) <- getArgs >>= getOptions (opts, args) <- (getArgs >>= getOptions)
test test
if "reg" `elem` args if args == []
then register then register []
-- else if "test" `elem` args else
-- then test let (command, args) = (head args, tail args) in
else return () if "reg" `isPrefixOf` command then register args
else if "bal" `isPrefixOf` command then balance args
else error "could not recognise your command"
-- commands -- commands
register :: IO () register :: [String] -> IO ()
register = do register args = do
p <- parseLedgerFile ledgerFilePath
case p of
Left e -> do putStr "ledger parse error at "; print e
Right l -> printRegister l
balance :: [String] -> IO ()
balance args = do
p <- parseLedgerFile ledgerFilePath p <- parseLedgerFile ledgerFilePath
case p of case p of
Left e -> do putStr "ledger parse error at "; print e Left e -> do putStr "ledger parse error at "; print e