(cloud) experimental approach to ensure the ledgers do not get out of sync
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
(ns auto-ap.graphql.invoices
|
||||
(:require
|
||||
[auto-ap.datomic
|
||||
:refer [conn pull-attr pull-many pull-ref random-tempid ]]
|
||||
[iol-ion.tx :refer [upsert-entity]]
|
||||
:refer [conn pull-attr pull-many pull-ref random-tempid audit-transact audit-transact-batch]]
|
||||
[iol-ion.tx :refer [upsert-entity upsert-invoice]]
|
||||
[auto-ap.datomic.clients :as d-clients]
|
||||
[auto-ap.datomic.invoices :as d-invoices]
|
||||
[auto-ap.datomic.vendors :as d-vendors]
|
||||
@@ -18,7 +18,7 @@
|
||||
attach-tracing-resolvers
|
||||
enum->keyword]]
|
||||
[auto-ap.ledger
|
||||
:refer [transact-batch-with-ledger transact-with-ledger]]
|
||||
:refer [transact-batch-with-ledger]]
|
||||
[auto-ap.rule-matching :as rm]
|
||||
[auto-ap.utils :refer [dollars=]]
|
||||
[clj-time.coerce :as coerce]
|
||||
@@ -62,8 +62,10 @@
|
||||
(assert-power-user (:id context))
|
||||
(doseq [i invoices]
|
||||
(assert-can-see-client (:id context) (:db/id (:invoice/client (dc/pull (dc/db conn) [{:invoice/client [:db/id]}] i)))))
|
||||
(let [transactions (map (fn [i] [:db/retractEntity i]) invoices)]
|
||||
(transact-with-ledger transactions (:id context))
|
||||
(let [transactions (mapcat (fn [i] [[:db/retractEntity i]
|
||||
[:db/retractEntity [:journal-entry/original-invoice i]]])
|
||||
invoices)]
|
||||
(audit-transact transactions (:id context))
|
||||
invoices))
|
||||
|
||||
(defn approve-invoices [context {:keys [invoices]} _]
|
||||
@@ -74,8 +76,8 @@
|
||||
i)]]
|
||||
(assert-can-see-client (:id context) (-> invoice :invoice/client :db/id))
|
||||
(assert-not-locked (-> invoice :invoice/client :db/id) (-> invoice :invoice/date)))
|
||||
(let [transactions (map (fn [i] {:db/id i :invoice/import-status :import-status/imported}) invoices)]
|
||||
(transact-with-ledger transactions (:id context))
|
||||
(let [transactions (map (fn [i] `(upsert-invoice ~{:db/id i :invoice/import-status :import-status/imported})) invoices)]
|
||||
(audit-transact transactions (:id context))
|
||||
invoices))
|
||||
|
||||
(defn assert-no-conflicting [{:keys [invoice_number client_id vendor_id]}]
|
||||
@@ -109,19 +111,19 @@
|
||||
_ (when-not (:db/id account)
|
||||
(throw (ex-info (str "Vendor '" (:vendor/name vendor) "' does not have a default expense acount.") {:vendor-id vendor_id})))]
|
||||
|
||||
`(upsert-entity ~{:db/id "invoice"
|
||||
:invoice/invoice-number invoice_number
|
||||
:invoice/client client_id
|
||||
:invoice/vendor vendor_id
|
||||
:invoice/import-status :import-status/imported
|
||||
:invoice/total total
|
||||
:invoice/outstanding-balance total
|
||||
:invoice/status :invoice-status/unpaid
|
||||
:invoice/date (coerce/to-date date)
|
||||
:invoice/expense-accounts (map expense-account->entity
|
||||
expense_accounts)
|
||||
:invoice/due (coerce/to-date due)
|
||||
:invoice/scheduled-payment (coerce/to-date scheduled_payment)})))
|
||||
`(upsert-invoice ~{:db/id "invoice"
|
||||
:invoice/invoice-number invoice_number
|
||||
:invoice/client client_id
|
||||
:invoice/vendor vendor_id
|
||||
:invoice/import-status :import-status/imported
|
||||
:invoice/total total
|
||||
:invoice/outstanding-balance total
|
||||
:invoice/status :invoice-status/unpaid
|
||||
:invoice/date (coerce/to-date date)
|
||||
:invoice/expense-accounts (map expense-account->entity
|
||||
expense_accounts)
|
||||
:invoice/due (coerce/to-date due)
|
||||
:invoice/scheduled-payment (coerce/to-date scheduled_payment)})))
|
||||
|
||||
(defn assert-valid-expense-accounts [expense_accounts vendor_id]
|
||||
(doseq [expense-account expense_accounts
|
||||
@@ -176,7 +178,7 @@
|
||||
(assert-valid-expense-accounts expense_accounts vendor_id)
|
||||
(assert-invoice-amounts-add-up in)
|
||||
|
||||
(let [transaction-result (transact-with-ledger [(add-invoice-transaction in)] (:id context))]
|
||||
(let [transaction-result (audit-transact [(add-invoice-transaction in)] (:id context))]
|
||||
(-> (d-invoices/get-by-id (get-in transaction-result [:tempids "invoice"]))
|
||||
(->graphql (:id context)))))
|
||||
|
||||
@@ -195,7 +197,7 @@
|
||||
(assert-not-locked client_id (:date in))
|
||||
(assert-valid-expense-accounts (:expense_accounts in) vendor_id)
|
||||
(assert-invoice-amounts-add-up in)))
|
||||
(let [transaction-result (transact-with-ledger [(add-invoice-transaction in)] (:id context))]
|
||||
(let [transaction-result (audit-transact [(add-invoice-transaction in)] (:id context))]
|
||||
(mu/trace ::printing-checks
|
||||
[]
|
||||
(-> (gq-checks/print-checks-internal [{:invoice-id (get-in transaction-result [:tempids "invoice"])
|
||||
@@ -230,7 +232,7 @@
|
||||
expense_accounts)
|
||||
:invoice/due (coerce/to-date due)
|
||||
:invoice/scheduled-payment (coerce/to-date scheduled_payment)}]
|
||||
(transact-with-ledger [`(upsert-entity ~updated-invoice)]
|
||||
(audit-transact [`(upsert-invoice ~updated-invoice)]
|
||||
(:id context))
|
||||
(-> (d-invoices/get-by-id id)
|
||||
(->graphql (:id context)))))
|
||||
@@ -239,13 +241,13 @@
|
||||
(let [invoice (d-invoices/get-by-id id)]
|
||||
(assert-can-see-client (:id context) (:db/id (:invoice/client invoice)))
|
||||
(assert-not-locked (:db/id (:invoice/client invoice)) (:invoice/date invoice))
|
||||
(transact-with-ledger [{:db/id id
|
||||
:invoice/total 0.0
|
||||
:invoice/outstanding-balance 0.0
|
||||
:invoice/status :invoice-status/voided
|
||||
:invoice/expense-accounts (map (fn [ea] {:db/id (:db/id ea)
|
||||
:invoice-expense-account/amount 0.0})
|
||||
(:invoice/expense-accounts invoice))}]
|
||||
(audit-transact [`(upsert-invoice ~{:db/id id
|
||||
:invoice/total 0.0
|
||||
:invoice/outstanding-balance 0.0
|
||||
:invoice/status :invoice-status/voided
|
||||
:invoice/expense-accounts (map (fn [ea] {:db/id (:db/id ea)
|
||||
:invoice-expense-account/amount 0.0})
|
||||
(:invoice/expense-accounts invoice))})]
|
||||
(:id context))
|
||||
|
||||
(-> (d-invoices/get-by-id id) (->graphql (:id context)))))
|
||||
@@ -296,7 +298,7 @@
|
||||
(gq-checks/void-payments-internal voidable-cash-payments (:id context))
|
||||
|
||||
(log/info "Voiding " (count all-ids) args)
|
||||
(transact-with-ledger
|
||||
(audit-transact
|
||||
(->> all-ids
|
||||
(dc/q '[:find (pull ?i [:db/id :invoice/date {:invoice/expense-accounts [:db/id]}])
|
||||
:in $ [?i ...]
|
||||
@@ -306,20 +308,17 @@
|
||||
[?i :invoice/date ?d]
|
||||
[(>= ?d ?lu)]]
|
||||
(dc/db conn))
|
||||
(map first)
|
||||
(mapcat
|
||||
(fn [i]
|
||||
(into
|
||||
[{:db/id (:db/id i)
|
||||
:invoice/total 0.0
|
||||
:invoice/outstanding-balance 0.0
|
||||
:invoice/status :invoice-status/voided
|
||||
}]
|
||||
(map
|
||||
(fn [iea]
|
||||
{:db/id (:db/id iea)
|
||||
:invoice-expense-account/amount 0.0})
|
||||
(:invoice/expense-accounts i))))))
|
||||
(map
|
||||
(fn [[i]]
|
||||
`(upsert-invoice ~{:db/id (:db/id i)
|
||||
:invoice/total 0.0
|
||||
:invoice/outstanding-balance 0.0
|
||||
:invoice/status :invoice-status/voided
|
||||
:invoice/expense-accounts (map
|
||||
(fn [iea]
|
||||
{:db/id (:db/id iea)
|
||||
:invoice-expense-account/amount 0.0})
|
||||
(:invoice/expense-accounts i))}))))
|
||||
(:id context))
|
||||
{:message (str "Succesfully voided " (count all-ids))}))
|
||||
|
||||
@@ -337,17 +336,17 @@
|
||||
:in ['$ '?e]}
|
||||
:args [history id]})
|
||||
[last-transaction] (->> txs (sort-by first) (last))]
|
||||
(mu/log ::here
|
||||
:txes txs)
|
||||
(transact-with-ledger [(->> txs
|
||||
(filter (fn [[tx]] (= tx last-transaction)))
|
||||
(reduce (fn [new-transaction [_ entity original-status original-outstanding total expense-account expense-account-amount]]
|
||||
(-> new-transaction
|
||||
(assoc :db/id entity
|
||||
:invoice/total total
|
||||
:invoice/status original-status
|
||||
:invoice/outstanding-balance original-outstanding)
|
||||
(update :invoice/expense-accounts conj {:db/id expense-account :invoice-expense-account/amount expense-account-amount}))) {}))]
|
||||
(audit-transact [`(upsert-invoice
|
||||
~(->> txs
|
||||
(filter (fn [[tx]] (= tx last-transaction)))
|
||||
(reduce (fn [new-transaction [_ entity original-status original-outstanding total expense-account expense-account-amount]]
|
||||
(-> new-transaction
|
||||
(assoc :db/id entity
|
||||
:invoice/total total
|
||||
:invoice/status original-status
|
||||
:invoice/outstanding-balance original-outstanding)
|
||||
(update :invoice/expense-accounts conj {:db/id expense-account :invoice-expense-account/amount expense-account-amount})))
|
||||
{})))]
|
||||
(:id context))
|
||||
|
||||
(-> (d-invoices/get-by-id id)
|
||||
@@ -363,9 +362,11 @@
|
||||
(assert-can-see-client (:id context) (:db/id (:invoice/client invoice)))
|
||||
(assert-not-locked (:db/id (:invoice/client invoice)) (:invoice/date invoice))
|
||||
(assert (not (seq (:invoice-payment/_invoice invoice))))
|
||||
(transact-with-ledger [[:db/add id :invoice/status :invoice-status/unpaid]
|
||||
[:db/add id :invoice/outstanding-balance (:invoice/total invoice)]
|
||||
[:db/retract id :invoice/scheduled-payment (:invoice/scheduled-payment invoice)]]
|
||||
(audit-transact [`(upsert-invoice
|
||||
~{:db/id id
|
||||
:invoice/status :invoice-status/unpaid
|
||||
:invoice/outstanding-balance (:invoice/total invoice)
|
||||
:invoice/scheduled-payment nil})]
|
||||
(:id context))
|
||||
|
||||
(-> (d-invoices/get-by-id id)
|
||||
@@ -378,11 +379,11 @@
|
||||
_ (assert-not-locked (:db/id (:invoice/client invoice)) (:invoice/date invoice))
|
||||
_ (assert-valid-expense-accounts (:expense_accounts args) (:db/id (:invoice/vendor invoice )))]
|
||||
|
||||
(transact-with-ledger [`(upsert-entity ~{:db/id invoice-id
|
||||
:invoice/expense-accounts (map
|
||||
expense-account->entity
|
||||
(:expense_accounts args))})]
|
||||
(:id context))
|
||||
(audit-transact [`(upsert-invoice ~{:db/id invoice-id
|
||||
:invoice/expense-accounts (map
|
||||
expense-account->entity
|
||||
(:expense_accounts args))})]
|
||||
(:id context))
|
||||
(->graphql
|
||||
(d-invoices/get-by-id (:invoice_id args))
|
||||
(:id context))))
|
||||
@@ -468,9 +469,9 @@
|
||||
(let [err (str "Account " name " uses location " (:location a) ", but doesn't belong to the client.")]
|
||||
(throw (ex-info err {:validation-error err}) ))))
|
||||
(log/info "Bulk coding " (count all-ids) args)
|
||||
(transact-batch-with-ledger
|
||||
(audit-transact-batch
|
||||
(map (fn [i]
|
||||
`(upsert-entity ~{:db/id (:db/id i)
|
||||
`(upsert-invoice ~{:db/id (:db/id i)
|
||||
:invoice/expense-accounts (maybe-code-accounts i (:accounts args) locations)}))
|
||||
invoices)
|
||||
(:id context))
|
||||
|
||||
Reference in New Issue
Block a user