cli: --auto adds automated postings to reports

Ledger-style automated postings, previously supported only by
hledger-budget, have landed as a first-class feature.  The --auto
flag activates them, so that any postings they generate are
included in reports.
This commit is contained in:
Dmitry Astapov 2017-11-18 00:40:10 +00:00
parent f101d5b515
commit 23f3da4e92
4 changed files with 94 additions and 1 deletions

View File

@ -105,6 +105,7 @@ data ReportOpts = ReportOpts {
-- how to sort negative numbers.
,color_ :: Bool
,forecast_ :: Bool
,auto_ :: Bool
} deriving (Show, Data, Typeable)
instance Default ReportOpts where def = defreportopts
@ -136,6 +137,7 @@ defreportopts = ReportOpts
def
def
def
def
rawOptsToReportOpts :: RawOpts -> IO ReportOpts
rawOptsToReportOpts rawopts = checkReportOpts <$> do
@ -167,6 +169,7 @@ rawOptsToReportOpts rawopts = checkReportOpts <$> do
,pretty_tables_ = boolopt "pretty-tables" rawopts'
,color_ = color
,forecast_ = boolopt "forecast" rawopts'
,auto_ = boolopt "auto" rawopts'
}
-- | Do extra validation of raw option values, raising an error if there's a problem.

View File

@ -155,7 +155,8 @@ reportflags = [
,flagNone ["empty","E"] (setboolopt "empty") "show items with zero amount, normally hidden"
,flagNone ["cost","B"] (setboolopt "cost") "convert amounts to their cost at transaction time (using the transaction price, if any)"
,flagNone ["value","V"] (setboolopt "value") "convert amounts to their market value on the report end date (using the most recent applicable market price, if any)"
,flagNone ["forecast"] (\opts -> setboolopt "forecast" opts) "generate forecast transactions"
,flagNone ["forecast"] (setboolopt "forecast") "generate forecast transactions"
,flagNone ["auto"] (setboolopt "auto") "generate automated postings"
]
-- | Common output-related flags: --output-file, --output-format...

View File

@ -54,6 +54,7 @@ import Hledger.Data
import Hledger.Read
import Hledger.Reports
import Hledger.Utils
import Hledger.Query (Query(Any))
-- | Parse the user's specified journal file, maybe apply some transformations
@ -71,6 +72,7 @@ withJournalDo opts cmd = do
. journalApplyAliases (aliasesFromOpts opts)
<=< journalApplyValue (reportopts_ opts)
<=< journalAddForecast opts
. generateAutomaticPostings (reportopts_ opts)
either error' f ej
-- | Apply the pivot transformation on a journal, if option is present.
@ -141,6 +143,15 @@ journalAddForecast opts j = do
in
either error' id $ journalBalanceTransactions assrt j
-- | Generate Automatic postings and add them to the current journal.
generateAutomaticPostings :: ReportOpts -> Journal -> Journal
generateAutomaticPostings ropts j =
if auto_ ropts then j { jtxns = map modifier $ jtxns j } else j
where
modifier = foldr (flip (.) . runModifierTransaction') id mtxns
runModifierTransaction' = fmap txnTieKnot . runModifierTransaction Any
mtxns = jmodifiertxns j
-- | Write some output to stdout or to a file selected by --output-file.
-- If the file exists it will be overwritten.
writeOutput :: CliOpts -> String -> IO ()

78
tests/budget/auto.test Normal file
View File

@ -0,0 +1,78 @@
# Add proportional income tax (from documentation)
hledger print -f- --auto
<<<
2016/1/1 paycheck
income:remuneration $-100
income:donations $-15
assets:bank
2016/1/1 withdraw
assets:cash $20
assets:bank
= ^income
(liabilities:tax) *.33 ; income tax
>>>
2016/01/01 paycheck
income:remuneration $-100
income:donations $-15
assets:bank
(liabilities:tax) $-33 ; income tax
(liabilities:tax) $-5 ; income tax
2016/01/01 withdraw
assets:cash $20
assets:bank
>>>2
>>>=0
hledger register -f- --auto
<<<
2016/1/1 paycheck
income:remuneration $-100
income:donations $-15
assets:bank
2016/1/1 withdraw
assets:cash $20
assets:bank
= ^income
(liabilities:tax) *.33 ; income tax
>>>
2016/01/01 paycheck income:remuneration $-100 $-100
income:donations $-15 $-115
assets:bank $115 0
(liabilities:tax) $-33 $-33
(liabilities:tax) $-5 $-38
2016/01/01 withdraw assets:cash $20 $-18
assets:bank $-20 $-38
>>>2
>>>=0
hledger balance -f- --auto
<<<
2016/1/1 paycheck
income:remuneration $-100
income:donations $-15
assets:bank
2016/1/1 withdraw
assets:cash $20
assets:bank
= ^income
(liabilities:tax) *.33 ; income tax
>>>
$115 assets
$95 bank
$20 cash
$-115 income
$-15 donations
$-100 remuneration
$-38 liabilities:tax
--------------------
$-38
>>>2
>>>=0