journal: fix balance assertions/assignments & prices (#824)
Hopefully this is will do it. This restores the past behaviour: - parsing prices in balance assertions/assignments - ignoring them in assertions - using them in assignments - and printing them and clarifies tests and docs.
This commit is contained in:
		
							parent
							
								
									08c0d83593
								
							
						
					
					
						commit
						550e33a558
					
				| @ -737,11 +737,11 @@ balanceassertionp = do | |||||||
|   char '=' |   char '=' | ||||||
|   exact <- optional $ try $ char '=' |   exact <- optional $ try $ char '=' | ||||||
|   lift (skipMany spacenonewline) |   lift (skipMany spacenonewline) | ||||||
|   -- allow this amount to have a price, for compatibility, but discard it |   -- this amount can have a price; balance assertions ignore it, | ||||||
|  |   -- but balance assignments will use it | ||||||
|   a <- amountp <?> "amount (for a balance assertion or assignment)" |   a <- amountp <?> "amount (for a balance assertion or assignment)" | ||||||
|   let a' = a{aprice=NoPrice} |  | ||||||
|   return BalanceAssertion |   return BalanceAssertion | ||||||
|     { baamount = a' |     { baamount = a | ||||||
|     , baexact = isJust exact |     , baexact = isJust exact | ||||||
|     , baposition = sourcepos |     , baposition = sourcepos | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -438,10 +438,18 @@ One workaround is to isolate each commodity into its own subaccount: | |||||||
| 
 | 
 | ||||||
| ### Assertions and prices | ### Assertions and prices | ||||||
| 
 | 
 | ||||||
| Balance assertion (or assignment) amounts should not have a [price](#transaction-prices), | Balance assertions ignore [transaction prices](#transaction-prices), | ||||||
| as the meaning of that is unclear. | and should normally be written without one: | ||||||
| A price written there will be ignored. | 
 | ||||||
| (hledger's [close](/manual.html#close) command used to generate balance assertions with prices.) | ``` journal | ||||||
|  | 2019/1/1 | ||||||
|  |   (a)     $1 @ €1 = $1 | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | We do allow prices to be written there, however, and [print](/manual.html#print) shows them, | ||||||
|  | even though they don't affect whether the assertion passes or fails. | ||||||
|  | This is for backward compatibility (hledger's [close](/manual.html#close) command used to generate balance assertions with prices), | ||||||
|  | and because [balance *assignments*](#balance-assignments) do use them (see below). | ||||||
| 
 | 
 | ||||||
| ### Assertions and subaccounts | ### Assertions and subaccounts | ||||||
| 
 | 
 | ||||||
| @ -505,6 +513,20 @@ Note that using balance assignments makes your journal a little less explicit; | |||||||
| to know the exact amount posted, you have to run hledger or do the calculations yourself, | to know the exact amount posted, you have to run hledger or do the calculations yourself, | ||||||
| instead of just reading it. | instead of just reading it. | ||||||
| 
 | 
 | ||||||
|  | ### Balance assignments and prices | ||||||
|  | 
 | ||||||
|  | A [transaction price](#transaction-prices) in a balance assignment | ||||||
|  | will cause the calculated amount to have that price attached: | ||||||
|  | 
 | ||||||
|  | ``` journal | ||||||
|  | 2019/1/1 | ||||||
|  |   (a)             = $1 @ €2 | ||||||
|  | ``` | ||||||
|  | ``` | ||||||
|  | $ hledger print --explicit | ||||||
|  | 2019/01/01 | ||||||
|  |     (a)         $1 @ €2 = $1 @ €2 | ||||||
|  | ``` | ||||||
| 
 | 
 | ||||||
| ## Transaction prices | ## Transaction prices | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,4 +1,6 @@ | |||||||
| #!/usr/bin/env shelltest | #!/usr/bin/env shelltest | ||||||
|  | # balance assertion & balance assignment tests | ||||||
|  | 
 | ||||||
| # 1. test some balance assertions | # 1. test some balance assertions | ||||||
| hledger -f - stats | hledger -f - stats | ||||||
| <<< | <<< | ||||||
| @ -358,16 +360,46 @@ hledger -f - stats | |||||||
| >>>=0 | >>>=0 | ||||||
| 
 | 
 | ||||||
| # 20. Balance assertions may have a price, but it's ignored | # 20. Balance assertions may have a price, but it's ignored | ||||||
| hledger -f- stats | hledger -f- print | ||||||
| <<< | <<< | ||||||
| 2019/01/01 | 2019/01/01 | ||||||
|     (a)         1A @ 1B = 1A @ 2B |     (a)         1A @ 1B = 1A @ 2B | ||||||
| >>> | >>> | ||||||
| >>>2 /unexpected '@'/ | 2019/01/01 | ||||||
| >>>=1 |     (a)         1A @ 1B = 1A @ 2B | ||||||
| 
 | 
 | ||||||
| # 21. The exact amounts are compared; display precision does not affect assertions. | >>>=0 | ||||||
| hledger -f- stats | 
 | ||||||
|  | # 21. Balance assignments may have a price, and it's used for the posting amount. | ||||||
|  | # But not shown as part of the balance assertion in the resulting posting. | ||||||
|  | hledger -f- print --explicit | ||||||
|  | <<< | ||||||
|  | 2019/01/01 | ||||||
|  |     (a)                 = 1A @ 2B | ||||||
|  | >>> | ||||||
|  | 2019/01/01 | ||||||
|  |     (a)         1A @ 2B = 1A @ 2B | ||||||
|  | 
 | ||||||
|  | >>>=0 | ||||||
|  | 
 | ||||||
|  | # 22. close generates balance assertions without prices | ||||||
|  | hledger -f- close -e 2019/1/2 | ||||||
|  | <<< | ||||||
|  | 2019/01/01 | ||||||
|  |     (a)         1A @ 1B = 1A @ 2B | ||||||
|  | >>> | ||||||
|  | 2019/01/01 closing balances | ||||||
|  |     a                              -1A @ 1B = 0A | ||||||
|  |     equity:closing balances | ||||||
|  | 
 | ||||||
|  | 2019/01/02 opening balances | ||||||
|  |     a                               1A @ 1B = 1A | ||||||
|  |     equity:opening balances | ||||||
|  | 
 | ||||||
|  | >>>=0 | ||||||
|  | 
 | ||||||
|  | # 23. The exact amounts are compared; display precision does not affect assertions. | ||||||
|  | hledger -f- print | ||||||
| <<< | <<< | ||||||
| commodity $1000.00 | commodity $1000.00 | ||||||
| 
 | 
 | ||||||
| @ -377,12 +409,12 @@ commodity $1000.00 | |||||||
| 2019/01/02 | 2019/01/02 | ||||||
|     (a)             $1.00  = $1.006 |     (a)             $1.00  = $1.006 | ||||||
| 
 | 
 | ||||||
| >>> /Transactions/ | >>> /2019/ | ||||||
| >>>2 | >>>2 | ||||||
| >>>=0 | >>>=0 | ||||||
| 
 | 
 | ||||||
| # 22. This fails | # 24. This fails | ||||||
| hledger -f- stats | hledger -f- print | ||||||
| <<< | <<< | ||||||
| commodity $1000.00 | commodity $1000.00 | ||||||
| 
 | 
 | ||||||
| @ -395,8 +427,8 @@ commodity $1000.00 | |||||||
| >>>2 /difference: 0\.004/ | >>>2 /difference: 0\.004/ | ||||||
| >>>=1 | >>>=1 | ||||||
| 
 | 
 | ||||||
| # 23. This fails | # 25. This fails | ||||||
| hledger -f- stats | hledger -f- print | ||||||
| <<< | <<< | ||||||
| commodity $1000.00 | commodity $1000.00 | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user