mirror of
https://github.com/simonmichael/hledger.git
synced 2024-11-08 07:09:28 +03:00
simplify Transaction type
This commit is contained in:
parent
a1b060f4cf
commit
5763a80fda
15
Ledger.hs
15
Ledger.hs
@ -12,10 +12,13 @@ import LedgerFile
|
||||
|
||||
|
||||
rawLedgerTransactions :: LedgerFile -> [Transaction]
|
||||
rawLedgerTransactions l = entryTransactionsFrom $ entries l
|
||||
rawLedgerTransactions = txns . entries
|
||||
where
|
||||
txns :: [LedgerEntry] -> [Transaction]
|
||||
txns es = concat $ map flattenEntry es
|
||||
|
||||
rawLedgerAccountNamesUsed :: LedgerFile -> [AccountName]
|
||||
rawLedgerAccountNamesUsed l = accountNamesFromTransactions $ entryTransactionsFrom $ entries l
|
||||
rawLedgerAccountNamesUsed = accountNamesFromTransactions . rawLedgerTransactions
|
||||
|
||||
rawLedgerAccountNames :: LedgerFile -> [AccountName]
|
||||
rawLedgerAccountNames = sort . expandAccountNames . rawLedgerAccountNamesUsed
|
||||
@ -44,12 +47,12 @@ cacheLedger l =
|
||||
tmap = Map.union
|
||||
(Map.fromList [(account $ head g, g) | g <- groupedts])
|
||||
(Map.fromList [(a,[]) | a <- ans])
|
||||
txns a = tmap ! a
|
||||
txns = (tmap !)
|
||||
subaccts a = filter (isAccountNamePrefixOf a) ans
|
||||
subtxns a = concat [txns a | a <- [a] ++ subaccts a]
|
||||
lprecision = maximum $ map (precision . tamount . transaction) ts
|
||||
lprecision = maximum $ map (precision . amount) ts
|
||||
bmap = Map.union
|
||||
(Map.fromList [(a, (sumEntryTransactions $ subtxns a){precision=lprecision}) | a <- ans])
|
||||
(Map.fromList [(a, (sumTransactions $ subtxns a){precision=lprecision}) | a <- ans])
|
||||
(Map.fromList [(a,nullamt) | a <- ans])
|
||||
amap = Map.fromList [(a, Account a (tmap ! a) (bmap ! a)) | a <- ans]
|
||||
in
|
||||
@ -69,7 +72,7 @@ ledgerTransactions :: Ledger -> [Transaction]
|
||||
ledgerTransactions l =
|
||||
setprecisions $ rawLedgerTransactions $ rawledger l
|
||||
where
|
||||
setprecisions = map (entryTransactionSetPrecision (lprecision l))
|
||||
setprecisions = map (transactionSetPrecision (lprecision l))
|
||||
|
||||
ledgerTransactionsMatching :: ([String],[String]) -> Ledger -> [Transaction]
|
||||
ledgerTransactionsMatching ([],[]) l = ledgerTransactionsMatching ([".*"],[".*"]) l
|
||||
|
@ -1,4 +1,3 @@
|
||||
|
||||
module LedgerEntry
|
||||
where
|
||||
import Utils
|
||||
@ -27,7 +26,7 @@ showDate d = printf "%-10s" d
|
||||
showDescription s = printf "%-20s" (elideRight 20 s)
|
||||
|
||||
isEntryBalanced :: LedgerEntry -> Bool
|
||||
isEntryBalanced e = (sumTransactions . etransactions) e == 0
|
||||
isEntryBalanced e = (sumLedgerTransactions . etransactions) e == 0
|
||||
|
||||
autofillEntry :: LedgerEntry -> LedgerEntry
|
||||
autofillEntry e =
|
||||
@ -68,7 +67,7 @@ showEntries = concatMap showEntry
|
||||
|
||||
entrySetPrecision :: Int -> LedgerEntry -> LedgerEntry
|
||||
entrySetPrecision p (LedgerEntry d s c desc ts) =
|
||||
LedgerEntry d s c desc $ map (transactionSetPrecision p) ts
|
||||
LedgerEntry d s c desc $ map (ledgerTransactionSetPrecision p) ts
|
||||
|
||||
|
||||
-- modifier & periodic entries
|
||||
|
@ -1,4 +1,3 @@
|
||||
|
||||
module LedgerTransaction
|
||||
where
|
||||
import Utils
|
||||
@ -7,10 +6,10 @@ import AccountName
|
||||
import Amount
|
||||
|
||||
|
||||
instance Show LedgerTransaction where show = showTransaction
|
||||
instance Show LedgerTransaction where show = showLedgerTransaction
|
||||
|
||||
showTransaction :: LedgerTransaction -> String
|
||||
showTransaction t = (showaccountname $ taccount t) ++ " " ++ (showamount $ tamount t)
|
||||
showLedgerTransaction :: LedgerTransaction -> String
|
||||
showLedgerTransaction t = (showaccountname $ taccount t) ++ " " ++ (showamount $ tamount t)
|
||||
where
|
||||
showaccountname = printf "%-22s" . elideRight 22
|
||||
showamount = printf "%11s" . showAmountRoundedOrZero
|
||||
@ -27,11 +26,11 @@ autofillTransactions ts =
|
||||
case (length as) of
|
||||
0 -> ns
|
||||
1 -> ns ++ [balanceTransaction $ head as]
|
||||
where balanceTransaction t = t{tamount = -(sumTransactions ns)}
|
||||
where balanceTransaction t = t{tamount = -(sumLedgerTransactions ns)}
|
||||
otherwise -> error "too many blank transactions in this entry"
|
||||
|
||||
sumTransactions :: [LedgerTransaction] -> Amount
|
||||
sumTransactions = sum . map tamount
|
||||
sumLedgerTransactions :: [LedgerTransaction] -> Amount
|
||||
sumLedgerTransactions = sum . map tamount
|
||||
|
||||
transactionSetPrecision :: Int -> LedgerTransaction -> LedgerTransaction
|
||||
transactionSetPrecision p (LedgerTransaction a amt) = LedgerTransaction a amt{precision=p}
|
||||
ledgerTransactionSetPrecision :: Int -> LedgerTransaction -> LedgerTransaction
|
||||
ledgerTransactionSetPrecision p (LedgerTransaction a amt) = LedgerTransaction a amt{precision=p}
|
||||
|
1
NOTES
1
NOTES
@ -2,7 +2,6 @@ hledger project notes
|
||||
|
||||
* TO DO
|
||||
** bugs/cleanup
|
||||
*** rename EntryTransaction/Transaction
|
||||
** ledger features
|
||||
*** print command
|
||||
**** need to save & print comments
|
||||
|
@ -9,30 +9,17 @@ import Amount
|
||||
import Currency
|
||||
|
||||
|
||||
entry (e,t) = e
|
||||
transaction (e,t) = t
|
||||
date (e,t) = edate e
|
||||
status (e,t) = estatus e
|
||||
code (e,t) = ecode e
|
||||
description (e,t) = edescription e
|
||||
account (e,t) = taccount t
|
||||
amount (e,t) = tamount t
|
||||
|
||||
flattenEntry :: LedgerEntry -> [Transaction]
|
||||
flattenEntry e = [(e,t) | t <- etransactions e]
|
||||
flattenEntry (LedgerEntry d _ _ desc ts) = [Transaction d desc (taccount t) (tamount t) | t <- ts]
|
||||
|
||||
entryTransactionSetPrecision :: Int -> Transaction -> Transaction
|
||||
entryTransactionSetPrecision p (e, LedgerTransaction a amt) = (e, LedgerTransaction a amt{precision=p})
|
||||
transactionSetPrecision :: Int -> Transaction -> Transaction
|
||||
transactionSetPrecision p (Transaction d desc a amt) = Transaction d desc a amt{precision=p}
|
||||
|
||||
accountNamesFromTransactions :: [Transaction] -> [AccountName]
|
||||
accountNamesFromTransactions ts = nub $ map account ts
|
||||
|
||||
entryTransactionsFrom :: [LedgerEntry] -> [Transaction]
|
||||
entryTransactionsFrom es = concat $ map flattenEntry es
|
||||
|
||||
sumEntryTransactions :: [Transaction] -> Amount
|
||||
sumEntryTransactions ets =
|
||||
sumTransactions $ map transaction ets
|
||||
sumTransactions :: [Transaction] -> Amount
|
||||
sumTransactions = sum . map amount
|
||||
|
||||
matchTransactionAccount :: Regex -> Transaction -> Bool
|
||||
matchTransactionAccount r t =
|
||||
@ -53,22 +40,27 @@ showTransactionsWithBalances [] _ = []
|
||||
showTransactionsWithBalances ts b =
|
||||
unlines $ showTransactionsWithBalances' ts dummyt b
|
||||
where
|
||||
dummyt = (LedgerEntry "" False "" "" [], LedgerTransaction "" (dollars 0))
|
||||
dummyt = Transaction "" "" "" (dollars 0)
|
||||
showTransactionsWithBalances' [] _ _ = []
|
||||
showTransactionsWithBalances' (t:ts) tprev b =
|
||||
(if (entry t /= (entry tprev))
|
||||
(if sameentry t tprev
|
||||
then [showTransactionDescriptionAndBalance t b']
|
||||
else [showTransactionAndBalance t b'])
|
||||
++ (showTransactionsWithBalances' ts t b')
|
||||
where b' = b + (amount t)
|
||||
where
|
||||
b' = b + (amount t)
|
||||
sameentry (Transaction d1 desc1 _ _) (Transaction d2 desc2 _ _) =
|
||||
d1 == d2 && desc1 == desc2
|
||||
-- we forgot the entry-txn relationships.. good enough ?
|
||||
|
||||
showTransactionDescriptionAndBalance :: Transaction -> Amount -> String
|
||||
showTransactionDescriptionAndBalance t b =
|
||||
(showEntryDescription $ entry t) ++ (showTransaction $ transaction t) ++ (showBalance b)
|
||||
(showEntryDescription $ LedgerEntry (date t) False "" (description t) [])
|
||||
++ (showLedgerTransaction $ LedgerTransaction (account t) (amount t)) ++ (showBalance b)
|
||||
|
||||
showTransactionAndBalance :: Transaction -> Amount -> String
|
||||
showTransactionAndBalance t b =
|
||||
(replicate 32 ' ') ++ (showTransaction $ transaction t) ++ (showBalance b)
|
||||
(replicate 32 ' ') ++ (showLedgerTransaction $ LedgerTransaction (account t) (amount t)) ++ (showBalance b)
|
||||
|
||||
showBalance :: Amount -> String
|
||||
showBalance b = printf " %12s" (showAmountRoundedOrZero b)
|
||||
|
33
Types.hs
33
Types.hs
@ -46,11 +46,11 @@ data Amount = Amount {
|
||||
precision :: Int -- number of significant decimal places
|
||||
} deriving (Eq)
|
||||
|
||||
-- AccountNames are strings like "assets:cash:petty"; from these we figure
|
||||
-- out the chart of accounts
|
||||
-- AccountNames are strings like "assets:cash:petty", from which we derive
|
||||
-- the chart of accounts
|
||||
type AccountName = String
|
||||
|
||||
-- a flow of some amount to some account (see also Transaction)
|
||||
-- a line item in a ledger entry
|
||||
data LedgerTransaction = LedgerTransaction {
|
||||
taccount :: AccountName,
|
||||
tamount :: Amount
|
||||
@ -59,21 +59,19 @@ data LedgerTransaction = LedgerTransaction {
|
||||
-- a ledger entry, with two or more balanced transactions
|
||||
data LedgerEntry = LedgerEntry {
|
||||
edate :: Date,
|
||||
estatus :: EntryStatus,
|
||||
estatus :: Bool,
|
||||
ecode :: String,
|
||||
edescription :: String,
|
||||
etransactions :: [LedgerTransaction]
|
||||
} deriving (Eq)
|
||||
|
||||
type EntryStatus = Bool
|
||||
|
||||
-- an "=" automated entry (ignored)
|
||||
-- an automated ledger entry
|
||||
data ModifierEntry = ModifierEntry {
|
||||
valueexpr :: String,
|
||||
m_transactions :: [LedgerTransaction]
|
||||
} deriving (Eq)
|
||||
|
||||
-- a "~" periodic entry (ignored)
|
||||
-- a periodic ledger entry
|
||||
data PeriodicEntry = PeriodicEntry {
|
||||
periodexpr :: String,
|
||||
p_transactions :: [LedgerTransaction]
|
||||
@ -97,20 +95,23 @@ data LedgerFile = LedgerFile {
|
||||
entries :: [LedgerEntry]
|
||||
} deriving (Eq)
|
||||
|
||||
-- We convert Transactions into EntryTransactions, which are (entry,
|
||||
-- transaction) pairs, since I couldn't see how to have transactions
|
||||
-- reference their entry like in OO. These are referred to as just
|
||||
-- "transactions" in modules above Transaction.
|
||||
type Transaction = (LedgerEntry,LedgerTransaction)
|
||||
-- we flatten LedgerEntries and LedgerTransactions into Transactions,
|
||||
-- which are simpler to query at the cost of some data duplication
|
||||
data Transaction = Transaction {
|
||||
date :: Date,
|
||||
description :: String,
|
||||
account :: AccountName,
|
||||
amount :: Amount
|
||||
} deriving (Eq)
|
||||
|
||||
-- all information for a particular account, derived from a LedgerFile
|
||||
-- cached information for a particular account
|
||||
data Account = Account {
|
||||
aname :: AccountName,
|
||||
atransactions :: [Transaction], -- excludes sub-accounts
|
||||
abalance :: Amount -- includes sub-accounts
|
||||
abalance :: Amount -- includes sub-accounts
|
||||
}
|
||||
|
||||
-- a ledger with account info cached for faster queries
|
||||
-- a ledger with account information cached for faster queries
|
||||
data Ledger = Ledger {
|
||||
rawledger :: LedgerFile,
|
||||
accountnametree :: Tree AccountName,
|
||||
|
Loading…
Reference in New Issue
Block a user