hledger/Types.hs

130 lines
3.3 KiB
Haskell
Raw Normal View History

2007-07-02 22:57:37 +04:00
module Types
where
import Utils
2007-07-02 22:57:37 +04:00
import qualified Data.Map as Map
2007-07-02 20:43:14 +04:00
{-
2007-07-04 06:50:29 +04:00
Here is the approximate module hierarchy. The early code defined types in
each module and so was strictly layered. Now, all data types have been
moved to the bottom. The modules are still used to group related
2007-07-04 13:34:30 +04:00
functions/methods (" make overview " to list those).
2007-07-02 20:43:14 +04:00
hledger
Options
Tests
Parse
Models
TimeLog
TimeLogEntry
Ledger
2007-07-02 22:57:37 +04:00
Account
Transaction
LedgerFile
LedgerEntry
LedgerTransaction
2007-07-04 13:34:30 +04:00
AccountName
Amount
Currency
Types
Utils
2007-07-02 20:43:14 +04:00
-}
2008-10-01 04:29:58 +04:00
-- | account and description-matching patterns
type FilterPatterns = (Maybe Regex, Maybe Regex)
2007-03-12 03:13:53 +03:00
type Date = String
2007-07-02 20:43:14 +04:00
2007-03-12 03:13:53 +03:00
type DateTime = String
2007-07-02 20:43:14 +04:00
data Currency = Currency {
symbol :: String,
2007-07-04 06:50:29 +04:00
rate :: Double -- relative to the dollar.. 0 rates not supported yet
2007-07-02 20:43:14 +04:00
} deriving (Eq,Show)
2008-10-01 04:29:58 +04:00
-- | some amount of money, time, stock, oranges, etc.
2007-07-02 20:43:14 +04:00
data Amount = Amount {
currency :: Currency,
quantity :: Double,
2008-10-01 04:29:58 +04:00
precision :: Int -- ^ number of significant decimal places
2007-07-02 20:43:14 +04:00
} deriving (Eq)
2007-07-04 14:59:29 +04:00
-- AccountNames are strings like "assets:cash:petty", from which we derive
-- the chart of accounts
2007-07-02 20:43:14 +04:00
type AccountName = String
2008-10-01 04:29:58 +04:00
-- | a line item in a ledger entry
data LedgerTransaction = LedgerTransaction {
2007-07-02 20:43:14 +04:00
taccount :: AccountName,
tamount :: Amount,
tcomment :: String
2007-07-02 20:43:14 +04:00
} deriving (Eq)
2008-10-01 04:29:58 +04:00
-- | a ledger entry, with two or more balanced transactions
data LedgerEntry = LedgerEntry {
2007-07-02 20:43:14 +04:00
edate :: Date,
2007-07-04 14:59:29 +04:00
estatus :: Bool,
2007-07-02 20:43:14 +04:00
ecode :: String,
edescription :: String,
ecomment :: String,
etransactions :: [LedgerTransaction],
epreceding_comment_lines :: String
2007-07-02 20:43:14 +04:00
} deriving (Eq)
2008-10-01 04:29:58 +04:00
-- | an automated ledger entry
2007-07-02 20:43:14 +04:00
data ModifierEntry = ModifierEntry {
valueexpr :: String,
m_transactions :: [LedgerTransaction]
2007-07-02 20:43:14 +04:00
} deriving (Eq)
2008-10-01 04:29:58 +04:00
-- | a periodic ledger entry
2007-07-02 20:43:14 +04:00
data PeriodicEntry = PeriodicEntry {
periodexpr :: String,
p_transactions :: [LedgerTransaction]
2007-07-02 20:43:14 +04:00
} deriving (Eq)
2008-10-01 04:29:58 +04:00
-- | we also parse timeclock.el timelogs
2007-07-02 20:43:14 +04:00
data TimeLogEntry = TimeLogEntry {
tlcode :: Char,
tldatetime :: DateTime,
tlcomment :: String
2007-07-02 20:43:14 +04:00
} deriving (Eq,Ord)
data TimeLog = TimeLog {
timelog_entries :: [TimeLogEntry]
} deriving (Eq)
2008-10-01 04:29:58 +04:00
-- | a parsed ledger file
data LedgerFile = LedgerFile {
2007-07-02 22:57:37 +04:00
modifier_entries :: [ModifierEntry],
periodic_entries :: [PeriodicEntry],
entries :: [LedgerEntry],
final_comment_lines :: String
2007-07-02 22:57:37 +04:00
} deriving (Eq)
2008-10-01 04:29:58 +04:00
-- | we flatten LedgerEntries and LedgerTransactions into Transactions,
2007-07-04 14:59:29 +04:00
-- which are simpler to query at the cost of some data duplication
data Transaction = Transaction {
entryno :: Int,
2007-07-04 14:59:29 +04:00
date :: Date,
description :: String,
account :: AccountName,
amount :: Amount
} deriving (Eq)
2007-07-02 20:43:14 +04:00
2008-10-01 04:29:58 +04:00
-- | cached information for a particular account
2007-07-02 20:43:14 +04:00
data Account = Account {
aname :: AccountName,
2008-10-01 04:29:58 +04:00
atransactions :: [Transaction], -- ^ excludes sub-accounts
abalance :: Amount -- ^ includes sub-accounts
2007-07-02 20:43:14 +04:00
}
2008-10-01 04:29:58 +04:00
-- | a ledger with account information cached for faster queries
data Ledger = Ledger {
rawledger :: LedgerFile,
2007-07-03 03:41:07 +04:00
accountnametree :: Tree AccountName,
accounts :: Map.Map AccountName Account,
lprecision :: Int
2007-07-02 22:57:37 +04:00
}