lib: multiBalanceReport: Don't import BalanceReport in MultiBalanceReport.
This commit is contained in:
parent
0dcfddd201
commit
b2bed03b4c
@ -42,7 +42,6 @@ import Hledger.Utils
|
|||||||
import Hledger.Read (mamountp')
|
import Hledger.Read (mamountp')
|
||||||
import Hledger.Reports.ReportOptions
|
import Hledger.Reports.ReportOptions
|
||||||
import Hledger.Reports.ReportTypes
|
import Hledger.Reports.ReportTypes
|
||||||
import Hledger.Reports.BalanceReport
|
|
||||||
|
|
||||||
|
|
||||||
-- | A multi balance report is a kind of periodic report, where the amounts
|
-- | A multi balance report is a kind of periodic report, where the amounts
|
||||||
@ -294,10 +293,10 @@ multiBalanceReportWith ropts@ReportOpts{..} q j priceoracle =
|
|||||||
-- Balances at report start date, from all earlier postings which otherwise match the query.
|
-- Balances at report start date, from all earlier postings which otherwise match the query.
|
||||||
-- These balances are unvalued except maybe converted to cost.
|
-- These balances are unvalued except maybe converted to cost.
|
||||||
startingBalances :: ReportOpts -> Query -> Journal -> DateSpan -> HashMap AccountName MixedAmount
|
startingBalances :: ReportOpts -> Query -> Journal -> DateSpan -> HashMap AccountName MixedAmount
|
||||||
startingBalances ropts q j reportspan = HM.fromList $ map (\(a,_,_,b) -> (a,b)) startbalanceitems
|
startingBalances ropts q j reportspan = acctchanges
|
||||||
where
|
where
|
||||||
(startbalanceitems,_) = dbg'' "starting balance report" $
|
acctchanges = acctChangesFromPostings ropts'' startbalq . map fst $
|
||||||
balanceReport ropts''{value_=Nothing, percent_=False} startbalq j
|
getPostings ropts'' startbalq j
|
||||||
|
|
||||||
-- q projected back before the report start date.
|
-- q projected back before the report start date.
|
||||||
-- When there's no report start date, in case there are future txns (the hledger-ui case above),
|
-- When there's no report start date, in case there are future txns (the hledger-ui case above),
|
||||||
@ -325,7 +324,7 @@ getPostings ropts q =
|
|||||||
filterJournalAmounts symq . -- remove amount parts excluded by cur:
|
filterJournalAmounts symq . -- remove amount parts excluded by cur:
|
||||||
filterJournalPostings reportq -- remove postings not matched by (adjusted) query
|
filterJournalPostings reportq -- remove postings not matched by (adjusted) query
|
||||||
where
|
where
|
||||||
symq = dbg "symq" . filterQuery queryIsSym $ dbg1 "requested q" q
|
symq = dbg "symq" . filterQuery queryIsSym $ dbg "requested q" q
|
||||||
-- The user's query with no depth limit, and expanded to the report span
|
-- The user's query with no depth limit, and expanded to the report span
|
||||||
-- if there is one (otherwise any date queries are left as-is, which
|
-- if there is one (otherwise any date queries are left as-is, which
|
||||||
-- handles the hledger-ui+future txns case above).
|
-- handles the hledger-ui+future txns case above).
|
||||||
@ -342,9 +341,9 @@ makeReportQuery ropts reportspan q
|
|||||||
| reportspan == nulldatespan = depthlessq
|
| reportspan == nulldatespan = depthlessq
|
||||||
| otherwise = And [dateless depthlessq, reportspandatesq]
|
| otherwise = And [dateless depthlessq, reportspandatesq]
|
||||||
where
|
where
|
||||||
depthlessq = dbg1 "depthless" $ filterQuery (not . queryIsDepth) q
|
depthlessq = dbg "depthless" $ filterQuery (not . queryIsDepth) q
|
||||||
reportspandatesq = dbg1 "reportspandatesq" $ dateqcons reportspan
|
reportspandatesq = dbg "reportspandatesq" $ dateqcons reportspan
|
||||||
dateless = dbg1 "dateless" . filterQuery (not . queryIsDateOrDate2)
|
dateless = dbg "dateless" . filterQuery (not . queryIsDateOrDate2)
|
||||||
dateqcons = if date2_ ropts then Date2 else Date
|
dateqcons = if date2_ ropts then Date2 else Date
|
||||||
|
|
||||||
-- | Calculate the DateSpans to be used for the columns of the report.
|
-- | Calculate the DateSpans to be used for the columns of the report.
|
||||||
@ -377,7 +376,7 @@ acctChangesFromPostings ropts q ps =
|
|||||||
depthLimit
|
depthLimit
|
||||||
| tree_ ropts = filter ((depthq `matchesAccount`) . aname) -- exclude deeper balances
|
| tree_ ropts = filter ((depthq `matchesAccount`) . aname) -- exclude deeper balances
|
||||||
| otherwise = clipAccountsAndAggregate $ queryDepth depthq -- aggregate deeper balances at the depth limit
|
| otherwise = clipAccountsAndAggregate $ queryDepth depthq -- aggregate deeper balances at the depth limit
|
||||||
depthq = dbg1 "depthq" $ filterQuery queryIsDepth q
|
depthq = dbg "depthq" $ filterQuery queryIsDepth q
|
||||||
|
|
||||||
-- | Gather the account balance changes into a regular matrix including the accounts
|
-- | Gather the account balance changes into a regular matrix including the accounts
|
||||||
-- from all columns
|
-- from all columns
|
||||||
@ -400,7 +399,8 @@ calculateAccountChanges ropts q startbals colps = acctchanges
|
|||||||
-- in order to support --historical. Does not support tree-mode boring parent eliding.
|
-- in order to support --historical. Does not support tree-mode boring parent eliding.
|
||||||
-- If the normalbalance_ option is set, it adjusts the sorting and sign of amounts
|
-- If the normalbalance_ option is set, it adjusts the sorting and sign of amounts
|
||||||
-- (see ReportOpts and CompoundBalanceCommand).
|
-- (see ReportOpts and CompoundBalanceCommand).
|
||||||
balanceReportFromMultiBalanceReport :: ReportOpts -> Query -> Journal -> BalanceReport
|
balanceReportFromMultiBalanceReport :: ReportOpts -> Query -> Journal
|
||||||
|
-> ([(AccountName, AccountName, Int, MixedAmount)], MixedAmount)
|
||||||
balanceReportFromMultiBalanceReport opts q j = (rows', total)
|
balanceReportFromMultiBalanceReport opts q j = (rows', total)
|
||||||
where
|
where
|
||||||
PeriodicReport _ rows (PeriodicReportRow _ _ totals _ _) =
|
PeriodicReport _ rows (PeriodicReportRow _ _ totals _ _) =
|
||||||
@ -425,6 +425,38 @@ transposeMap xs = M.foldrWithKey addSpan mempty xs
|
|||||||
|
|
||||||
emptySpanMap = nullmixedamt <$ xs
|
emptySpanMap = nullmixedamt <$ xs
|
||||||
|
|
||||||
|
-- | A sorting helper: sort a list of things (eg report rows) keyed by account name
|
||||||
|
-- to match the provided ordering of those same account names.
|
||||||
|
sortAccountItemsLike :: [AccountName] -> [(AccountName, b)] -> [b]
|
||||||
|
sortAccountItemsLike sortedas items =
|
||||||
|
concatMap (\a -> maybe [] (:[]) $ lookup a items) sortedas
|
||||||
|
|
||||||
|
-- | Helper to unify a MixedAmount to a single commodity value.
|
||||||
|
-- Like normaliseMixedAmount, this consolidates amounts of the same commodity
|
||||||
|
-- and discards zero amounts; but this one insists on simplifying to
|
||||||
|
-- a single commodity, and will throw a program-terminating error if
|
||||||
|
-- this is not possible.
|
||||||
|
unifyMixedAmount :: MixedAmount -> Amount
|
||||||
|
unifyMixedAmount mixedAmount = foldl combine (num 0) (amounts mixedAmount)
|
||||||
|
where
|
||||||
|
combine amount result =
|
||||||
|
if amountIsZero amount
|
||||||
|
then result
|
||||||
|
else if amountIsZero result
|
||||||
|
then amount
|
||||||
|
else if acommodity amount == acommodity result
|
||||||
|
then amount + result
|
||||||
|
else error' "Cannot calculate percentages for accounts with multiple commodities. (Hint: Try --cost, -V or similar flags.)"
|
||||||
|
|
||||||
|
-- | Helper to calculate the percentage from two mixed. Keeps the sign of the first argument.
|
||||||
|
-- Uses unifyMixedAmount to unify each argument and then divides them.
|
||||||
|
perdivide :: MixedAmount -> MixedAmount -> MixedAmount
|
||||||
|
perdivide a b =
|
||||||
|
let a' = unifyMixedAmount a
|
||||||
|
b' = unifyMixedAmount b
|
||||||
|
in if amountIsZero a' || amountIsZero b' || acommodity a' == acommodity b'
|
||||||
|
then mixed [per $ if aquantity b' == 0 then 0 else (aquantity a' / abs (aquantity b') * 100)]
|
||||||
|
else error' "Cannot calculate percentages if accounts have different commodities. (Hint: Try --cost, -V or similar flags.)"
|
||||||
|
|
||||||
-- Local debug helper
|
-- Local debug helper
|
||||||
-- add a prefix to this function's debug output
|
-- add a prefix to this function's debug output
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user