Maybe makes transactions less stuck
This commit is contained in:
@@ -3,7 +3,7 @@
|
|||||||
(:require [datomic.api :as dc]))
|
(:require [datomic.api :as dc]))
|
||||||
|
|
||||||
(defn -random-tempid []
|
(defn -random-tempid []
|
||||||
(str (UUID/randomUUID)))
|
(dc/tempid :db.part/user))
|
||||||
|
|
||||||
(defn get-line-items-after [db journal-entry]
|
(defn get-line-items-after [db journal-entry]
|
||||||
(for [jel (:journal-entry/line-items journal-entry)
|
(for [jel (:journal-entry/line-items journal-entry)
|
||||||
@@ -11,15 +11,13 @@
|
|||||||
:selector [:db/id :journal-entry-line/client+account+location+date]
|
:selector [:db/id :journal-entry-line/client+account+location+date]
|
||||||
:start [:journal-entry-line/client+account+location+date
|
:start [:journal-entry-line/client+account+location+date
|
||||||
(:journal-entry-line/client+account+location+date jel)
|
(:journal-entry-line/client+account+location+date jel)
|
||||||
(:db/id jel)]
|
(:db/id jel)]})
|
||||||
})
|
|
||||||
(take-while (fn line-must-match-client-account-location [result]
|
(take-while (fn line-must-match-client-account-location [result]
|
||||||
(and
|
(and
|
||||||
(= (take 3 (:journal-entry-line/client+account+location+date result))
|
(= (take 3 (:journal-entry-line/client+account+location+date result))
|
||||||
(take 3 (:journal-entry-line/client+account+location+date jel)))
|
(take 3 (:journal-entry-line/client+account+location+date jel)))
|
||||||
(not= (:db/id jel)
|
(not= (:db/id jel)
|
||||||
(:db/id result)))
|
(:db/id result)))))
|
||||||
))
|
|
||||||
(take 2))
|
(take 2))
|
||||||
:when next-jel]
|
:when next-jel]
|
||||||
(:db/id next-jel)))
|
(:db/id next-jel)))
|
||||||
@@ -29,8 +27,8 @@
|
|||||||
|
|
||||||
(defn calc-client+account+location+date [je jel]
|
(defn calc-client+account+location+date [je jel]
|
||||||
[(or
|
[(or
|
||||||
(:db/id (:journal-entry/client je))
|
(:db/id (:journal-entry/client je))
|
||||||
(:journal-entry/client je))
|
(:journal-entry/client je))
|
||||||
(or (:db/id (:journal-entry-line/account jel))
|
(or (:db/id (:journal-entry-line/account jel))
|
||||||
(:journal-entry-line/account jel))
|
(:journal-entry-line/account jel))
|
||||||
(-> jel :journal-entry-line/location)
|
(-> jel :journal-entry-line/location)
|
||||||
|
|||||||
@@ -3,13 +3,12 @@
|
|||||||
|
|
||||||
(defn -remove-nils [m]
|
(defn -remove-nils [m]
|
||||||
(let [result (reduce-kv
|
(let [result (reduce-kv
|
||||||
(fn [m k v]
|
(fn [m k v]
|
||||||
(if (not (nil? v))
|
(if (not (nil? v))
|
||||||
(assoc m k v)
|
(assoc m k v)
|
||||||
m
|
m))
|
||||||
))
|
{}
|
||||||
{}
|
m)]
|
||||||
m)]
|
|
||||||
(if (seq result)
|
(if (seq result)
|
||||||
result
|
result
|
||||||
nil)))
|
nil)))
|
||||||
@@ -17,18 +16,18 @@
|
|||||||
(defn transaction->journal-entry
|
(defn transaction->journal-entry
|
||||||
[db transaction-id raw-transaction-id]
|
[db transaction-id raw-transaction-id]
|
||||||
(let [entity (dc/pull db [:transaction/client
|
(let [entity (dc/pull db [:transaction/client
|
||||||
:transaction/date
|
:transaction/date
|
||||||
:transaction/description-original
|
:transaction/description-original
|
||||||
:db/id
|
:db/id
|
||||||
:transaction/vendor
|
:transaction/vendor
|
||||||
:transaction/amount
|
:transaction/amount
|
||||||
:transaction/cleared-against
|
:transaction/cleared-against
|
||||||
{:transaction/accounts [:transaction-account/account
|
{:transaction/accounts [:transaction-account/account
|
||||||
:transaction-account/location
|
:transaction-account/location
|
||||||
:transaction-account/amount]
|
:transaction-account/amount]
|
||||||
:transaction/approval-status [:db/ident]
|
:transaction/approval-status [:db/ident]
|
||||||
:transaction/bank-account [:db/id {:bank-account/type [:db/ident]}]}]
|
:transaction/bank-account [:db/id {:bank-account/type [:db/ident]}]}]
|
||||||
transaction-id)
|
transaction-id)
|
||||||
decreasing? (< (or (:transaction/amount entity) 0.0) 0.0)
|
decreasing? (< (or (:transaction/amount entity) 0.0) 0.0)
|
||||||
credit-from-bank? decreasing?
|
credit-from-bank? decreasing?
|
||||||
debit-from-bank? (not decreasing?)]
|
debit-from-bank? (not decreasing?)]
|
||||||
@@ -37,50 +36,75 @@
|
|||||||
(:transaction/amount entity)
|
(:transaction/amount entity)
|
||||||
(not (< -0.001 (:transaction/amount entity) 0.001)))
|
(not (< -0.001 (:transaction/amount entity) 0.001)))
|
||||||
(-remove-nils
|
(-remove-nils
|
||||||
{:journal-entry/source "transaction"
|
{:journal-entry/source "transaction"
|
||||||
:journal-entry/client (:db/id (:transaction/client entity))
|
:journal-entry/client (:db/id (:transaction/client entity))
|
||||||
:journal-entry/date (:transaction/date entity)
|
:journal-entry/date (:transaction/date entity)
|
||||||
:journal-entry/original-entity raw-transaction-id
|
:journal-entry/original-entity raw-transaction-id
|
||||||
:journal-entry/alternate-description (:transaction/description-original entity)
|
:journal-entry/alternate-description (:transaction/description-original entity)
|
||||||
:journal-entry/vendor (:db/id (:transaction/vendor entity))
|
:journal-entry/vendor (:db/id (:transaction/vendor entity))
|
||||||
:journal-entry/amount (Math/abs (:transaction/amount entity))
|
:journal-entry/amount (Math/abs (:transaction/amount entity))
|
||||||
:journal-entry/cleared-against (:transaction/cleared-against entity)
|
:journal-entry/cleared-against (:transaction/cleared-against entity)
|
||||||
|
|
||||||
:journal-entry/line-items (into [(-remove-nils {:journal-entry-line/account (:db/id (:transaction/bank-account entity))
|
:journal-entry/line-items (into [(-remove-nils {:journal-entry-line/account (:db/id (:transaction/bank-account entity))
|
||||||
:db/id (str raw-transaction-id "-" 0)
|
:db/id (str raw-transaction-id "-" 0)
|
||||||
:journal-entry-line/location "A"
|
:journal-entry-line/location "A"
|
||||||
:journal-entry-line/credit (when credit-from-bank?
|
:journal-entry-line/credit (when credit-from-bank?
|
||||||
(Math/abs (:transaction/amount entity)))
|
(Math/abs (:transaction/amount entity)))
|
||||||
:journal-entry-line/debit (when debit-from-bank?
|
:journal-entry-line/debit (when debit-from-bank?
|
||||||
(Math/abs (:transaction/amount entity)))})
|
(Math/abs (:transaction/amount entity)))})]
|
||||||
]
|
(map-indexed
|
||||||
(map-indexed
|
(fn [i a]
|
||||||
(fn [i a]
|
(-remove-nils {:db/id (str raw-transaction-id "-" (inc i))
|
||||||
(-remove-nils{
|
:journal-entry-line/account (:db/id (:transaction-account/account a))
|
||||||
:db/id (str raw-transaction-id "-" (inc i))
|
:journal-entry-line/location (:transaction-account/location a)
|
||||||
:journal-entry-line/account (:db/id (:transaction-account/account a))
|
:journal-entry-line/debit (when credit-from-bank?
|
||||||
:journal-entry-line/location (:transaction-account/location a)
|
(Math/abs (:transaction-account/amount a)))
|
||||||
:journal-entry-line/debit (when credit-from-bank?
|
:journal-entry-line/credit (when debit-from-bank?
|
||||||
(Math/abs (:transaction-account/amount a)))
|
(Math/abs (:transaction-account/amount a)))}))
|
||||||
:journal-entry-line/credit (when debit-from-bank?
|
(if (seq (:transaction/accounts entity))
|
||||||
(Math/abs (:transaction-account/amount a)))}))
|
(:transaction/accounts entity)
|
||||||
(if (seq (:transaction/accounts entity))
|
[{:transaction-account/amount (:transaction/amount entity)}])))
|
||||||
(:transaction/accounts entity)
|
|
||||||
[{:transaction-account/amount (:transaction/amount entity)}])))
|
|
||||||
|
|
||||||
:journal-entry/cleared true}))))
|
:journal-entry/cleared true}))))
|
||||||
|
|
||||||
(defn upsert-transaction [db transaction]
|
(defn upsert-transaction [db transaction]
|
||||||
;; because some transactions will reference temp ids, you have to dissoc them, like :transaction/payment
|
;; because some transactions will reference temp ids, you have to dissoc them, like :transaction/payment
|
||||||
(let [upserted-entity [[:upsert-entity (dissoc transaction :transaction/payment :import-batch/_entry)]]
|
(let [upserted-entity [[:upsert-entity (dissoc transaction :transaction/payment :import-batch/_entry)]]
|
||||||
with-transaction (dc/with db upserted-entity)
|
with-transaction (dc/with db upserted-entity)
|
||||||
transaction-id (or (-> with-transaction :tempids (get (:db/id transaction)))
|
transaction-id (or (-> with-transaction :tempids (get (:db/id transaction)))
|
||||||
(:db/id transaction))
|
(:db/id transaction))
|
||||||
journal-entry (transaction->journal-entry (:db-after with-transaction)
|
journal-entry (transaction->journal-entry (:db-after with-transaction)
|
||||||
transaction-id
|
transaction-id
|
||||||
(:db/id transaction))]
|
(:db/id transaction))]
|
||||||
(into [[:upsert-entity transaction]]
|
(into [[:upsert-entity transaction]]
|
||||||
(if journal-entry
|
(if journal-entry
|
||||||
[[:upsert-ledger journal-entry]]
|
[[:upsert-ledger journal-entry]]
|
||||||
[[:db/retractEntity [:journal-entry/original-entity (:db/id transaction)]]]))))
|
[[:db/retractEntity [:journal-entry/original-entity (:db/id transaction)]]]))))
|
||||||
|
|
||||||
|
|
||||||
|
#_(comment
|
||||||
|
|
||||||
|
(upsert-transaction (dc/db auto-ap.datomic/conn) {:transaction/matched-rule 17592233159891,
|
||||||
|
:db/id "34411061-4656-4e77-8cc0-2f2769b4324c",
|
||||||
|
:transaction/status "POSTED",
|
||||||
|
:transaction/description-original "Rotten Robbie #03",
|
||||||
|
:transaction/approval-status {:db/id 17592231963877,
|
||||||
|
:db/ident :transaction-approval-status/approved},
|
||||||
|
:transaction/plaid-merchant {:db/id "223ceae4-d9e7-4e7f-92be-4fb00676088b",
|
||||||
|
:plaid-merchant/name "Rotten Robbie"},
|
||||||
|
:transaction/bank-account 17592232681223,
|
||||||
|
:transaction/vendor 17592232627053,
|
||||||
|
:transaction/date #inst "2024-02-24T08:00:00Z",
|
||||||
|
:transaction/client 17592232577980,
|
||||||
|
:transaction/id "11a4a13e713d63f476009027e9a53e217e13d0192a37df8ab96c0eed4bdbe996",
|
||||||
|
:transaction/amount -84.43,
|
||||||
|
:transaction/accounts [{:db/id "cad8463f-2dfe-47dc-ab17-831e87a633d5",
|
||||||
|
:transaction-account/account 17592231963549,
|
||||||
|
:transaction-account/location "CB",
|
||||||
|
:transaction-account/amount 84.43}],
|
||||||
|
:transaction/raw-id "gQypbv5946F08op74wZmidDg8qD8Q1fM6gEBP"})
|
||||||
|
|
||||||
|
["upsert-transaction"]
|
||||||
|
(user/init-repl)
|
||||||
|
|
||||||
|
)
|
||||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user