lib: multiBalanceReport: Split sortRows into a separate function.
This commit is contained in:
		
							parent
							
								
									7a9bf998e5
								
							
						
					
					
						commit
						0b30b2f9fb
					
				| @ -141,10 +141,6 @@ multiBalanceReportWith ropts@ReportOpts{..} q j priceoracle = | ||||
|       -- Process changes into normal, cumulative, or historical amounts, plus value them | ||||
|       accumvalued = dbg'' "accumvalued" $ accumValueAmounts ropts j priceoracle startbals acctchanges | ||||
| 
 | ||||
|       ---------------------------------------------------------------------- | ||||
|       -- 5. Gather the account balance changes into a regular matrix including the accounts | ||||
|       -- from all columns (and with -H, accounts with starting balances), adding zeroes where needed. | ||||
| 
 | ||||
|       -- All account names that will be displayed, possibly depth-clipped. | ||||
|       displayaccts :: [ClippedAccountName] = | ||||
|           dbg'' "displayaccts" $ | ||||
| @ -160,49 +156,8 @@ multiBalanceReportWith ropts@ReportOpts{..} q j priceoracle = | ||||
|       -- All the rows of the report. | ||||
|       rows = dbg'' "rows" $ buildReportRows ropts reportq accumvalued | ||||
| 
 | ||||
|       ---------------------------------------------------------------------- | ||||
|       -- 7. Sort the report rows. | ||||
| 
 | ||||
|       -- Sort the rows by amount or by account declaration order. This is a bit tricky. | ||||
|       -- TODO: is it always ok to sort report rows after report has been generated, as a separate step ? | ||||
|       sortedrows :: [MultiBalanceReportRow] = | ||||
|         dbg' "sortedrows" $ | ||||
|         sortrows rows | ||||
|         where | ||||
|           sortrows | ||||
|             | sort_amount_ && accountlistmode_ == ALTree = sortTreeMBRByAmount | ||||
|             | sort_amount_                               = sortFlatMBRByAmount | ||||
|             | otherwise                                  = sortMBRByAccountDeclaration | ||||
|             where | ||||
|               -- Sort the report rows, representing a tree of accounts, by row total at each level. | ||||
|               -- Similar to sortMBRByAccountDeclaration/sortAccountNamesByDeclaration. | ||||
|               sortTreeMBRByAmount :: [MultiBalanceReportRow] -> [MultiBalanceReportRow] | ||||
|               sortTreeMBRByAmount rows = sortedrows | ||||
|                 where | ||||
|                   anamesandrows = [(prrName r, r) | r <- rows] | ||||
|                   anames = map fst anamesandrows | ||||
|                   atotals = [(prrName r, prrTotal r) | r <- rows] | ||||
|                   accounttree = accountTree "root" anames | ||||
|                   accounttreewithbals = mapAccounts setibalance accounttree | ||||
|                     where | ||||
|                       -- should not happen, but it's dangerous; TODO | ||||
|                       setibalance a = a{aibalance=fromMaybe (error "sortTreeMBRByAmount 1") $ lookup (aname a) atotals} | ||||
|                   sortedaccounttree = sortAccountTreeByAmount (fromMaybe NormallyPositive normalbalance_) accounttreewithbals | ||||
|                   sortedanames = map aname $ drop 1 $ flattenAccounts sortedaccounttree | ||||
|                   sortedrows = sortAccountItemsLike sortedanames anamesandrows | ||||
| 
 | ||||
|               -- Sort the report rows, representing a flat account list, by row total. | ||||
|               sortFlatMBRByAmount = sortBy (maybeflip $ comparing (normaliseMixedAmountSquashPricesForDisplay . prrTotal)) | ||||
|                 where | ||||
|                   maybeflip = if normalbalance_ == Just NormallyNegative then id else flip | ||||
| 
 | ||||
