hledger-lib-1.20.4: A reusable library providing the core functionality of hledger

Hledger.Data.Journal

Description

A Journal is a set of transactions, plus optional related data. This is hledger's primary data object. It is usually parsed from a journal file or other data format (see Hledger.Read).

Synopsis

# Parsing helpers

Infer any missing amounts (to satisfy balance assignments and to balance transactions) and check that all transactions balance and (optional) all balance assertions pass. Or return an error message (just the first error encountered).

Assumes journalInferCommodityStyles has been called, since those affect transaction balancing.

This does multiple things at once because amount inferring, balance assignments, balance assertions and posting dates are interdependent.

Infer transaction-implied market prices from commodity-exchanging transactions, if any. It's best to call this after transactions have been balanced and posting amounts have appropriate prices attached.

Choose and apply a consistent display style to the posting amounts in each commodity (see journalCommodityStyles). Can return an error message eg if inconsistent number formats are found.

Given a list of amounts, in parse order (roughly speaking; see journalStyleInfluencingAmounts), build a map from their commodity names to standard commodity display formats. Can return an error message eg if inconsistent number formats are found.

Though, these amounts may have come from multiple files, so we shouldn't assume they use consistent number formats. Currently we don't enforce that even within a single file, and this function never reports an error.

Get the canonical amount styles for this journal, whether (in order of precedence): set globally in InputOpts, declared by commodity directives, declared by a default commodity (D) directive, or inferred from posting amounts, as a map from symbol to style. Styles from directives are assumed to specify the decimal mark.

Convert all this journal's amounts to cost using the transaction prices, if any. The journal's commodity styles are applied to the resulting amounts.

Reverse all lists of parsed items, which during parsing were prepended to, so that the items are in parse order. Part of post-parse finalisation.

Set this journal's last read time, ie when its files were last read.

Apply the pivot transformation to all postings in a journal, replacing their account name by their value for the given field or tag.

# Filtering

Keep only transactions matching the query expression.

Keep only postings matching the query expression. This can leave unbalanced transactions.

Within each posting's amount, keep only the parts matching the query. This can leave unbalanced transactions.

Filter out all parts of this transaction's amounts which do not match the query. This can leave the transaction unbalanced.

Filter out all parts of this posting's amount which do not match the query.

# Mapping

Apply a transformation to a journal's transactions.

Apply a transformation to a journal's postings.

Apply a transformation to a transaction's postings.

# Querying

Sorted unique account names posted to by this journal's transactions.

Sorted unique account names implied by this journal's transactions - accounts posted to and all their implied parent accounts.

Sorted unique account names declared by account directives in this journal.

Sorted unique account names declared by account directives or posted to by transactions in this journal.

Sorted unique account names declared by account directives, or posted to or implied as parents by transactions in this journal.

Convenience/compatibility alias for journalAccountNamesDeclaredOrImplied.

Sorted unique commodity symbols declared by commodity directives in this journal.

Get an ordered list of AmountStyles from the amounts in this journal which influence canonical amount display styles. See traverseJournalAmounts. journalAmounts :: Journal -> [Amount] journalAmounts = getConst . traverseJournalAmounts (Const . (:[]))

| Apply a transformation to the journal amounts traversed by traverseJournalAmounts. overJournalAmounts :: (Amount -> Amount) -> Journal -> Journal overJournalAmounts f = runIdentity . traverseJournalAmounts (Identity . f)

| A helper that traverses over most amounts in the journal, in particular the ones which influence canonical amount display styles, processing them with the given applicative function.

These include, in the following order:

• the amount in the final default commodity (D) directive
• amounts in market price (P) directives (in parse order)
• posting amounts in transactions (in parse order)

Transaction price amounts, which may be embedded in posting amounts (the aprice field), are left intact but not traversed/processed.

traverseJournalAmounts :: Applicative f => (Amount -> f Amount) -> Journal -> f Journal traverseJournalAmounts f j = recombine $(traverse . dcamt) f (jparsedefaultcommodity j) * (traverse . pdamt) f (jpricedirectives j) * (traverse . tps . traverse . pamt . amts . traverse) f (jtxns j) where recombine pds txns = j { jpricedirectives = pds, jtxns = txns } -- a bunch of traversals dcamt g pd = (mdc -> case mdc of Nothing -> Nothing Just ((c,stpd{pdamount =amt} )$ g (pdamount pd) pdamt g pd = (amt -> pd{pdamount =amt}) $g (pdamount pd) tps g t = (ps -> t {tpostings=ps })$ g (tpostings t) pamt g p = (amt -> p {pamount =amt}) $g (pamount p) amts g (Mixed as) = Mixed$ g as

The fully specified date span enclosing the dates (primary or secondary) of all this journal's transactions and postings, or DateSpan Nothing Nothing if there are none.

The earliest of this journal's transaction and posting dates, or Nothing if there are none.

The latest of this journal's transaction and posting dates, or Nothing if there are none.

Unique transaction descriptions used in this journal.

Get the transaction with this index (its 1-based position in the input stream), if any.

Get the transaction that appeared immediately after this one in the input stream, if any.

Get the transaction that appeared immediately before this one in the input stream, if any.

All postings from this journal's transactions, in order.

# Standard account types

A query for Asset, Liability & Equity accounts in this journal. Cf http://en.wikipedia.org/wiki/Chart_of_accounts#Balance_Sheet_Accounts.

A query for Profit & Loss accounts in this journal. Cf http://en.wikipedia.org/wiki/Chart_of_accounts#Profit_.26_Loss_accounts.

A query for accounts in this journal which have been declared as Revenue by account directives, or otherwise for accounts with names matched by the case-insensitive regular expression ^(income|revenue)s?(:|$). A query for accounts in this journal which have been declared as Expense by account directives, or otherwise for accounts with names matched by the case-insensitive regular expression ^expenses?(:|$).

A query for accounts in this journal which have been declared as Asset (or Cash, a subtype of Asset) by account directives, or otherwise for accounts with names matched by the case-insensitive regular expression ^assets?(:|$). A query for accounts in this journal which have been declared as Liability by account directives, or otherwise for accounts with names matched by the case-insensitive regular expression ^(debts?|liabilit(y|ies))(:|$).

A query for accounts in this journal which have been declared as Equity by account directives, or otherwise for accounts with names matched by the case-insensitive regular expression ^equity(:|$). A query for Cash (liquid asset) accounts in this journal, ie accounts declared as Cash by account directives, or otherwise with names matched by the case-insensitive regular expression ^assets?(:|$). and not including the case-insensitive regular expression (investment|receivable|:A/R|:fixed).

# Misc

Given a list of amount styles (assumed to be from parsed amounts in a single commodity), in parse order, choose a canonical style. This is: the general style of the first amount, with the first digit group style seen, with the maximum precision of all.

Check any balance assertions in the journal and return an error message if any of them fail (or if the transaction balancing they require fails).

Untie all transaction-posting knots in this journal, so that eg recursiveSize and GHCI's :sprint can work on it.

Apply any transaction modifier rules in the journal (adding automated postings to transactions, eg). Or if a modifier rule fails to parse, return the error message. A reference date is provided to help interpret relative dates in transaction modifier queries.

Apply some account aliases to all posting account names in the journal, as described by accountNameApplyAliases. This can fail due to a bad replacement pattern in a regular expression alias.

# Orphan instances

 Source # Instance details MethodsshowList :: [Journal] -> ShowS # Source # Instance details Methodsstimes :: Integral b => b -> Journal -> Journal # Source # Instance details Methods