balance: move -V helpers to the *Report modules
This commit is contained in:
parent
466192b18e
commit
19c3749b50
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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))) =
|
||||
|
||||
Loading…
Reference in New Issue
Block a user