Fixes two types of bugs.

This commit is contained in:
2021-12-09 08:53:36 -08:00
parent f95a3b2c3a
commit 4a7215a74b
7 changed files with 225 additions and 105 deletions

View File

@@ -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]