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