journal: clarify balance assertion/display precision more (#941)
This commit is contained in:
		
							parent
							
								
									187fcf75ed
								
							
						
					
					
						commit
						c331be7f23
					
				| @ -583,16 +583,25 @@ checkBalanceAssertion p@Posting{pbalanceassertion=Just (BalanceAssertion{baamoun | ||||
|                     | otherwise = [] | ||||
| checkBalanceAssertion _ _ = Right () | ||||
| 
 | ||||
| -- | Does the difference between the asserted balance | ||||
| -- and (the corresponding part of) the actual balance | ||||
| -- appear as zero, when rendered to the greater of | ||||
| -- 1. the standard display precision for the commodity | ||||
| -- 2. the full precision of the asserted amount ? | ||||
| -- The posting is used when creating an error message. | ||||
| checkBalanceAssertionCommodity :: Posting -> Amount -> MixedAmount -> Either String () | ||||
| checkBalanceAssertionCommodity p assertedamt actualbal | ||||
|   -- this effectively compares the actual balance rounded to display precision (I believe), | ||||
|   -- with the asserted balance as written. See examples in balance assertions manual. | ||||
|   | isZeroAmount diff = Right () | ||||
|   | True              = Left err | ||||
|     where | ||||
|       diff = | ||||
|         -- traceWith (("diff:"++).showAmountDebug) $ | ||||
|         -- traceWith (("asserted:"++).showAmountDebug) | ||||
|         assertedamt - | ||||
|         -- traceWith (("actual:"++).showAmountDebug) | ||||
|         actualbalincommodity | ||||
|       assertedcomm = acommodity assertedamt | ||||
|       actualbalincommodity = fromMaybe nullamt $ find ((== assertedcomm) . acommodity) (amounts actualbal) | ||||
|       diff = assertedamt - actualbalincommodity | ||||
|       diffplus | isNegativeAmount diff == False = "+" | ||||
|                | otherwise = "" | ||||
|       err = printf (unlines | ||||
|  | ||||
| @ -468,10 +468,37 @@ flag or `real:` query. | ||||
| 
 | ||||
| ### Assertions and precision | ||||
| 
 | ||||
| The calculated account balance is rounded to display precision before checking. | ||||
| Eg: here the calculated balance is $1.006. The commodity directive causes | ||||
| users, and balance assertions, to see this rounded to two decimal places, ie $1.01, | ||||
| so this assertion passes: | ||||
| A commodity directive which limits the display precision, can affect assertions. | ||||
| 
 | ||||
| In general, hledger balance assertions should pass or fail as you would | ||||
| expect from visual inspection and manual summing of the amounts shown | ||||
| in reports and error messages.  | ||||
| 
 | ||||
| More specifically, assertions pass if the difference between asserted | ||||
| and actual amounts appears to be zero, when rendered to the greater of | ||||
| the standard display precision and the asserted amount's precision. | ||||
| 
 | ||||
| Here are some examples of this in action. | ||||
| 
 | ||||
| Asserting the exact balance: | ||||
| ```journal | ||||
| commodity $1000.00 | ||||
| 
 | ||||
| 2019/01/01 | ||||
|     (a)             $0.006 | ||||
| 
 | ||||
| 2019/01/02 | ||||
|     (a)             $1.00  = $1.006 | ||||
| 
 | ||||
| ; Actual balance:       1.006 | ||||
| ; Asserted balence:     1.006 | ||||
| ; Difference:           0.000 | ||||
| ; Standard & asserted precisions: 2, 3 | ||||
| ; Difference rendered:  0.000 | ||||
| ; Result:               pass | ||||
| ``` | ||||
| 
 | ||||
| Asserting the balance rounded to fewer decimal places: | ||||
| ```journal | ||||
| commodity $1000.00 | ||||
| 
 | ||||
| @ -480,9 +507,16 @@ commodity $1000.00 | ||||
| 
 | ||||
| 2019/01/02 | ||||
|     (a)             $1.00  = $1.01 | ||||
| 
 | ||||
| ; Actual balance:       1.006 | ||||
| ; Asserted balence:     1.01 | ||||
| ; Difference:           0.004 | ||||
| ; Standard & asserted precisions: 2, 2 | ||||
| ; Difference rendered:  0.00 | ||||
| ; Result:               pass | ||||
| ``` | ||||
| 
 | ||||
| The asserted balance is not rounded to display precision. So this assertion fails: | ||||
| Asserting an inexact balance with too many decimal places (fails): | ||||
| ```journal | ||||
| commodity $1000.00 | ||||
| 
 | ||||
| @ -490,9 +524,14 @@ commodity $1000.00 | ||||
|     (a)             $0.006 | ||||
| 
 | ||||
| 2019/01/02 | ||||
|     (a)             $1.00  = $1.007 | ||||
| # calculated: $1.01 | ||||
| # asserted:   $1.007 (difference: +$0.001) | ||||
|     (a)             $1.00  = $1.0061 | ||||
| 
 | ||||
| ; Actual balance:       1.006 | ||||
| ; Asserted balence:     1.0061 | ||||
| ; Difference:           0.0001 | ||||
| ; Standard & asserted precisions: 2, 4 | ||||
| ; Difference rendered:  0.0001 | ||||
| ; Result:               fail | ||||
| ``` | ||||
| 
 | ||||
| ## Balance Assignments | ||||
|  | ||||
| @ -366,9 +366,38 @@ hledger -f- stats | ||||
| >>>2 /unexpected '@'/ | ||||
| >>>=1 | ||||
| 
 | ||||
| # 21. The calculated balance is rounded to display precision before checking. | ||||
| # Here the calculated balance is $1.005 but users, and balance assertions, | ||||
| # see it as $1.00 (because the commodity directive set display precision to 2). | ||||
| # 21. With a commodity directive limiting the display precision.  | ||||
| # Assertions pass if the difference between asserted and actual amounts | ||||
| # appears to be zero, when rendered to the greater of the standard  | ||||
| # display precision and the asserted amount's precision.  | ||||
| # Here, | ||||
| # Actual balance:       1.006 | ||||
| # Asserted balence:     1.006 | ||||
| # Difference:           0.000 | ||||
| # Standard & asserted precisions: 2, 3 | ||||
| # Difference rendered:  0.000 | ||||
| # Result:               pass | ||||
| hledger -f- stats | ||||
| <<< | ||||
| commodity $1000.00 | ||||
| 
 | ||||
| 2019/01/01 | ||||
|     (a)             $0.006 | ||||
| 
 | ||||
| 2019/01/02 | ||||
|     (a)             $1.00  = $1.006 | ||||
| 
 | ||||
| >>> /Transactions/ | ||||
| >>>2 | ||||
| >>>=0 | ||||
| 
 | ||||
| # 22. A rounded assertion amount can also pass. Here, | ||||
| # Actual balance:       1.006 | ||||
| # Asserted balence:     1.01 | ||||
| # Difference:           0.004 | ||||
| # Standard & asserted precisions: 2, 2 | ||||
| # Difference rendered:  0.00 | ||||
| # Result:               pass | ||||
| hledger -f- stats | ||||
| <<< | ||||
| commodity $1000.00 | ||||
| @ -383,7 +412,13 @@ commodity $1000.00 | ||||
| >>>2 | ||||
| >>>=0 | ||||
| 
 | ||||
| # 22. The asserted balance is not rounded to display precision. | ||||
| # 23. A more precise assertion amount can fail. Here, | ||||
| # Actual balance:       1.006 | ||||
| # Asserted balence:     1.0061 | ||||
| # Difference:           0.0001 | ||||
| # Standard & asserted precisions: 2, 4 | ||||
| # Difference rendered:  0.0001 | ||||
| # Result:               fail | ||||
| hledger -f- stats | ||||
| <<< | ||||
| commodity $1000.00 | ||||
| @ -392,8 +427,8 @@ commodity $1000.00 | ||||
|     (a)             $0.006 | ||||
| 
 | ||||
| 2019/01/02 | ||||
|     (a)             $1.00  = $1.007 | ||||
|     (a)             $1.00  = $1.0061 | ||||
| 
 | ||||
| >>> | ||||
| >>>2 /difference: \+\$0\.001/ | ||||
| >>>2 /difference: \+\$0\.0001/ | ||||
| >>>=1 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user