This patch replaces the strings used in the Entry, TimeLogEntry, and Transaction records with real types. Rather than use the inbuild system date and time types directly, two custom types have been implemented that wrap UTCTime: Date and DateTime. A minimal API for these has been added.
106 lines
2.7 KiB
Haskell
106 lines
2.7 KiB
Haskell
{-|
|
|
|
|
All the main data types, defined here to avoid import cycles.
|
|
See the corresponding modules for documentation.
|
|
|
|
-}
|
|
|
|
module Ledger.Types
|
|
where
|
|
import Ledger.Utils
|
|
import qualified Data.Map as Map
|
|
|
|
|
|
type AccountName = String
|
|
|
|
data Side = L | R deriving (Eq,Show)
|
|
|
|
data Commodity = Commodity {
|
|
symbol :: String, -- ^ the commodity's symbol
|
|
|
|
-- display preferences for amounts of this commodity
|
|
side :: Side, -- ^ should the symbol appear on the left or the right
|
|
spaced :: Bool, -- ^ should there be a space between symbol and quantity
|
|
comma :: Bool, -- ^ should thousands be comma-separated
|
|
precision :: Int -- ^ number of decimal places to display
|
|
} deriving (Eq,Show)
|
|
|
|
data Amount = Amount {
|
|
commodity :: Commodity,
|
|
quantity :: Double,
|
|
price :: Maybe MixedAmount -- ^ optional per-unit price for this amount at the time of entry
|
|
} deriving (Eq)
|
|
|
|
newtype MixedAmount = Mixed [Amount] deriving (Eq)
|
|
|
|
data TransactionType = RegularTransaction | VirtualTransaction | BalancedVirtualTransaction
|
|
deriving (Eq,Show)
|
|
|
|
data RawTransaction = RawTransaction {
|
|
taccount :: AccountName,
|
|
tamount :: MixedAmount,
|
|
tcomment :: String,
|
|
rttype :: TransactionType
|
|
} deriving (Eq)
|
|
|
|
-- | a ledger "modifier" entry. Currently ignored.
|
|
data ModifierEntry = ModifierEntry {
|
|
valueexpr :: String,
|
|
m_transactions :: [RawTransaction]
|
|
} deriving (Eq)
|
|
|
|
-- | a ledger "periodic" entry. Currently ignored.
|
|
data PeriodicEntry = PeriodicEntry {
|
|
periodexpr :: String,
|
|
p_transactions :: [RawTransaction]
|
|
} deriving (Eq)
|
|
|
|
data Entry = Entry {
|
|
edate :: Date,
|
|
estatus :: Bool,
|
|
ecode :: String,
|
|
edescription :: String,
|
|
ecomment :: String,
|
|
etransactions :: [RawTransaction],
|
|
epreceding_comment_lines :: String
|
|
} deriving (Eq)
|
|
|
|
data RawLedger = RawLedger {
|
|
modifier_entries :: [ModifierEntry],
|
|
periodic_entries :: [PeriodicEntry],
|
|
entries :: [Entry],
|
|
final_comment_lines :: String
|
|
} deriving (Eq)
|
|
|
|
data TimeLogEntry = TimeLogEntry {
|
|
tlcode :: Char,
|
|
tldatetime :: DateTime,
|
|
tlcomment :: String
|
|
} deriving (Eq,Ord)
|
|
|
|
data TimeLog = TimeLog {
|
|
timelog_entries :: [TimeLogEntry]
|
|
} deriving (Eq)
|
|
|
|
data Transaction = Transaction {
|
|
entryno :: Int,
|
|
date :: Date,
|
|
description :: String,
|
|
account :: AccountName,
|
|
amount :: MixedAmount,
|
|
ttype :: TransactionType
|
|
} deriving (Eq)
|
|
|
|
data Account = Account {
|
|
aname :: AccountName,
|
|
atransactions :: [Transaction],
|
|
abalance :: MixedAmount
|
|
}
|
|
|
|
data Ledger = Ledger {
|
|
rawledger :: RawLedger,
|
|
accountnametree :: Tree AccountName,
|
|
accountmap :: Map.Map AccountName Account
|
|
}
|
|
|