makes sure rounding happens.
This commit is contained in:
@@ -95,28 +95,40 @@
|
||||
(filter #(rule-applies? transaction %))))
|
||||
|
||||
(defn apply-rule [transaction rule valid-locations]
|
||||
(assoc transaction
|
||||
:transaction/matched-rule (:db/id rule)
|
||||
:transaction/approval-status (:transaction-rule/transaction-approval-status rule)
|
||||
:transaction/accounts (mapcat
|
||||
(fn [tra]
|
||||
(if (= "Shared" (:transaction-rule-account/location tra))
|
||||
(map
|
||||
(fn [location]
|
||||
{:transaction-account/account (:db/id (:transaction-rule-account/account tra))
|
||||
:transaction-account/amount (Math/abs (* (/ 1.0 (count valid-locations))
|
||||
(:transaction-rule-account/percentage tra)
|
||||
(:transaction/amount transaction)))
|
||||
:transaction-account/location location})
|
||||
(with-precision 2
|
||||
(let [accounts (vec (mapcat
|
||||
(fn [tra]
|
||||
(if (= "Shared" (:transaction-rule-account/location tra))
|
||||
(map
|
||||
(fn [location]
|
||||
{:transaction-account/account (:db/id (:transaction-rule-account/account tra))
|
||||
:transaction-account/amount (Math/abs (* (/ 1.0 (count valid-locations))
|
||||
(:transaction-rule-account/percentage tra)
|
||||
(:transaction/amount transaction)))
|
||||
:transaction-account/location location})
|
||||
|
||||
|
||||
valid-locations)
|
||||
[{:transaction-account/account (:db/id (:transaction-rule-account/account tra))
|
||||
:transaction-account/amount (Math/abs (* (:transaction-rule-account/percentage tra)
|
||||
(:transaction/amount transaction)))
|
||||
:transaction-account/location (:transaction-rule-account/location tra)}]))
|
||||
(:transaction-rule/accounts rule))
|
||||
:transaction/vendor (:db/id (:transaction-rule/vendor rule))))
|
||||
valid-locations)
|
||||
[{:transaction-account/account (:db/id (:transaction-rule-account/account tra))
|
||||
:transaction-account/amount (Math/abs (* (:transaction-rule-account/percentage tra)
|
||||
(:transaction/amount transaction)))
|
||||
:transaction-account/location (:transaction-rule-account/location tra)}]))
|
||||
(:transaction-rule/accounts rule)))
|
||||
accounts (mapv
|
||||
(fn [a]
|
||||
(update a :transaction-account/amount
|
||||
#(with-precision 2
|
||||
(double (.setScale (bigdec %) 2 java.math.RoundingMode/HALF_UP)))))
|
||||
accounts)
|
||||
leftover (with-precision 2 (.round (bigdec (- (Math/abs (:transaction/amount transaction))
|
||||
(Math/abs (reduce + 0.0 (map #(:transaction-account/amount %) accounts)))))
|
||||
*math-context*))
|
||||
accounts (update-in accounts [(dec (count accounts)) :transaction-account/amount] #(+ % (double leftover)))]
|
||||
(assoc transaction
|
||||
:transaction/matched-rule (:db/id rule)
|
||||
:transaction/approval-status (:transaction-rule/transaction-approval-status rule)
|
||||
:transaction/accounts accounts
|
||||
:transaction/vendor (:db/id (:transaction-rule/vendor rule))))))
|
||||
|
||||
(defn rule-applying-fn [rules]
|
||||
(let [rules-by-priority (group-rules-by-priority rules)]
|
||||
|
||||
Reference in New Issue
Block a user