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,
 | 
					  BalanceReportItem,
 | 
				
			||||||
  RenderableAccountName,
 | 
					  RenderableAccountName,
 | 
				
			||||||
  balanceReport,
 | 
					  balanceReport,
 | 
				
			||||||
 | 
					  balanceReportValue,
 | 
				
			||||||
 | 
					  mixedAmountValue,
 | 
				
			||||||
  flatShowsExclusiveBalance,
 | 
					  flatShowsExclusiveBalance,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  -- * Tests
 | 
					  -- * Tests
 | 
				
			||||||
@ -17,7 +19,9 @@ module Hledger.Reports.BalanceReport (
 | 
				
			|||||||
)
 | 
					)
 | 
				
			||||||
where
 | 
					where
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import Data.List (sort)
 | 
				
			||||||
import Data.Maybe
 | 
					import Data.Maybe
 | 
				
			||||||
 | 
					import Data.Time.Calendar
 | 
				
			||||||
import Test.HUnit
 | 
					import Test.HUnit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import Hledger.Data
 | 
					import Hledger.Data
 | 
				
			||||||
@ -123,6 +127,41 @@ balanceReportItem opts q a
 | 
				
			|||||||
--     items = [(a,a',n, headDef 0 bs) | ((a,a',n), bs) <- mbrrows]
 | 
					--     items = [(a,a',n, headDef 0 bs) | ((a,a',n), bs) <- mbrrows]
 | 
				
			||||||
--     total = headDef 0 mbrtotals
 | 
					--     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 =
 | 
					tests_balanceReport =
 | 
				
			||||||
  let
 | 
					  let
 | 
				
			||||||
    (opts,journal) `gives` r = do
 | 
					    (opts,journal) `gives` r = do
 | 
				
			||||||
 | 
				
			|||||||
@ -8,7 +8,8 @@ Multi-column balance reports, used by the balance command.
 | 
				
			|||||||
module Hledger.Reports.MultiBalanceReports (
 | 
					module Hledger.Reports.MultiBalanceReports (
 | 
				
			||||||
  MultiBalanceReport(..),
 | 
					  MultiBalanceReport(..),
 | 
				
			||||||
  MultiBalanceReportRow,
 | 
					  MultiBalanceReportRow,
 | 
				
			||||||
  multiBalanceReport
 | 
					  multiBalanceReport,
 | 
				
			||||||
 | 
					  multiBalanceReportValue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  -- -- * Tests
 | 
					  -- -- * Tests
 | 
				
			||||||
  -- tests_Hledger_Reports_MultiBalanceReport
 | 
					  -- tests_Hledger_Reports_MultiBalanceReport
 | 
				
			||||||
@ -18,6 +19,7 @@ where
 | 
				
			|||||||
import Data.List
 | 
					import Data.List
 | 
				
			||||||
import Data.Maybe
 | 
					import Data.Maybe
 | 
				
			||||||
import Data.Ord
 | 
					import Data.Ord
 | 
				
			||||||
 | 
					import Data.Time.Calendar
 | 
				
			||||||
import Safe
 | 
					import Safe
 | 
				
			||||||
-- import Test.HUnit
 | 
					-- 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 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
 | 
					      -- 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
 | 
					 ,tests_Hledger_Cli_Balance
 | 
				
			||||||
) where
 | 
					) where
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import Data.List (intercalate, sort)
 | 
					import Data.List (intercalate)
 | 
				
			||||||
import Data.Time.Calendar (Day)
 | 
					 | 
				
			||||||
import Data.Maybe (fromMaybe, isJust)
 | 
					import Data.Maybe (fromMaybe, isJust)
 | 
				
			||||||
import System.Console.CmdArgs.Explicit as C
 | 
					import System.Console.CmdArgs.Explicit as C
 | 
				
			||||||
import Text.CSV
 | 
					import Text.CSV
 | 
				
			||||||
@ -316,41 +315,6 @@ balance opts@CliOpts{reportopts_=ropts} j = do
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
-- single-column balance reports
 | 
					-- 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
 | 
					-- | 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
 | 
					-- 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
 | 
					-- 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
 | 
					-- 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.
 | 
					-- | Render a multi-column balance report as CSV.
 | 
				
			||||||
multiBalanceReportAsCsv :: ReportOpts -> MultiBalanceReport -> CSV
 | 
					multiBalanceReportAsCsv :: ReportOpts -> MultiBalanceReport -> CSV
 | 
				
			||||||
multiBalanceReportAsCsv opts (MultiBalanceReport (colspans, items, (coltotals,tot,avg))) =
 | 
					multiBalanceReportAsCsv opts (MultiBalanceReport (colspans, items, (coltotals,tot,avg))) =
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user