moved -V/--value to be a global report option, so it works with balance, print, register, balancesheet, incomestatement, cashflow, etc.

This commit is contained in:
Justin Le 2017-02-04 00:17:37 -08:00 committed by Simon Michael
parent f47df67167
commit baf232d3d9
4 changed files with 22 additions and 12 deletions

View File

@ -275,7 +275,6 @@ balancemode = (defCommandMode $ ["balance"] ++ aliases) { -- also accept but don
"show historical ending balance in each period (includes postings before report start date)\n "
,flagNone ["tree"] (\opts -> setboolopt "tree" opts) "show accounts as a tree; amounts include subaccounts (default in simple reports)"
,flagNone ["flat"] (\opts -> setboolopt "flat" opts) "show accounts as a list; amounts exclude subaccounts except when account is depth-clipped (default in multicolumn reports)\n "
,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 ["average","A"] (\opts -> setboolopt "average" opts) "show a row average column (in multicolumn reports)"
,flagNone ["row-total","T"] (\opts -> setboolopt "row-total" opts) "show a row total column (in multicolumn reports)"
,flagNone ["no-total","N"] (\opts -> setboolopt "no-total" opts) "omit the final total row"
@ -314,23 +313,19 @@ balance opts@CliOpts{reportopts_=ropts} j = do
| otherwise = ropts{accountlistmode_=ALTree}
in singleBalanceReport ropts' (queryFromOpts d ropts) j
| otherwise = balanceReport ropts (queryFromOpts d ropts) j
convert | value_ ropts = maybe id (balanceReportValue j) mvaluedate
| otherwise = id
render = case format of
"csv" -> \ropts r -> (++ "\n") $ printCSV $ balanceReportAsCsv ropts r
_ -> balanceReportAsText
writeOutput opts $ render ropts $ convert report
writeOutput opts $ render ropts report
_ -> do
let report = multiBalanceReport ropts (queryFromOpts d ropts) j
convert | value_ ropts = maybe id (multiBalanceReportValue j) mvaluedate
| otherwise = id
render = case format of
"csv" -> \ropts r -> (++ "\n") $ printCSV $ multiBalanceReportAsCsv ropts r
_ -> case baltype of
PeriodChange -> periodChangeReportAsText
CumulativeChange -> cumulativeChangeReportAsText
HistoricalBalance -> historicalBalanceReportAsText
writeOutput opts $ render ropts $ convert report
writeOutput opts $ render ropts report
-- single-column balance reports

View File

@ -30,7 +30,6 @@ balanceviewmode bv@BV{..} = (defCommandMode $ bvmode : bvaliases) {
groupUnnamed = [
flagNone ["flat"] (\opts -> setboolopt "flat" opts) "show accounts as a list"
,flagReq ["drop"] (\s opts -> Right $ setopt "drop" s opts) "N" "flat mode: omit N leading account name parts"
,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 ["no-total","N"] (\opts -> setboolopt "no-total" opts) "omit the final total row"
,flagNone ["no-elide"] (\opts -> setboolopt "no-elide" opts) "don't squash boring parent accounts (in tree mode)"
,flagReq ["format"] (\s opts -> Right $ setopt "format" s opts) "FORMATSTR" "use this custom line format (in simple reports)"
@ -51,9 +50,7 @@ balanceviewQueryReport
balanceviewQueryReport ropts currDay reportEnd j t q = ([view], Sum amt)
where
q' = And [queryFromOpts currDay (withoutBeginDate ropts), q j]
convert | value_ ropts = maybe id (balanceReportValue j) reportEnd
| otherwise = id
rep@(_ , amt) = convert $ balanceReport ropts q' j
rep@(_ , amt) = balanceReport ropts q' j
view = intercalate "\n" [t <> ":", balanceReportAsText ropts rep]
balanceviewReport :: BalanceView -> CliOpts -> Journal -> IO ()

View File

@ -144,6 +144,7 @@ reportflags = [
,flagReq ["depth"] (\s opts -> Right $ setopt "depth" s opts) "N" "hide accounts/postings deeper than N"
,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 ["anon"] (setboolopt "anon") "output ledger with anonymized accounts and payees."
]

View File

@ -23,6 +23,7 @@ module Hledger.Cli.Utils
)
where
import Control.Exception as C
import Control.Monad ((<=<))
import Data.Hashable (hash)
import Data.List
import Data.Maybe
@ -63,6 +64,7 @@ import Data.Time.Clock.POSIX (utcTimeToPOSIXSeconds)
import Hledger.Cli.CliOptions
import Hledger.Data
import Hledger.Read
import Hledger.Reports
import Hledger.Utils
@ -76,7 +78,12 @@ withJournalDo opts cmd = do
rulespath <- rulesFilePathFromOpts opts
journalpaths <- journalFilePathFromOpts opts
ej <- readJournalFiles Nothing rulespath (not $ ignore_assertions_ opts) journalpaths
either error' (cmd opts . pivotByOpts opts . anonymiseByOpts opts . journalApplyAliases (aliasesFromOpts opts)) ej
let f = cmd opts
. pivotByOpts opts
. anonymiseByOpts opts
. journalApplyAliases (aliasesFromOpts opts)
<=< journalApplyValue (reportopts_ opts)
either error' f ej
-- | Apply the pivot transformation on a journal, if option is present.
pivotByOpts :: CliOpts -> Journal -> Journal
@ -119,6 +126,16 @@ anonymise j
where
anon = T.pack . flip showHex "" . (fromIntegral :: Int -> Word32) . hash
journalApplyValue :: ReportOpts -> Journal -> IO Journal
journalApplyValue ropts j = do
mvaluedate <- reportEndDate j ropts
let convert | value_ ropts
, Just d <- mvaluedate
= overJournalAmounts (amountValue j d)
| otherwise
= id
return $ convert j
-- | Write some output to stdout or to a file selected by --output-file.
writeOutput :: CliOpts -> String -> IO ()
writeOutput opts s = do