hledger-lib-0.22: Core data types, parsers and utilities for the hledger accounting tool.

Safe Haskell | None

Hledger.Data.Types

Description

Most data types are defined here to avoid import cycles. Here is an overview of the hledger data model:

     Journal                  -- a journal is read from one or more data files. It contains..
      [Transaction]           -- journal transactions (aka entries), which have date, status, code, description and..
       [Posting]              -- multiple account postings, which have account name and amount
      [HistoricalPrice]       -- historical commodity prices

     Ledger                   -- a ledger is derived from a journal, by applying a filter specification and doing some further processing. It contains..
      Journal                 -- a filtered copy of the original journal, containing only the transactions and postings we are interested in
      [Account]               -- all accounts, in tree order beginning with a "root" account", with their balances and sub/parent accounts

For more detailed documentation on each type, see the corresponding modules.

Synopsis

- type SmartDate = (String, String, String)
- data WhichDate
  - = PrimaryDate
  - | SecondaryDate
- data DateSpan = DateSpan (Maybe Day) (Maybe Day)
- data Interval
  - = NoInterval
  - | Days Int
  - | Weeks Int
  - | Months Int
  - | Quarters Int
  - | Years Int
  - | DayOfMonth Int
  - | DayOfWeek Int
- type AccountName = String
- data Side
  - = L
  - | R
- type Commodity = String
- type Quantity = Double
- data Price
  - = NoPrice
  - | UnitPrice Amount
  - | TotalPrice Amount
- data AmountStyle = AmountStyle {
  - ascommodityside :: Side
  - ascommodityspaced :: Bool
  - asprecision :: Int
  - asdecimalpoint :: Char
  - asseparator :: Char
  - asseparatorpositions :: [Int]
  }
- data Amount = Amount {
  - acommodity :: Commodity
  - aquantity :: Quantity
  - aprice :: Price
  - astyle :: AmountStyle
  }
- newtype MixedAmount = Mixed [Amount]
- data PostingType
  - = RegularPosting
  - | VirtualPosting
  - | BalancedVirtualPosting
- type Tag = (String, String)
- data Posting = Posting {
  - pdate :: Maybe Day
  - pdate2 :: Maybe Day
  - pstatus :: Bool
  - paccount :: AccountName
  - pamount :: MixedAmount
  - pcomment :: String
  - ptype :: PostingType
  - ptags :: [Tag]
  - pbalanceassertion :: Maybe MixedAmount
  - ptransaction :: Maybe Transaction
  }
- data Transaction = Transaction {
  - tdate :: Day
  - tdate2 :: Maybe Day
  - tstatus :: Bool
  - tcode :: String
  - tdescription :: String
  - tcomment :: String
  - ttags :: [Tag]
  - tpostings :: [Posting]
  - tpreceding_comment_lines :: String
  }
- data ModifierTransaction = ModifierTransaction {
  - mtvalueexpr :: String
  - mtpostings :: [Posting]
  }
- data PeriodicTransaction = PeriodicTransaction {
  - ptperiodicexpr :: String
  - ptpostings :: [Posting]
  }
- data TimeLogCode
  - = SetBalance
  - | SetRequiredHours
  - | In
  - | Out
  - | FinalOut
- data TimeLogEntry = TimeLogEntry {
  - tlcode :: TimeLogCode
  - tldatetime :: LocalTime
  - tlcomment :: String
  }
- data HistoricalPrice = HistoricalPrice {
  - hdate :: Day
  - hcommodity :: Commodity
  - hamount :: Amount
  }
- type Year = Integer
- data JournalContext = Ctx {
  - ctxYear :: !(Maybe Year)
  - ctxCommodityAndStyle :: !(Maybe (Commodity, AmountStyle))
  - ctxAccount :: ![AccountName]
  - ctxAliases :: ![(AccountName, AccountName)]
  }
- data Journal = Journal {
  - jmodifiertxns :: [ModifierTransaction]
  - jperiodictxns :: [PeriodicTransaction]
  - jtxns :: [Transaction]
  - open_timelog_entries :: [TimeLogEntry]
  - historical_prices :: [HistoricalPrice]
  - final_comment_lines :: String
  - jContext :: JournalContext
  - files :: [(FilePath, String)]
  - filereadtime :: ClockTime
  - jcommoditystyles :: Map Commodity AmountStyle
  }
- type JournalUpdate = ErrorT String IO (Journal -> Journal)
- type Format = String
- data Reader = Reader {
  - rFormat :: Format
  - rDetector :: FilePath -> String -> Bool
  - rParser :: Maybe FilePath -> FilePath -> String -> ErrorT String IO Journal
  }
- data HledgerFormatField
  - = AccountField
  - | DefaultDateField
  - | DescriptionField
  - | TotalField
  - | DepthSpacerField
  - | FieldNo Int
