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
|
where
|
||||||
|
|
||||||
import Control.Applicative ((<|>))
|
import Control.Applicative ((<|>), liftA2)
|
||||||
import Data.Maybe (catMaybes)
|
import Data.Maybe (catMaybes)
|
||||||
import qualified Data.Text as T
|
import qualified Data.Text as T
|
||||||
import Data.Time.Calendar (Day)
|
import Data.Time.Calendar (Day)
|
||||||
@ -21,7 +21,7 @@ import Hledger.Data.Dates
|
|||||||
import Hledger.Data.Amount
|
import Hledger.Data.Amount
|
||||||
import Hledger.Data.Transaction (txnTieKnot)
|
import Hledger.Data.Transaction (txnTieKnot)
|
||||||
import Hledger.Query (Query, filterQuery, matchesAmount, matchesPosting,
|
import Hledger.Query (Query, filterQuery, matchesAmount, matchesPosting,
|
||||||
parseQuery, queryIsSym, simplifyQuery)
|
parseQuery, queryIsAmt, queryIsSym, simplifyQuery)
|
||||||
import Hledger.Data.Posting (commentJoin, commentAddTag)
|
import Hledger.Data.Posting (commentJoin, commentAddTag)
|
||||||
import Hledger.Utils (dbg6, wrap)
|
import Hledger.Utils (dbg6, wrap)
|
||||||
|
|
||||||
@ -81,8 +81,7 @@ transactionModifierToFunction refdate TransactionModifier{tmquerytxt, tmpostingr
|
|||||||
q <- simplifyQuery . fst <$> parseQuery refdate tmquerytxt
|
q <- simplifyQuery . fst <$> parseQuery refdate tmquerytxt
|
||||||
let
|
let
|
||||||
fs = map (tmPostingRuleToFunction q tmquerytxt) tmpostingrules
|
fs = map (tmPostingRuleToFunction q tmquerytxt) tmpostingrules
|
||||||
generatePostings ps = [p' | p <- ps
|
generatePostings ps = concatMap (\p -> p : map ($p) (if q `matchesPosting` p then fs else [])) ps
|
||||||
, p' <- if q `matchesPosting` p then p:[f p | f <- fs] else [p]]
|
|
||||||
Right $ \t@(tpostings -> ps) -> txnTieKnot t{tpostings=generatePostings ps}
|
Right $ \t@(tpostings -> ps) -> txnTieKnot t{tpostings=generatePostings ps}
|
||||||
|
|
||||||
-- | Converts a 'TransactionModifier''s posting rule to a 'Posting'-generating function,
|
-- | Converts a 'TransactionModifier''s posting rule to a 'Posting'-generating function,
|
||||||
@ -106,9 +105,9 @@ tmPostingRuleToFunction query querytxt pr =
|
|||||||
}
|
}
|
||||||
where
|
where
|
||||||
qry = "= " <> querytxt
|
qry = "= " <> querytxt
|
||||||
symq = filterQuery queryIsSym query
|
symq = filterQuery (liftA2 (||) queryIsSym queryIsAmt) query
|
||||||
amount' = case postingRuleMultiplier pr of
|
amount' = case postingRuleMultiplier pr of
|
||||||
Nothing -> const . filterMixedAmount (symq `matchesAmount`) $ pamount pr
|
Nothing -> const $ pamount pr
|
||||||
Just n -> \p ->
|
Just n -> \p ->
|
||||||
-- Multiply the old posting's amount by the posting rule's multiplier.
|
-- Multiply the old posting's amount by the posting rule's multiplier.
|
||||||
let
|
let
|
||||||
|
|||||||
@ -348,6 +348,9 @@ $ hledger -f- print --auto
|
|||||||
= assets cur:USD
|
= assets cur:USD
|
||||||
(b:USD) *1
|
(b:USD) *1
|
||||||
|
|
||||||
|
= assets cur:EUR
|
||||||
|
(b:USD) 5 USD
|
||||||
|
|
||||||
2017-12-14
|
2017-12-14
|
||||||
revenue:job -10 EUR
|
revenue:job -10 EUR
|
||||||
revenue:job -10 USD
|
revenue:job -10 USD
|
||||||
@ -358,6 +361,26 @@ $ hledger -f- print --auto
|
|||||||
revenue:job -10 EUR
|
revenue:job -10 EUR
|
||||||
revenue:job -10 USD
|
revenue:job -10 USD
|
||||||
assets
|
assets
|
||||||
|
(b:USD) 5 USD ; generated-posting: = assets cur:EUR
|
||||||
(b:USD) 10 USD ; generated-posting: = assets cur:USD
|
(b:USD) 10 USD ; generated-posting: = assets cur:USD
|
||||||
|
|
||||||
>=0
|
>=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