hledger-lib-1.12: Core data types, parsers and functionality for the hledger accounting tools

Safe Haskell | None
Language | Haskell2010

Hledger.Data.PeriodicTransaction

Contents

- Orphan instances

Description

A `PeriodicTransaction` is a rule describing recurring transactions.

Synopsis

- runPeriodicTransaction :: PeriodicTransaction -> DateSpan -> [Transaction]
- checkPeriodicTransactionStartDate :: Interval -> DateSpan -> Text -> Maybe String

# Documentation

runPeriodicTransaction :: PeriodicTransaction -> DateSpan -> [Transaction] Source #

Generate transactions from `PeriodicTransaction` within a `DateSpan`

Note that new transactions require `txnTieKnot` post-processing.

    >>> _ptgen "monthly from 2017/1 to 2017/4"
    2017/01/01
        ; recur: monthly from 2017/1 to 2017/4
        a           $1.00

    2017/02/01
        ; recur: monthly from 2017/1 to 2017/4
        a           $1.00

    2017/03/01
        ; recur: monthly from 2017/1 to 2017/4
        a           $1.00

    >>> _ptgen "monthly from 2017/1 to 2017/5"
    2017/01/01
        ; recur: monthly from 2017/1 to 2017/5
        a           $1.00

    2017/02/01
        ; recur: monthly from 2017/1 to 2017/5
        a           $1.00

    2017/03/01
        ; recur: monthly from 2017/1 to 2017/5
        a           $1.00

    2017/04/01
        ; recur: monthly from 2017/1 to 2017/5
        a           $1.00

    >>> _ptgen "every 2nd day of month from 2017/02 to 2017/04"
    2017/01/02
        ; recur: every 2nd day of month from 2017/02 to 2017/04
        a           $1.00

    2017/02/02
        ; recur: every 2nd day of month from 2017/02 to 2017/04
        a           $1.00

    2017/03/02
        ; recur: every 2nd day of month from 2017/02 to 2017/04
        a           $1.00

    >>> _ptgen "every 30th day of month from 2017/1 to 2017/5"
    2016/12/30
        ; recur: every 30th day of month from 2017/1 to 2017/5
        a           $1.00

    2017/01/30
        ; recur: every 30th day of month from 2017/1 to 2017/5
        a           $1.00

    2017/02/28
        ; recur: every 30th day of month from 2017/1 to 2017/5
        a           $1.00

    2017/03/30
        ; recur: every 30th day of month from 2017/1 to 2017/5
        a           $1.00

    2017/04/30
        ; recur: every 30th day of month from 2017/1 to 2017/5
        a           $1.00

    >>> _ptgen "every 2nd Thursday of month from 2017/1 to 2017/4"
    2016/12/08
        ; recur: every 2nd Thursday of month from 2017/1 to 2017/4
        a           $1.00

    2017/01/12
        ; recur: every 2nd Thursday of month from 2017/1 to 2017/4
        a           $1.00

    2017/02/09
        ; recur: every 2nd Thursday of month from 2017/1 to 2017/4
        a           $1.00

    2017/03/09
        ; recur: every 2nd Thursday of month from 2017/1 to 2017/4
        a           $1.00

    >>> _ptgen "every nov 29th from 2017 to 2019"
    2016/11/29
        ; recur: every nov 29th from 2017 to 2019
        a           $1.00

    2017/11/29
        ; recur: every nov 29th from 2017 to 2019
        a           $1.00

    2018/11/29
        ; recur: every nov 29th from 2017 to 2019
        a           $1.00

    >>> _ptgen "2017/1"
    2017/01/01
        ; recur: 2017/1
        a           $1.00

    >>> _ptgen ""
    *** Exception: failed to parse...
    ...

    >>> _ptgen "weekly from 2017"
    *** Exception: Unable to generate transactions according to "weekly from 2017" because 2017-01-01 is not a first day of the week

    >>> _ptgen "monthly from 2017/5/4"
    *** Exception: Unable to generate transactions according to "monthly from 2017/5/4" because 2017-05-04 is not a first day of the month

    >>> _ptgen "every quarter from 2017/1/2"
    *** Exception: Unable to generate transactions according to "every quarter from 2017/1/2" because 2017-01-02 is not a first day of the quarter

    >>> _ptgen "yearly from 2017/1/14"
    *** Exception: Unable to generate transactions according to "yearly from 2017/1/14" because 2017-01-14 is not a first day of the year

    >>> let reportperiod="daily from 2018/01/03" in let (i,s) = parsePeriodExpr' nulldate reportperiod in runPeriodicTransaction (nullperiodictransaction{ptperiodexpr=reportperiod, ptspan=s, ptinterval=i, ptpostings=["a" `post` usd 1]}) (DateSpan (Just $ parsedate "2018-01-01") (Just $ parsedate "2018-01-03"))
    []

checkPeriodicTransactionStartDate :: Interval -> DateSpan -> Text -> Maybe String Source #

Check that this date span begins at a boundary of this interval, or return an explanatory error message including the provided period expression (from which the span and interval are derived).

# Orphan instances

Show PeriodicTransaction Source # |
Instance details Methods showsPrec :: Int -> PeriodicTransaction -> ShowS Source # show :: PeriodicTransaction -> String Source # showList :: [PeriodicTransaction] -> ShowS Source #