mirror of
https://github.com/simonmichael/hledger.git
synced 2024-09-20 02:37:12 +03:00
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.Reports.ReportOptions
|
||||
import Hledger.Reports.ReportTypes
|
||||
import Hledger.Reports.BalanceReport
|
||||
|
||||
|
||||
-- | 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.
|
||||
-- These balances are unvalued except maybe converted to cost.
|
||||
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
|
||||
(startbalanceitems,_) = dbg'' "starting balance report" $
|
||||
balanceReport ropts''{value_=Nothing, percent_=False} startbalq j
|
||||
acctchanges = acctChangesFromPostings ropts'' startbalq . map fst $
|
||||
getPostings ropts'' startbalq j
|
||||
|
||||
-- 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),
|
||||
@ -325,7 +324,7 @@ getPostings ropts q =
|
||||
filterJournalAmounts symq . -- remove amount parts excluded by cur:
|
||||
filterJournalPostings reportq -- remove postings not matched by (adjusted) query
|
||||
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
|
||||
-- if there is one (otherwise any date queries are left as-is, which
|
||||
-- handles the hledger-ui+future txns case above).
|
||||
@ -342,9 +341,9 @@ makeReportQuery ropts reportspan q
|
||||
| reportspan == nulldatespan = depthlessq
|
||||
| otherwise = And [dateless depthlessq, reportspandatesq]
|
||||
where
|
||||
depthlessq = dbg1 "depthless" $ filterQuery (not . queryIsDepth) q
|
||||
reportspandatesq = dbg1 "reportspandatesq" $ dateqcons reportspan
|
||||
dateless = dbg1 "dateless" . filterQuery (not . queryIsDateOrDate2)
|
||||
depthlessq = dbg "depthless" $ filterQuery (not . queryIsDepth) q
|
||||
reportspandatesq = dbg "reportspandatesq" $ dateqcons reportspan
|
||||
dateless = dbg "dateless" . filterQuery (not . queryIsDateOrDate2)
|
||||
dateqcons = if date2_ ropts then Date2 else Date
|
||||
|
||||
-- | Calculate the DateSpans to be used for the columns of the report.
|
||||
@ -377,7 +376,7 @@ acctChangesFromPostings ropts q ps =
|
||||
depthLimit
|
||||
| tree_ ropts = filter ((depthq `matchesAccount`) . aname) -- exclude deeper balances
|
||||
| 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
|
||||
-- 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.
|
||||
-- If the normalbalance_ option is set, it adjusts the sorting and sign of amounts
|
||||
-- (see ReportOpts and CompoundBalanceCommand).
|
||||
balanceReportFromMultiBalanceReport :: ReportOpts -> Query -> Journal -> BalanceReport
|
||||
balanceReportFromMultiBalanceReport :: ReportOpts -> Query -> Journal
|
||||
-> ([(AccountName, AccountName, Int, MixedAmount)], MixedAmount)
|
||||
balanceReportFromMultiBalanceReport opts q j = (rows', total)
|
||||
where
|
||||
PeriodicReport _ rows (PeriodicReportRow _ _ totals _ _) =
|
||||
@ -425,6 +425,38 @@ transposeMap xs = M.foldrWithKey addSpan mempty 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
|
||||
-- add a prefix to this function's debug output
|
||||
|
Loading…
Reference in New Issue
Block a user