- data FormatString
  - = FormatLiteral String
  - | FormatField Bool (Maybe Int) (Maybe Int) HledgerFormatField
- data Account = Account {
  - aname :: AccountName
  - aebalance :: MixedAmount
  - asubs :: [Account]
  - aibalance :: MixedAmount
  - aparent :: Maybe Account
  - aboring :: Bool
  }
- data Ledger = Ledger {
  - ljournal :: Journal
  - laccounts :: [Account]
  }

# Documentation

type SmartDate = (String, String, String)Source

data WhichDate Source

Constructors

PrimaryDate |
SecondaryDate |

Instances

Eq WhichDate |
Show WhichDate |

data DateSpan Source

Constructors

DateSpan (Maybe Day) (Maybe Day) |

Instances

Eq DateSpan |
Data DateSpan |
Ord DateSpan |
Show DateSpan |
Typeable DateSpan |

data Interval Source

Constructors

NoInterval |
Days Int |
Weeks Int |
Months Int |
Quarters Int |
Years Int |
DayOfMonth Int |
DayOfWeek Int |

Instances

Eq Interval |
Data Interval |
Ord Interval |
Show Interval |
Typeable Interval |

type AccountName = String Source

data Side Source

Constructors

L |
R |

Instances

Eq Side |
Data Side |
Ord Side |
Read Side |
Show Side |
Typeable Side |

type Commodity = String Source

type Quantity = Double Source

data Price Source

An amount's price (none, per unit, or total) in another commodity. Note the price should be a positive number, although this is not enforced.

Constructors

NoPrice |
UnitPrice Amount |
TotalPrice Amount |

Instances

Eq Price |
Data Price |
Ord Price |
Typeable Price |

data AmountStyle Source

Display style for an amount.

Constructors

AmountStyle |

Fields

ascommodityside :: Side

  does the symbol appear on the left or the right ?

ascommodityspaced :: Bool

  space between symbol and quantity ?

asprecision :: Int

  number of digits displayed after the decimal point

asdecimalpoint :: Char

  character used as decimal point

asseparator :: Char

  character used for separating digit groups (eg thousands)

asseparatorpositions :: [Int]

  positions of digit group separators, counting leftward from decimal point

Instances

Eq AmountStyle |
Data AmountStyle |
Ord AmountStyle |
Read AmountStyle |
Show AmountStyle |
Typeable AmountStyle |

data Amount Source

Constructors

Amount |

Fields

acommodity :: Commodity
aquantity :: Quantity
aprice :: Price

  the (fixed) price for this amount, if any

astyle :: AmountStyle

Instances

Eq Amount |
Data Amount |
Num Amount |
Ord Amount |
Show Amount |
Typeable Amount |

newtype MixedAmount Source

Constructors

Mixed [Amount] |

Instances

Eq MixedAmount |
Data MixedAmount |
Num MixedAmount |
Ord MixedAmount |
Show MixedAmount |
Typeable MixedAmount |

data PostingType Source

Constructors

RegularPosting |
VirtualPosting |
BalancedVirtualPosting |

Instances

Eq PostingType |
Data PostingType |
Show PostingType |
Typeable PostingType |

type Tag Source

Arguments

= (String, String) | A tag name and (possibly empty) value.

data Posting Source

Constructors

Posting |

Fields

pdate :: Maybe Day

  this posting's date, if different from the transaction's

pdate2 :: Maybe Day

  this posting's secondary date, if different from the transaction's

pstatus :: Bool
paccount :: AccountName
pamount :: MixedAmount
pcomment :: String

  this posting's comment lines, as a single non-indented multi-line string

ptype :: PostingType
ptags :: [Tag]

  tag names and values, extracted from the comment

pbalanceassertion :: Maybe MixedAmount

  optional: the expected balance in the account after this posting

ptransaction :: Maybe Transaction

  this posting's parent transaction (co-recursive types). Tying this knot gets tedious, Maybe makes it easier/optional.

Instances

Eq Posting |
Data Posting |
Show Posting |
Typeable Posting |

data Transaction Source

Constructors

Transaction |

Fields

tdate :: Day
tdate2 :: Maybe Day
tstatus :: Bool
tcode :: String
tdescription :: String
tcomment :: String

  this transaction's comment lines, as a single non-indented multi-line string

ttags :: [Tag]

  tag names and values, extracted from the comment

tpostings :: [Posting]

  this transaction's postings

tpreceding_comment_lines :: String

  any comment lines immediately preceding this transaction

Instances

Eq Transaction |
Data Transaction |
Show Transaction |
Typeable Transaction |

data ModifierTransaction Source

Constructors

ModifierTransaction |

Fields

mtvalueexpr :: String
mtpostings :: [Posting]

Instances

Eq ModifierTransaction |
Data ModifierTransaction |
Show ModifierTransaction |
Typeable ModifierTransaction |

