supports bulk voiding invoices, searches for iol duplicates.

This commit is contained in:
2022-02-17 17:38:58 -08:00
parent 38befab81d
commit ea490c5859
7 changed files with 368 additions and 209 deletions

View File

@@ -1,17 +1,18 @@
(ns auto-ap.graphql.invoices
(:require
[auto-ap.datomic :refer [audit-transact conn remove-nils uri]]
[auto-ap.datomic
:refer [audit-transact audit-transact-batch conn remove-nils uri]]
[auto-ap.datomic.clients :as d-clients]
[auto-ap.datomic.invoices :as d-invoices]
[auto-ap.datomic.vendors :as d-vendors]
[auto-ap.graphql.checks :as gq-checks]
[auto-ap.graphql.utils
:as u
:refer [<-graphql
assert-admin
assert-can-see-client
assert-power-user
enum->keyword]
:as u]
enum->keyword]]
[auto-ap.utils :refer [dollars=]]
[clj-time.coerce :as coerce]
[clj-time.core :as time]
@@ -31,6 +32,7 @@
(let [args (assoc args :id (:id context))
[invoices invoice-count outstanding total-amount] (-> args
:filters
(assoc :id (:id context))
(<-graphql)
(update :status enum->keyword "invoice-status")
@@ -208,18 +210,55 @@
(defn void-invoice [context {id :invoice_id} _]
(let [invoice (d-invoices/get-by-id id)
_ (assert-can-see-client (:id context) (:db/id (:invoice/client invoice)))]
(audit-transact [{:db/id id
:invoice/total 0.0
_ (assert-can-see-client (:id context) (:db/id (:invoice/client invoice)))]
(audit-transact [{: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/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)))))
(defn void-invoices [context args _]
(let [_ (assert-admin (:id context))
args (assoc args :id (:id context))
ids (some-> args
:filters
(assoc :id (:id context))
(<-graphql)
(update :status enum->keyword "invoice-status")
(assoc :per-page Integer/MAX_VALUE)
d-invoices/raw-graphql-ids
:ids)
specific-ids (d-invoices/filter-ids (:ids args))
all-ids (into (set ids) specific-ids)]
(log/info "Voiding " (count all-ids) args)
(audit-transact
(->> all-ids
(d/q '[:find [(pull ?i [:db/id {:invoice/expense-accounts [:db/id]}]) ...]
:in $ [?i ...]
:where (not [_ :invoice-payment/invoice ?i])]
(d/db conn)
)
(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/retract (:db/id i) :invoice/expense-accounts (:db/id iea)])
(:invoice/expense-accounts i))))))
(:id context))
{:message (str "Succesfully voided " (count all-ids))}))
(defn unvoid-invoice [context {id :invoice_id} _]
(let [invoice (d-invoices/get-by-id id)
_ (assert-can-see-client (:id context) (:db/id (:invoice/client invoice)))
@@ -316,22 +355,7 @@
(def queries
{:invoice_page {:type '(list :invoice_page)
:args {:import_status {:type 'String}
:exact_match_id {:type :id}
:date_range {:type :date_range}
:due_range {:type :date_range}
:status {:type :invoice_status}
:unresolved {:type 'Boolean}
:scheduled_payments {:type 'Boolean}
:client_id {:type :id}
:vendor_id {:type :id}
:amount_lte {:type :money}
:amount_gte {:type :money}
:invoice_number_like {:type 'String}
:location {:type 'String}
:start {:type 'Int}
:per_page {:type 'Int}
:sort {:type '(list :sort_item)}}
:args {:filters {:type :invoice_filters}}
:resolve :get-invoice-page}
:all_invoices {:type '(list :invoice)
@@ -351,6 +375,10 @@
:void_invoice {:type :invoice
:args {:invoice_id {:type :id}}
:resolve :mutation/void-invoice}
:void_invoices {:type :message
:args {:filters {:type :invoice_filters}
:ids {:type '(list :id)}}
:resolve :mutation/void-invoices}
:unvoid_invoice {:type :invoice
:args {:invoice_id {:type :id}}
:resolve :mutation/unvoid-invoice}
@@ -400,7 +428,24 @@
{:fields {:id {:type :id}
:account_id {:type :id}
:location {:type 'String}
:amount {:type :money}}}})
:amount {:type :money}}}
:invoice_filters {:fields {:import_status {:type 'String}
:exact_match_id {:type :id}
:date_range {:type :date_range}
:due_range {:type :date_range}
:status {:type :invoice_status}
:unresolved {:type 'Boolean}
:scheduled_payments {:type 'Boolean}
:client_id {:type :id}
:vendor_id {:type :id}
:amount_lte {:type :money}
:amount_gte {:type :money}
:invoice_number_like {:type 'String}
:location {:type 'String}
:start {:type 'Int}
:per_page {:type 'Int}
:sort {:type '(list :sort_item)}}}})
(def enums
{:invoice_status {:values [{:enum-value :paid}
@@ -416,6 +461,7 @@
:mutation/add-and-print-invoice add-and-print-invoice
:mutation/edit-invoice edit-invoice
:mutation/void-invoice void-invoice
:mutation/void-invoices void-invoices
:mutation/unvoid-invoice unvoid-invoice
:mutation/unautopay-invoice unautopay-invoice
:mutation/edit-expense-accounts edit-expense-accounts})