|               -- Sort the report rows by account declaration order then account name. | ||||
|               sortMBRByAccountDeclaration rows = sortedrows | ||||
|                 where | ||||
|                   anamesandrows = [(prrName r, r) | r <- rows] | ||||
|                   anames = map fst anamesandrows | ||||
|                   sortedanames = sortAccountNamesByDeclaration j (tree_ ropts) anames | ||||
|                   sortedrows = sortAccountItemsLike sortedanames anamesandrows | ||||
|       -- Sorted report rows. | ||||
|       sortedrows = dbg' "sortedrows" $ sortRows ropts j rows | ||||
| 
 | ||||
|       ---------------------------------------------------------------------- | ||||
|       -- 8. Build the report totals row. | ||||
| @ -402,6 +357,44 @@ buildReportRows ropts q acctvalues = | ||||
|     , empty_ ropts || queryDepth q == 0 || any (not . mixedAmountLooksZero) rowbals  -- TODO: Remove this eventually, to be handled elswhere | ||||
|     ] | ||||
| 
 | ||||
| -- | Sort the rows by amount or by account declaration order. This is a bit tricky. | ||||
| -- TODO: is it always ok to sort report rows after report has been generated, as a separate step ? | ||||
| sortRows :: ReportOpts -> Journal -> [MultiBalanceReportRow] -> [MultiBalanceReportRow] | ||||
| sortRows ropts j | ||||
|     | sort_amount_ ropts && accountlistmode_ ropts == ALTree = sortTreeMBRByAmount | ||||
|     | sort_amount_ ropts                                     = sortFlatMBRByAmount | ||||
|     | otherwise                                              = sortMBRByAccountDeclaration | ||||
|   where | ||||
|     -- Sort the report rows, representing a tree of accounts, by row total at each level. | ||||
|     -- Similar to sortMBRByAccountDeclaration/sortAccountNamesByDeclaration. | ||||
|     sortTreeMBRByAmount :: [MultiBalanceReportRow] -> [MultiBalanceReportRow] | ||||
|     sortTreeMBRByAmount rows = sortedrows | ||||
|       where | ||||
|         anamesandrows = [(prrName r, r) | r <- rows] | ||||
|         anames = map fst anamesandrows | ||||
|         atotals = [(prrName r, prrTotal r) | r <- rows] | ||||
|         accounttree = accountTree "root" anames | ||||
|         accounttreewithbals = mapAccounts setibalance accounttree | ||||
|           where | ||||
|             -- should not happen, but it's dangerous; TODO | ||||
|             setibalance a = a{aibalance=fromMaybe (error "sortTreeMBRByAmount 1") $ lookup (aname a) atotals} | ||||
|         sortedaccounttree = sortAccountTreeByAmount (fromMaybe NormallyPositive $ normalbalance_ ropts) accounttreewithbals | ||||
|         sortedanames = map aname $ drop 1 $ flattenAccounts sortedaccounttree | ||||
|         sortedrows = sortAccountItemsLike sortedanames anamesandrows | ||||
| 
 | ||||
|     -- Sort the report rows, representing a flat account list, by row total. | ||||
|     sortFlatMBRByAmount = sortBy (maybeflip $ comparing (normaliseMixedAmountSquashPricesForDisplay . prrTotal)) | ||||
|       where | ||||
|         maybeflip = if normalbalance_ ropts == Just NormallyNegative then id else flip | ||||
| 
 | ||||
|     -- Sort the report rows by account declaration order then account name. | ||||
|     sortMBRByAccountDeclaration rows = sortedrows | ||||
|       where | ||||
|         anamesandrows = [(prrName r, r) | r <- rows] | ||||
|         anames = map fst anamesandrows | ||||
|         sortedanames = sortAccountNamesByDeclaration j (tree_ ropts) anames | ||||
|         sortedrows = sortAccountItemsLike sortedanames anamesandrows | ||||
| 
 | ||||
| 
 | ||||
| -- | Generates a simple non-columnar BalanceReport, but using multiBalanceReport, | ||||
| -- in order to support --historical. Does not support tree-mode boring parent eliding. | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user