Fixes two types of bugs.
This commit is contained in:
@@ -100,25 +100,36 @@
|
||||
(map (fn [r] (update r :transaction-rule/description #(some-> % ->pattern))))
|
||||
(filter #(rule-applies? transaction %))))
|
||||
|
||||
(defn spread-cents [cents n]
|
||||
(let [default-spread (for [x (range n)]
|
||||
(int (* cents (/ 1.0 n))))
|
||||
short-by (- cents (reduce + 0 default-spread)) ;; amount that was lost in the differenc
|
||||
adjusted-spread (map
|
||||
(fn [cents increments]
|
||||
(+ cents increments))
|
||||
|
||||
default-spread
|
||||
(concat (take short-by (repeat 1)) (repeat 0)))]
|
||||
(filter #(> % 0) adjusted-spread)))
|
||||
|
||||
(defn apply-rule [transaction rule valid-locations]
|
||||
(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)
|
||||
[(cond-> {:transaction-account/account (:db/id (:transaction-rule-account/account tra))
|
||||
:transaction-account/amount (Math/abs (* (:transaction-rule-account/percentage tra)
|
||||
(:transaction/amount transaction)))}
|
||||
(:transaction-rule-account/location tra) (assoc :transaction-account/location (:transaction-rule-account/location tra)))]))
|
||||
(let [cents-to-distribute (int (Math/round (Math/abs (* (:transaction-rule-account/percentage tra)
|
||||
(:transaction/amount transaction)
|
||||
100))))]
|
||||
(if (= "Shared" (:transaction-rule-account/location tra))
|
||||
(->> valid-locations
|
||||
(map
|
||||
(fn [cents location]
|
||||
{:transaction-account/account (:db/id (:transaction-rule-account/account tra))
|
||||
:transaction-account/amount (* 0.01 cents)
|
||||
:transaction-account/location location})
|
||||
(spread-cents cents-to-distribute (count valid-locations))))
|
||||
[(cond-> {:transaction-account/account (:db/id (:transaction-rule-account/account tra))
|
||||
:transaction-account/amount (* 0.01 cents-to-distribute)}
|
||||
(:transaction-rule-account/location tra) (assoc :transaction-account/location (:transaction-rule-account/location tra)))])))
|
||||
(filter (comp seq :transaction-rule-account/account) (:transaction-rule/accounts rule))))
|
||||
accounts (mapv
|
||||
(fn [a]
|
||||
|
||||
Reference in New Issue
Block a user