no need for transact-with-ledger.
This commit is contained in:
@@ -259,7 +259,7 @@
|
||||
:journal-entry/vendor (:db/id (:invoice/vendor entity))
|
||||
:journal-entry/amount (Math/abs (:invoice/total entity))
|
||||
|
||||
:journal-entry/line-items (into [(cond-> {:db/id (str (:db/id entity) "-" 0)
|
||||
:journal-entry/line-items (into [(cond-> {:db/id (str raw-invoice-id "-" 0)
|
||||
:journal-entry-line/account :account/accounts-payable
|
||||
:journal-entry-line/location "A"
|
||||
}
|
||||
@@ -267,7 +267,7 @@
|
||||
(not credit-invoice?) (assoc :journal-entry-line/credit (Math/abs (:invoice/total entity))))]
|
||||
(map-indexed (fn [i ea]
|
||||
(cond->
|
||||
{:db/id (str (:db/id entity) "-" (inc i))
|
||||
{:db/id (str raw-invoice-id "-" (inc i))
|
||||
:journal-entry-line/account (:db/id (:invoice-expense-account/account ea))
|
||||
:journal-entry-line/location (or (:invoice-expense-account/location ea) "HQ")
|
||||
}
|
||||
@@ -291,6 +291,7 @@
|
||||
journal-entry (invoice->journal-entry (:db-after with-invoice)
|
||||
invoice-id
|
||||
(:db/id invoice))]
|
||||
|
||||
(into upserted-entity
|
||||
(if journal-entry
|
||||
(upsert-ledger db journal-entry)
|
||||
@@ -311,3 +312,82 @@
|
||||
(if existing?
|
||||
[]
|
||||
(upsert-invoice db invoice))))
|
||||
|
||||
|
||||
(defn transaction->journal-entry
|
||||
([db transaction-id]
|
||||
(transaction->journal-entry db transaction-id transaction-id))
|
||||
;; the 3-arity version allows you to pass a potential tempid in instead of the invoice-id,
|
||||
;; which would be a temporary value after the transaction
|
||||
([db transaction-id raw-transaction-id]
|
||||
(let [entity (dc/pull db [:transaction/client
|
||||
:transaction/date
|
||||
:transaction/description-original
|
||||
:db/id
|
||||
:transaction/vendor
|
||||
:transaction/amount
|
||||
:transaction/cleared-against
|
||||
{:transaction/accounts [:transaction-account/account
|
||||
:transaction-account/location
|
||||
:transaction-account/amount]
|
||||
:transaction/approval-status [:db/ident]
|
||||
:transaction/bank-account [:db/id {:bank-account/type [:db/ident]}]}]
|
||||
transaction-id)
|
||||
decreasing? (< (or (:transaction/amount entity) 0.0) 0.0)
|
||||
credit-from-bank? decreasing?
|
||||
debit-from-bank? (not decreasing?)]
|
||||
(when (and (not (= :transaction-approval-status/excluded (:db/ident (:transaction/approval-status entity))))
|
||||
(not (= :transaction-approval-status/suppressed (:db/ident (:transaction/approval-status entity))))
|
||||
(:transaction/amount entity)
|
||||
(not (< -0.001 (:transaction/amount entity) 0.001)))
|
||||
(remove-nils
|
||||
{:journal-entry/source "transaction"
|
||||
:journal-entry/client (:db/id (:transaction/client entity))
|
||||
:journal-entry/date (:transaction/date entity)
|
||||
:journal-entry/original-entity raw-transaction-id
|
||||
:journal-entry/alternate-description (:transaction/description-original entity)
|
||||
:journal-entry/vendor (:db/id (:transaction/vendor entity))
|
||||
:journal-entry/amount (Math/abs (:transaction/amount 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))
|
||||
:db/id (str raw-transaction-id "-" 0)
|
||||
:journal-entry-line/location "A"
|
||||
:journal-entry-line/credit (when credit-from-bank?
|
||||
(Math/abs (:transaction/amount entity)))
|
||||
:journal-entry-line/debit (when debit-from-bank?
|
||||
(Math/abs (:transaction/amount entity)))})
|
||||
]
|
||||
(map-indexed
|
||||
(fn [i a]
|
||||
(remove-nils{
|
||||
:db/id (str raw-transaction-id "-" (inc i))
|
||||
:journal-entry-line/account (:db/id (:transaction-account/account a))
|
||||
:journal-entry-line/location (:transaction-account/location a)
|
||||
:journal-entry-line/debit (when credit-from-bank?
|
||||
(Math/abs (:transaction-account/amount a)))
|
||||
:journal-entry-line/credit (when debit-from-bank?
|
||||
(Math/abs (:transaction-account/amount a)))}))
|
||||
(if (seq (:transaction/accounts entity))
|
||||
(:transaction/accounts entity)
|
||||
[{:transaction-account/amount (:transaction/amount entity)}])))
|
||||
|
||||
:journal-entry/cleared true})))))
|
||||
|
||||
(defn upsert-transaction [db transaction]
|
||||
;; because some transactions will reference temp ids, you have to dissoc them, like :transaction/payment
|
||||
(let [upserted-entity (upsert-entity db (dissoc transaction :transaction/payment))
|
||||
with-transaction (try (dc/with db {:tx-data upserted-entity})
|
||||
(catch ClassCastException e
|
||||
(println "Dev local does not support with in tx functions. :(")
|
||||
(dc/with (dc/with-db @(resolve 'auto-ap.datomic/conn)) {:tx-data upserted-entity})
|
||||
))
|
||||
transaction-id (or (-> with-transaction :tempids (get (:db/id transaction)))
|
||||
(:db/id transaction))
|
||||
journal-entry (transaction->journal-entry (:db-after with-transaction)
|
||||
transaction-id
|
||||
(:db/id transaction))]
|
||||
(into (upsert-entity db transaction)
|
||||
(if journal-entry
|
||||
(upsert-ledger db journal-entry)
|
||||
[[:db/retractEntity [:journal-entry/original-entity (:db/id transaction)]]]))))
|
||||
|
||||
Reference in New Issue
Block a user