data PeriodicTransaction Source

Constructors

PeriodicTransaction |

Fields

ptperiodicexpr :: String
ptpostings :: [Posting]

Instances

Eq PeriodicTransaction |
Data PeriodicTransaction |
Show PeriodicTransaction |
Typeable PeriodicTransaction |

data TimeLogCode Source

Constructors

SetBalance |
SetRequiredHours |
In |
Out |
FinalOut |

Instances

Eq TimeLogCode |
Data TimeLogCode |
Ord TimeLogCode |
Read TimeLogCode |
Show TimeLogCode |
Typeable TimeLogCode |

data TimeLogEntry Source

Constructors

TimeLogEntry |

Fields

tlcode :: TimeLogCode
tldatetime :: LocalTime
tlcomment :: String

Instances

Eq TimeLogEntry |
Data TimeLogEntry |
Ord TimeLogEntry |
Show TimeLogEntry |
Typeable TimeLogEntry |

data HistoricalPrice Source

Constructors

HistoricalPrice |

Fields

hdate :: Day
hcommodity :: Commodity
hamount :: Amount

Instances

Eq HistoricalPrice |
Data HistoricalPrice |
Show HistoricalPrice |
Typeable HistoricalPrice |

type Year = Integer Source

data JournalContext Source

A journal context is some data which can change in the course of parsing a journal. An example is the default year, which changes when a Y directive is encountered. At the end of parsing, the final context is saved for later use by eg the add command.

Constructors

Ctx |

Fields

ctxYear :: !(Maybe Year)

  the default year most recently specified with Y

ctxCommodityAndStyle :: !(Maybe (Commodity, AmountStyle))

  the default commodity and amount style most recently specified with D

ctxAccount :: ![AccountName]

  the current stack of parent accounts/account name components specified with account directive(s). Concatenated, these are the account prefix prepended to parsed account names.

ctxAliases :: ![(AccountName, AccountName)]

  the current list of account name aliases in effect

Instances

Eq JournalContext |
Data JournalContext |
Read JournalContext |
Show JournalContext |
Typeable JournalContext |

data Journal Source

Constructors

Journal |

Fields

jmodifiertxns :: [ModifierTransaction]
jperiodictxns :: [PeriodicTransaction]
jtxns :: [Transaction]
open_timelog_entries :: [TimeLogEntry]
historical_prices :: [HistoricalPrice]
final_comment_lines :: String

  any trailing comments from the journal file

jContext :: JournalContext

  the context (parse state) at the end of parsing

files :: [(FilePath, String)]

  the file path and raw text of the main and any included journal files. The main file is first followed by any included files in the order encountered (XXX reversed, cf journalAddFile).

filereadtime :: ClockTime

  when this journal was last read from its file(s)

jcommoditystyles :: Map Commodity AmountStyle

  how to display amounts in each commodity

Instances

Eq Journal |
Data Journal |
Show Journal |
Typeable Journal |

type JournalUpdate = ErrorT String IO (Journal -> Journal)Source

A JournalUpdate is some transformation of a Journal. It can do I/O or raise an error.

type Format = String Source

The id of a data format understood by hledger, eg `journal` or `csv`.

data Reader Source

A hledger journal reader is a triple of format name, format-detecting predicate, and a parser to Journal.

Constructors

Reader |

Fields

rFormat :: Format
rDetector :: FilePath -> String -> Bool
rParser :: Maybe FilePath -> FilePath -> String -> ErrorT String IO Journal

Instances

Show Reader |

data HledgerFormatField Source

Constructors

AccountField |
DefaultDateField |
DescriptionField |
TotalField |
DepthSpacerField |
FieldNo Int |

Instances

Eq HledgerFormatField |
Show HledgerFormatField |

data FormatString Source

Constructors

FormatLiteral String |
FormatField Bool (Maybe Int) (Maybe Int) HledgerFormatField |

Instances

Eq FormatString |
Show FormatString |

data Account Source

An account, with name, balances and links to parent/subaccounts which let you walk up or down the account tree.

Constructors

Account |

Fields

aname :: AccountName

  this account's full name

aebalance :: MixedAmount

  this account's balance, excluding subaccounts

asubs :: [Account]

  sub-accounts anumpostings :: Int -- ^ number of postings to this account derived from the above:

aibalance :: MixedAmount

  this account's balance, including subaccounts

aparent :: Maybe Account

  parent account

aboring :: Bool

  used in the accounts report to label elidable parents

Instances

Eq Account |
Show Account |

data Ledger Source

A Ledger has the journal it derives from, and the accounts derived from that. Accounts are accessible both list-wise and tree-wise, since each one knows its parent and subs; the first account is the root of the tree and always exists.

Constructors

Ledger |

Fields

ljournal :: Journal
laccounts :: [Account]

Instances

Show Ledger |