lib: Auto-postings with Amount queries should filter only those commodities which match the query.
Also corrects a regression introduced in 8ab29f84b32288a34ae7627a2204081fae31900f where transaction modifier postings without multipliers would incorrectly be filtered by commodity.
This commit is contained in:
		
							parent
							
								
									9ffed51f54
								
							
						
					
					
						commit
						e2198ff1ee
					
				| @ -12,7 +12,7 @@ module Hledger.Data.TransactionModifier ( | ||||
| ) | ||||
| where | ||||
| 
 | ||||
| import Control.Applicative ((<|>)) | ||||
| import Control.Applicative ((<|>), liftA2) | ||||
| import Data.Maybe (catMaybes) | ||||
| import qualified Data.Text as T | ||||
| import Data.Time.Calendar (Day) | ||||
| @ -21,7 +21,7 @@ import Hledger.Data.Dates | ||||
| import Hledger.Data.Amount | ||||
| import Hledger.Data.Transaction (txnTieKnot) | ||||
| import Hledger.Query (Query, filterQuery, matchesAmount, matchesPosting, | ||||
|                       parseQuery, queryIsSym, simplifyQuery) | ||||
|                       parseQuery, queryIsAmt, queryIsSym, simplifyQuery) | ||||
| import Hledger.Data.Posting (commentJoin, commentAddTag) | ||||
| import Hledger.Utils (dbg6, wrap) | ||||
| 
 | ||||
| @ -81,8 +81,7 @@ transactionModifierToFunction refdate TransactionModifier{tmquerytxt, tmpostingr | ||||
|   q <- simplifyQuery . fst <$> parseQuery refdate tmquerytxt | ||||
|   let | ||||
|     fs = map (tmPostingRuleToFunction q tmquerytxt) tmpostingrules | ||||
|     generatePostings ps = [p' | p <- ps | ||||
|                               , p' <- if q `matchesPosting` p then p:[f p | f <- fs] else [p]] | ||||
|     generatePostings ps = concatMap (\p -> p : map ($p) (if q `matchesPosting` p then fs else [])) ps | ||||
|   Right $ \t@(tpostings -> ps) -> txnTieKnot t{tpostings=generatePostings ps} | ||||
| 
 | ||||
| -- | Converts a 'TransactionModifier''s posting rule to a 'Posting'-generating function, | ||||
| @ -106,9 +105,9 @@ tmPostingRuleToFunction query querytxt pr = | ||||
|       } | ||||
|   where | ||||
|     qry = "= " <> querytxt | ||||
|     symq = filterQuery queryIsSym query | ||||
|     symq = filterQuery (liftA2 (||) queryIsSym queryIsAmt) query | ||||
|     amount' = case postingRuleMultiplier pr of | ||||
|         Nothing -> const . filterMixedAmount (symq `matchesAmount`) $ pamount pr | ||||
|         Nothing -> const $ pamount pr | ||||
|         Just n  -> \p -> | ||||
|           -- Multiply the old posting's amount by the posting rule's multiplier. | ||||
|           let | ||||
|  | ||||
| @ -348,6 +348,9 @@ $ hledger -f- print --auto | ||||
| = assets cur:USD | ||||
|   (b:USD)  *1 | ||||
| 
 | ||||
| = assets cur:EUR | ||||
|   (b:USD)  5 USD | ||||
| 
 | ||||
| 2017-12-14 | ||||
|   revenue:job  -10 EUR | ||||
|   revenue:job  -10 USD | ||||
| @ -358,6 +361,26 @@ $ hledger -f- print --auto | ||||
|     revenue:job         -10 EUR | ||||
|     revenue:job         -10 USD | ||||
|     assets | ||||
|     (b:USD)               5 USD  ; generated-posting: = assets cur:EUR | ||||
|     (b:USD)              10 USD  ; generated-posting: = assets cur:USD | ||||
| 
 | ||||
| >=0 | ||||
| 
 | ||||
| # 19. Auto-generated postings match only the amounts which match amount query. | ||||
| < | ||||
| = assets amt:>50 | ||||
|   (b)  *1 | ||||
| 
 | ||||
| 2017-12-14 | ||||
|   revenue:job   -10 USD | ||||
|   revenue:job  -100 EUR | ||||
|   assets | ||||
| 
 | ||||
| $ hledger -f- print --auto | ||||
| 2017-12-14  ; modified: | ||||
|     revenue:job         -10 USD | ||||
|     revenue:job        -100 EUR | ||||
|     assets | ||||
|     (b)                 100 EUR  ; generated-posting: = assets amt:>50 | ||||
| 
 | ||||
| >=0 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user