balance: move -V helpers to the *Report modules

This commit is contained in:
Simon Michael 2015-08-26 10:38:45 -07:00
parent 466192b18e
commit 19c3749b50
3 changed files with 56 additions and 51 deletions

View File

@ -10,6 +10,8 @@ module Hledger.Reports.BalanceReport (
BalanceReportItem,
RenderableAccountName,
balanceReport,
balanceReportValue,
mixedAmountValue,
flatShowsExclusiveBalance,
-- * Tests
@ -17,7 +19,9 @@ module Hledger.Reports.BalanceReport (
)
where
import Data.List (sort)
import Data.Maybe
import Data.Time.Calendar
import Test.HUnit
import Hledger.Data
@ -123,6 +127,41 @@ balanceReportItem opts q a
-- items = [(a,a',n, headDef 0 bs) | ((a,a',n), bs) <- mbrrows]
-- total = headDef 0 mbrtotals
-- | Convert all the amounts in a single-column balance report to
-- their value on the given date in their default valuation
-- commodities.
balanceReportValue :: Journal -> Day -> BalanceReport -> BalanceReport
balanceReportValue j d r = r'
where
(items,total) = r
r' = ([(n, mixedAmountValue j d a) |(n,a) <- items], mixedAmountValue j d total)
mixedAmountValue :: Journal -> Day -> MixedAmount -> MixedAmount
mixedAmountValue j d (Mixed as) = Mixed $ map (amountValue j d) as
-- | Find the market value of this amount on the given date, in it's
-- default valuation commodity, based on historical prices. If no
-- default valuation commodity can be found, the amount is left
-- unchanged.
amountValue :: Journal -> Day -> Amount -> Amount
amountValue j d a =
case commodityValue j d (acommodity a) of
Just v -> v{aquantity=aquantity v * aquantity a
,aprice=aprice a
}
Nothing -> a
-- | Find the market value, if known, of one unit of this commodity on
-- the given date, in the commodity in which it has most recently been
-- market-priced (ie the commodity mentioned in the most recent
-- applicable historical price directive before this date).
commodityValue :: Journal -> Day -> Commodity -> Maybe Amount
commodityValue j d c
| null applicableprices = Nothing
| otherwise = Just $ mpamount $ last applicableprices
where
applicableprices = [p | p <- sort $ jmarketprices j, mpcommodity p == c, mpdate p <= d]
tests_balanceReport =
let
(opts,journal) `gives` r = do

View File

@ -8,7 +8,8 @@ Multi-column balance reports, used by the balance command.
module Hledger.Reports.MultiBalanceReports (
MultiBalanceReport(..),
MultiBalanceReportRow,
multiBalanceReport
multiBalanceReport,
multiBalanceReportValue
-- -- * Tests
-- tests_Hledger_Reports_MultiBalanceReport
@ -18,6 +19,7 @@ where
import Data.List
import Data.Maybe
import Data.Ord
import Data.Time.Calendar
import Safe
-- import Test.HUnit
@ -177,3 +179,16 @@ multiBalanceReport opts q j = MultiBalanceReport (displayspans, items, totalsrow
dbg1 s = let p = "multiBalanceReport" in Hledger.Utils.dbg1 (p++" "++s) -- add prefix in this function's debug output
-- dbg1 = const id -- exclude this function from debug output
-- | Convert all the amounts in a multi-column balance report to their
-- value on the given date in their default valuation commodities
-- (which are determined as of that date, not the report interval dates).
multiBalanceReportValue :: Journal -> Day -> MultiBalanceReport -> MultiBalanceReport
multiBalanceReportValue j d r = r'
where
MultiBalanceReport (spans, rows, (coltotals, rowtotaltotal, rowavgtotal)) = r
r' = MultiBalanceReport
(spans,
[(n, map convert rowamts, convert rowtotal, convert rowavg) | (n, rowamts, rowtotal, rowavg) <- rows],
(map convert coltotals, convert rowtotaltotal, convert rowavgtotal))
convert = mixedAmountValue j d

View File

@ -243,8 +243,7 @@ module Hledger.Cli.Balance (
,tests_Hledger_Cli_Balance
) where
import Data.List (intercalate, sort)
import Data.Time.Calendar (Day)
import Data.List (intercalate)
import Data.Maybe (fromMaybe, isJust)
import System.Console.CmdArgs.Explicit as C
import Text.CSV
@ -316,41 +315,6 @@ balance opts@CliOpts{reportopts_=ropts} j = do
-- single-column balance reports
-- | Convert all the amounts in a single-column balance report to
-- their value on the given date in their default valuation
-- commodities.
balanceReportValue :: Journal -> Day -> BalanceReport -> BalanceReport
balanceReportValue j d r = r'
where
(items,total) = r
r' = ([(n, mixedAmountValue j d a) |(n,a) <- items], mixedAmountValue j d total)
mixedAmountValue :: Journal -> Day -> MixedAmount -> MixedAmount
mixedAmountValue j d (Mixed as) = Mixed $ map (amountValue j d) as
-- | Find the market value of this amount on the given date, in it's
-- default valuation commodity, based on historical prices. If no
-- default valuation commodity can be found, the amount is left
-- unchanged.
amountValue :: Journal -> Day -> Amount -> Amount
amountValue j d a =
case commodityValue j d (acommodity a) of
Just v -> v{aquantity=aquantity v * aquantity a
,aprice=aprice a
}
Nothing -> a
-- | Find the market value, if known, of one unit of this commodity on
-- the given date, in the commodity in which it has most recently been
-- market-priced (ie the commodity mentioned in the most recent
-- applicable historical price directive before this date).
commodityValue :: Journal -> Day -> Commodity -> Maybe Amount
commodityValue j d c
| null applicableprices = Nothing
| otherwise = Just $ mpamount $ last applicableprices
where
applicableprices = [p | p <- sort $ jmarketprices j, mpcommodity p == c, mpdate p <= d]
-- | Find the best commodity to convert to when asked to show the
-- market value of this commodity on the given date. That is, the one
-- in which it has most recently been market-priced, ie the commodity
@ -472,19 +436,6 @@ renderComponent1 (acctname, depth, total) (FormatField ljust min max field) = ca
-- multi-column balance reports
-- | Convert all the amounts in a multi-column balance report to their
-- value on the given date in their default valuation commodities
-- (which are determined as of that date, not the report interval dates).
multiBalanceReportValue :: Journal -> Day -> MultiBalanceReport -> MultiBalanceReport
multiBalanceReportValue j d r = r'
where
MultiBalanceReport (spans, rows, (coltotals, rowtotaltotal, rowavgtotal)) = r
r' = MultiBalanceReport
(spans,
[(n, map convert rowamts, convert rowtotal, convert rowavg) | (n, rowamts, rowtotal, rowavg) <- rows],
(map convert coltotals, convert rowtotaltotal, convert rowavgtotal))
convert = mixedAmountValue j d
-- | Render a multi-column balance report as CSV.
multiBalanceReportAsCsv :: ReportOpts -> MultiBalanceReport -> CSV
multiBalanceReportAsCsv opts (MultiBalanceReport (colspans, items, (coltotals,tot,avg))) =