lib: showTransaction: fix a case showing multiple missing amounts
Noticed by peti: showTransaction could sometimes hide the last posting's amount even if one of the other posting amounts was already implcit, producing invalid transaction output.
This commit is contained in:
		
							parent
							
								
									b5a90432ff
								
							
						
					
					
						commit
						0d531bb24f
					
				| @ -117,7 +117,8 @@ To facilitate this, postings with explicit multi-commodity amounts | |||||||
| are displayed as multiple similar postings, one per commodity. | are displayed as multiple similar postings, one per commodity. | ||||||
| (Normally does not happen with this function). | (Normally does not happen with this function). | ||||||
| 
 | 
 | ||||||
| If there are multiple postings and the transaction appears obviously balanced | If there are multiple postings, all with explicit amounts, | ||||||
|  | and the transaction appears obviously balanced | ||||||
| (postings sum to 0, without needing to infer conversion prices), | (postings sum to 0, without needing to infer conversion prices), | ||||||
| the last posting's amount will not be shown. | the last posting's amount will not be shown. | ||||||
| -} | -} | ||||||
| @ -171,7 +172,8 @@ renderCommentLines t  = case lines $ T.unpack t of ("":ls) -> "":map commentpref | |||||||
| -- for `print` output. | -- for `print` output. | ||||||
| -- | -- | ||||||
| -- Explicit amounts are shown, implicit amounts are not.  | -- Explicit amounts are shown, implicit amounts are not.  | ||||||
| -- If elide is true and there are multiple postings and the transaction appears obviously balanced | -- If elide is true and there are multiple postings, all with explicit amounts, | ||||||
|  | -- and the transaction appears obviously balanced | ||||||
| -- (postings sum to 0, without needing to infer conversion prices), | -- (postings sum to 0, without needing to infer conversion prices), | ||||||
| -- the last posting's amount will be made implicit (and not shown). | -- the last posting's amount will be made implicit (and not shown). | ||||||
| -- | -- | ||||||
| @ -188,7 +190,7 @@ renderCommentLines t  = case lines $ T.unpack t of ("":ls) -> "":map commentpref | |||||||
| --  | --  | ||||||
| postingsAsLines :: Bool -> Bool -> Transaction -> [Posting] -> [String] | postingsAsLines :: Bool -> Bool -> Transaction -> [Posting] -> [String] | ||||||
| postingsAsLines elide onelineamounts t ps | postingsAsLines elide onelineamounts t ps | ||||||
|     | elide && length ps > 1 && isTransactionBalanced Nothing t -- imprecise balanced check |     | elide && length ps > 1 && all hasAmount ps && isTransactionBalanced Nothing t -- imprecise balanced check | ||||||
|        = (concatMap (postingAsLines False onelineamounts ps) $ init ps) ++ postingAsLines True onelineamounts ps (last ps) |        = (concatMap (postingAsLines False onelineamounts ps) $ init ps) ++ postingAsLines True onelineamounts ps (last ps) | ||||||
|     | otherwise = concatMap (postingAsLines False onelineamounts ps) ps |     | otherwise = concatMap (postingAsLines False onelineamounts ps) ps | ||||||
| 
 | 
 | ||||||
| @ -571,6 +573,12 @@ tests_Transaction = tests "Transaction" [ | |||||||
|             "a" `post` usd 1, |             "a" `post` usd 1, | ||||||
|             "b" `post` hrs (-1) |             "b" `post` hrs (-1) | ||||||
|             ]} |             ]} | ||||||
|  |     -- one missing amount, not the last one | ||||||
|  |     t3 = nulltransaction{tpostings=[ | ||||||
|  |          "a" `post` usd 1 | ||||||
|  |         ,"b" `post` missingamt | ||||||
|  |         ,"c" `post` usd (-1) | ||||||
|  |         ]} | ||||||
|   in |   in | ||||||
|     tests "postingsAsLines" [ |     tests "postingsAsLines" [ | ||||||
| 
 | 
 | ||||||
| @ -619,6 +627,12 @@ tests_Transaction = tests "Transaction" [ | |||||||
|           ,"    b          -1.00h"    -- explicit amount remains explicit since a conversion price would have be inferred to balance |           ,"    b          -1.00h"    -- explicit amount remains explicit since a conversion price would have be inferred to balance | ||||||
|           ] |           ] | ||||||
| 
 | 
 | ||||||
|  |     ,test "implicit-amount-not-last" $ | ||||||
|  |       let t = t3 in postingsAsLines True False t (tpostings t) `is` [ | ||||||
|  |            "    a           $1.00"  | ||||||
|  |           ,"    b" | ||||||
|  |           ,"    c          $-1.00" | ||||||
|  |           ] | ||||||
|    ] |    ] | ||||||
| 
 | 
 | ||||||
|   ,do |   ,do | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user