74 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Haskell
		
	
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Haskell
		
	
	
	
	
	
 | 
						|
module EntryTransaction
 | 
						|
where
 | 
						|
import Utils
 | 
						|
import BasicTypes
 | 
						|
import Entry
 | 
						|
import Transaction
 | 
						|
import Amount
 | 
						|
 | 
						|
 | 
						|
-- We convert Transactions into EntryTransactions, which are (entry,
 | 
						|
-- transaction) pairs, since I couldn't see how to easily have
 | 
						|
-- transactions reference their entry like in OO.  These are referred to
 | 
						|
-- as just "transactions" hereafter.
 | 
						|
 | 
						|
type EntryTransaction = (Entry,Transaction)
 | 
						|
 | 
						|
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 :: Entry -> [EntryTransaction]
 | 
						|
flattenEntry e = [(e,t) | t <- etransactions e]
 | 
						|
 | 
						|
entryTransactionsFrom :: [Entry] -> [EntryTransaction]
 | 
						|
entryTransactionsFrom es = concat $ map flattenEntry es
 | 
						|
 | 
						|
sumEntryTransactions :: [EntryTransaction] -> Amount
 | 
						|
sumEntryTransactions ets = 
 | 
						|
    sumTransactions $ map transaction ets
 | 
						|
 | 
						|
matchTransactionAccount :: String -> EntryTransaction -> Bool
 | 
						|
matchTransactionAccount s t =
 | 
						|
    case matchRegex (mkRegex s) (account t) of
 | 
						|
      Nothing -> False
 | 
						|
      otherwise -> True
 | 
						|
 | 
						|
matchTransactionDescription :: String -> EntryTransaction -> Bool
 | 
						|
matchTransactionDescription s t =
 | 
						|
    case matchRegex (mkRegex s) (description t) of
 | 
						|
      Nothing -> False
 | 
						|
      otherwise -> True
 | 
						|
 | 
						|
showTransactionsWithBalances :: [EntryTransaction] -> Amount -> String
 | 
						|
showTransactionsWithBalances [] _ = []
 | 
						|
showTransactionsWithBalances ts b =
 | 
						|
    unlines $ showTransactionsWithBalances' ts dummyt b
 | 
						|
        where
 | 
						|
          dummyt = (Entry "" False "" "" [], Transaction "" (dollars 0))
 | 
						|
          showTransactionsWithBalances' [] _ _ = []
 | 
						|
          showTransactionsWithBalances' (t:ts) tprev b =
 | 
						|
              (if (entry t /= (entry tprev))
 | 
						|
               then [showTransactionDescriptionAndBalance t b']
 | 
						|
               else [showTransactionAndBalance t b'])
 | 
						|
              ++ (showTransactionsWithBalances' ts t b')
 | 
						|
                  where b' = b + (amount t)
 | 
						|
 | 
						|
showTransactionDescriptionAndBalance :: EntryTransaction -> Amount -> String
 | 
						|
showTransactionDescriptionAndBalance t b =
 | 
						|
    (showEntry $ entry t) ++ (showTransaction $ transaction t) ++ (showBalance b)
 | 
						|
 | 
						|
showTransactionAndBalance :: EntryTransaction -> Amount -> String
 | 
						|
showTransactionAndBalance t b =
 | 
						|
    (replicate 32 ' ') ++ (showTransaction $ transaction t) ++ (showBalance b)
 | 
						|
 | 
						|
showBalance :: Amount -> String
 | 
						|
showBalance b = printf " %12s" (showAmountRoundedOrZero b)
 | 
						|
 |