Add vendor pre-population for bulk code and individual edit forms

- Add vendor-changed HTMX handlers for both bulk code and individual edit
- Pre-populate default account at 100% when vendor is selected and no accounts exist
- Fix render-accounts-section to render from step-params correctly
- Change bulk code vendor-changed from hx-get to hx-post to include form data
- Add routes for vendor-changed endpoints
- Update e2e tests to cover vendor pre-population
- Run lein cljfmt fix across codebase
This commit is contained in:
2026-05-21 14:45:19 -07:00
parent 8bd0cee1b1
commit ba87805d4c
210 changed files with 8694 additions and 9627 deletions

View File

@@ -375,7 +375,6 @@ test.describe('Bulk Code Transactions - Account Distribution', () => {
await addNewAccount(page); await addNewAccount(page);
await selectAccountFromTypeahead(page, 0, 'test-account'); await selectAccountFromTypeahead(page, 0, 'test-account');
// "Shared" should be valid for accounts without fixed location
await setAccountLocation(page, 0, 'Shared'); await setAccountLocation(page, 0, 'Shared');
await setAccountPercentage(page, 0, '100'); await setAccountPercentage(page, 0, '100');
@@ -385,3 +384,60 @@ test.describe('Bulk Code Transactions - Account Distribution', () => {
await page.waitForSelector('table tbody tr'); await page.waitForSelector('table tbody tr');
}); });
}); });
test.describe('Bulk Code Transactions - Vendor Pre-population', () => {
test('should pre-populate default account when vendor is selected', async ({ page }) => {
await navigateToTransactions(page);
await selectTransactionByIndex(page, 0);
await openBulkCodeModal(page);
// Select vendor (test vendor has default-account set to test-account)
const testInfo = await getTestInfo(page);
const vendorId = testInfo.accounts.vendor;
// The vendor typeahead dispatches change from its parent div
// We need to set the hidden input and dispatch change on the container
const vendorContainer = page.locator('div[hx-post*="vendor-changed"]').first();
const vendorHidden = vendorContainer.locator('input[type="hidden"]').first();
await vendorHidden.evaluate((el: HTMLInputElement, value: string) => {
const newInput = document.createElement('input');
newInput.type = 'hidden';
newInput.name = el.name;
newInput.value = value;
el.parentNode.replaceChild(newInput, el);
}, vendorId.toString());
// Dispatch change on the container to trigger HTMX
await vendorContainer.evaluate((el: HTMLElement) => {
el.dispatchEvent(new Event('change', { bubbles: true }));
});
// Wait for HTMX response
await page.waitForResponse(response => response.url().includes('/vendor-changed') && response.status() === 200);
await page.waitForTimeout(500);
// Account should be pre-populated - check for account row
const accountRows = page.locator('#account-entries tbody tr');
const rowCount = await accountRows.count();
// Should have at least 1 account row (the default account) plus the new-row button
expect(rowCount).toBeGreaterThanOrEqual(2);
// The account should have a hidden input with the test-account ID
const accountHidden = page.locator('input[type="hidden"][name*="[account]"]').first();
const accountValue = await accountHidden.inputValue();
expect(accountValue).toBe(testInfo.accounts['test-account'].toString());
// Percentage should be 100
const percentageInput = page.locator('input[name*="percentage"]').first();
const percentageValue = await percentageInput.inputValue();
expect(percentageValue).toBe('100');
// Submit should succeed
await submitBulkCodeForm(page);
await closeBulkCodeModal(page);
await page.waitForSelector('table tbody tr');
});
});

View File

@@ -22,7 +22,6 @@
(defn local-now [] (defn local-now []
(localize (time/now))) (localize (time/now)))
(defn recent-date (defn recent-date
([] ([]
(recent-date 90)) (recent-date 90))
@@ -53,9 +52,6 @@
[client start] [client start]
[client end])))) [client end]))))
(defn can-see-client? [identity client] (defn can-see-client? [identity client]
(when (not client) (when (not client)
(println "WARNING - permission checking for null client")) (println "WARNING - permission checking for null client"))
@@ -63,11 +59,9 @@
((set (map :db/id (:user/clients identity))) (:db/id client)) ((set (map :db/id (:user/clients identity))) (:db/id client))
((set (map :db/id (:user/clients identity))) client))) ((set (map :db/id (:user/clients identity))) client)))
(defn ->pattern [x] (defn ->pattern [x]
(. java.util.regex.Pattern (compile x java.util.regex.Pattern/CASE_INSENSITIVE))) (. java.util.regex.Pattern (compile x java.util.regex.Pattern/CASE_INSENSITIVE)))
(defn dom [^java.util.Date x] (defn dom [^java.util.Date x]
(-> x (-> x
(.toInstant) (.toInstant)
@@ -164,8 +158,7 @@
(defn ident [x] (defn ident [x]
(:db/ident x)) (:db/ident x))
(deftype Line [^Long id ^Long client-id ^Long account-id ^String location ^java.util.Date date ^Double debit ^Double credit ^Double running-balance] (deftype Line [^Long id ^Long client-id ^Long account-id ^String location ^java.util.Date date ^Double debit ^Double credit ^Double running-balance])
)
(defmethod print-method Line [entity writer] (defmethod print-method Line [entity writer]
(.write writer (format "Line %d: client:%d account:%d location:%s date:%s" (.write writer (format "Line %d: client:%d account:%d location:%s date:%s"
@@ -175,12 +168,10 @@
(.-location entity) (.-location entity)
(iso-date (.-date entity))))) (iso-date (.-date entity)))))
(defn ->line [{[current-client current-account current-location current-date debit credit running-balance] (defn ->line [{[current-client current-account current-location current-date debit credit running-balance]
:v :v
id :e}] id :e}]
(Line. id current-client current-account current-location current-date debit credit running-balance) (Line. id current-client current-account current-location current-date debit credit running-balance))
)
(defn compare-account [^Line l1 ^Line l2] (defn compare-account [^Line l1 ^Line l2]
@@ -269,7 +260,6 @@
(do (do
[client-id account-id location debits credits current-balance count sample])))) [client-id account-id location debits credits current-balance count sample]))))
(comment (comment
(->> (->>
(detailed-account-snapshot (dc/db auto-ap.datomic/conn) (detailed-account-snapshot (dc/db auto-ap.datomic/conn)

View File

@@ -11,7 +11,6 @@
(def pull-many iol-ion.utils/pull-many) (def pull-many iol-ion.utils/pull-many)
(def remove-nils iol-ion.utils/remove-nils) (def remove-nils iol-ion.utils/remove-nils)
;; TODO expected-deposit ledger entry ;; TODO expected-deposit ledger entry
#_(defmethod entity-change->ledger :expected-deposit #_(defmethod entity-change->ledger :expected-deposit
[db [type id]] [db [type id]]
@@ -33,9 +32,6 @@
:location "A" :location "A"
:account :account/ccp}]})) :account :account/ccp}]}))
(defn regenerate-literals [] (defn regenerate-literals []
(require 'com.github.ivarref.gen-fn) (require 'com.github.ivarref.gen-fn)
(spit (spit

View File

@@ -5,7 +5,6 @@
) )
(:import [java.util UUID])) (:import [java.util UUID]))
(defn -random-tempid [] (defn -random-tempid []
(str (UUID/randomUUID))) (str (UUID/randomUUID)))
@@ -36,7 +35,6 @@
;; :else ;; :else
;; v)) ;; v))
(defn upsert-entity [db entity] (defn upsert-entity [db entity]
(when-not (or (:db/id entity) (when-not (or (:db/id entity)
(:db/ident entity)) (:db/ident entity))

View File

@@ -7,8 +7,7 @@
(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)
@@ -49,22 +48,19 @@
:journal-entry/line-items (into [(cond-> {:db/id (str raw-invoice-id "-" 0) :journal-entry/line-items (into [(cond-> {:db/id (str raw-invoice-id "-" 0)
:journal-entry-line/account :account/accounts-payable :journal-entry-line/account :account/accounts-payable
:journal-entry-line/location "A" :journal-entry-line/location "A"}
}
credit-invoice? (assoc :journal-entry-line/debit (Math/abs (:invoice/total entity))) credit-invoice? (assoc :journal-entry-line/debit (Math/abs (:invoice/total entity)))
(not credit-invoice?) (assoc :journal-entry-line/credit (Math/abs (:invoice/total entity))))] (not credit-invoice?) (assoc :journal-entry-line/credit (Math/abs (:invoice/total entity))))]
(map-indexed (fn [i ea] (map-indexed (fn [i ea]
(cond-> (cond->
{:db/id (str raw-invoice-id "-" (inc i)) {:db/id (str raw-invoice-id "-" (inc i))
:journal-entry-line/account (:db/id (:invoice-expense-account/account ea)) :journal-entry-line/account (:db/id (:invoice-expense-account/account ea))
:journal-entry-line/location (or (:invoice-expense-account/location ea) "HQ") :journal-entry-line/location (or (:invoice-expense-account/location ea) "HQ")}
}
credit-invoice? (assoc :journal-entry-line/credit (Math/abs (:invoice-expense-account/amount ea))) credit-invoice? (assoc :journal-entry-line/credit (Math/abs (:invoice-expense-account/amount ea)))
(not credit-invoice?) (assoc :journal-entry-line/debit (Math/abs (:invoice-expense-account/amount ea))))) (not credit-invoice?) (assoc :journal-entry-line/debit (Math/abs (:invoice-expense-account/amount ea)))))
(:invoice/expense-accounts entity))) (:invoice/expense-accounts entity)))
:journal-entry/cleared (and (< (:invoice/outstanding-balance entity) 0.01) :journal-entry/cleared (and (< (:invoice/outstanding-balance entity) 0.01)
(every? #(= :payment-status/cleared (:payment/status %)) (:invoice/payments entity)) (every? #(= :payment-status/cleared (:payment/status %)) (:invoice/payments entity)))}))))
)}))))
(defn current-date [db] (defn current-date [db]
(let [last-tx (dc/t->tx (dc/basis-t db)) (let [last-tx (dc/t->tx (dc/basis-t db))

View File

@@ -24,7 +24,6 @@
(def extant-read '[:db/id :journal-entry/date :journal-entry/client {:journal-entry/line-items [:journal-entry-line/account :journal-entry-line/location :db/id :journal-entry-line/client+account+location+date]}]) (def extant-read '[:db/id :journal-entry/date :journal-entry/client {:journal-entry/line-items [:journal-entry-line/account :journal-entry-line/location :db/id :journal-entry-line/client+account+location+date]}])
(defn current-date [db] (defn current-date [db]
(let [last-tx (dc/t->tx (dc/basis-t db)) (let [last-tx (dc/t->tx (dc/basis-t db))
[[date]] (seq (dc/q '[:find ?ti :in $ ?tx [[date]] (seq (dc/q '[:find ?ti :in $ ?tx

View File

@@ -30,8 +30,7 @@
total-debits (reduce + 0.0 (map #(get % :ledger-side/debit 0.0) aggregated)) total-debits (reduce + 0.0 (map #(get % :ledger-side/debit 0.0) aggregated))
total-credits (reduce + 0.0 (map #(get % :ledger-side/credit 0.0) aggregated)) total-credits (reduce + 0.0 (map #(get % :ledger-side/credit 0.0) aggregated))
_ (clojure.pprint/pprint [total-debits total-credits]) _ (clojure.pprint/pprint [total-debits total-credits])]
]
(when (and (seq line-items) (when (and (seq line-items)
(= (Math/round (* 1000 total-debits)) (= (Math/round (* 1000 total-debits))
(Math/round (* 1000 total-credits)))) (Math/round (* 1000 total-credits))))
@@ -65,6 +64,5 @@ _ (clojure.pprint/pprint [total-debits total-credits])
(concat (concat
[[:db/retractEntity [:journal-entry/original-entity (:db/id summary)]]] [[:db/retractEntity [:journal-entry/original-entity (:db/id summary)]]]
(when client-id [{:db/id client-id (when client-id [{:db/id client-id
:client/ledger-last-change (current-date db)}])))))) :client/ledger-last-change (current-date db)}]))))))

View File

@@ -81,7 +81,6 @@
[[: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 #_(comment
;; If transactions are failing, it is likely that there are multiple bank accounts linked ;; If transactions are failing, it is likely that there are multiple bank accounts linked
@@ -148,6 +147,4 @@
[:upsert-ledger my-journal]]) [:upsert-ledger my-journal]])
(auto-ap.datomic/pull-attr (dc/db auto-ap.datomic/conn) :bank-account/code 17592232681223) (auto-ap.datomic/pull-attr (dc/db auto-ap.datomic/conn) :bank-account/code 17592232681223)
(auto-ap.datomic/pull-attr (dc/db auto-ap.datomic/conn) :bank-account/code 17592232681228) (auto-ap.datomic/pull-attr (dc/db auto-ap.datomic/conn) :bank-account/code 17592232681228))
)

View File

@@ -27,8 +27,7 @@
(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)

File diff suppressed because one or more lines are too long

View File

@@ -2,8 +2,7 @@
(:require [amazonica.core :as amz]) (:require [amazonica.core :as amz])
(:import [com.amazonaws.services.textract AmazonTextractClient])) (:import [com.amazonaws.services.textract AmazonTextractClient]))
#_ #_(import '[com.amazonaws.services.textract AmazonTextractClient])
(import '[com.amazonaws.services.textract AmazonTextractClient ])
#_(import '[com.amazonaws.services.textract.model S3Object]) #_(import '[com.amazonaws.services.textract.model S3Object])
#_(import '[com.amazonaws.services.textract.model StartExpenseAnalysisRequest]) #_(import '[com.amazonaws.services.textract.model StartExpenseAnalysisRequest])
#_(import '[com.amazonaws.services.textract.model GetExpenseAnalysisRequest]) #_(import '[com.amazonaws.services.textract.model GetExpenseAnalysisRequest])

View File

@@ -28,7 +28,6 @@
[(str "container:" (:DockerId container-data)) [(str "container:" (:DockerId container-data))
(str "ip:" (-> container-data :Networks first :IPv4Addresses first))]) (str "ip:" (-> container-data :Networks first :IPv4Addresses first))])
(mount/defstate container-tags (mount/defstate container-tags
:start (get-container-tags) :start (get-container-tags)
:stop nil) :stop nil)

View File

@@ -5,14 +5,11 @@
(path [cursor]) (path [cursor])
(state [cursor])) (state [cursor]))
(defprotocol ITransact (defprotocol ITransact
(-transact! [cursor f])) (-transact! [cursor f]))
(declare to-cursor cursor?) (declare to-cursor cursor?)
(deftype ValCursor [value state path] (deftype ValCursor [value state path]
IDeref IDeref
(deref [_] (deref [_]
@@ -26,7 +23,6 @@
(swap! state (if (empty? path) f #(update-in % path f))) (swap! state (if (empty? path) f #(update-in % path f)))
path))) path)))
(deftype MapCursor [value state path] (deftype MapCursor [value state path]
Counted Counted
(count [_] (count [_]
@@ -60,7 +56,6 @@
(for [[k v] @this] (for [[k v] @this]
[k (to-cursor v state (conj path k) nil)]))) [k (to-cursor v state (conj path k) nil)])))
(deftype VecCursor [value state path] (deftype VecCursor [value state path]
Counted Counted
(count [_] (count [_]
@@ -98,22 +93,18 @@
(for [[v i] (map vector @this (range))] (for [[v i] (map vector @this (range))]
(to-cursor v state (conj path i) nil)))) (to-cursor v state (conj path i) nil))))
(defn- to-cursor (defn- to-cursor
([v state path value] ([v state path value]
(cond (cond
(cursor? v) v (cursor? v) v
(map? v) (MapCursor. value state path) (map? v) (MapCursor. value state path)
(vector? v) (VecCursor. value state path) (vector? v) (VecCursor. value state path)
:else (ValCursor. value state path) :else (ValCursor. value state path))))
)))
(defn cursor? [c] (defn cursor? [c]
"Returns true if c is a cursor." "Returns true if c is a cursor."
(satisfies? ICursor c)) (satisfies? ICursor c))
(defn cursor [v] (defn cursor [v]
"Creates cursor from supplied value v. If v is an ordinary "Creates cursor from supplied value v. If v is an ordinary
data structure, it is wrapped into atom. If v is an atom, data structure, it is wrapped into atom. If v is an atom,
@@ -123,7 +114,6 @@
(if (instance? Atom v) v (atom v)) (if (instance? Atom v) v (atom v))
[] nil)) [] nil))
(defn synthetic-cursor [v prefix] (defn synthetic-cursor [v prefix]
(let [internal-cursor (cursor v)] (let [internal-cursor (cursor v)]
(reify ICursor (reify ICursor
@@ -132,14 +122,12 @@
(state [this] (state [this]
(state internal-cursor))))) (state internal-cursor)))))
(defn transact! [cursor f] (defn transact! [cursor f]
"Changes value beneath cursor by passing it to a single-argument "Changes value beneath cursor by passing it to a single-argument
function f. Old value will be passed as function argument. Function function f. Old value will be passed as function argument. Function
result will be the new value." result will be the new value."
(-transact! cursor f)) (-transact! cursor f))
(defn update! [cursor v] (defn update! [cursor v]
"Replaces value supplied by cursor with value v." "Replaces value supplied by cursor with value v."
(-transact! cursor (constantly v))) (-transact! cursor (constantly v)))

View File

@@ -49,8 +49,7 @@
(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)
@@ -108,8 +107,7 @@
:db/cardinality :db.cardinality/one :db/cardinality :db.cardinality/one
:db/isComponent true :db/isComponent true
:db.install/_attribute :db.part/db :db.install/_attribute :db.part/db
:db/doc "The vendor's address"} :db/doc "The vendor's address"}])
])
(def client-schema (def client-schema
[{:db/ident :client/original-id [{:db/ident :client/original-id
@@ -151,8 +149,7 @@
:db/doc "Bank accounts for the client"}]) :db/doc "Bank accounts for the client"}])
(def address-schema (def address-schema
[ [{:db/ident :address/street1
{:db/ident :address/street1
:db/valueType :db.type/string :db/valueType :db.type/string
:db/cardinality :db.cardinality/one :db/cardinality :db.cardinality/one
:db/doc "123 main st"} :db/doc "123 main st"}
@@ -174,8 +171,7 @@
:db/doc "95014"}]) :db/doc "95014"}])
(def contact-schema (def contact-schema
[ [{:db/ident :contact/name
{:db/ident :contact/name
:db/valueType :db.type/string :db/valueType :db.type/string
:db/cardinality :db.cardinality/one :db/cardinality :db.cardinality/one
:db/doc "John Smith"} :db/doc "John Smith"}
@@ -188,8 +184,6 @@
:db/cardinality :db.cardinality/one :db/cardinality :db.cardinality/one
:db/doc "hello@example.com"}]) :db/doc "hello@example.com"}])
(def bank-account-schema (def bank-account-schema
[{:db/ident :bank-account/external-id [{:db/ident :bank-account/external-id
:db/valueType :db.type/long :db/valueType :db.type/long
@@ -297,7 +291,6 @@
:db/isComponent true :db/isComponent true
:db/doc "The expense account categories for this invoice"} :db/doc "The expense account categories for this invoice"}
{:db/ident :invoice-status/paid} {:db/ident :invoice-status/paid}
{:db/ident :invoice-status/unpaid} {:db/ident :invoice-status/unpaid}
{:db/ident :invoice-status/voided}]) {:db/ident :invoice-status/voided}])
@@ -321,8 +314,6 @@
:db/cardinality :db.cardinality/one :db/cardinality :db.cardinality/one
:db/doc "The amount that this contributes to"}]) :db/doc "The amount that this contributes to"}])
(def payment-schema (def payment-schema
[{:db/ident :payment/original-id [{:db/ident :payment/original-id
:db/valueType :db.type/long :db/valueType :db.type/long
@@ -374,7 +365,6 @@
:db/cardinality :db.cardinality/one :db/cardinality :db.cardinality/one
:db/doc "raw data used to generate check pdf"} :db/doc "raw data used to generate check pdf"}
;; relations ;; relations
{:db/ident :payment/vendor {:db/ident :payment/vendor
:db/valueType :db.type/ref :db/valueType :db.type/ref
@@ -400,8 +390,7 @@
{:db/ident :payment-type/cash} {:db/ident :payment-type/cash}
{:db/ident :payment-type/check} {:db/ident :payment-type/check}
{:db/ident :payment-type/debit} {:db/ident :payment-type/debit}])
])
(def invoice-payment-schema (def invoice-payment-schema
[{:db/ident :invoice-payment/original-id [{:db/ident :invoice-payment/original-id
@@ -481,7 +470,6 @@
:db/cardinality :db.cardinality/one :db/cardinality :db.cardinality/one
:db/doc "The check number that was parsed from the description"} :db/doc "The check number that was parsed from the description"}
;; relations ;; relations
{:db/ident :transaction/vendor {:db/ident :transaction/vendor
:db/valueType :db.type/ref :db/valueType :db.type/ref
@@ -498,8 +486,7 @@
{:db/ident :transaction/payment {:db/ident :transaction/payment
:db/valueType :db.type/ref :db/valueType :db.type/ref
:db/cardinality :db.cardinality/one :db/cardinality :db.cardinality/one
:db/doc "The payment that this transaction matched to"} :db/doc "The payment that this transaction matched to"}])
])
(def user-schema (def user-schema
[{:db/ident :user/original-id [{:db/ident :user/original-id
@@ -531,13 +518,11 @@
;;enums ;;enums
{:db/ident :user-role/admin} {:db/ident :user-role/admin}
{:db/ident :user-role/user} {:db/ident :user-role/user}
{:db/ident :user-role/none} {:db/ident :user-role/none}])
])
(def base-schema (def base-schema
[address-schema contact-schema vendor-schema client-schema bank-account-schema invoice-schema invoice-expense-account-schema payment-schema invoice-payment-schema transaction-schema user-schema]) [address-schema contact-schema vendor-schema client-schema bank-account-schema invoice-schema invoice-expense-account-schema payment-schema invoice-payment-schema transaction-schema user-schema])
#_{:clj-kondo/ignore [:clojure-lsp/unused-public-var]} #_{:clj-kondo/ignore [:clojure-lsp/unused-public-var]}
(defn migrate-vendors [_] (defn migrate-vendors [_]
[[]]) [[]])
@@ -695,8 +680,7 @@
:exception e :exception e
:level :error :level :error
:tx txes) :tx txes)
(throw e) (throw e))))
)))
(defn pull-many [db read ids] (defn pull-many [db read ids]
(->> (dc/q '[:find (pull ?e r) (->> (dc/q '[:find (pull ?e r)
@@ -734,9 +718,6 @@
(defn pull-ref [db k id] (defn pull-ref [db k id]
(:db/id (pull-attr db k id))) (:db/id (pull-attr db k id)))
#_(comment #_(comment
(dc/pull (dc/db conn) '[*] 175921860633685) (dc/pull (dc/db conn) '[*] 175921860633685)
@@ -757,9 +738,7 @@
[{:entity/migration-key 17592234924274, [{:entity/migration-key 17592234924274,
:invoice-expense-account/location nil :invoice-expense-account/location nil
:invoice-expense-account/amount 360.0, :invoice-expense-account/amount 360.0,
:invoice-expense-account/account #:db{:id 92358976759248}}],}) :invoice-expense-account/account #:db{:id 92358976759248}}]})
#_(dc/pull (dc/db conn) auto-ap.datomic.clients 79164837221904) #_(dc/pull (dc/db conn) auto-ap.datomic.clients 79164837221904)
(upsert-entity (dc/db conn) {:client/name "20Twenty - WG Development LLC", (upsert-entity (dc/db conn) {:client/name "20Twenty - WG Development LLC",
@@ -864,9 +843,7 @@
:integration-status/last-updated #inst "2022-08-23T13:09:16.082-00:00", :integration-status/last-updated #inst "2022-08-23T13:09:16.082-00:00",
:integration-status/last-attempt #inst "2022-08-23T13:08:47.018-00:00", :integration-status/last-attempt #inst "2022-08-23T13:08:47.018-00:00",
:integration-status/state :integration-status/state
#:db{:id 101155069755529, :ident :integration-state/success}}}) #:db{:id 101155069755529, :ident :integration-state/success}}}))
)
(defn install-functions [] (defn install-functions []
@(dc/transact conn @(dc/transact conn
@@ -923,7 +900,6 @@
(into #{} (into #{}
(map :db/id (:user/clients id []))))) (map :db/id (:user/clients id [])))))
(defn query2 [query] (defn query2 [query]
(apply dc/q (:query query) (:args query))) (apply dc/q (:query query) (:args query)))

View File

@@ -115,12 +115,10 @@
:where ['[?e :account/name] :where ['[?e :account/name]
'[?e :account/numeric-code ?sort-default]]}}))] '[?e :account/numeric-code ?sort-default]]}}))]
(cond->> (query2 query) (cond->> (query2 query)
true (apply-sort-3 args) true (apply-sort-3 args)
true (apply-pagination args)))) true (apply-pagination args))))
(defn graphql-results [ids db _] (defn graphql-results [ids db _]
(let [results (->> (pull-many db default-read ids) (let [results (->> (pull-many db default-read ids)
(group-by :db/id)) (group-by :db/id))

View File

@@ -14,10 +14,7 @@
(defn <-datomic [x] (defn <-datomic [x]
(->> x (->> x
(map #(update % :bank-account/type :db/ident)) (map #(update % :bank-account/type :db/ident))))
))
(defn get-by-id [id] (defn get-by-id [id]
(->> [(dc/pull (dc/db conn) default-read id)] (->> [(dc/pull (dc/db conn) default-read id)]

View File

@@ -118,7 +118,6 @@
'[(iol-ion.query/dollars= ?transaction-amount ?amount)]]} '[(iol-ion.query/dollars= ?transaction-amount ?amount)]]}
:args [(:amount args)]}) :args [(:amount args)]})
(:status args) (:status args)
(merge-query {:query {:in ['?status] (merge-query {:query {:in ['?status]
:where ['[?e :payment/status ?status]]} :where ['[?e :payment/status ?status]]}
@@ -137,7 +136,6 @@
true true
(merge-query {:query {:find ['?sort-default '?e]}})))] (merge-query {:query {:find ['?sort-default '?e]}})))]
(cond->> (observable-query query) (cond->> (observable-query query)
true (apply-sort-3 (assoc args :default-asc? false)) true (apply-sort-3 (assoc args :default-asc? false))
true (apply-pagination args))))) true (apply-pagination args)))))

View File

@@ -122,8 +122,6 @@
Long/parseLong Long/parseLong
(#(hash-map :db/id %))))) (#(hash-map :db/id %)))))
(defn exact-match [identifier] (defn exact-match [identifier]
(when (and identifier (not-empty identifier)) (when (and identifier (not-empty identifier))
(some-> (solr/query solr/impl "clients" (some-> (solr/query solr/impl "clients"
@@ -170,7 +168,6 @@
matching-ids) matching-ids)
(set (map :db/id (:clients args)))) (set (map :db/id (:clients args))))
query (cond-> {:query {:find [] query (cond-> {:query {:find []
:in ['$] :in ['$]
:where []} :where []}
@@ -179,7 +176,6 @@
(merge-query {:query {:in ['[?e ...]]} (merge-query {:query {:in ['[?e ...]]}
:args [(set valid-ids)]}) :args [(set valid-ids)]})
(:sort args) (add-sorter-fields {"name" ['[?e :client/name ?sort-name]]} (:sort args) (add-sorter-fields {"name" ['[?e :client/name ?sort-name]]}
args) args)
@@ -195,7 +191,6 @@
(map cleanse))] (map cleanse))]
results)) results))
(defn get-graphql-page [args] (defn get-graphql-page [args]
(let [db (dc/db conn) (let [db (dc/db conn)
{ids-to-retrieve :ids matching-count :count} (raw-graphql-ids db args)] {ids-to-retrieve :ids matching-count :count} (raw-graphql-ids db args)]

View File

@@ -76,7 +76,6 @@
'[(iol-ion.query/dollars= ?expected-deposit-total ?total)]]} '[(iol-ion.query/dollars= ?expected-deposit-total ?total)]]}
:args [(:total args)]}) :args [(:total args)]})
(:start (:date-range args)) (:start (:date-range args))
(merge-query {:query {:in '[?start-date] (merge-query {:query {:in '[?start-date]
:where ['[?e :expected-deposit/date ?date] :where ['[?e :expected-deposit/date ?date]

View File

@@ -44,7 +44,6 @@
eas))) eas)))
(rename-keys {:invoice-payment/_invoice :invoice/payments}))) (rename-keys {:invoice-payment/_invoice :invoice/payments})))
(defn raw-graphql-ids (defn raw-graphql-ids
([args] ([args]
(raw-graphql-ids (dc/db conn) args)) (raw-graphql-ids (dc/db conn) args))
@@ -63,15 +62,12 @@
valid-clients]} valid-clients]}
(cond-> {:query {:find [] (cond-> {:query {:find []
:in '[$ [?clients ?start ?end]] :in '[$ [?clients ?start ?end]]
:where '[ :where '[[(iol-ion.query/scan-invoices $ ?clients ?start ?end) [[?e _ ?sort-default] ...]]]}
[(iol-ion.query/scan-invoices $ ?clients ?start ?end) [[?e _ ?sort-default] ...]]
]}
:args [db :args [db
[valid-clients [valid-clients
(some-> (:start (:date-range args)) coerce/to-date) (some-> (:start (:date-range args)) coerce/to-date)
(some-> (:end (:date-range args)) coerce/to-date)]]} (some-> (:end (:date-range args)) coerce/to-date)]]}
(:client-id args) (:client-id args)
(merge-query {:query {:in ['?client-id] (merge-query {:query {:in ['?client-id]
:where ['[?e :invoice/client ?client-id]]} :where ['[?e :invoice/client ?client-id]]}
@@ -85,16 +81,11 @@
(:original-id args) (:original-id args)
(merge-query {:query {:in ['?original-id] (merge-query {:query {:in ['?original-id]
:where [ :where ['[?e :invoice/client ?c]
'[?e :invoice/client ?c]
'[?c :client/original-id ?original-id]]} '[?c :client/original-id ?original-id]]}
:args [(cond-> (:original-id args) :args [(cond-> (:original-id args)
(string? (:original-id args)) Long/parseLong)]}) (string? (:original-id args)) Long/parseLong)]})
(:start (:due-range args)) (merge-query {:query {:in '[?start-due] (:start (:due-range args)) (merge-query {:query {:in '[?start-due]
:where ['[?e :invoice/due ?due] :where ['[?e :invoice/due ?due]
'[(>= ?due ?start-due)]]} '[(>= ?due ?start-due)]]}
@@ -105,7 +96,6 @@
'[(<= ?due ?end-due)]]} '[(<= ?due ?end-due)]]}
:args [(coerce/to-date (:end (:due-range args)))]}) :args [(coerce/to-date (:end (:due-range args)))]})
(:import-status args) (:import-status args)
(merge-query {:query {:in ['?import-status] (merge-query {:query {:in ['?import-status]
:where ['[?e :invoice/import-status ?import-status]]} :where ['[?e :invoice/import-status ?import-status]]}
@@ -181,7 +171,6 @@
(apply-sort-3 args) (apply-sort-3 args)
(apply-pagination args))))) (apply-pagination args)))))
(defn graphql-results [ids db _] (defn graphql-results [ids db _]
(let [results (->> (pull-many db default-read ids) (let [results (->> (pull-many db default-read ids)
(group-by :db/id)) (group-by :db/id))
@@ -210,8 +199,7 @@
(->> (->>
(dc/q {:find ['?id '?o] (dc/q {:find ['?id '?o]
:in ['$ '[?id ...]] :in ['$ '[?id ...]]
:where ['[?id :invoice/total ?o]] :where ['[?id :invoice/total ?o]]}
}
(dc/db conn) (dc/db conn)
ids) ids)
(map last) (map last)
@@ -226,7 +214,6 @@
outstanding (sum-outstanding ids-to-retrieve) outstanding (sum-outstanding ids-to-retrieve)
total-amount (sum-total-amount ids-to-retrieve)] total-amount (sum-total-amount ids-to-retrieve)]
[(->> (graphql-results ids-to-retrieve db args)) [(->> (graphql-results ids-to-retrieve db args))
matching-count matching-count
outstanding outstanding
@@ -241,8 +228,6 @@
(map <-datomic (map <-datomic
(pull-many (dc/db conn) default-read ids))) (pull-many (dc/db conn) default-read ids)))
(defn find-conflicting [{:keys [:invoice/invoice-number :invoice/vendor :invoice/client :db/id]}] (defn find-conflicting [{:keys [:invoice/invoice-number :invoice/vendor :invoice/client :db/id]}]
(->> (dc/q (->> (dc/q
@@ -257,23 +242,20 @@
(map first) (map first)
(map <-datomic))) (map <-datomic)))
(defn get-existing-set [] (defn get-existing-set []
(let [vendored-results (set (dc/q {:find ['?vendor '?client '?invoice-number] (let [vendored-results (set (dc/q {:find ['?vendor '?client '?invoice-number]
:in ['$] :in ['$]
:where '[[?e :invoice/invoice-number ?invoice-number] :where '[[?e :invoice/invoice-number ?invoice-number]
[?e :invoice/vendor ?vendor] [?e :invoice/vendor ?vendor]
[?e :invoice/client ?client] [?e :invoice/client ?client]
(not [?e :invoice/status :invoice-status/voided]) (not [?e :invoice/status :invoice-status/voided])]}
]}
(dc/db conn))) (dc/db conn)))
vendorless-results (->> (dc/q {:find ['?client '?invoice-number] vendorless-results (->> (dc/q {:find ['?client '?invoice-number]
:in ['$] :in ['$]
:where '[[?e :invoice/invoice-number ?invoice-number] :where '[[?e :invoice/invoice-number ?invoice-number]
(not [?e :invoice/vendor]) (not [?e :invoice/vendor])
[?e :invoice/client ?client] [?e :invoice/client ?client]
(not [?e :invoice/status :invoice-status/voided]) (not [?e :invoice/status :invoice-status/voided])]}
]}
(dc/db conn)) (dc/db conn))
(mapv (fn [[client invoice-number]] (mapv (fn [[client invoice-number]]
[nil client invoice-number])) [nil client invoice-number]))

View File

@@ -53,7 +53,6 @@
:where ['[?e :journal-entry/vendor ?vendor-id]]} :where ['[?e :journal-entry/vendor ?vendor-id]]}
:args [(:vendor-id args)]}) :args [(:vendor-id args)]})
(or (seq (:numeric-code args)) (or (seq (:numeric-code args))
(:bank-account-id args) (:bank-account-id args)
(not-empty (:location args))) (not-empty (:location args)))
@@ -70,7 +69,6 @@
:args [(vec (for [{:keys [from to]} (:numeric-code args)] :args [(vec (for [{:keys [from to]} (:numeric-code args)]
[(or from 0) (or to 99999)]))]}) [(or from 0) (or to 99999)]))]})
(:amount-gte args) (:amount-gte args)
(merge-query {:query {:in ['?amount-gte] (merge-query {:query {:in ['?amount-gte]
:where ['[?e :journal-entry/amount ?a] :where ['[?e :journal-entry/amount ?a]

View File

@@ -43,8 +43,7 @@
:sales-order/source, :sales-order/source,
:sales-order/reference-link, :sales-order/reference-link,
{:sales-order/client [:client/name :db/id :client/code] {:sales-order/client [:client/name :db/id :client/code]
:sales-order/charges [ :sales-order/charges [:charge/type-name,
:charge/type-name,
:charge/total, :charge/total,
:charge/tax, :charge/tax,
:charge/tip, :charge/tip,
@@ -63,7 +62,6 @@
(set/intersection #{(:client-id args)} (set/intersection #{(:client-id args)}
visible-clients) visible-clients)
(:client-code args) (:client-code args)
(set/intersection #{(pull-id db [:client/code (:client-code args)])} (set/intersection #{(pull-id db [:client/code (:client-code args)])}
visible-clients) visible-clients)

View File

@@ -78,7 +78,6 @@
(merge-query {:query {:find ['?e] (merge-query {:query {:find ['?e]
:where ['[?e :transaction-rule/transaction-approval-status]]}}))] :where ['[?e :transaction-rule/transaction-approval-status]]}}))]
(cond->> (query2 query) (cond->> (query2 query)
true (apply-sort-3 args) true (apply-sort-3 args)
true (apply-pagination args)))) true (apply-pagination args))))

View File

@@ -37,7 +37,6 @@
(map first) (map first)
set))) set)))
(defn raw-graphql-ids (defn raw-graphql-ids
([args] (raw-graphql-ids (dc/db conn) args)) ([args] (raw-graphql-ids (dc/db conn) args))
([db args] ([db args]
@@ -87,7 +86,6 @@
:where ['[?e :transaction/vendor ?vendor-id]]} :where ['[?e :transaction/vendor ?vendor-id]]}
:args [(:vendor-id args)]}) :args [(:vendor-id args)]})
(:amount-gte args) (:amount-gte args)
(merge-query {:query {:in ['?amount-gte] (merge-query {:query {:in ['?amount-gte]
:where ['[?e :transaction/amount ?a] :where ['[?e :transaction/amount ?a]

View File

@@ -50,7 +50,6 @@
:vendor/plaid-merchant [:db/id :plaid-merchant/name] :vendor/plaid-merchant [:db/id :plaid-merchant/name]
:vendor-usage/_vendor [:vendor-usage/client :vendor-usage/count]}]) :vendor-usage/_vendor [:vendor-usage/client :vendor-usage/count]}])
(defn raw-graphql-ids [db args] (defn raw-graphql-ids [db args]
(let [query (cond-> {:query {:find [] (let [query (cond-> {:query {:find []
:in ['$] :in ['$]
@@ -70,7 +69,6 @@
(merge-query {:query {:find ['?e] (merge-query {:query {:find ['?e]
:where ['[?e :vendor/name]]}}))] :where ['[?e :vendor/name]]}}))]
(cond->> (query2 query) (cond->> (query2 query)
true (apply-sort-3 args) true (apply-sort-3 args)
true (apply-pagination args)))) true (apply-pagination args))))
@@ -86,9 +84,7 @@
(update v :usage (fn [usages] (update v :usage (fn [usages]
(->> usages (->> usages
(map (fn [u] {:client-id (:db/id (:vendor-usage/client u)) (map (fn [u] {:client-id (:db/id (:vendor-usage/client u))
:count (:vendor-usage/count u)})))))) :count (:vendor-usage/count u)}))))))))
))
(defn graphql-results [ids db args] (defn graphql-results [ids db args]
(let [results (->> (pull-many db default-read ids) (let [results (->> (pull-many db default-read ids)
@@ -104,9 +100,7 @@
(let [db (dc/db conn) (let [db (dc/db conn)
{ids-to-retrieve :ids matching-count :count} (raw-graphql-ids db args)] {ids-to-retrieve :ids matching-count :count} (raw-graphql-ids db args)]
[(->> (graphql-results ids-to-retrieve db args)) [(->> (graphql-results ids-to-retrieve db args))
matching-count]) matching-count]))
)
(defn get-graphql-by-id [args id] (defn get-graphql-by-id [args id]
(->> (dc/q {:find [(list 'pull '?e default-read)] (->> (dc/q {:find [(list 'pull '?e default-read)]
@@ -139,7 +133,6 @@
(map <-datomic) (map <-datomic)
(first))) (first)))
(defn terms-for-client-id [vendor client-id] (defn terms-for-client-id [vendor client-id]
(or (or
(->> (->>

View File

@@ -20,8 +20,7 @@
:body (json/write-str {"query" (v/graphql-query q)}) :body (json/write-str {"query" (v/graphql-query q)})
:as :json}) :as :json})
:body :body
:data :data))
))
(defn get-caterers [integration] (defn get-caterers [integration]
(:caterers (query integration {:venia/queries [{:query/data (:caterers (query integration {:venia/queries [{:query/data
@@ -94,7 +93,6 @@
:eventKey 'cancelled}} :eventKey 'cancelled}}
[[:subscription [:parentId :parentEntity :eventEntity :eventKey]]]]]}))))) [[:subscription [:parentId :parentEntity :eventEntity :eventKey]]]]]})))))
#_{:clj-kondo/ignore [:clojure-lsp/unused-public-var]} #_{:clj-kondo/ignore [:clojure-lsp/unused-public-var]}
(defn upsert-ezcater (defn upsert-ezcater
([] (upsert-ezcater (get-integrations))) ([] (upsert-ezcater (get-integrations)))
@@ -121,7 +119,6 @@
{:client/_ezcater-locations [:client/code]}]}] {:client/_ezcater-locations [:client/code]}]}]
[:ezcater-caterer/uuid caterer-uuid])) [:ezcater-caterer/uuid caterer-uuid]))
(defn round-carry-cents [f] (defn round-carry-cents [f]
(with-precision 2 (double (.setScale (bigdec f) 2 java.math.RoundingMode/HALF_UP)))) (with-precision 2 (double (.setScale (bigdec f) 2 java.math.RoundingMode/HALF_UP))))
@@ -200,7 +197,6 @@
:returns 0.0 :returns 0.0
:vendor :vendor/ccp-ezcater})) :vendor :vendor/ccp-ezcater}))
(defn get-by-id [integration id] (defn get-by-id [integration id]
(query (query
integration integration
@@ -231,27 +227,20 @@
[:currency [:currency
:subunits]]]]]] :subunits]]]]]]
[:totals [[:customerTotalDue [:totals [[:customerTotalDue
[ [:currency
:currency :subunits]]
:subunits
]]
[:pointOfSaleIntegrationFee [:pointOfSaleIntegrationFee
[ [:currency
:currency :subunits]]
:subunits
]]
[:tip [:tip
[:currency [:currency
:subunits]] :subunits]]
[:salesTax [:salesTax
[ [:currency
:currency :subunits]]
:subunits
]]
[:salesTaxRemittance [:salesTaxRemittance
[:currency [:currency
:subunits :subunits]]
]]
[:subTotal [:subTotal
[:currency [:currency
:subunits]]]]]]]})) :subunits]]]]]]]}))

View File

@@ -34,8 +34,7 @@
(clojure.lang IPersistentMap))) (clojure.lang IPersistentMap)))
(def integreat-schema (def integreat-schema
{ {:scalars {:id {:parse #(cond (number? %)
:scalars {:id {:parse #(cond (number? %)
% %
% %
@@ -86,8 +85,7 @@
(str %) (str %)
%)}} %)}}
:objects :objects
{ {:message
:message
{:fields {:message {:type 'String}}} {:fields {:message {:type 'String}}}
:search_result :search_result
@@ -128,7 +126,6 @@
:email {:type 'String} :email {:type 'String}
:phone {:type 'String}}} :phone {:type 'String}}}
:address :address
{:fields {:id {:type :id} {:fields {:id {:type :id}
:street1 {:type 'String} :street1 {:type 'String}
@@ -184,7 +181,6 @@
:legal_entity_tin_type {:type :tin_type} :legal_entity_tin_type {:type :tin_type}
:legal_entity_1099_type {:type :type_1099}}} :legal_entity_1099_type {:type :type_1099}}}
:reminder :reminder
{:fields {:id {:type 'Int} {:fields {:id {:type 'Int}
:email {:type 'String} :email {:type 'String}
@@ -222,8 +218,6 @@
:accounts {:type '(list :percentage_account)} :accounts {:type '(list :percentage_account)}
:transaction_approval_status {:type :transaction_approval_status}}} :transaction_approval_status {:type :transaction_approval_status}}}
:user :user
{:fields {:id {:type :id} {:fields {:id {:type :id}
:name {:type 'String} :name {:type 'String}
@@ -264,18 +258,12 @@
:start {:type 'Int} :start {:type 'Int}
:end {:type 'Int}}} :end {:type 'Int}}}
:transaction_rule_page {:fields {:transaction_rules {:type '(list :transaction_rule)} :transaction_rule_page {:fields {:transaction_rules {:type '(list :transaction_rule)}
:count {:type 'Int} :count {:type 'Int}
:total {:type 'Int} :total {:type 'Int}
:start {:type 'Int} :start {:type 'Int}
:end {:type 'Int}}} :end {:type 'Int}}}
:vendor_page {:fields {:vendors {:type '(list :vendor)} :vendor_page {:fields {:vendors {:type '(list :vendor)}
:count {:type 'Int} :count {:type 'Int}
:total {:type 'Int} :total {:type 'Int}
@@ -321,7 +309,6 @@
:args {:transaction_id {:type :id}} :args {:transaction_id {:type :id}}
:resolve :get-transaction-rule-matches} :resolve :get-transaction-rule-matches}
:test_transaction_rule {:type '(list :transaction) :test_transaction_rule {:type '(list :transaction)
:args {:transaction_rule {:type :edit_transaction_rule}} :args {:transaction_rule {:type :edit_transaction_rule}}
:resolve :test-transaction-rule} :resolve :test-transaction-rule}
@@ -338,7 +325,6 @@
:args {:client_id {:type :id}} :args {:client_id {:type :id}}
:resolve :get-cash-flow} :resolve :get-cash-flow}
:all_accounts {:type '(list :account) :all_accounts {:type '(list :account)
:args {} :args {}
:resolve :get-all-accounts} :resolve :get-all-accounts}
@@ -353,10 +339,6 @@
:vendor_id {:type :id}} :vendor_id {:type :id}}
:resolve :search-account} :resolve :search-account}
:yodlee_merchants {:type '(list :yodlee_merchant) :yodlee_merchants {:type '(list :yodlee_merchant)
:args {} :args {}
:resolve :get-yodlee-merchants} :resolve :get-yodlee-merchants}
@@ -376,9 +358,6 @@
:description {:type 'String}} :description {:type 'String}}
:resolve :get-transaction-rule-page} :resolve :get-transaction-rule-page}
:vendor {:type :vendor_page :vendor {:type :vendor_page
:args {:name_like {:type 'String} :args {:name_like {:type 'String}
:start {:type 'Int} :start {:type 'Int}
@@ -395,8 +374,7 @@
:resolve :account-for-vendor}} :resolve :account-for-vendor}}
:input-objects :input-objects
{ {:sort_item
:sort_item
{:fields {:sort_key {:type 'String} {:fields {:sort_key {:type 'String}
:sort_name {:type 'String} :sort_name {:type 'String}
:asc {:type 'Boolean}}} :asc {:type 'Boolean}}}
@@ -495,8 +473,7 @@
:name {:type 'String} :name {:type 'String}
:client_overrides {:type '(list :edit_account_client_override)}}}} :client_overrides {:type '(list :edit_account_client_override)}}}}
:enums { :enums {:processor {:values [{:enum-value :na}
:processor {:values [{:enum-value :na}
{:enum-value :doordash} {:enum-value :doordash}
{:enum-value :koala} {:enum-value :koala}
{:enum-value :ezcater} {:enum-value :ezcater}
@@ -533,9 +510,7 @@
{:enum-value :equity} {:enum-value :equity}
{:enum-value :revenue}]}} {:enum-value :revenue}]}}
:mutations :mutations
{ {:delete_transaction_rule
:delete_transaction_rule
{:type :id {:type :id
:args {:transaction_rule_id {:type :id}} :args {:transaction_rule_id {:type :id}}
:resolve :mutation/delete-transaction-rule} :resolve :mutation/delete-transaction-rule}
@@ -553,9 +528,7 @@
:upsert_transaction_rule :upsert_transaction_rule
{:type :transaction_rule {:type :transaction_rule
:args {:transaction_rule {:type :edit_transaction_rule}} :args {:transaction_rule {:type :edit_transaction_rule}}
:resolve :mutation/upsert-transaction-rule} :resolve :mutation/upsert-transaction-rule}}})
}})
(defn snake->kebab [s] (defn snake->kebab [s]
(str/replace s #"_" "-")) (str/replace s #"_" "-"))
@@ -581,7 +554,6 @@
node)) node))
m)) m))
(defn get-expense-account-stats [_ {:keys [client_id]} _] (defn get-expense-account-stats [_ {:keys [client_id]} _]
(let [query (cond-> {:query {:find ['?account '?account-name '(sum ?amount)] (let [query (cond-> {:query {:find ['?account '?account-name '(sum ?amount)]
:in ['$] :in ['$]
@@ -736,12 +708,10 @@
(take (* 7 4) (time/day-of-week-seq 1))) (take (* 7 4) (time/day-of-week-seq 1)))
(filter #(< (:amount %) 0) forecasted-transactions))}))) (filter #(< (:amount %) 0) forecasted-transactions))})))
(def schema (def schema
(-> integreat-schema (-> integreat-schema
(attach-tracing-resolvers (attach-tracing-resolvers
{ {:get-all-accounts gq-accounts/get-all-graphql
:get-all-accounts gq-accounts/get-all-graphql
:get-transaction-rule-page gq-transaction-rules/get-transaction-rule-page :get-transaction-rule-page gq-transaction-rules/get-transaction-rule-page
:get-transaction-rule-matches gq-transaction-rules/get-transaction-rule-matches :get-transaction-rule-matches gq-transaction-rules/get-transaction-rule-matches
:get-expense-account-stats get-expense-account-stats :get-expense-account-stats get-expense-account-stats
@@ -772,8 +742,6 @@
gq-sales-orders/attach gq-sales-orders/attach
schema/compile)) schema/compile))
(defn simplify (defn simplify
"Converts all ordered maps nested within the map into standard hash maps, and "Converts all ordered maps nested within the map into standard hash maps, and
sequences into vectors, which makes for easier constants in the tests, and eliminates ordering problems." sequences into vectors, which makes for easier constants in the tests, and eliminates ordering problems."

View File

@@ -18,7 +18,6 @@
[iol-ion.tx :refer [random-tempid]] [iol-ion.tx :refer [random-tempid]]
[com.brunobonacci.mulog :as mu])) [com.brunobonacci.mulog :as mu]))
(defn get-all-graphql [context args _] (defn get-all-graphql [context args _]
(assert-admin (:id context)) (assert-admin (:id context))
(let [args (assoc args :id (:id context)) (let [args (assoc args :id (:id context))

View File

@@ -97,7 +97,6 @@
[:line {:line-width 0.15 :color [50 50 50]}]] [:line {:line-width 0.15 :color [50 50 50]}]]
[:cell {:colspan 3}]] [:cell {:colspan 3}]]
[[:cell {:size 9 :leading 11.5} "\n\n\n\n\nMEMO"] [[:cell {:size 9 :leading 11.5} "\n\n\n\n\nMEMO"]
[:cell {:colspan 5 :leading 11.5} (split-memo memo) [:cell {:colspan 5 :leading 11.5} (split-memo memo)
[:line {:line-width 0.15 :color [50 50 50]}]] [:line {:line-width 0.15 :color [50 50 50]}]]
@@ -186,8 +185,6 @@
:payment/pdf-data :payment/pdf-data
(edn/read-string) (edn/read-string)
make-check-pdf)] make-check-pdf)]
(s3/put-object :bucket-name (:data-bucket env) (s3/put-object :bucket-name (:data-bucket env)
:key (:payment/s3-key check) :key (:payment/s3-key check)
@@ -277,7 +274,6 @@
(conj payment) (conj payment)
(into (invoice-payments invoices invoice-amounts))))) (into (invoice-payments invoices invoice-amounts)))))
(defmethod invoices->entities :payment-type/debit [invoices vendor client bank-account type index invoice-amounts date] (defmethod invoices->entities :payment-type/debit [invoices vendor client bank-account type index invoice-amounts date]
(when (<= (->> invoices (when (<= (->> invoices
(map (comp invoice-amounts :db/id)) (map (comp invoice-amounts :db/id))
@@ -297,7 +293,6 @@
(conj payment) (conj payment)
(into (invoice-payments invoices invoice-amounts))))) (into (invoice-payments invoices invoice-amounts)))))
(defmethod invoices->entities :payment-type/balance-credit [invoices invoice-amounts] (defmethod invoices->entities :payment-type/balance-credit [invoices invoice-amounts]
(when (<= (->> invoices (when (<= (->> invoices
(map (comp invoice-amounts :db/id)) (map (comp invoice-amounts :db/id))
@@ -488,7 +483,6 @@
{:s3-url nil {:s3-url nil
:invoices (d-invoices/get-multi (map :invoice_id (:invoice_payments args)))}))) :invoices (d-invoices/get-multi (map :invoice_id (:invoice_payments args)))})))
(defn void-payment [context {id :payment_id} _] (defn void-payment [context {id :payment_id} _]
(let [check (d-checks/get-by-id id)] (let [check (d-checks/get-by-id id)]
(assert (or (= :payment-status/pending (:payment/status check)) (assert (or (= :payment-status/pending (:payment/status check))
@@ -549,7 +543,6 @@
:invoice-status/unpaid)}]])))))))) :invoice-status/unpaid)}]]))))))))
id)) id))
(defn void-payments [context args _] (defn void-payments [context args _]
(assert-admin (:id context)) (assert-admin (:id context))
(let [args (assoc args :clients (:clients context)) (let [args (assoc args :clients (:clients context))
@@ -607,7 +600,6 @@
0.001)) 0.001))
invoices) invoices)
total-to-pay (reduce + 0 (map :invoice/outstanding-balance invoices-to-be-paid)) total-to-pay (reduce + 0 (map :invoice/outstanding-balance invoices-to-be-paid))
_ (when (<= total-to-pay 0.001) _ (when (<= total-to-pay 0.001)
(assert-failure "You must select invoices that need to be paid.")) (assert-failure "You must select invoices that need to be paid."))
@@ -637,8 +629,6 @@
[total-to-pay []]))) [total-to-pay []])))
(into {})) (into {}))
vendor-id (:db/id (:invoice/vendor (first invoices))) vendor-id (:db/id (:invoice/vendor (first invoices)))
payment {:db/id (str vendor-id) payment {:db/id (str vendor-id)
:payment/amount total-to-pay :payment/amount total-to-pay
@@ -751,7 +741,6 @@
{:enum-value :pending} {:enum-value :pending}
{:enum-value :cleared}]}}) {:enum-value :cleared}]}})
(def resolvers (def resolvers
{:get-potential-payments get-potential-payments {:get-potential-payments get-potential-payments
:get-payment-page get-payment-page :get-payment-page get-payment-page

View File

@@ -47,13 +47,6 @@
bank-accounts))))))] bank-accounts))))))]
(result->page clients clients-count :clients (:filters args)))) (result->page clients clients-count :clients (:filters args))))
(def objects (def objects
{:location_match {:location_match
{:fields {:location {:type 'String} {:fields {:location {:type 'String}
@@ -109,8 +102,6 @@
:start {:type 'Int} :start {:type 'Int}
:end {:type 'Int}}} :end {:type 'Int}}}
:bank_account :bank_account
{:fields {:id {:type :id} {:fields {:id {:type :id}
:integration_status {:type :integration_status} :integration_status {:type :integration_status}
@@ -139,9 +130,7 @@
:forecasted_transaction {:fields {:identifier {:type 'String} :forecasted_transaction {:fields {:identifier {:type 'String}
:id {:type :id} :id {:type :id}
:day_of_month {:type 'Int} :day_of_month {:type 'Int}
:amount {:type :money}}} :amount {:type :money}}}})
})
(def queries (def queries
{:client {:type '(list :client) {:client {:type '(list :client)
@@ -175,7 +164,6 @@
:get-admin-client get-admin-client :get-admin-client get-admin-client
:get-client-page get-client-page}) :get-client-page get-client-page})
(defn attach [schema] (defn attach [schema]
(-> (->
(merge-with merge schema (merge-with merge schema

View File

@@ -17,7 +17,6 @@
{:name name {:name name
:id id})) :id id}))
(def objects (def objects
{:ezcater_caterer {:fields {:name {:type 'String} {:ezcater_caterer {:fields {:name {:type 'String}
:id {:type :id}}}}) :id {:type :id}}}})

View File

@@ -40,7 +40,6 @@
(merge-query {:query {:find ['?e] (merge-query {:query {:find ['?e]
:where ['[?e :import-batch/date]]}}))] :where ['[?e :import-batch/date]]}}))]
(cond->> (query2 query) (cond->> (query2 query)
true (apply-sort-3 args) true (apply-sort-3 args)
true (apply-pagination args)))) true (apply-pagination args))))
@@ -66,7 +65,6 @@
(map #(update % :import-batch/date coerce/to-date-time))) (map #(update % :import-batch/date coerce/to-date-time)))
matching-count :data args))) matching-count :data args)))
(defn attach [schema] (defn attach [schema]
(-> (->
(merge-with merge schema (merge-with merge schema
@@ -83,9 +81,7 @@
:count {:type 'Int} :count {:type 'Int}
:total {:type 'Int} :total {:type 'Int}
:start {:type 'Int} :start {:type 'Int}
:end {:type 'Int}}} :end {:type 'Int}}}}
}
:queries {:import_batch_page {:type :import_batch_page :queries {:import_batch_page {:type :import_batch_page
:args {:filters {:type :import_batch_filters}} :args {:filters {:type :import_batch_filters}}

View File

@@ -174,8 +174,6 @@
(let [error (str "Expense account total (" expense-account-total ") does not equal invoice total (" total ")")] (let [error (str "Expense account total (" expense-account-total ") does not equal invoice total (" total ")")]
(throw (ex-info error {:validation-error error})))))) (throw (ex-info error {:validation-error error}))))))
(defn add-invoice [context {{:keys [expense_accounts client_id vendor_id] :as in} :invoice} _] (defn add-invoice [context {{:keys [expense_accounts client_id vendor_id] :as in} :invoice} _]
(assert-no-conflicting in) (assert-no-conflicting in)
(assert-can-see-client (:id context) client_id) (assert-can-see-client (:id context) client_id)
@@ -193,8 +191,6 @@
(when-not ((set (map :db/id (:client/bank-accounts (d-clients/get-by-id client-id)))) bank-account-id) (when-not ((set (map :db/id (:client/bank-accounts (d-clients/get-by-id client-id)))) bank-account-id)
(throw (ex-info (str "Bank account does not belong to client") {:validation-error "Bank account does not belong to client."})))) (throw (ex-info (str "Bank account does not belong to client") {:validation-error "Bank account does not belong to client."}))))
(defn add-and-print-invoice [context {{:keys [total client_id vendor_id] :as in} :invoice bank-account-id :bank_account_id type :type} _] (defn add-and-print-invoice [context {{:keys [total client_id vendor_id] :as in} :invoice bank-account-id :bank_account_id type :type} _]
(mu/trace ::validating-invoice [:invoice in] (mu/trace ::validating-invoice [:invoice in]
(do (do
@@ -261,7 +257,6 @@
(-> (d-invoices/get-by-id id) (->graphql (:id context))))) (-> (d-invoices/get-by-id id) (->graphql (:id context)))))
(defn get-ids-matching-filters [args] (defn get-ids-matching-filters [args]
(let [ids (some-> args (let [ids (some-> args
:filters :filters
@@ -448,8 +443,6 @@
[])] [])]
accounts))) accounts)))
(defn bulk-change-invoices [context args _] (defn bulk-change-invoices [context args _]
(assert-admin (:id context)) (assert-admin (:id context))
(when-not (:client_id args) (when-not (:client_id args)

View File

@@ -55,10 +55,8 @@
(let [args (assoc args :id (:id context)) (let [args (assoc args :id (:id context))
[journal-entries journal-entries-count] (l/get-graphql (assoc (<-graphql (:filters args)) [journal-entries journal-entries-count] (l/get-graphql (assoc (<-graphql (:filters args))
:per-page Integer/MAX_VALUE :per-page Integer/MAX_VALUE
:clients (:clients context))) :clients (:clients context)))]
]
{:csv_content_b64 (Base64/encodeBase64String {:csv_content_b64 (Base64/encodeBase64String
(.getBytes (.getBytes
(with-open [w (java.io.StringWriter.)] (with-open [w (java.io.StringWriter.)]
@@ -90,15 +88,12 @@
:account-type/dividend :account-type/dividend
:account-type/expense} account-type) :account-type/expense} account-type)
(- (or (-> li :journal-entry-line/debit) 0.0) (or (-> li :journal-entry-line/credit) 0.0)) (- (or (-> li :journal-entry-line/debit) 0.0) (or (-> li :journal-entry-line/credit) 0.0))
(- (or (-> li :journal-entry-line/credit) 0.0) (or (-> li :journal-entry-line/debit) 0.0))) (- (or (-> li :journal-entry-line/credit) 0.0) (or (-> li :journal-entry-line/debit) 0.0)))]))
])) (:journal-entry/line-items j))))))
(:journal-entry/line-items j))
))))
:quote? (constantly true)) :quote? (constantly true))
(.toString w))))})) (.toString w))))}))
(defn roll-up-until (defn roll-up-until
([lookup-account all-ledger-entries end-date] ([lookup-account all-ledger-entries end-date]
(roll-up-until lookup-account all-ledger-entries end-date nil)) (roll-up-until lookup-account all-ledger-entries end-date nil))
@@ -115,8 +110,7 @@
(-> acc (-> acc
(update-in [[location account] :debit] (fnil + 0.0) debit) (update-in [[location account] :debit] (fnil + 0.0) debit)
(update-in [[location account] :credit] (fnil + 0.0) credit) (update-in [[location account] :credit] (fnil + 0.0) credit)
(update-in [[location account] :count] (fnil + 0) 1)) (update-in [[location account] :count] (fnil + 0) 1)))
)
{}) {})
(reduce-kv (reduce-kv
(fn [acc [location account-id] {:keys [debit credit count]}] (fn [acc [location account-id] {:keys [debit credit count]}]
@@ -183,8 +177,7 @@
(cond-> {:balance-sheet-accounts (mapcat (cond-> {:balance-sheet-accounts (mapcat
#(roll-up-until (lookup-account %) (all-ledger-entries %) end-date) #(roll-up-until (lookup-account %) (all-ledger-entries %) end-date)
client-ids) client-ids)}
}
(:include_comparison args) (assoc :comparable-balance-sheet-accounts (mapcat (:include_comparison args) (assoc :comparable-balance-sheet-accounts (mapcat
#(roll-up-until (lookup-account %) (all-ledger-entries %) comparable-date) #(roll-up-until (lookup-account %) (all-ledger-entries %) comparable-date)
client-ids)) client-ids))
@@ -219,9 +212,6 @@
(throw (ex-info "Please select one of 'Include deltas' or 'Column per location'" {:validation-error "Please select one of 'Include deltas' or 'Column per location'"})))] (throw (ex-info "Please select one of 'Include deltas' or 'Column per location'" {:validation-error "Please select one of 'Include deltas' or 'Column per location'"})))]
(get-profit-and-loss-raw client-ids (:periods args)))) (get-profit-and-loss-raw client-ids (:periods args))))
;; profit and loss based off of index ;; profit and loss based off of index
#_(defn get-profit-and-loss [context args _] #_(defn get-profit-and-loss [context args _]
(let [client-id (:client_id args) (let [client-id (:client_id args)
@@ -296,8 +286,7 @@
:debits 0 :debits 0
:credits 0 :credits 0
:amount (- (or (:journal-entry-line/running-balance end-point) 0.0) :amount (- (or (:journal-entry-line/running-balance end-point) 0.0)
(or (:journal-entry-line/running-balance start-point) 0.0)) (or (:journal-entry-line/running-balance start-point) 0.0))}
}
((lookup-account c) a))]))) ((lookup-account c) a))])))
all-used-account-locations)}))))}))) all-used-account-locations)}))))})))
@@ -320,7 +309,6 @@
(->graphql result))) (->graphql result)))
(defn assoc-error [f] (defn assoc-error [f]
(fn [entry] (fn [entry]
(try (try
@@ -546,15 +534,13 @@
(dc/q '[:find ?je (dc/q '[:find ?je
:in $ [?ei ...] :in $ [?ei ...]
:where [?je :journal-entry/external-id ?ei]] :where [?je :journal-entry/external-id ?ei]]
(dc/db conn) (dc/db conn))
)
(map first) (map first)
(map (fn [je] [:db/retractEntity je])))] (map (fn [je] [:db/retractEntity je])))]
(alog/info ::manual-import (alog/info ::manual-import
:errors (count errors) :errors (count errors)
:sample (take 3 errors)) :sample (take 3 errors))
(mu/trace ::retraction-tx (mu/trace ::retraction-tx
[:count (count retraction)] [:count (count retraction)]
(audit-transact-batch retraction (:id context))) (audit-transact-batch retraction (:id context)))
@@ -582,7 +568,6 @@
:errors (map (fn [x] {:external_id (:external_id x) :errors (map (fn [x] {:external_id (:external_id x)
:error (:error x)}) errors)})) :error (:error x)}) errors)}))
(defn get-journal-detail-report [context input _] (defn get-journal-detail-report [context input _]
(let [category-totals (atom {}) (let [category-totals (atom {})
base-categories (into [] base-categories (into []
@@ -608,8 +593,7 @@
(when-let [account (account-lookup (:id (:account jel)))] (when-let [account (account-lookup (:id (:account jel)))]
(and (and
(l-reports/account-belongs-in-category? (:numeric_code account) category) (l-reports/account-belongs-in-category? (:numeric_code account) category)
(= location (:location jel))))) (= location (:location jel))))))
)
(map (fn [jel] (map (fn [jel]
{:date (:date je) {:date (:date je)
:debit (:debit jel) :debit (:debit jel)
@@ -675,15 +659,12 @@
line))}] line))}]
result)) result))
(defn journal-detail-report-pdf [context args value] (defn journal-detail-report-pdf [context args value]
(let [data (get-journal-detail-report context args value) (let [data (get-journal-detail-report context args value)
result (print-journal-detail-report (:id context) args data)] result (print-journal-detail-report (:id context) args data)]
(->graphql result))) (->graphql result)))
(def objects (def objects
{:balance_sheet_account {:balance_sheet_account
{:fields {:id {:type 'String} {:fields {:id {:type 'String}
@@ -881,8 +862,7 @@
:amount {:type :money} :amount {:type :money}
:note {:type 'String} :note {:type 'String}
:cleared_against {:type 'String} :cleared_against {:type 'String}
:line_items {:type '(list :import_ledger_line_item)}}} :line_items {:type '(list :import_ledger_line_item)}}}})
})
(def enums (def enums
{:ledger_category {:values [{:enum-value :sales} {:ledger_category {:values [{:enum-value :sales}
@@ -892,7 +872,6 @@
{:enum-value :fixed_overhead} {:enum-value :fixed_overhead}
{:enum-value :ownership_controllable}]}}) {:enum-value :ownership_controllable}]}})
(def resolvers (def resolvers
{:get-ledger-page get-ledger-page {:get-ledger-page get-ledger-page
:get-balance-sheet get-balance-sheet :get-balance-sheet get-balance-sheet

View File

@@ -21,8 +21,6 @@
:name (first name)})) :name (first name)}))
[])) []))
(defn attach [schema] (defn attach [schema]
(-> (->
(merge-with merge schema (merge-with merge schema

View File

@@ -17,7 +17,6 @@
->graphql ->graphql
(first (d-sales-orders2/get-graphql (assoc (<-graphql args) :count Integer/MAX_VALUE))))) (first (d-sales-orders2/get-graphql (assoc (<-graphql args) :count Integer/MAX_VALUE)))))
(def objects (def objects
{:sales_order_page {:sales_order_page
{:fields {:sales_orders {:type '(list :sales_order)} {:fields {:sales_orders {:type '(list :sales_order)}
@@ -93,8 +92,7 @@
(def resolvers (def resolvers
{:get-all-sales-orders get-all-sales-orders {:get-all-sales-orders get-all-sales-orders
:get-sales-order-page get-sales-orders-page :get-sales-order-page get-sales-orders-page})
})
(defn attach [schema] (defn attach [schema]
(-> (->

View File

@@ -29,9 +29,8 @@
(defn get-transaction-rule-matches [context args _] (defn get-transaction-rule-matches [context args _]
(if (= "admin" (:user/role (:id context))) (if (= "admin" (:user/role (:id context)))
(let [transaction (update (d-transactions/get-by-id (:transaction_id args)) :transaction/date c/to-date) (let [transaction (update (d-transactions/get-by-id (:transaction_id args)) :transaction/date c/to-date)
all-rules (tr/get-all-for-client (:db/id (:transaction/client transaction))) all-rules (tr/get-all-for-client (:db/id (:transaction/client transaction)))]
]
(mu/log ::counted (mu/log ::counted
:count (count all-rules)) :count (count all-rules))
(doto (map ->graphql (rm/get-matching-rules transaction all-rules)) (#(println (count %))))) (doto (map ->graphql (rm/get-matching-rules transaction all-rules)) (#(println (count %)))))
@@ -68,8 +67,7 @@
(throw (ex-info error {:validation-error error})))) (throw (ex-info error {:validation-error error}))))
_ (doseq [a accounts _ (doseq [a accounts
:let [{:keys [:account/location :account/name]} (dc/pull (dc/db conn) [:account/location :account/name] (:account_id a)) :let [{:keys [:account/location :account/name]} (dc/pull (dc/db conn) [:account/location :account/name] (:account_id a))
client (dc/pull (dc/db conn) [:client/locations] client_id) client (dc/pull (dc/db conn) [:client/locations] client_id)]]
]]
(when (and location (not= location (:location a))) (when (and location (not= location (:location a)))
(let [err (str "Account " name " uses location " (:location a) ", but is supposed to be " location)] (let [err (str "Account " name " uses location " (:location a) ", but is supposed to be " location)]
(throw (ex-info err {:validation-error err})))) (throw (ex-info err {:validation-error err}))))
@@ -100,7 +98,6 @@
(keyword "transaction-approval-status")) (keyword "transaction-approval-status"))
:transaction-rule/accounts (map transaction-rule-account->entity accounts)}]] :transaction-rule/accounts (map transaction-rule-account->entity accounts)}]]
transaction-result (audit-transact transaction (:id context))] transaction-result (audit-transact transaction (:id context))]
(-> (tr/get-by-id (or (-> transaction-result :tempids (get "transaction-rule")) (-> (tr/get-by-id (or (-> transaction-result :tempids (get "transaction-rule"))
id)) id))
@@ -110,8 +107,7 @@
(defn -test-transaction-rule [id {:keys [:transaction-rule/description :transaction-rule/client :transaction-rule/bank-account :transaction-rule/amount-lte :transaction-rule/amount-gte :transaction-rule/dom-lte :transaction-rule/dom-gte :transaction-rule/yodlee-merchant]} include-coded? count] (defn -test-transaction-rule [id {:keys [:transaction-rule/description :transaction-rule/client :transaction-rule/bank-account :transaction-rule/amount-lte :transaction-rule/amount-gte :transaction-rule/dom-lte :transaction-rule/dom-gte :transaction-rule/yodlee-merchant]} include-coded? count]
(let [query (cond-> {:query {:find ['(pull ?e [* {:transaction/client [:client/name] (let [query (cond-> {:query {:find ['(pull ?e [* {:transaction/client [:client/name]
:transaction/bank-account [:bank-account/name] :transaction/bank-account [:bank-account/name]
:transaction/payment [:db/id]} :transaction/payment [:db/id]}])]
])]
:in ['$] :in ['$]
:where []} :where []}
:args [(dc/db conn)]} :args [(dc/db conn)]}
@@ -170,7 +166,6 @@
:where ['[?e :transaction/client ?client-id]]} :where ['[?e :transaction/client ?client-id]]}
:args [(:db/id client)]}) :args [(:db/id client)]})
(not include-coded?) (not include-coded?)
(merge-query {:query {:where ['[or [?e :transaction/approval-status :transaction-approval-status/unapproved] (merge-query {:query {:where ['[or [?e :transaction/approval-status :transaction-approval-status/unapproved]
[(missing? $ ?e :transaction/approval-status)]]]}}) [(missing? $ ?e :transaction/approval-status)]]]}})
@@ -200,7 +195,6 @@
:yodlee-merchant (when yodlee_merchant_id {:db/id yodlee_merchant_id})} :yodlee-merchant (when yodlee_merchant_id {:db/id yodlee_merchant_id})}
true 15)) true 15))
(defn run-transaction-rule [{:keys [id]} {:keys [transaction_rule_id count]} _] (defn run-transaction-rule [{:keys [id]} {:keys [transaction_rule_id count]} _]
(assert-admin id) (assert-admin id)
(-test-transaction-rule id (tr/get-by-id transaction_rule_id) false count)) (-test-transaction-rule id (tr/get-by-id transaction_rule_id) false count))

View File

@@ -100,8 +100,7 @@
(alog/info ::bulk-change-status (alog/info ::bulk-change-status
:count (count all-ids) :count (count all-ids)
:sample (take 3 all-ids) :sample (take 3 all-ids)
:status (:status args) :status (:status args))
)
(audit-transact-batch (audit-transact-batch
(->> all-ids (->> all-ids
(mapv (fn [t] (mapv (fn [t]
@@ -200,7 +199,6 @@
(:id context)) (:id context))
{:message (str "Successfully coded " (count all-ids) " transactions.")})) {:message (str "Successfully coded " (count all-ids) " transactions.")}))
(defn delete-transactions [context args _] (defn delete-transactions [context args _]
(let [_ (assert-admin (:id context)) (let [_ (assert-admin (:id context))
args (assoc args :clients (:clients context)) args (assoc args :clients (:clients context))
@@ -286,8 +284,7 @@
(dc/db conn) (:db/id payment)) (dc/db conn) (:db/id payment))
seq seq
(map first) (map first)
(every? #(instance? java.util.Date %))) (every? #(instance? java.util.Date %)))]
]
(alog/info ::unlinking :transaction (pr-str transaction) :autopay is-autopay-payment? :payment (pr-str payment)) (alog/info ::unlinking :transaction (pr-str transaction) :autopay is-autopay-payment? :payment (pr-str payment))
@@ -330,14 +327,12 @@
approval-status->graphql approval-status->graphql
->graphql))) ->graphql)))
(defn transaction-account->entity [{:keys [id account_id amount location]}] (defn transaction-account->entity [{:keys [id account_id amount location]}]
#:transaction-account {:amount amount #:transaction-account {:amount amount
:db/id (or id (random-tempid)) :db/id (or id (random-tempid))
:account account_id :account account_id
:location location}) :location location})
(defn assert-valid-expense-accounts [accounts] (defn assert-valid-expense-accounts [accounts]
(doseq [trans-account accounts (doseq [trans-account accounts
:let [account (dc/pull (dc/db conn) :let [account (dc/pull (dc/db conn)
@@ -359,7 +354,6 @@
(throw (ex-info err (throw (ex-info err
{:validation-error err})))) {:validation-error err}))))
(when (nil? (:account_id trans-account)) (when (nil? (:account_id trans-account))
(throw (ex-info "Account is missing account" {:validation-error "Account is missing account"}))))) (throw (ex-info "Account is missing account" {:validation-error "Account is missing account"})))))
@@ -529,7 +523,6 @@
(filter #(not (:payment %))) (filter #(not (:payment %)))
(map :id)) (map :id))
transaction_ids) transaction_ids)
_ (mu/log ::here :txids transaction_ids) _ (mu/log ::here :txids transaction_ids)
transaction_ids (all-ids-not-locked transaction_ids) transaction_ids (all-ids-not-locked transaction_ids)
@@ -562,8 +555,7 @@
(:id context)) (:id context))
(doseq [n transactions] (doseq [n transactions]
(solr/touch-with-ledger (:db/id n))) (solr/touch-with-ledger (:db/id n))))
)
(transduce (transduce
(comp (comp
(map d-transactions/get-by-id) (map d-transactions/get-by-id)
@@ -711,7 +703,6 @@
:mutation/match-transaction-unpaid-invoices match-transaction-unpaid-invoices :mutation/match-transaction-unpaid-invoices match-transaction-unpaid-invoices
:mutation/match-transaction-rules match-transaction-rules}) :mutation/match-transaction-rules match-transaction-rules})
(defn attach [schema] (defn attach [schema]
(-> (->
(merge-with merge schema (merge-with merge schema

View File

@@ -13,7 +13,6 @@
[iol-ion.query :refer [entid]] [iol-ion.query :refer [entid]]
[slingshot.slingshot :refer [throw+]])) [slingshot.slingshot :refer [throw+]]))
(defn snake->kebab [s] (defn snake->kebab [s]
(str/replace s #"_" "-")) (str/replace s #"_" "-"))
@@ -107,8 +106,6 @@
(#{"manager" "user" "power-user" "read-only"} (:user/role id)) (#{"manager" "user" "power-user" "read-only"} (:user/role id))
(:user/clients id []))) (:user/clients id [])))
(defn result->page [results result-count key args] (defn result->page [results result-count key args]
{key (map ->graphql results) {key (map ->graphql results)
:total result-count :total result-count
@@ -197,7 +194,6 @@
(= :client/code (first x))) (= :client/code (first x)))
[(entid (dc/db conn) x)] [(entid (dc/db conn) x)]
(sequential? x) (sequential? x)
(mapcat coerce-client-ids x) (mapcat coerce-client-ids x)

View File

@@ -130,7 +130,6 @@
:vendor/schedule-payment-dom schedule-payment-dom :vendor/schedule-payment-dom schedule-payment-dom
:vendor/automatically-paid-when-due (:automatically_paid_when_due in)))] :vendor/automatically-paid-when-due (:automatically_paid_when_due in)))]
transaction-result (audit-transact [transaction] (:id context)) transaction-result (audit-transact [transaction] (:id context))
new-vendor (d-vendors/get-by-id (or (-> transaction-result :tempids (get "vendor")) new-vendor (d-vendors/get-by-id (or (-> transaction-result :tempids (get "vendor"))
id))] id))]
@@ -160,7 +159,6 @@
(audit-transact transaction (:id context)) (audit-transact transaction (:id context))
to)) to))
(defn get-graphql [context args _] (defn get-graphql [context args _]
(assert-admin (:id context)) (assert-admin (:id context))
(let [args (assoc args :id (:id context)) (let [args (assoc args :id (:id context))
@@ -187,7 +185,6 @@
(if-let [query (not-empty (cleanse-query (:query args)))] (if-let [query (not-empty (cleanse-query (:query args)))]
(let [search-query (str "name:(" query ")")] (let [search-query (str "name:(" query ")")]
(for [{:keys [id name]} (solr/query solr/impl "vendors" {"query" (cond-> search-query (for [{:keys [id name]} (solr/query solr/impl "vendors" {"query" (cond-> search-query
(not (is-admin? (:id context))) (str " hidden:false")) (not (is-admin? (:id context))) (str " hidden:false"))
"fields" "id, name"})] "fields" "id, name"})]

View File

@@ -70,7 +70,6 @@
:headers {} :headers {}
:body ""}) :body ""})
(defn home-handler [{:keys [identity]}] (defn home-handler [{:keys [identity]}]
(if identity (if identity
{:status 302 {:status 302
@@ -78,7 +77,6 @@
{:status 302 {:status 302
:headers {"Location" "/login"}})) :headers {"Location" "/login"}}))
(def match->handler-lookup (def match->handler-lookup
(-> {:not-found not-found (-> {:not-found not-found
:home home-handler} :home home-handler}
@@ -90,15 +88,13 @@
(merge yodlee2/match->handler) (merge yodlee2/match->handler)
(merge auth/match->handler) (merge auth/match->handler)
(merge invoices/match->handler) (merge invoices/match->handler)
(merge exports/match->handler) (merge exports/match->handler)))
))
(def match->handler (def match->handler
(fn [route] (fn [route]
(or (get match->handler-lookup route) (or (get match->handler-lookup route)
route))) route)))
(def route-handler (def route-handler
(make-handler all-routes (make-handler all-routes
match->handler)) match->handler))
@@ -125,7 +121,6 @@
uri uri
:request-method method)) :request-method method))
(def auth-backend (jws-backend {:secret (:jwt-secret env) :options {:alg :hs512}})) (def auth-backend (jws-backend {:secret (:jwt-secret env) :options {:alg :hs512}}))
(defn wrap-logging [handler] (defn wrap-logging [handler]
@@ -159,8 +154,6 @@
:exception e) :exception e)
(throw e))))))) (throw e)))))))
(defn wrap-idle-session-timeout (defn wrap-idle-session-timeout
[handler] [handler]
(fn [request] (fn [request]

View File

@@ -32,7 +32,6 @@
db db
client-codes))) client-codes)))
(defn intuit->transaction [transaction] (defn intuit->transaction [transaction]
(let [check-number (when (not (str/blank? (:Num transaction))) (let [check-number (when (not (str/blank? (:Num transaction)))
(try (try
@@ -46,7 +45,6 @@
:transaction/status "POSTED"} :transaction/status "POSTED"}
check-number (assoc :transaction/check-number check-number)))) check-number (assoc :transaction/check-number check-number))))
(defn intuits->transactions [transactions bank-account-id client-id] (defn intuits->transactions [transactions bank-account-id client-id]
(->> transactions (->> transactions
(map intuit->transaction) (map intuit->transaction)

View File

@@ -11,7 +11,6 @@
(t/is (= #inst "2021-01-01T00:00:00-08:00" (:transaction/date (sut/intuit->transaction (assoc base-transaction :Date "2021-01-01"))))) (t/is (= #inst "2021-01-01T00:00:00-08:00" (:transaction/date (sut/intuit->transaction (assoc base-transaction :Date "2021-01-01")))))
(t/is (= #inst "2021-06-01T00:00:00-07:00" (:transaction/date (sut/intuit->transaction (assoc base-transaction :Date "2021-06-01"))))))) (t/is (= #inst "2021-06-01T00:00:00-07:00" (:transaction/date (sut/intuit->transaction (assoc base-transaction :Date "2021-06-01")))))))
(t/deftest intuits->transactions (t/deftest intuits->transactions
(t/testing "should give unique ids to duplicates" (t/testing "should give unique ids to duplicates"
(t/is (= ["2021-10-11T00:00:00.000-07:00-123-this is a description-45.23-0-345" (t/is (= ["2021-10-11T00:00:00.000-07:00-123-this is a description-45.23-0-345"

View File

@@ -7,8 +7,6 @@
[clojure.data.csv :as csv] [clojure.data.csv :as csv]
[datomic.api :as dc])) [datomic.api :as dc]))
(def columns [:status :raw-date :description-original :high-level-category nil nil :amount nil nil nil nil nil :bank-account-code :client-code]) (def columns [:status :raw-date :description-original :high-level-category nil nil :amount nil nil nil nil nil :bank-account-code :client-code])
(defn tabulate-data [data] (defn tabulate-data [data]

View File

@@ -40,7 +40,6 @@
db db
client-codes)))) client-codes))))
(defn plaid->transaction [t plaid-merchant->vendor-id] (defn plaid->transaction [t plaid-merchant->vendor-id]
(alog/info ::trying-transaction :transaction t) (alog/info ::trying-transaction :transaction t)
(cond-> #:transaction {:description-original (:name t) (cond-> #:transaction {:description-original (:name t)
@@ -68,7 +67,6 @@
[?pm :plaid-merchant/name ?pmn]] [?pm :plaid-merchant/name ?pmn]]
(dc/db conn)))) (dc/db conn))))
(def single-thread (ex/fixed-thread-executor 1)) (def single-thread (ex/fixed-thread-executor 1))
(defn rebuild-search-index [] (defn rebuild-search-index []
@@ -103,13 +101,9 @@
(catch Exception e (catch Exception e
(alog/warn ::couldnt-upsert-account :error e)))) (alog/warn ::couldnt-upsert-account :error e))))
(catch Exception e (catch Exception e
(alog/warn ::couldnt-upsert-accounts :error e)))) (alog/warn ::couldnt-upsert-accounts :error e))))
(defn import-plaid-int [] (defn import-plaid-int []
(let [_ (upsert-accounts) (let [_ (upsert-accounts)
import-batch (t/start-import-batch :import-source/plaid "Automated plaid user") import-batch (t/start-import-batch :import-source/plaid "Automated plaid user")

View File

@@ -29,7 +29,6 @@
nil)) nil))
nil)) nil))
(defn transaction->existing-payment [_ check-number client-id bank-account-id amount id] (defn transaction->existing-payment [_ check-number client-id bank-account-id amount id]
(alog/info ::searching (alog/info ::searching
:client-id client-id :client-id client-id
@@ -172,9 +171,7 @@
(= 1234 (extract-check-number {:transaction/description-original "Check abc 4/10 1234"})) (= 1234 (extract-check-number {:transaction/description-original "Check abc 4/10 1234"}))
(= 1234 (extract-check-number {:transaction/description-original "Check abc 4/10 1234 12/3"})) (= 1234 (extract-check-number {:transaction/description-original "Check abc 4/10 1234 12/3"}))
(not= 1234 (extract-check-number {:transaction/description-original "Checkcard 4/10 1234"})) (not= 1234 (extract-check-number {:transaction/description-original "Checkcard 4/10 1234"})))
)
(defn find-expected-deposit [client-id amount date] (defn find-expected-deposit [client-id amount date]
(when date (when date
@@ -187,12 +184,10 @@
[?ed :expected-deposit/date ?d] [?ed :expected-deposit/date ?d]
[(>= ?d ?d-start)] [(>= ?d ?d-start)]
[?ed :expected-deposit/total ?a2] [?ed :expected-deposit/total ?a2]
[(auto-ap.utils/dollars= ?a2 ?a)] [(auto-ap.utils/dollars= ?a2 ?a)]]
]
(dc/db conn) client-id amount (coerce/to-date (t/plus date (t/days -10)))) (dc/db conn) client-id amount (coerce/to-date (t/plus date (t/days -10))))
ffirst))) ffirst)))
(defn categorize-transaction [transaction bank-account existing] (defn categorize-transaction [transaction bank-account existing]
(cond (= :transaction-approval-status/suppressed (existing (:transaction/id transaction))) (cond (= :transaction-approval-status/suppressed (existing (:transaction/id transaction)))
:suppressed :suppressed
@@ -235,7 +230,6 @@
(assoc transaction :transaction/check-number check-number) (assoc transaction :transaction/check-number check-number)
transaction)) transaction))
(defn maybe-clear-payment [{:transaction/keys [check-number client bank-account amount id] :as transaction}] (defn maybe-clear-payment [{:transaction/keys [check-number client bank-account amount id] :as transaction}]
(when-let [existing-payment (transaction->existing-payment transaction check-number client bank-account amount id)] (when-let [existing-payment (transaction->existing-payment transaction check-number client bank-account amount id)]
(assoc transaction (assoc transaction
@@ -266,8 +260,7 @@
:transaction-account/amount amount :transaction-account/amount amount
:transaction-account/location "A"}] :transaction-account/location "A"}]
:transaction/approval-status :transaction-approval-status/approved :transaction/approval-status :transaction-approval-status/approved
:transaction/vendor (:db/id (:expected-deposit/vendor expected-deposit)) :transaction/vendor (:db/id (:expected-deposit/vendor expected-deposit))))))
))))
(defn maybe-code [{:transaction/keys [client amount] :as transaction} apply-rules valid-locations] (defn maybe-code [{:transaction/keys [client amount] :as transaction} apply-rules valid-locations]
(mu/trace (mu/trace
@@ -304,7 +297,6 @@
(maybe-apply-default-vendor) (maybe-apply-default-vendor)
remove-nils))) remove-nils)))
(defn get-existing [bank-account] (defn get-existing [bank-account]
(into {} (into {}
(dc/q '[:find ?tid ?as2 (dc/q '[:find ?tid ?as2
@@ -410,8 +402,6 @@
:import-batch/status :import-status/completed} :import-batch/status :import-status/completed}
@stats)]))))) @stats)])))))
(defn synthetic-key [{:transaction/keys [date bank-account description-original amount client]} index] (defn synthetic-key [{:transaction/keys [date bank-account description-original amount client]} index]
(str (str (some-> date coerce/to-date-time atime/localize)) "-" bank-account "-" description-original "-" amount "-" index "-" client)) (str (str (some-> date coerce/to-date-time atime/localize)) "-" bank-account "-" description-original "-" amount "-" index "-" client))

View File

@@ -95,5 +95,4 @@
nil) nil)
(Thread/sleep 10000))))) (Thread/sleep 10000)))))
(def import-yodlee2 (allow-once import-yodlee2-int)) (def import-yodlee2 (allow-once import-yodlee2-int))

View File

@@ -15,7 +15,6 @@
;; (def base-url "https://sandbox-quickbooks.api.intuit.com/v3") ;; (def base-url "https://sandbox-quickbooks.api.intuit.com/v3")
(def prod-client-id "ABFRwAiOqQiLN66HKplXfyRE3ipD390DHsrUquflRCiOa81mxa") (def prod-client-id "ABFRwAiOqQiLN66HKplXfyRE3ipD390DHsrUquflRCiOa81mxa")
(def prod-client-secret "xDUj04GeQXpLvrhxep1jjDYwjJWbzzOPrirUQTKF") (def prod-client-secret "xDUj04GeQXpLvrhxep1jjDYwjJWbzzOPrirUQTKF")
@@ -27,11 +26,8 @@
;; "accessToken":, ;; "accessToken":,
;; ;;
(def prod-company-id "123146163906404") (def prod-company-id "123146163906404")
(def prod-base-url "https://quickbooks.api.intuit.com/v3") (def prod-base-url "https://quickbooks.api.intuit.com/v3")
(defn set-access-token [t] (defn set-access-token [t]
@@ -53,7 +49,6 @@
:bucket-name "data.prod.app.integreatconsult.com" :bucket-name "data.prod.app.integreatconsult.com"
:key "intuit/refresh-token"))))) :key "intuit/refresh-token")))))
#_{:clj-kondo/ignore [:clojure-lsp/unused-public-var]} #_{:clj-kondo/ignore [:clojure-lsp/unused-public-var]}
(defn init-tokens [access refresh] (defn init-tokens [access refresh]
(set-access-token access) (set-access-token access)
@@ -74,7 +69,6 @@
(defn get-basic-auth [] (defn get-basic-auth []
(Base64/encodeBase64String (.getBytes (str prod-client-id ":" prod-client-secret)))) (Base64/encodeBase64String (.getBytes (str prod-client-id ":" prod-client-secret))))
(defn get-fresh-access-token [] (defn get-fresh-access-token []
(let [refresh-token (lookup-refresh-token) (let [refresh-token (lookup-refresh-token)
response (:body (client/post (str "https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer") response (:body (client/post (str "https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer")
@@ -106,7 +100,6 @@
:query-params {"query" "SELECT * From Account maxresults 1000"}})) :query-params {"query" "SELECT * From Account maxresults 1000"}}))
:QueryResponse)) :QueryResponse))
(defn get-bank-accounts [token] (defn get-bank-accounts [token]
(->> (:body (client/get (str prod-base-url "/company/" prod-company-id "/query") (->> (:body (client/get (str prod-base-url "/company/" prod-company-id "/query")
{:headers {:headers
@@ -124,7 +117,6 @@
:last-updated (c/to-date-time (-> metadata :LastUpdatedTime)) :last-updated (c/to-date-time (-> metadata :LastUpdatedTime))
:current-balance (try (double current-balance) (catch Exception _ nil))})))) :current-balance (try (double current-balance) (catch Exception _ nil))}))))
(defn get-all-transactions [start end] (defn get-all-transactions [start end]
(let [token (get-fresh-access-token)] (let [token (get-fresh-access-token)]
(:body (client/get (str prod-base-url "/company/" prod-company-id "/reports/TransactionList" "?minorversion=63&start_date=" start "&end_date=" end) (:body (client/get (str prod-base-url "/company/" prod-company-id "/reports/TransactionList" "?minorversion=63&start_date=" start "&end_date=" end)

View File

@@ -12,7 +12,6 @@
(defn line->id [{:keys [source id client-code]}] (defn line->id [{:keys [source id client-code]}]
(str client-code "-" source "-" id)) (str client-code "-" source "-" id))
(defn csv->graphql-rows [lines] (defn csv->graphql-rows [lines]
(for [lines (partition-by line->id (drop 1 lines)) (for [lines (partition-by line->id (drop 1 lines))
:let [{:keys [source client-code date vendor-name note cleared-against] :as line} (first lines)]] :let [{:keys [source client-code date vendor-name note cleared-against] :as line} (first lines)]]

View File

@@ -20,8 +20,7 @@
(mapv (fn [[i]] {:db/id i (mapv (fn [[i]] {:db/id i
:invoice/outstanding-balance 0.0 :invoice/outstanding-balance 0.0
:invoice/status :invoice-status/paid})) :invoice/status :invoice-status/paid}))))
))
(alog/info ::closed :count (count invoices-to-close)))) (alog/info ::closed :count (count invoices-to-close))))

View File

@@ -29,7 +29,6 @@
:body {:html (str "<div>You can download the original email <a href=\"" target-url "\">here</a>.<p><pre>" message "</pre></p></div>") :body {:html (str "<div>You can download the original email <a href=\"" target-url "\">here</a>.<p><pre>" message "</pre></p></div>")
:text (str "<div>You can download the original email here: " target-url)}}}))) :text (str "<div>You can download the original email here: " target-url)}}})))
(defn process-sqs [] (defn process-sqs []
(alog/info ::fetching-sqs) (alog/info ::fetching-sqs)
(doseq [message (:messages (sqs/receive-message {:queue-url (:invoice-import-queue-url env) (doseq [message (:messages (sqs/receive-message {:queue-url (:invoice-import-queue-url env)
@@ -79,27 +78,20 @@
(defn -main [& _] (defn -main [& _]
(execute "import-uploaded-invoices" process-sqs)) (execute "import-uploaded-invoices" process-sqs))
(comment (comment
(with-open [i (io/output-stream "/tmp/bryce.pdf")] (with-open [i (io/output-stream "/tmp/bryce.pdf")]
(clojure.java.io/copy (clojure.java.io/copy
(-> (s3/get-object :bucket-name (:data-bucket env) (-> (s3/get-object :bucket-name (:data-bucket env)
:key "invoice-files/f0e73dcb-e5e5-4c81-b82b-319b7caedacf.pdf" :key "invoice-files/f0e73dcb-e5e5-4c81-b82b-319b7caedacf.pdf")
)
:input-stream) :input-stream)
i)) i))
(parse/parse-file "/tmp/bryce.pdf" "/tmp/bryce.pdf") (parse/parse-file "/tmp/bryce.pdf" "/tmp/bryce.pdf")
(-> (clojure.java.shell/sh "pdftotext" "-layout" "/tmp/bryce.pdf" "-") (-> (clojure.java.shell/sh "pdftotext" "-layout" "/tmp/bryce.pdf" "-")
:out :out)
)
1 1
(user/init-repl) (user/init-repl))
)

View File

@@ -10,7 +10,6 @@
[config.core :refer [env]] [config.core :refer [env]]
[datomic.api :as dc])) [datomic.api :as dc]))
(defn historical-load-sales [client days] (defn historical-load-sales [client days]
(alog/info ::new-sales-loading :client (:client/code client) :days days) (alog/info ::new-sales-loading :client (:client/code client) :days days)
(let [client (dc/pull (dc/db auto-ap.datomic/conn) (let [client (dc/pull (dc/db auto-ap.datomic/conn)
@@ -31,7 +30,6 @@
@(square3/upsert-refunds client square-location) @(square3/upsert-refunds client square-location)
@(square3/upsert-payouts client square-location (time/plus (time/now) (time/days (- days))) (time/now))))) @(square3/upsert-payouts client square-location (time/plus (time/now) (time/days (- days))) (time/now)))))
(defn load-historical-sales [args] (defn load-historical-sales [args]
(let [{:keys [days client]} args (let [{:keys [days client]} args
client (cond-> client client (cond-> client

View File

@@ -32,8 +32,6 @@
xml/parse xml/parse
zip/xml-zip)) zip/xml-zip))
(defn mark-key [k] (defn mark-key [k]
(s3/copy-object {:source-bucket-name bucket-name (s3/copy-object {:source-bucket-name bucket-name
:destination-bucket-name bucket-name :destination-bucket-name bucket-name
@@ -99,8 +97,7 @@
(-> vendor :vendor/default-account :db/id) (-> vendor :vendor/default-account :db/id)
:invoice-expense-account/location location :invoice-expense-account/location location
:invoice-expense-account/amount (Math/abs (Double/parseDouble invoice-total)) :invoice-expense-account/amount (Math/abs (Double/parseDouble invoice-total))
:db/id (random-tempid) :db/id (random-tempid)}]})))
}]})))
(filter :invoice/client) (filter :invoice/client)
(reduce (fn [[seen-so-far list] i] (reduce (fn [[seen-so-far list] i]
(let [k [(:invoice/invoice-number i) (:invoice/client i)]] (let [k [(:invoice/invoice-number i) (:invoice/client i)]]
@@ -108,8 +105,7 @@
[seen-so-far list] [seen-so-far list]
[(conj seen-so-far k) (conj list i)]))) [(conj seen-so-far k) (conj list i)])))
[#{} []]) [#{} []])
(second) (second))
)
(catch Exception e (catch Exception e
(log/error ::cant-import-general-produce (log/error ::cant-import-general-produce
:error e) :error e)
@@ -206,8 +202,7 @@
(-> vendor :vendor/default-account :db/id) (-> vendor :vendor/default-account :db/id)
:invoice-expense-account/location location :invoice-expense-account/location location
:invoice-expense-account/amount (Math/abs total) :invoice-expense-account/amount (Math/abs total)
:db/id (random-tempid) :db/id (random-tempid)}]}]
}]}]
(log/info ::cintas-invoice-importing (log/info ::cintas-invoice-importing
:invoice invoice) :invoice invoice)
[invoice]) [invoice])
@@ -250,8 +245,7 @@
(lazy-seq (concat (:object-summaries page-result) (get-all-keys (:next-continuation-token page-result))))))))) (lazy-seq (concat (:object-summaries page-result) (get-all-keys (:next-continuation-token page-result)))))))))
(defn recent? [k] (defn recent? [k]
(time/after? (:last-modified k) (time/plus (time/now) (time/days -15))) (time/after? (:last-modified k) (time/plus (time/now) (time/days -15))))
)
(defn import-ntg-invoices (defn import-ntg-invoices
([] (import-ntg-invoices (->> (get-all-keys) ([] (import-ntg-invoices (->> (get-all-keys)
@@ -304,6 +298,5 @@
(doseq [k keys] (doseq [k keys]
(mark-key k))))) (mark-key k)))))
(defn -main [& _] (defn -main [& _]
(execute "ntg" import-ntg-invoices)) (execute "ntg" import-ntg-invoices))

View File

@@ -45,8 +45,7 @@
(reduce + 0.0 (reduce + 0.0
(->> values (->> values
(map (fn [[_ _ _ _ amount]] (map (fn [[_ _ _ _ amount]]
(- (Double/parseDouble amount)))))) (- (Double/parseDouble amount))))))]))
]))
(into {}))] (into {}))]
(->> (->>
(for [[i (for [[i
@@ -76,27 +75,22 @@
target-date (coerce/to-date (atime/parse target-date atime/normal-date)) target-date (coerce/to-date (atime/parse target-date atime/normal-date))
current-date (:invoice/date invoice) current-date (:invoice/date invoice)
current-expense-account-amount (:invoice-expense-account/amount invoice-expense-account 0.0) current-expense-account-amount (:invoice-expense-account/amount invoice-expense-account 0.0)
target-expense-account-amount (- (Double/parseDouble amount)) target-expense-account-amount (- (Double/parseDouble amount))
current-expense-account-location (:invoice-expense-account/location invoice-expense-account) current-expense-account-location (:invoice-expense-account/location invoice-expense-account)
target-expense-account-location location target-expense-account-location location
[[_ _ invoice-payment]] (vec (dc/q [[_ _ invoice-payment]] (vec (dc/q
'[:find ?p ?a ?ip '[:find ?p ?a ?ip
:in $ ?i :in $ ?i
:where [?ip :invoice-payment/invoice ?i] :where [?ip :invoice-payment/invoice ?i]
[?ip :invoice-payment/amount ?a] [?ip :invoice-payment/amount ?a]
[?ip :invoice-payment/payment ?p] [?ip :invoice-payment/payment ?p]]
]
db invoice-id))] db invoice-id))]
:when current-total] :when current-total]
[ [(when (not (dollars= current-total target-total))
(when (not (dollars= current-total target-total))
{:db/id invoice-id {:db/id invoice-id
:invoice/total target-total}) :invoice/total target-total})

View File

@@ -38,9 +38,6 @@
(recur next-deps (into order next-order)) (recur next-deps (into order next-order))
(into order next-order))))) (into order next-order)))))
(def loaded (atom #{})) (def loaded (atom #{}))
(defn upsert-batch (defn upsert-batch
@@ -112,7 +109,6 @@
{:entity/migration-key 17592263907739} {:entity/migration-key 17592263907739}
{:entity/migration-key 17592271516922}]) {:entity/migration-key 17592271516922}])
(doseq [entity (cond->> (order-of-insert entity-dependencies) (doseq [entity (cond->> (order-of-insert entity-dependencies)
true (filter #(not= "audit" %)) true (filter #(not= "audit" %))
starting-at (drop-while #(not= starting-at %))) starting-at (drop-while #(not= starting-at %)))
@@ -136,7 +132,6 @@
(mu/log ::refresh-running-balance-cache-complete) (mu/log ::refresh-running-balance-cache-complete)
(mu/log ::done)) (mu/log ::done))
(defn -main [& _] (defn -main [& _]
(try (try
(println "restore") (println "restore")
@@ -156,8 +151,6 @@
;; /datomic-backup/079df203-eae0-4acf-94d5-8608ba8b8a9a ;; /datomic-backup/079df203-eae0-4acf-94d5-8608ba8b8a9a
(load-from-backup "079df203-eae0-4acf-94d5-8608ba8b8a9a" auto-ap.datomic/conn ["charge"]) (load-from-backup "079df203-eae0-4acf-94d5-8608ba8b8a9a" auto-ap.datomic/conn ["charge"])
(load-entity "charge" (ednl/slurp "/tmp/tmp-edn")) (load-entity "charge" (ednl/slurp "/tmp/tmp-edn")))
)
;; => nil ;; => nil

View File

@@ -39,7 +39,6 @@
(dc/db conn) (dc/db conn)
number))) number)))
(defn delete-all [] (defn delete-all []
@(dc/transact-async conn @(dc/transact-async conn
(->> (->>
@@ -49,8 +48,6 @@
(map (fn [[ss]] (map (fn [[ss]]
[:db/retractEntity ss]))))) [:db/retractEntity ss])))))
(defn dirty-sales-summaries [c] (defn dirty-sales-summaries [c]
(let [client-id (dc/entid (dc/db conn) c)] (let [client-id (dc/entid (dc/db conn) c)]
(->> (dc/index-pull (dc/db conn) (->> (dc/index-pull (dc/db conn)
@@ -192,8 +189,6 @@
:ledger-mapped/amount v :ledger-mapped/amount v
:ledger-mapped/ledger-side :ledger-side/credit})))) :ledger-mapped/ledger-side :ledger-side/credit}))))
(defn get-fees [c date] (defn get-fees [c date]
(when-let [fee (get-fee c date)] (when-let [fee (get-fee c date)]
{:db/id (str (java.util.UUID/randomUUID)) {:db/id (str (java.util.UUID/randomUUID))
@@ -315,7 +310,6 @@
@(dc/transact conn [[:upsert-sales-summary result]])) @(dc/transact conn [[:upsert-sales-summary result]]))
@(dc/transact conn [{:db/id id :sales-summary/dirty false}])))))) @(dc/transact conn [{:db/id id :sales-summary/dirty false}]))))))
(defn reset-summaries [] (defn reset-summaries []
@(dc/transact conn (->> (dc/q '[:find ?sos @(dc/transact conn (->> (dc/q '[:find ?sos
:in $ :in $
@@ -324,9 +318,6 @@
(map (fn [[sos]] (map (fn [[sos]]
[:db/retractEntity sos]))))) [:db/retractEntity sos])))))
(comment (comment
(auto-ap.datomic/transact-schema conn) (auto-ap.datomic/transact-schema conn)
@@ -336,26 +327,19 @@
(dirty-sales-summaries [:client/code "NGWH"]) (dirty-sales-summaries [:client/code "NGWH"])
(apply mark-dirty [:client/code "NGWH"] (last-n-days 5)) (apply mark-dirty [:client/code "NGWH"] (last-n-days 5))
(iol-ion.tx.upsert-sales-summary-ledger/summary->journal-entry (dc/db conn) 17592314245819) (iol-ion.tx.upsert-sales-summary-ledger/summary->journal-entry (dc/db conn) 17592314245819)
(iol-ion.tx.upsert-sales-summary-ledger/upsert-sales-summary (dc/db conn) {:db/id 17592314241429}) (iol-ion.tx.upsert-sales-summary-ledger/upsert-sales-summary (dc/db conn) {:db/id 17592314241429})
(mark-all-dirty 5) (mark-all-dirty 5)
(delete-all) (delete-all)
(sales-summaries-v2) (sales-summaries-v2)
1 1
(dc/q '[:find (pull ?sos [* {:sales-summary/sales-items [*]}]) (dc/q '[:find (pull ?sos [* {:sales-summary/sales-items [*]}])
:in $ :in $
:where [?sos :sales-summary/client [:client/code "NGHW"]] :where [?sos :sales-summary/client [:client/code "NGHW"]]
@@ -386,15 +370,7 @@
@(dc/transact conn [{:db/id :sales-summary/total-tax :db/ident :sales-summary/total-tax-legacy} @(dc/transact conn [{:db/id :sales-summary/total-tax :db/ident :sales-summary/total-tax-legacy}
{:db/id :sales-summary/total-tip :db/ident :sales-summary/total-tip-legacy}]) {:db/id :sales-summary/total-tip :db/ident :sales-summary/total-tip-legacy}])
(auto-ap.datomic/transact-schema conn) (auto-ap.datomic/transact-schema conn))
)
(defn -main [& _] (defn -main [& _]
(execute "sales-summaries" sales-summaries-v2)) (execute "sales-summaries" sales-summaries-v2))

View File

@@ -44,7 +44,6 @@
(dc/db conn) (dc/db conn)
50000)))) 50000))))
(def ^:dynamic bucket-name (:data-bucket env)) (def ^:dynamic bucket-name (:data-bucket env))
(def header-keys ["TransCode" "GroupID" "Company" "CustomerNumber" "InvoiceNumber" "RecordType" "Item" "InvoiceDocument" "AccountName" "AccountDunsNo" "InvoiceDate" "AccountDate" "CustomerPONo" "PaymentTerms" "TermsDescription" "StoreNumber" "CustomerName" "AddressLine1" "AddressLine2" "City1" "State1" "Zip1" "Phone1" "Duns1" "Hin1" "Dea1" "TIDCustomer" "ChainNumber" "BidNumber" "ContractNumber" "CompanyNumber" "BriefName" "Address" "Address2" "City2" "State2" "Zip2" "Phone2" "Duns2" "Hin2" "Dea2" "Tid_OPCO" "ObligationIndicator" "Manifest" "Route" "Stop" "TermsDiscountPercent" "TermsDiscountDueDate" "TermsNetDueDate" "TermsDiscountAmount" "TermsDiscountCode" "OrderDate" "DepartmentCode"]) (def header-keys ["TransCode" "GroupID" "Company" "CustomerNumber" "InvoiceNumber" "RecordType" "Item" "InvoiceDocument" "AccountName" "AccountDunsNo" "InvoiceDate" "AccountDate" "CustomerPONo" "PaymentTerms" "TermsDescription" "StoreNumber" "CustomerName" "AddressLine1" "AddressLine2" "City1" "State1" "Zip1" "Phone1" "Duns1" "Hin1" "Dea1" "TIDCustomer" "ChainNumber" "BidNumber" "ContractNumber" "CompanyNumber" "BriefName" "Address" "Address2" "City2" "State2" "Zip2" "Phone2" "Duns2" "Hin2" "Dea2" "Tid_OPCO" "ObligationIndicator" "Manifest" "Route" "Stop" "TermsDiscountPercent" "TermsDiscountDueDate" "TermsNetDueDate" "TermsDiscountAmount" "TermsDiscountCode" "OrderDate" "DepartmentCode"])
@@ -64,7 +63,6 @@
first first
first))) first)))
(defn read-sysco-csv [k] (defn read-sysco-csv [k]
(-> (s3/get-object {:bucket-name bucket-name (-> (s3/get-object {:bucket-name bucket-name
:key k}) :key k})
@@ -84,11 +82,9 @@
(fn [acc row] (fn [acc row]
(update acc (get-line-account (nth row item-name-index)) (update acc (get-line-account (nth row item-name-index))
(fnil + 0.0) (fnil + 0.0)
(Double/parseDouble (nth row item-price-index)) (Double/parseDouble (nth row item-price-index))))
)
) {}))
{})
)
items-with-tax (update items (get-line-account "TAX") items-with-tax (update items (get-line-account "TAX")
(fnil + 0.0) (fnil + 0.0)
tax) tax)
@@ -186,22 +182,16 @@
(nth (->> (s3/list-objects-v2 {:bucket-name "data.prod.app.integreatconsult.com" (nth (->> (s3/list-objects-v2 {:bucket-name "data.prod.app.integreatconsult.com"
:prefix "sysco/imported"}) :prefix "sysco/imported"})
:object-summaries :object-summaries
(map :key) (map :key))
)
i))) i)))
(comment (comment
(with-bindings {#'bucket-name "data.prod.app.integreatconsult.com"} (with-bindings {#'bucket-name "data.prod.app.integreatconsult.com"}
(doall (doall
(for [n (range 930 940) (for [n (range 930 940)
:let [result (-> (get-test-invoice-file n) :let [result (-> (get-test-invoice-file n)
read-sysco-csv read-sysco-csv
(extract-invoice-details (get-sysco-vendor)) (extract-invoice-details (get-sysco-vendor)))]
)]
#_#_:when (not (check-okay-amount? result))] #_#_:when (not (check-okay-amount? result))]
result))) result)))
@@ -209,12 +199,9 @@
(with-bindings {#'bucket-name "data.prod.app.integreatconsult.com"} (with-bindings {#'bucket-name "data.prod.app.integreatconsult.com"}
(let [result (-> "sysco/error/SYSCO050_00175962_20241010122639019.csv" (let [result (-> "sysco/error/SYSCO050_00175962_20241010122639019.csv"
read-sysco-csv read-sysco-csv
(extract-invoice-details (get-sysco-vendor)) (extract-invoice-details (get-sysco-vendor)))]
)]
result)) result)))
)
(defn import-sysco [] (defn import-sysco []
(let [sysco-vendor (get-sysco-vendor) (let [sysco-vendor (get-sysco-vendor)
@@ -223,7 +210,6 @@
:object-summaries :object-summaries
(map :key))] (map :key))]
(alog/info ::importing-sysco (alog/info ::importing-sysco
:count (count keys) :count (count keys)
:keys (pr-str keys)) :keys (pr-str keys))
@@ -256,6 +242,5 @@
(doseq [k keys] (doseq [k keys]
(mark-key k)))) (mark-key k))))
(defn -main [& _] (defn -main [& _]
(execute "sysco" import-sysco)) (execute "sysco" import-sysco))

View File

@@ -20,20 +20,17 @@
([start-date] ([start-date]
(let [txes-missing-ledger-entries (->> (dc/q {:find ['?t] (let [txes-missing-ledger-entries (->> (dc/q {:find ['?t]
:in ['$ '?sd] :in ['$ '?sd]
:where [ :where ['[?t :transaction/date ?d]
'[?t :transaction/date ?d]
'[(>= ?d ?sd)] '[(>= ?d ?sd)]
'(not [_ :journal-entry/original-entity ?t]) '(not [_ :journal-entry/original-entity ?t])
'(not [?t :transaction/amount 0.0]) '(not [?t :transaction/amount 0.0])
'(not [?t :transaction/approval-status :transaction-approval-status/excluded]) '(not [?t :transaction/approval-status :transaction-approval-status/excluded])
'(not [?t :transaction/approval-status :transaction-approval-status/suppressed]) '(not [?t :transaction/approval-status :transaction-approval-status/suppressed])]}
]}
(dc/db conn) start-date) (dc/db conn) start-date)
(map first) (map first)
(mapv (fn [t] (mapv (fn [t]
[:upsert-transaction {:db/id t}]))) [:upsert-transaction {:db/id t}])))
invoices-missing-ledger-entries (->> (dc/q {:find ['?t] invoices-missing-ledger-entries (->> (dc/q {:find ['?t]
:in ['$ '?sd] :in ['$ '?sd]
:where ['[?t :invoice/date ?d] :where ['[?t :invoice/date ?d]
@@ -43,8 +40,7 @@
'[(not= 0.0 ?amt)] '[(not= 0.0 ?amt)]
'(not [?t :invoice/status :invoice-status/voided]) '(not [?t :invoice/status :invoice-status/voided])
'(not [?t :invoice/import-status :import-status/pending]) '(not [?t :invoice/import-status :import-status/pending])
'(not [?t :invoice/exclude-from-ledger true]) '(not [?t :invoice/exclude-from-ledger true])]}
]}
(dc/db conn) start-date) (dc/db conn) start-date)
(map first) (map first)
(mapv (fn [i] (mapv (fn [i]
@@ -56,8 +52,7 @@
'[(>= ?d ?sd)] '[(>= ?d ?sd)]
'(not [_ :journal-entry/original-entity ?ss]) '(not [_ :journal-entry/original-entity ?ss])
'[?ss :sales-summary/items ?item] '[?ss :sales-summary/items ?item]
'[?item :ledger-mapped/account] '[?item :ledger-mapped/account]]}
]}
(dc/db conn) start-date) (dc/db conn) start-date)
(map first) (map first)
(mapv (fn [ss] (mapv (fn [ss]
@@ -72,7 +67,6 @@
:sales-summary-count (count sales-summaries-missing-ledger-entries)) :sales-summary-count (count sales-summaries-missing-ledger-entries))
@(dc/transact conn repairs))))) @(dc/transact conn repairs)))))
(defn touch-transaction [e] (defn touch-transaction [e]
@(dc/transact conn [{:db/id "datomic.tx" @(dc/transact conn [{:db/id "datomic.tx"
:db/doc "touching transaction to update ledger"} :db/doc "touching transaction to update ledger"}
@@ -83,8 +77,6 @@
:db/doc "touching invoice to update ledger"} :db/doc "touching invoice to update ledger"}
[:upsert-invoice {:db/id e}]])) [:upsert-invoice {:db/id e}]]))
(defn recently-changed-entities [start end] (defn recently-changed-entities [start end]
(into #{} (into #{}
(map first) (map first)
@@ -154,8 +146,7 @@
:where [?je :journal-entry/amount ?a] :where [?je :journal-entry/amount ?a]
[?je :journal-entry/line-items ?jel] [?je :journal-entry/line-items ?jel]
[(get-else $ ?jel :journal-entry-line/debit 0.0) ?debit] [(get-else $ ?jel :journal-entry-line/debit 0.0) ?debit]
[(get-else $ ?jel :journal-entry-line/credit 0.0) ?credit] [(get-else $ ?jel :journal-entry-line/credit 0.0) ?credit]]
]
(dc/db conn) (dc/db conn)
entities-to-consider) entities-to-consider)
(filter (fn [[_ a d c]] (filter (fn [[_ a d c]]
@@ -165,8 +156,6 @@
(map (fn [je] (map (fn [je]
(pull-ref (dc/db conn) :journal-entry/original-entity je))))))) (pull-ref (dc/db conn) :journal-entry/original-entity je)))))))
(defn unbalanced-invoices (defn unbalanced-invoices
([] (unbalanced-invoices (c/to-date (t/minus (t/now) (t/days 7))) ([] (unbalanced-invoices (c/to-date (t/minus (t/now) (t/days 7)))
(c/to-date (t/minus (t/now) (t/hours 1))))) (c/to-date (t/minus (t/now) (t/hours 1)))))
@@ -230,8 +219,7 @@
(not [?e :invoice/exclude-from-ledger true]) (not [?e :invoice/exclude-from-ledger true])
[?e :invoice/import-status :import-status/imported]] [?e :invoice/import-status :import-status/imported]]
(dc/db conn) (dc/db conn)
entities-to-consider)) entities-to-consider))]
]
(filter (filter
(fn [[e accounts]] (fn [[e accounts]]
(not= accounts (get jel-accounts e))) (not= accounts (get jel-accounts e)))
@@ -272,7 +260,6 @@
(statsd/gauge "data.unbalanced_transactions" (count (unbalanced-transactions)))) (statsd/gauge "data.unbalanced_transactions" (count (unbalanced-transactions))))
(statsd/gauge "data.unbalanced_transactions" 0.0)))) (statsd/gauge "data.unbalanced_transactions" 0.0))))
(mu/trace ::fixing-mismatched-invoices (mu/trace ::fixing-mismatched-invoices
[] []
(mu/log ::started-fixing-mismatched-invoices) (mu/log ::started-fixing-mismatched-invoices)
@@ -308,13 +295,11 @@
:priority :low} :priority :low}
nil)) nil))
(defn build-account-lookup [client-id] (defn build-account-lookup [client-id]
(let [accounts (by :db/id (map first (dc/q {:find ['(pull ?e [:db/id :account/name (let [accounts (by :db/id (map first (dc/q {:find ['(pull ?e [:db/id :account/name
:account/numeric-code :account/numeric-code
{:account/type [:db/ident] {:account/type [:db/ident]
:account/client-overrides [:account-client-override/client :account-client-override/name]} :account/client-overrides [:account-client-override/client :account-client-override/name]}])]
])]
:in ['$] :in ['$]
:where ['[?e :account/name]]} :where ['[?e :account/name]]}
(dc/db conn)))) (dc/db conn))))
@@ -329,8 +314,7 @@
(map (fn [o] (map (fn [o]
[[(:db/id a) (:db/id (:account-client-override/client o))] [[(:db/id a) (:db/id (:account-client-override/client o))]
(:account-client-override/name o)]) (:account-client-override/name o)])
(:account/client-overrides a)) (:account/client-overrides a))))
) )
(into {}))] (into {}))]
(fn [a] (fn [a]
{:name (or (:bank-account/name (bank-accounts a)) {:name (or (:bank-account/name (bank-accounts a))
@@ -356,8 +340,7 @@
:selector [:db/id :journal-entry-line/location :journal-entry-line/account :journal-entry-line/client+account+location+date {:journal-entry/_line-items [:journal-entry/date :journal-entry/client]}] :selector [:db/id :journal-entry-line/location :journal-entry-line/account :journal-entry-line/client+account+location+date {:journal-entry/_line-items [:journal-entry/date :journal-entry/client]}]
:start [:journal-entry-line/client+account+location+date [c]]}) :start [:journal-entry-line/client+account+location+date [c]]})
(take-while (fn [result] (take-while (fn [result]
(= c (first (:journal-entry-line/client+account+location+date result))) (= c (first (:journal-entry-line/client+account+location+date result)))))
))
(filter (fn [{index :journal-entry-line/client+account+location+date :as result}] (filter (fn [{index :journal-entry-line/client+account+location+date :as result}]
(not= index (not= index
[(-> result :journal-entry/_line-items :journal-entry/client :db/id) [(-> result :journal-entry/_line-items :journal-entry/client :db/id)
@@ -580,18 +563,14 @@
:journal-entry-line/date date :journal-entry-line/date date
:journal-entry-line/client client}) :journal-entry-line/client client})
{:user/name "backfill-client and dates"}) {:user/name "backfill-client and dates"})
(println "done.")) (println "done."))
#_(dc/q '[:find (pull ?je [*]) (pull ?jel [*]) #_(dc/q '[:find (pull ?je [*]) (pull ?jel [*])
:where [?je :journal-entry/line-items ?jel] :where [?je :journal-entry/line-items ?jel]
(not [?jel :journal-entry-line/running-balance-tuple])] (not [?jel :journal-entry-line/running-balance-tuple])]
(dc/db conn))) (dc/db conn)))
;; TODO only enable once IOL is set up in clod ;; TODO only enable once IOL is set up in clod
#_{:clj-kondo/ignore [:clojure-lsp/unused-public-var]} #_{:clj-kondo/ignore [:clojure-lsp/unused-public-var]}
(mount/defstate running-balance-cache-worker (mount/defstate running-balance-cache-worker

View File

@@ -1,7 +1,6 @@
(ns auto-ap.logging (ns auto-ap.logging
(:require [com.brunobonacci.mulog :as mu])) (:require [com.brunobonacci.mulog :as mu]))
(defmacro with-context-as [ctx s & body] (defmacro with-context-as [ctx s & body]
`(mu/with-context ~ctx `(mu/with-context ~ctx
(let [~s (mu/local-context)] (let [~s (mu/local-context)]

View File

@@ -16,7 +16,6 @@
(defonce last-text (atom nil)) (defonce last-text (atom nil))
(defn template-applies? [text {:keys [keywords]}] (defn template-applies? [text {:keys [keywords]}]
(every? #(re-find % text) keywords)) (every? #(re-find % text) keywords))
@@ -60,8 +59,6 @@
first first
(extract-template text))) (extract-template text)))
(defmulti parse-file (defmulti parse-file
"Parses a file based on its extension. Accepts options as additional arguments. "Parses a file based on its extension. Accepts options as additional arguments.
Options: Options:
@@ -75,7 +72,6 @@
(json/write-str (json/write-str
(alog/peek ::x {"url" (str "https://" "data.prod.app.integreatconsult.com" "/" f)}))})))] (alog/peek ::x {"url" (str "https://" "data.prod.app.integreatconsult.com" "/" f)}))})))]
(alog/info ::glimpse2-payload :payload result) (alog/info ::glimpse2-payload :payload result)
(-> result (-> result
json/read-str))) json/read-str)))
@@ -123,7 +119,6 @@
[file filename & _] [file filename & _]
(excel/parse-file file filename)) (excel/parse-file file filename))
(defmethod parse-file (defmethod parse-file
"xlsx" "xlsx"
[file filename & _] [file filename & _]

View File

@@ -23,7 +23,6 @@
(str/includes? (str header) "Document Number") (str/includes? (str header) "Document Number")
:philz :philz
(str/includes? (str header) "DISCOUNT_MESSAGE") (str/includes? (str header) "DISCOUNT_MESSAGE")
:wismettac :wismettac
@@ -53,8 +52,7 @@
(try (try
(u/parse-value :clj-time f d) (u/parse-value :clj-time f d)
(catch Exception _ (catch Exception _
nil)) nil))))
))
(first))] (first))]
(u/parse-value :clj-time valid-fmt d))) (u/parse-value :clj-time valid-fmt d)))
@@ -147,10 +145,8 @@
:date (some-> dt not-empty (parse-date-fallover ["MM/dd/yyyy"])) :date (some-> dt not-empty (parse-date-fallover ["MM/dd/yyyy"]))
:total (str/replace amount #"," "") :total (str/replace amount #"," "")
:text (str/join " " row) :text (str/join " " row)
:full-text (str/join " " row)})) :full-text (str/join " " row)})))
)
conj conj
[] []
(drop 1 rows))) (drop 1 rows)))
@@ -165,8 +161,7 @@
:date (some-> inv_dt not-empty (parse-date-fallover ["MM/dd/yyyy"])) :date (some-> inv_dt not-empty (parse-date-fallover ["MM/dd/yyyy"]))
:total (str/replace total #"," "") :total (str/replace total #"," "")
:text (str/join " " row) :text (str/join " " row)
:full-text (str/join " " row)})) :full-text (str/join " " row)})))
)
conj conj
[] []
(drop 1 rows))) (drop 1 rows)))
@@ -182,8 +177,7 @@
:due (some-> due not-empty (parse-date-fallover ["MM/dd/yy"])) :due (some-> due not-empty (parse-date-fallover ["MM/dd/yy"]))
:total (str/replace amount #"[\$,]" "") :total (str/replace amount #"[\$,]" "")
:text (str/join " " row) :text (str/join " " row)
:full-text (str/join " " row)})) :full-text (str/join " " row)})))
)
conj conj
[] []
(drop 1 rows))) (drop 1 rows)))
@@ -199,8 +193,7 @@
:date (some-> date not-empty (parse-date-fallover ["MM/dd/yy"])) :date (some-> date not-empty (parse-date-fallover ["MM/dd/yy"]))
:total (str/replace amount #"[\$,]" "") :total (str/replace amount #"[\$,]" "")
:text (str/join " " row) :text (str/join " " row)
:full-text (str/join " " row)})) :full-text (str/join " " row)})))
)
conj conj
[] []
(drop 1 rows))) (drop 1 rows)))

View File

@@ -6,10 +6,7 @@
[clojure.data.json :as json] [clojure.data.json :as json]
[config.core :refer [env]] [config.core :refer [env]]
[clojure.java.io :as io] [clojure.java.io :as io]
[amazonica.aws.s3 :as s3]) [amazonica.aws.s3 :as s3]))
)
(defn template-applies? [text {:keys [keywords]}] (defn template-applies? [text {:keys [keywords]}]
@@ -37,8 +34,7 @@
cell-value)] cell-value)]
(if (get parser k) (if (get parser k)
(u/parse-value (first (get parser k)) (second (get parser k)) raw-result) (u/parse-value (first (get parser k)) (second (get parser k)) raw-result)
raw-result raw-result))))
))))
first))) first)))
{:vendor-code vendor} {:vendor-code vendor}
extract)])) extract)]))
@@ -67,9 +63,6 @@
first first
(extract sheet)))) (extract sheet))))
(defn xls-date->date [f] (defn xls-date->date [f]
(when (not-empty f) (when (not-empty f)
(let [f (Double/parseDouble f) (let [f (Double/parseDouble f)

View File

@@ -8,11 +8,9 @@
(defmulti parse-value (fn [method _ _] (defmulti parse-value (fn [method _ _]
method)) method))
(defmethod parse-value :trim-commas (defmethod parse-value :trim-commas
[_ _ value] [_ _ value]
(str/replace value #"," "") (str/replace value #"," ""))
)
(defmethod parse-value :trim-commas-and-remove-dollars (defmethod parse-value :trim-commas-and-remove-dollars
[_ _ value] [_ _ value]
(str/replace (str/replace value #"," "") #"\$" "")) (str/replace (str/replace value #"," "") #"\$" ""))
@@ -40,8 +38,7 @@
(let [format "yyyy-MM-dd" (let [format "yyyy-MM-dd"
[month day year] (str/split (-> value [month day year] (str/split (-> value
(str/replace #"\s+" " ") (str/replace #"\s+" " "))
)
#"\s") #"\s")
value (str "20" year "-" month "-" day)] value (str "20" year "-" month "-" day)]
@@ -66,8 +63,7 @@
(alog/warn ::cant-parse-date :error e :raw-value (str value)) (alog/warn ::cant-parse-date :error e :raw-value (str value))
nil))) nil)))
nil nil
format) format)))
))
(defmethod parse-value nil (defmethod parse-value nil
[_ _ value] [_ _ value]

View File

@@ -47,8 +47,7 @@
(:color cell) (assoc :color (:color cell)) (:color cell) (assoc :color (:color cell))
(:bg-color cell) (assoc :background-color (:bg-color cell))) (:bg-color cell) (assoc :background-color (:bg-color cell)))
cell-contents cell-contents]))
]))
(defn cell-count [table] (defn cell-count [table]
(let [counts (map count (:rows table))] (let [counts (map count (:rows table))]
@@ -77,15 +76,13 @@
:else :else
100)} 100)}
widths widths]
]
(into (into
(for [row (:rows table)] (for [row (:rows table)]
(into [] (into []
(for [cell (take cell-count (concat row (repeat nil)))] (for [cell (take cell-count (concat row (repeat nil)))]
(cell->pdf cell) (cell->pdf cell)))))
))))
(conj (take cell-count (repeat (cell->pdf {:value " "}))))))) (conj (take cell-count (repeat (cell->pdf {:value " "})))))))
(defn split-table [table n] (defn split-table [table n]
@@ -192,10 +189,8 @@
(mapcat (fn [p1 p2] (mapcat (fn [p1 p2]
(map (map
(fn [a] (fn [a]
(assoc a :period p1) (assoc a :period p1))
) (:accounts p2)))
(:accounts p2))
)
(:periods args))) (:periods args)))
pnl-data (l-reports/->PNLData args data (by :db/id :client/code clients)) pnl-data (l-reports/->PNLData args data (by :db/id :client/code clients))
report (l-reports/summarize-pnl pnl-data) report (l-reports/summarize-pnl pnl-data)
@@ -238,10 +233,8 @@
(mapcat (fn [p1 p2] (mapcat (fn [p1 p2]
(map (map
(fn [a] (fn [a]
(assoc a :period p1) (assoc a :period p1))
) (:accounts p2)))
(:accounts p2))
)
(:periods args))) (:periods args)))
pnl-data (l-reports/->PNLData args data (by :db/id :client/code clients)) pnl-data (l-reports/->PNLData args data (by :db/id :client/code clients))
report (l-reports/summarize-cash-flows pnl-data) report (l-reports/summarize-cash-flows pnl-data)

View File

@@ -40,8 +40,6 @@
:body :body
:link_token)) :link_token))
(defn exchange-public-token [public-token _] (defn exchange-public-token [public-token _]
(-> (client/post (str base-url "/item/public_token/exchange") (-> (client/post (str base-url "/item/public_token/exchange")
{:as :json {:as :json
@@ -87,8 +85,6 @@
(.getMessage (:throwable &throw-context))) (.getMessage (:throwable &throw-context)))
json)))))) json))))))
(defn get-balance [access-token] (defn get-balance [access-token]
(-> (client/post (str base-url "/accounts/balance/get") (-> (client/post (str base-url "/accounts/balance/get")
{:as :json {:as :json
@@ -104,7 +100,6 @@
:end (str end) :end (str end)
:acct (str account-id)) :acct (str account-id))
(try+ (try+
(-> (client/post (str base-url "/transactions/get") (-> (client/post (str base-url "/transactions/get")
{:as :json {:as :json
@@ -140,6 +135,4 @@
(clojure.pprint/pprint (clojure.pprint/pprint
(get-transactions "access-production-c0e322fa-f33d-4806-bc42-5fc883fb1ba4" "VZ8Y1azZMdhoYo9MQABrfpgz4jm4kPtakyxN5" #clj-time/date-time "2024-03-15" #clj-time/date-time "2024-03-30")) (get-transactions "access-production-c0e322fa-f33d-4806-bc42-5fc883fb1ba4" "VZ8Y1azZMdhoYo9MQABrfpgz4jm4kPtakyxN5" #clj-time/date-time "2024-03-15" #clj-time/date-time "2024-03-30"))
(clojure.pprint/pprint (get-accounts "access-production-c0e322fa-f33d-4806-bc42-5fc883fb1ba4")) (clojure.pprint/pprint (get-accounts "access-production-c0e322fa-f33d-4806-bc42-5fc883fb1ba4")))
)

View File

@@ -76,10 +76,8 @@
(double? v) (double? v)
(str v) (str v)
:else :else
v) v)]))
]))
m)) m))
(defn export-invoices [{:keys [query-params identity]}] (defn export-invoices [{:keys [query-params identity]}]
@@ -124,13 +122,11 @@
[:invoices [[:invoice [:id :original-id]] :amount]] [:invoices [[:invoice [:id :original-id]] :amount]]
[:bank-account [:number :code :bank-name :bank-code :id]] [:bank-account [:number :code :bank-name :bank-code :id]]
[:vendor [:name :id [:primary-contact [:name :email :phone]] [:default-account [:name :numeric-code :id]] [:address [:street1 :city :state :zip]]]] [:vendor [:name :id [:primary-contact [:name :email :phone]] [:default-account [:name :numeric-code :id]] [:address [:street1 :city :state :zip]]]]
[:client [:id :name :code]] [:client [:id :name :code]]]]]
]]]
payments (graphql/query identity (venia/graphql-query {:venia/queries (->graphql query)}) {:clients [[:client/code (query-params "client-code")]]})] payments (graphql/query identity (venia/graphql-query {:venia/queries (->graphql query)}) {:clients [[:client/code (query-params "client-code")]]})]
{:body {:body
(list (:all-payments (:data payments)))}))) (list (:all-payments (:data payments)))})))
(defn export-sales [{:keys [query-params identity]}] (defn export-sales [{:keys [query-params identity]}]
(assert-admin identity) (assert-admin identity)
(statsd/time! [(str "export.time") {:tags #{(client-tag query-params) (statsd/time! [(str "export.time") {:tags #{(client-tag query-params)
@@ -206,12 +202,10 @@
(update :total #(some-> % Double/parseDouble)))) (update :total #(some-> % Double/parseDouble))))
(:all-expected-deposits (:data payments))))}))) (:all-expected-deposits (:data payments))))})))
(generate/add-encoder org.joda.time.DateTime (generate/add-encoder org.joda.time.DateTime
(fn [c jsonGenerator] (fn [c jsonGenerator]
(.writeString jsonGenerator (str c)))) (.writeString jsonGenerator (str c))))
(defn export-clients [{:keys [identity]}] (defn export-clients [{:keys [identity]}]
(assert-admin identity) (assert-admin identity)
{:body (into [] {:body (into []
@@ -264,9 +258,8 @@
(-> v :vendor/address :address/zip) (-> v :vendor/address :address/zip)
(-> v (vendor/terms-for-client-id client)) (-> v (vendor/terms-for-client-id client))
(-> v (vendor/account-for-client-id client) (accounts/clientize client) :account/name) (-> v (vendor/account-for-client-id client) (accounts/clientize client) :account/name)
(-> v (vendor/account-for-client-id client) :account/numeric-code) (-> v (vendor/account-for-client-id client) :account/numeric-code)]))
]
))
(into [["Vendor Name" "Address" "City" "State" "Zip" "Terms" "Account" "Account Code"]]))] (into [["Vendor Name" "Address" "City" "State" "Zip" "Terms" "Account" "Account Code"]]))]
{:body {:body
(into [] (into []
@@ -405,7 +398,6 @@
#_#_:original-id (Integer/parseInt (query-params "original")) #_#_:original-id (Integer/parseInt (query-params "original"))
:count Integer/MAX_VALUE})] :count Integer/MAX_VALUE})]
{:body (map {:body (map
(comp ->graphql (comp ->graphql
(fn [i] (fn [i]
@@ -564,8 +556,7 @@
{[:charge/processor :xform iol-ion.query/ident] [:db/ident]}] {[:charge/processor :xform iol-ion.query/ident] [:db/ident]}]
:sales-order/line-items [:order-line-item/item-name :sales-order/line-items [:order-line-item/item-name
:order-line-item/category :order-line-item/category
:order-line-item/total]} :order-line-item/total]}]
]
:start [:sales-order/client+date [(:db/id client) (coerce/to-date date)]] :start [:sales-order/client+date [(:db/id client) (coerce/to-date date)]]
:end [:sales-order/client+date [(:db/id client) (coerce/to-date end)]] :end [:sales-order/client+date [(:db/id client) (coerce/to-date end)]]
:reverse false :reverse false
@@ -576,40 +567,34 @@
(:db/id client)) (:db/id client))
(< (compare (:sales-order/date curr) (< (compare (:sales-order/date curr)
(coerce/to-date end)) (coerce/to-date end))
0)) 0)))))]
)))
]
entry all-entries entry all-entries
:let [sales-columns [(-> entry :sales-order/client :client/name) :let [sales-columns [(-> entry :sales-order/client :client/name)
(atime/unparse-local (coerce/from-date (-> entry :sales-order/date)) atime/standard-time) (atime/unparse-local (coerce/from-date (-> entry :sales-order/date)) atime/standard-time)
(-> entry :sales-order/total) (-> entry :sales-order/total)
(-> entry :sales-order/tip) (-> entry :sales-order/tip)
(-> entry :sales-order/service-charge) (-> entry :sales-order/service-charge)
(-> entry :sales-order/reference-link) (-> entry :sales-order/reference-link)]
]
sales-column-count (count sales-columns) sales-column-count (count sales-columns)
tender-column-count 6] tender-column-count 6]
row (concat [sales-columns] row (concat [sales-columns]
(map (fn [tender] (map (fn [tender]
(concat (concat
(take sales-column-count (repeat nil)) (take sales-column-count (repeat nil))
[ [(-> tender :charge/total)
(-> tender :charge/total)
(-> tender :charge/tax) (-> tender :charge/tax)
(-> tender :charge/tip) (-> tender :charge/tip)
(-> tender :charge/type-name) (-> tender :charge/type-name)
(some-> tender :charge/processor name) (some-> tender :charge/processor name)
(-> tender :charge/reference-link) (-> tender :charge/reference-link)]))
]))
(:sales-order/charges entry)) (:sales-order/charges entry))
(map (fn [tender] (map (fn [tender]
(concat (concat
(take (+ sales-column-count tender-column-count) (repeat nil)) (take (+ sales-column-count tender-column-count) (repeat nil))
[ [(-> tender :order-line-item/item-name)
(-> tender :order-line-item/item-name)
(-> tender :order-line-item/category) (-> tender :order-line-item/category)
(-> tender :order-line-item/total) (-> tender :order-line-item/total)]))
]))
(:sales-order/line-items entry)))] (:sales-order/line-items entry)))]
row row
@@ -628,7 +613,6 @@
(handler request) (handler request)
{:status 401}))) {:status 401})))
(def routes2 {"api/" {"sales/" {"aggregated/" {#"export/?" {:get :aggregated-sales-export}} (def routes2 {"api/" {"sales/" {"aggregated/" {#"export/?" {:get :aggregated-sales-export}}
#"export/?" {:get :export-sales} #"export/?" {:get :export-sales}
"ntg-export" {:get :export-ntg-sales-snapshot}} "ntg-export" {:get :export-ntg-sales-snapshot}}
@@ -662,8 +646,7 @@
[:date {:required true [:date {:required true
:decode/string #(try (atime/parse % atime/iso-date) (catch Exception _ nil))} :some]])) :decode/string #(try (atime/parse % atime/iso-date) (catch Exception _ nil))} :some]]))
(wrap-form-4xx-2 (fn [_] {:body "Invalid Date"})) (wrap-form-4xx-2 (fn [_] {:body "Invalid Date"}))
(wrap-predetermined-api-key "fd07755a-ed4c-4c9a-ad85-fbdd8af37206") (wrap-predetermined-api-key "fd07755a-ed4c-4c9a-ad85-fbdd8af37206"))
)
:export-trial-balance (-> export-trial-balance wrap-csv-response wrap-secure) :export-trial-balance (-> export-trial-balance wrap-csv-response wrap-secure)
:export-accounts (-> export-accounts wrap-json-response wrap-secure) :export-accounts (-> export-accounts wrap-json-response wrap-secure)
:export-transactions (-> export-transactions wrap-json-response wrap-secure) :export-transactions (-> export-transactions wrap-json-response wrap-secure)

View File

@@ -23,8 +23,6 @@
:else :else
{:status 404})) {:status 404}))
(def routes {"api/" {"ezcater/" {#"event/?" :ezcater-event}}}) (def routes {"api/" {"ezcater/" {#"event/?" :ezcater-event}}})
(def match->handler {:ezcater-event (-> handle-ezcater (def match->handler {:ezcater-event (-> handle-ezcater
wrap-json-params)}) wrap-json-params)})

View File

@@ -11,9 +11,6 @@
[clojure.set :as set] [clojure.set :as set]
[datomic.api :as dc])) [datomic.api :as dc]))
(defn handle-graphql [{:keys [request-method query-params clients] :as r}] (defn handle-graphql [{:keys [request-method query-params clients] :as r}]
(when (= "none" (:user/role (:identity r))) (when (= "none" (:user/role (:identity r)))
(throw-unauthorized)) (throw-unauthorized))
@@ -48,6 +45,5 @@
:body (pr-str {:errors [{:message (str "Unhandled error:" (str e))}]}) :body (pr-str {:errors [{:message (str "Unhandled error:" (str e))}]})
:headers {"Content-Type" "application/edn"}})))))) :headers {"Content-Type" "application/edn"}}))))))
(def routes {"api/" {#"graphql/?" :graphql}}) (def routes {"api/" {#"graphql/?" :graphql}})
(def match->handler {:graphql (wrap-secure handle-graphql)}) (def match->handler {:graphql (wrap-secure handle-graphql)})

View File

@@ -97,7 +97,6 @@
invoice) invoice)
(defn admin-only-if-multiple-clients [is] (defn admin-only-if-multiple-clients [is]
(let [client-count (->> is (let [client-count (->> is
(map :invoice/client) (map :invoice/client)
@@ -318,8 +317,6 @@
:data (ex-data e)}) :data (ex-data e)})
:headers {"Content-Type" "application/edn"}})))) :headers {"Content-Type" "application/edn"}}))))
(defn bulk-account-overrides [{{files :file (defn bulk-account-overrides [{{files :file
files-2 "file" files-2 "file"
client :client client :client

View File

@@ -25,8 +25,6 @@
(csv/write-csv w %) (csv/write-csv w %)
(.toString w)))))) (.toString w))))))
(defn execute-query [query-params params] (defn execute-query [query-params params]
(let [{:keys [query-id]} params] (let [{:keys [query-id]} params]
(mu/with-context {:query-id query-id} (mu/with-context {:query-id query-id}
@@ -37,7 +35,6 @@
(into (list) (apply dc/q (edn/read-string query-string) (into (list) (apply dc/q (edn/read-string query-string)
(into [(dc/db conn)] (edn/read-string (get query-params "args" "[]"))))))))) (into [(dc/db conn)] (edn/read-string (get query-params "args" "[]")))))))))
(defn put-query [guid body note & [lookup-key client]] (defn put-query [guid body note & [lookup-key client]]
(let [id (pull-id (dc/db conn) [:saved-query/lookup-key lookup-key]) (let [id (pull-id (dc/db conn) [:saved-query/lookup-key lookup-key])
guid (if lookup-key guid (if lookup-key
@@ -62,8 +59,6 @@
:csv-results-url (str "/api/queries/" guid "/results/csv") :csv-results-url (str "/api/queries/" guid "/results/csv")
:json-results-url (str "/api/queries/" guid "/results/json")}})) :json-results-url (str "/api/queries/" guid "/results/json")}}))
(defn get-queries [{:keys [identity]}] (defn get-queries [{:keys [identity]}]
(assert-admin identity) (assert-admin identity)
(let [obj (s3/list-objects :bucket-name (:data-bucket env) (let [obj (s3/list-objects :bucket-name (:data-bucket env)

View File

@@ -80,8 +80,6 @@
(recur rules))) (recur rules)))
[]))) [])))
(defn group-rules-by-priority [rules] (defn group-rules-by-priority [rules]
(->> rules (->> rules
(map (fn [r] (update r :transaction-rule/description #(some-> % ->pattern)))) (map (fn [r] (update r :transaction-rule/description #(some-> % ->pattern))))

View File

@@ -33,7 +33,6 @@
(.addShutdownHook (Runtime/getRuntime) (.addShutdownHook (Runtime/getRuntime)
(Thread. f))) (Thread. f)))
(defn gzip-handler [] (defn gzip-handler []
(let [gz (GzipHandler.)] (let [gz (GzipHandler.)]
(doto gz (doto gz

View File

@@ -123,7 +123,6 @@
"vendor_id" (-> i :payment/vendor :db/id) "vendor_id" (-> i :payment/vendor :db/id)
"type" "payment"})) "type" "payment"}))
(defprotocol SolrClient (defprotocol SolrClient
(index-documents-raw [this index xs]) (index-documents-raw [this index xs])
(index-documents [this index xs]) (index-documents [this index xs])
@@ -162,8 +161,7 @@
:socket-timeout 30000 :socket-timeout 30000
:connection-timeout 30000 :connection-timeout 30000
:headers {"Content-Type" "application/json"} :headers {"Content-Type" "application/json"}
:as :json} :as :json})
)
:body :body
:response :response
:docs)) :docs))
@@ -193,10 +191,6 @@
(->RealSolrClient (:solr-uri env)) (->RealSolrClient (:solr-uri env))
(->MockSolrClient))) (->MockSolrClient)))
(defn touch-with-ledger [i] (defn touch-with-ledger [i]
(index-documents impl "invoices" [i [:journal-entry/original-entity i]])) (index-documents impl "invoices" [i [:journal-entry/original-entity i]]))
@@ -205,7 +199,6 @@
([i index] ([i index]
(index-documents impl index [i]))) (index-documents impl index [i])))
(defrecord InMemSolrClient [data-set-atom] (defrecord InMemSolrClient [data-set-atom]
SolrClient SolrClient
(index-documents [this index xs] (index-documents [this index xs]

View File

@@ -27,11 +27,9 @@
"Authorization" (str "Bearer " (:client/square-auth-token client)) "Authorization" (str "Bearer " (:client/square-auth-token client))
"Content-Type" "application/json"})) "Content-Type" "application/json"}))
(defn ->square-date [d] (defn ->square-date [d]
(f/unparse (f/formatter "YYYY-MM-dd'T'HH:mm:ssZZ") d)) (f/unparse (f/formatter "YYYY-MM-dd'T'HH:mm:ssZZ") d))
(def manifold-api-stream (def manifold-api-stream
(let [stream (s/stream 100)] (let [stream (s/stream 100)]
(->> stream (->> stream
@@ -104,7 +102,6 @@
:exception error)) :exception error))
[])))) []))))
(def item-cache (atom {})) (def item-cache (atom {}))
(defn fetch-catalog [client i v] (defn fetch-catalog [client i v]
@@ -124,13 +121,11 @@
#(do (swap! item-cache assoc i %) #(do (swap! item-cache assoc i %)
%)))) %))))
(defn fetch-catalog-cache [client i version] (defn fetch-catalog-cache [client i version]
(if (get @item-cache i) (if (get @item-cache i)
(de/success-deferred (get @item-cache i)) (de/success-deferred (get @item-cache i))
(fetch-catalog client i version))) (fetch-catalog client i version)))
(defn item->category-name-impl [client item version] (defn item->category-name-impl [client item version]
(capture-context->lc (capture-context->lc
(cond (:item_id (:item_variation_data item)) (cond (:item_id (:item_variation_data item))
@@ -161,7 +156,6 @@
:item item) :item item)
"Uncategorized")))) "Uncategorized"))))
(defn item-id->category-name [client i version] (defn item-id->category-name [client i version]
(capture-context->lc (capture-context->lc
(-> [client i] (-> [client i]
@@ -226,7 +220,6 @@
(concat (:orders result) continued-results)))) (concat (:orders result) continued-results))))
(:orders result))))))) (:orders result)))))))
(defn search (defn search
([client location start end] ([client location start end]
(capture-context->lc (capture-context->lc
@@ -250,11 +243,9 @@
(concat (:orders result) continued-results)))) (concat (:orders result) continued-results))))
(:orders result)))))))) (:orders result))))))))
(defn amount->money [amt] (defn amount->money [amt]
(* 0.01 (or (:amount amt) 0.0))) (* 0.01 (or (:amount amt) 0.0)))
;; to get totals: ;; to get totals:
(comment (comment
(reduce (reduce
@@ -415,7 +406,6 @@
:client client :client client
:location location))))))) :location location)))))))
(defn get-payment [client p] (defn get-payment [client p]
(de/chain (manifold-api-call (de/chain (manifold-api-call
{:url (str "https://connect.squareup.com/v2/payments/" p) {:url (str "https://connect.squareup.com/v2/payments/" p)
@@ -424,7 +414,6 @@
:body :body
:payment)) :payment))
(defn continue-payout-entry-list [c l poi cursor] (defn continue-payout-entry-list [c l poi cursor]
(capture-context->lc lc (capture-context->lc lc
(de/chain (de/chain
@@ -618,7 +607,6 @@
:count (count x)) :count (count x))
@(dc/transact-async conn x)))))))) @(dc/transact-async conn x))))))))
(defn upsert-payouts (defn upsert-payouts
([client] ([client]
(apply de/zip (apply de/zip
@@ -667,7 +655,6 @@
(log/info ::done-loading-refunds))))))) (log/info ::done-loading-refunds)))))))
(defn get-cash-shift [client id] (defn get-cash-shift [client id]
(de/chain (manifold-api-call {:url (str (url/url "https://connect.squareup.com/v2/cash-drawers/shifts" id)) (de/chain (manifold-api-call {:url (str (url/url "https://connect.squareup.com/v2/cash-drawers/shifts" id))
:method :get :method :get
@@ -826,8 +813,6 @@
d1 d1
d2)) d2))
(defn remove-voided-orders (defn remove-voided-orders
([client] ([client]
(apply de/zip (apply de/zip
@@ -872,9 +857,7 @@
@(let [[c [l]] (get-square-client-and-location "DBFS")] @(let [[c [l]] (get-square-client-and-location "DBFS")]
(log/peek :x [c l]) (log/peek :x [c l])
(search c l #clj-time/date-time "2026-03-28" #clj-time/date-time "2026-03-29") (search c l #clj-time/date-time "2026-03-28" #clj-time/date-time "2026-03-29"))
)
@(let [[c [l]] (get-square-client-and-location "NGAK")] @(let [[c [l]] (get-square-client-and-location "NGAK")]
(log/peek :x [c l]) (log/peek :x [c l])
@@ -884,10 +867,7 @@
(try (try
@(remove-voided-orders c) @(remove-voided-orders c)
(catch Exception e (catch Exception e
nil))) nil))))
)
(defn upsert-all [& clients] (defn upsert-all [& clients]
(capture-context->lc (capture-context->lc
@@ -956,8 +936,6 @@
[:clients clients] [:clients clients]
@(apply upsert-all clients))) @(apply upsert-all clients)))
(comment (comment
(defn refunds-raw-cont (defn refunds-raw-cont
([client l cursor so-far] ([client l cursor so-far]
@@ -987,7 +965,6 @@
(->> (->>
@(let [[c [l]] (get-square-client-and-location "NGGG")] @(let [[c [l]] (get-square-client-and-location "NGGG")]
(search c l (time/now) (time/plus (time/now) (time/days -1)))) (search c l (time/now) (time/plus (time/now) (time/days -1))))
(filter (fn [r] (filter (fn [r]
@@ -997,7 +974,6 @@
(->> (->>
@(let [[c [l]] (get-square-client-and-location "NGGG")] @(let [[c [l]] (get-square-client-and-location "NGGG")]
(refunds-raw-cont c l nil [])) (refunds-raw-cont c l nil []))
(filter (fn [r] (filter (fn [r]
(str/starts-with? (:created_at r) "2024-03-14"))))) (str/starts-with? (:created_at r) "2024-03-14")))))
@@ -1032,13 +1008,8 @@
[(:client/code c) (atime/unparse-local (clj-time.coerce/to-date-time (:sales-order/date bad-row)) atime/normal-date) (:sales-order/total bad-row) (:sales-order/tax bad-row) (:sales-order/tip bad-row) (:db/id bad-row)]) [(:client/code c) (atime/unparse-local (clj-time.coerce/to-date-time (:sales-order/date bad-row)) atime/normal-date) (:sales-order/total bad-row) (:sales-order/tax bad-row) (:sales-order/tip bad-row) (:db/id bad-row)])
:separator \tab) :separator \tab)
;; => ;; =>
(require 'auto-ap.time-reader) (require 'auto-ap.time-reader)
@(upsert-all "NGPG") @(upsert-all "NGPG")
@@ -1046,26 +1017,15 @@
(clojure.pprint/pprint (let [[c [l]] (get-square-client-and-location "NGVT")] (clojure.pprint/pprint (let [[c [l]] (get-square-client-and-location "NGVT")]
l l
(def z @(search c l #clj-time/date-time "2025-02-23T00:00:00-08:00" (def z @(search c l #clj-time/date-time "2025-02-23T00:00:00-08:00"
#clj-time/date-time "2025-02-28T00:00:00-08:00")) #clj-time/date-time "2025-02-28T00:00:00-08:00"))
(take 10 (map #(first (deref (order->sales-order c l %))) z))) (take 10 (map #(first (deref (order->sales-order c l %))) z))))
)
(->> z (->> z
(filter (fn [o] (filter (fn [o]
(seq (filter (comp #{"OTHER"} :type) (:tenders o))))) (seq (filter (comp #{"OTHER"} :type) (:tenders o)))))
(filter #(not (:name (:source %)))) (filter #(not (:name (:source %))))
(count) (count))
)
(doseq [[code] (seq (dc/q '[:find ?code (doseq [[code] (seq (dc/q '[:find ?code
:in $ :in $
@@ -1075,8 +1035,7 @@
[?o :sales-order/client ?c] [?o :sales-order/client ?c]
[?c :client/code ?code]] [?c :client/code ?code]]
(dc/db conn))) (dc/db conn)))
:let [[c [l]] (get-square-client-and-location code) :let [[c [l]] (get-square-client-and-location code)]
]
order @(search c l #clj-time/date-time "2026-01-01T00:00:00-08:00" (time/now)) order @(search c l #clj-time/date-time "2026-01-01T00:00:00-08:00" (time/now))
:when (= "Invoices" (:name (:source order))) :when (= "Invoices" (:name (:source order)))
:let [[sales-order] @(order->sales-order c l order)]] :let [[sales-order] @(order->sales-order c l order)]]
@@ -1085,22 +1044,13 @@
(println "DATE IS" (:sales-order/date sales-order)) (println "DATE IS" (:sales-order/date sales-order))
(when (some-> (:sales-order/date sales-order) coerce/to-date-time (time/after? #clj-time/date-time "2026-2-16T00:00:00-08:00")) (when (some-> (:sales-order/date sales-order) coerce/to-date-time (time/after? #clj-time/date-time "2026-2-16T00:00:00-08:00"))
(println "WOULD UPDATE" sales-order) (println "WOULD UPDATE" sales-order)
@(dc/transact auto-ap.datomic/conn [sales-order]) @(dc/transact auto-ap.datomic/conn [sales-order]))
)
#_@(dc/transact) #_@(dc/transact)
(println "DONE")) (println "DONE")))
)
#_(filter (comp #{"OTHER"} :type) (mapcat :tenders z)) #_(filter (comp #{"OTHER"} :type) (mapcat :tenders z))
@(let [[c [l]] (get-square-client-and-location "NGRY")] @(let [[c [l]] (get-square-client-and-location "NGRY")]
#_(search c l (clj-time.coerce/from-date #inst "2025-02-28") (clj-time.coerce/from-date #inst "2025-03-01")) #_(search c l (clj-time.coerce/from-date #inst "2025-02-28") (clj-time.coerce/from-date #inst "2025-03-01"))
(order->sales-order c l (:order (get-order c l "KdvwntmfMNTKBu8NOocbxatOs18YY" ))) (order->sales-order c l (:order (get-order c l "KdvwntmfMNTKBu8NOocbxatOs18YY")))))
)
)

View File

@@ -35,9 +35,8 @@
tx-instant))) tx-instant)))
(group-by (fn hours-ago [d] (group-by (fn hours-ago [d]
(time/in-hours (time/interval (coerce/to-date-time d) (time/now))) (time/in-hours (time/interval (coerce/to-date-time d) (time/now))))))]
))
)]
(for [h (range 24)] (for [h (range 24)]
(count (tx-lookup h []))))) (count (tx-lookup h [])))))
@@ -59,8 +58,7 @@
[:div [:div
[:div {:class "w-full h-64" [:div {:class "w-full h-64"
:id "client-chart" :id "client-chart"
:data-chart (hx/json { :data-chart (hx/json {:labels ["2 years ago" "1 year ago" "today"],
:labels ["2 years ago" "1 year ago" "today"],
:series [(for [n [2 1 0] :series [(for [n [2 1 0]
:let [start (time/plus (time/now) (time/years (- n)))]] :let [start (time/plus (time/now) (time/years (- n)))]]
(->> (dc/q '[:find (count ?c) (->> (dc/q '[:find (count ?c)
@@ -80,19 +78,14 @@
[:div [:div
[:div {:class "w-full h-64" [:div {:class "w-full h-64"
:id "changes" :id "changes"
:data-chart (hx/json { :data-chart (hx/json {:labels (for [n (range -24 0)]
:labels (for [n (range -24 0)]
(format "%d" n)), (format "%d" n)),
:series [(hourly-changes)]})}] :series [(hourly-changes)]})}]
[:script {:lang "javascript"} [:script {:lang "javascript"}
(hiccup/raw (hiccup/raw
"new Chartist.Line('#changes', JSON.parse(document.getElementById('changes').getAttribute('data-chart')))")]]]])] "new Chartist.Line('#changes', JSON.parse(document.getElementById('changes').getAttribute('data-chart')))")]]]])])
) "Admin"))
"Admin")
)
(def key->handler (def key->handler
{ {:auto-ap.routes.admin/page (wrap-client-redirect-unauthenticated (wrap-admin page))})
:auto-ap.routes.admin/page (wrap-client-redirect-unauthenticated (wrap-admin page))
})

View File

@@ -213,8 +213,7 @@
(map (fn [client] (map (fn [client]
(format "'%s'" (pull-attr (dc/db conn) (format "'%s'" (pull-attr (dc/db conn)
:client/name :client/name
(-> client))) (-> client)))) %)))
) %)))
:form-params form-params)) ;; TODO shouldnt need to bubble this through. See if we can eliminate the passing of form and last-form. :form-params form-params)) ;; TODO shouldnt need to bubble this through. See if we can eliminate the passing of form and last-form.
) )
{:keys [tempids]} (audit-transact [[:upsert-entity (cond-> entity {:keys [tempids]} (audit-transact [[:upsert-entity (cond-> entity
@@ -279,8 +278,7 @@
(fc/start-form form-params form-errors (fc/start-form form-params form-errors
[:div {:x-data (hx/json {"accountName" (or (:account/name form-params) (:account/numeric-code entity)) [:div {:x-data (hx/json {"accountName" (or (:account/name form-params) (:account/numeric-code entity))
"accountCode" (or (:account/numeric-code form-params) (:account/numeric-code entity))}) "accountCode" (or (:account/numeric-code form-params) (:account/numeric-code entity))})
:hx-target "this" :hx-target "this"}
}
(com/modal (com/modal
{} {}
[:form (-> {:hx-ext "response-targets" [:form (-> {:hx-ext "response-targets"
@@ -416,9 +414,6 @@
{}) {})
:form-errors form-errors}))) :form-errors form-errors})))
(def key->handler (def key->handler
(apply-middleware-to-all-handlers (apply-middleware-to-all-handlers
(->> (->>

View File

@@ -36,7 +36,6 @@
(sort-by :created-at) (sort-by :created-at)
reverse)) reverse))
(defn is-background-job? (defn is-background-job?
"This function checks whether a given task is a background job. "This function checks whether a given task is a background job.
It does this by checking the environment of the task's container definitions for an environment variable It does this by checking the environment of the task's container definitions for an environment variable
@@ -107,8 +106,7 @@
:entity-name "Job" :entity-name "Job"
:query-schema query-schema :query-schema query-schema
:route :admin-job-table :route :admin-job-table
:headers [ :headers [{:key "start"
{:key "start"
:name "Start" :name "Start"
:render #(some-> % :start-date (atime/unparse-local atime/standard-time))} :render #(some-> % :start-date (atime/unparse-local atime/standard-time))}
{:key "end" {:key "end"
@@ -176,8 +174,7 @@
:name (fc/field-name) :name (fc/field-name)
:value (fc/field-value)})]))] :value (fc/field-value)})]))]
(= "register-invoice-import" name) (= "register-invoice-import" name)
[ [(fc/with-field :invoice-url
(fc/with-field :invoice-url
(com/validated-field {:label "Url" (com/validated-field {:label "Url"
:errors (fc/field-errors)} :errors (fc/field-errors)}
[:div.flex.place-items-center.gap-2 [:div.flex.place-items-center.gap-2
@@ -186,8 +183,7 @@
:name (fc/field-name) :name (fc/field-name)
:value (fc/field-value)})]))] :value (fc/field-value)})]))]
(= "load-historical-sales" name) (= "load-historical-sales" name)
[ [(fc/with-field :client
(fc/with-field :client
(com/validated-field {:label "Client" (com/validated-field {:label "Client"
:errors (fc/field-errors)} :errors (fc/field-errors)}
(com/typeahead {:name (fc/field-name) (com/typeahead {:name (fc/field-name)
@@ -201,10 +197,7 @@
(com/text-input {:placeholder "60" (com/text-input {:placeholder "60"
:name (fc/field-name) :name (fc/field-name)
:value (fc/field-value)})))] :value (fc/field-value)})))]
:else nil)) :else nil)))
)
(defn subform [{{:keys [name]} :query-params}] (defn subform [{{:keys [name]} :query-params}]
(html-response (html-response
@@ -256,8 +249,7 @@
[:ledger-url {:optional true} [:string {:min 1}]] [:ledger-url {:optional true} [:string {:min 1}]]
[:invoice-url {:optional true} [:string {:min 1}]] [:invoice-url {:optional true} [:string {:min 1}]]
[:client {:optional true} entity-id] [:client {:optional true} entity-id]
[:days {:optional true} [:int {:min 1 :max 120}]] [:days {:optional true} [:int {:min 1 :max 120}]]]))
]))
(def key->handler (def key->handler
(apply-middleware-to-all-handlers (apply-middleware-to-all-handlers

View File

@@ -47,7 +47,6 @@
(:import (:import
[java.util UUID])) [java.util UUID]))
;; TODO make more reusable malli schemas, use unions if it would be helpful ;; TODO make more reusable malli schemas, use unions if it would be helpful
;; TODO copy save logic from graphql version ;; TODO copy save logic from graphql version
;; TODO cash drawer shift ;; TODO cash drawer shift
@@ -67,8 +66,6 @@
[:enum [:enum
"" "all" "only-mine"]]]]])) "" "all" "only-mine"]]]]]))
(defn filters [request] (defn filters [request]
[:form {"hx-trigger" "change delay:500ms, keyup changed from:.hot-filter delay:1000ms" [:form {"hx-trigger" "change delay:500ms, keyup changed from:.hot-filter delay:1000ms"
"hx-get" (bidi/path-for ssr-routes/only-routes "hx-get" (bidi/path-for ssr-routes/only-routes
@@ -178,7 +175,6 @@
:where ['[?e :client/groups ?g]]} :where ['[?e :client/groups ?g]]}
:args [(clojure.string/upper-case (:group query-params))]}) :args [(clojure.string/upper-case (:group query-params))]})
(not (str/blank? (some-> query-params :code))) (not (str/blank? (some-> query-params :code)))
(merge-query {:query {:in ['?code] (merge-query {:query {:in ['?code]
:where ['[?e :client/code ?code]]} :where ['[?e :client/code ?code]]}
@@ -293,8 +289,6 @@
(def row* (partial helper/row* grid-page)) (def row* (partial helper/row* grid-page))
(def bank-account-schema [:and [:map (def bank-account-schema [:and [:map
[:db/id [:or entity-id temp-id]] [:db/id [:or entity-id temp-id]]
[:bank-account/name :string] [:bank-account/name :string]
@@ -443,10 +437,6 @@
[:client/week-b-credits {:optional true} [:maybe :double]] [:client/week-b-credits {:optional true} [:maybe :double]]
[:client/week-b-debits {:optional true} [:maybe :double]]])) [:client/week-b-debits {:optional true} [:maybe :double]]]))
(defn email-contact-row [email-contact-cursor] (defn email-contact-row [email-contact-cursor]
(com/data-grid-row (com/data-grid-row
(-> {:x-data (hx/json {:show (boolean (not (fc/field-value (:new? email-contact-cursor))))}) (-> {:x-data (hx/json {:show (boolean (not (fc/field-value (:new? email-contact-cursor))))})
@@ -526,12 +516,10 @@
(com/data-grid-cell {:class "align-top"} (com/data-grid-cell {:class "align-top"}
(com/a-icon-button {"@click.prevent.stop" "$refs.p.remove()"} svg/x)))) (com/a-icon-button {"@click.prevent.stop" "$refs.p.remove()"} svg/x))))
(defn- dialog-header [step] (defn- dialog-header [step]
[:div.flex [:div.p-2 (mm/step-name step)] [:p.ml-2.rounded.bg-gray-50.p-2.dark:bg-gray-600 [:div.flex [:div.p-2 (mm/step-name step)] [:p.ml-2.rounded.bg-gray-50.p-2.dark:bg-gray-600
[:span {:x-text "clientName"}]]]) [:span {:x-text "clientName"}]]])
(defrecord InfoModal [linear-wizard] (defrecord InfoModal [linear-wizard]
mm/ModalWizardStep mm/ModalWizardStep
(step-name [_] (step-name [_]
@@ -598,7 +586,6 @@
(mm/default-step-footer linear-wizard this :validation-route ::route/navigate) (mm/default-step-footer linear-wizard this :validation-route ::route/navigate)
:validation-route ::route/navigate))) :validation-route ::route/navigate)))
(defn match-row [_] (defn match-row [_]
(com/data-grid-row (com/data-grid-row
{:x-ref "p" {:x-ref "p"
@@ -644,8 +631,6 @@
(com/data-grid-cell {:class "align-top"} (com/data-grid-cell {:class "align-top"}
(com/a-icon-button {"@click.prevent.stop" "show=false; setTimeout(() => $refs.p.remove(), 500)"} svg/x)))) (com/a-icon-button {"@click.prevent.stop" "show=false; setTimeout(() => $refs.p.remove(), 500)"} svg/x))))
(defrecord MatchesModal [linear-wizard] (defrecord MatchesModal [linear-wizard]
mm/ModalWizardStep mm/ModalWizardStep
(step-name [_] (step-name [_]
@@ -699,7 +684,6 @@
(step-key [_] (step-key [_]
:contact) :contact)
(edit-path [_ _] (edit-path [_ _]
[]) [])
@@ -798,7 +782,6 @@
:to (mm/encode-step-key [:bank-account (fc/field-value (:db/id bank-account))])})} :to (mm/encode-step-key [:bank-account (fc/field-value (:db/id bank-account))])})}
svg/pencil)]])]) svg/pencil)]])])
(defmulti bank-account-card (comp deref :bank-account/type)) (defmulti bank-account-card (comp deref :bank-account/type))
(defmethod bank-account-card :bank-account-type/cash [bank-account] (defmethod bank-account-card :bank-account-type/cash [bank-account]
(bank-account-card-base {:bg-color "bg-green-50" (bank-account-card-base {:bg-color "bg-green-50"
@@ -821,7 +804,6 @@
:icon svg/check :icon svg/check
:bank-account bank-account})) :bank-account bank-account}))
(defmulti bank-account-form (comp deref :bank-account/type)) (defmulti bank-account-form (comp deref :bank-account/type))
(defmethod bank-account-form :bank-account-type/cash [bank-account] (defmethod bank-account-form :bank-account-type/cash [bank-account]
[:div [:div
@@ -904,8 +886,6 @@
:checked (fc/field-value)} :checked (fc/field-value)}
"Visible for payment"))]]) "Visible for payment"))]])
(defn- plaid-account-select [client-id] (defn- plaid-account-select [client-id]
(fc/with-field :bank-account/plaid-account (fc/with-field :bank-account/plaid-account
(com/validated-field {:errors (fc/field-errors) (com/validated-field {:errors (fc/field-errors)
@@ -1048,7 +1028,6 @@
[:div#days-indicator [:div#days-indicator
(i/days-ago* (some-> (fc/field-value)))]]) (i/days-ago* (some-> (fc/field-value)))]])
(fc/with-field :bank-account/include-in-reports (fc/with-field :bank-account/include-in-reports
(com/checkbox {:name (fc/field-name) (com/checkbox {:name (fc/field-name)
:value (boolean (fc/field-value)) :value (boolean (fc/field-value))
@@ -1224,8 +1203,6 @@
(yodlee-account-select (:db/id (:snapshot fc/*form-data*))) (yodlee-account-select (:db/id (:snapshot fc/*form-data*)))
(intuit-account-select (:db/id (:snapshot fc/*form-data*)))]) (intuit-account-select (:db/id (:snapshot fc/*form-data*)))])
(defn new-bank-account-card [] (defn new-bank-account-card []
[:div {:class "w-[30em]"} [:div {:class "w-[30em]"}
(com/card {:class "w-full border-dotted bg-gray-50"} (com/card {:class "w-full border-dotted bg-gray-50"}
@@ -1255,7 +1232,6 @@
(edit-path [_ _] []) (edit-path [_ _] [])
(step-schema [_] (step-schema [_]
(mut/select-keys (mm/form-schema linear-wizard) #{})) (mut/select-keys (mm/form-schema linear-wizard) #{}))
@@ -1284,7 +1260,6 @@
:validation-route ::route/navigate)] :validation-route ::route/navigate)]
:validation-route ::route/navigate))) :validation-route ::route/navigate)))
(defn square-location-table [] (defn square-location-table []
[:div#square-locations [:div#square-locations
[:div.htmx-indicator [:div.htmx-indicator
@@ -1447,8 +1422,6 @@
(filterv #(not= (get-in multi-form-state [:step-params :db/id]) (:db/id %)) bank-accounts))) (filterv #(not= (get-in multi-form-state [:step-params :db/id]) (:db/id %)) bank-accounts)))
(mm/select-state [] nil)))) (mm/select-state [] nil))))
(defrecord CashFlowModal [linear-wizard] (defrecord CashFlowModal [linear-wizard]
mm/ModalWizardStep mm/ModalWizardStep
(step-name [_] (step-name [_]
@@ -1663,7 +1636,6 @@
#(mm/select-state % [] {}) #(mm/select-state % [] {})
#(assoc-in % [:snapshot :client/bank-accounts] new-bank-accounts))))))) #(assoc-in % [:snapshot :client/bank-accounts] new-bank-accounts)))))))
(def sales-summary-query (def sales-summary-query
"[:find ?d4 (sum ?total) (sum ?tax) (sum ?tip) (sum ?service-charge) (sum ?discount) (sum ?returns) "[:find ?d4 (sum ?total) (sum ?tax) (sum ?tip) (sum ?service-charge) (sum ?discount) (sum ?returns)
:with ?s :with ?s
@@ -1792,9 +1764,6 @@
[?cds :cash-drawer-shift/opened-cash ?opened-cash] [?cds :cash-drawer-shift/opened-cash ?opened-cash]
[(iol-ion.query/excel-date ?date) ?d4]]") [(iol-ion.query/excel-date ?date) ?d4]]")
(defn setup-sales-queries-impl [client-id] (defn setup-sales-queries-impl [client-id]
(let [{client-code :client/code feature-flags :client/feature-flags} (dc/pull (dc/db conn) '[:client/code :client/feature-flags] client-id) (let [{client-code :client/code feature-flags :client/feature-flags} (dc/pull (dc/db conn) '[:client/code :client/feature-flags] client-id)
is-new-square? ((set feature-flags) "new-square")] is-new-square? ((set feature-flags) "new-square")]
@@ -1840,7 +1809,6 @@
(cheshire/generate-string (format (slurp (io/resource which)) url)))} (cheshire/generate-string (format (slurp (io/resource which)) url)))}
children)) children))
(defn biweekly-sales-powerquery [request] (defn biweekly-sales-powerquery [request]
(setup-sales-queries-impl (:db/id (:route-params request))) (setup-sales-queries-impl (:db/id (:route-params request)))
(modal-response (modal-response
@@ -1872,7 +1840,6 @@
(com/modal-footer {} [:div]))))) (com/modal-footer {} [:div])))))
(def key->handler (def key->handler
(apply-middleware-to-all-handlers (apply-middleware-to-all-handlers
{::route/page (helper/page-route grid-page) {::route/page (helper/page-route grid-page)

View File

@@ -38,7 +38,6 @@
invoice) invoice)
(defn reset-id [i] (defn reset-id [i]
(update i :invoice-number (update i :invoice-number
(fn [n] (if (re-matches #"#+" n) (fn [n] (if (re-matches #"#+" n)
@@ -85,7 +84,6 @@
(get (by (comp :db/id :vendor-schedule-payment-dom/client) :vendor-schedule-payment-dom/dom (:vendor/schedule-payment-dom vendor)) (get (by (comp :db/id :vendor-schedule-payment-dom/client) :vendor-schedule-payment-dom/dom (:vendor/schedule-payment-dom vendor))
client-id)) client-id))
(defn invoice-rows->transaction [rows user] (defn invoice-rows->transaction [rows user]
(->> rows (->> rows
(mapcat (fn [{:keys [vendor-id total client-id date invoice-number default-location check automatically-paid-when-due account-id]}] (mapcat (fn [{:keys [vendor-id total client-id date invoice-number default-location check automatically-paid-when-due account-id]}]
@@ -121,8 +119,7 @@
(let [[[bank-account]] (seq (dc/q '[:find ?ba (let [[[bank-account]] (seq (dc/q '[:find ?ba
:in $ ?c :in $ ?c
:where [?c :client/bank-accounts ?ba] :where [?c :client/bank-accounts ?ba]
[?ba :bank-account/type :bank-account-type/cash] [?ba :bank-account/type :bank-account-type/cash]]
]
(dc/db conn) (dc/db conn)
client-id))] client-id))]
[:upsert-transaction #:transaction {:amount (- (:invoice/total invoice)) [:upsert-transaction #:transaction {:amount (- (:invoice/total invoice))
@@ -140,8 +137,7 @@
:accounts [{:db/id (str #_{:clj-kondo/ignore [:unresolved-var]} (digest/sha-256 transaction-id) "-account") :accounts [{:db/id (str #_{:clj-kondo/ignore [:unresolved-var]} (digest/sha-256 transaction-id) "-account")
:transaction-account/account (:db/id (a/get-account-by-numeric-code-and-sets 21000 ["default"])) :transaction-account/account (:db/id (a/get-account-by-numeric-code-and-sets 21000 ["default"]))
:transaction-account/location "A" :transaction-account/location "A"
:transaction-account/amount (Math/abs (:invoice/total invoice))}]}])) :transaction-account/amount (Math/abs (:invoice/total invoice))}]}]))]
]
[[:propose-invoice (d-invoices/code-invoice (validate-invoice (remove-nils invoice)) [[:propose-invoice (d-invoices/code-invoice (validate-invoice (remove-nils invoice))
account-id)] account-id)]
(some-> payment remove-nils) (some-> payment remove-nils)
@@ -158,8 +154,7 @@
(dc/q '[:find ?n ?v (dc/q '[:find ?n ?v
:in $ [?n ...] :in $ [?n ...]
:where [?v :vendor/name ?n]] :where [?v :vendor/name ?n]]
(dc/db conn) (dc/db conn))
)
(into {})) (into {}))
all-clients (merge (into {} (dc/q '[:find ?n (pull ?v [:db/id :client/locations]) all-clients (merge (into {} (dc/q '[:find ?n (pull ?v [:db/id :client/locations])
:in $ :in $
@@ -226,8 +221,7 @@
(com/validated-field {:label "Tab-separated invoices" (com/validated-field {:label "Tab-separated invoices"
:errors (fc/field-errors)} :errors (fc/field-errors)}
[:textarea {:class (hh/add-class "w-full h-96" inputs/default-input-classes) :placeholder (hiccup/raw sample) [:textarea {:class (hh/add-class "w-full h-96" inputs/default-input-classes) :placeholder (hiccup/raw sample)
:name (fc/field-name) :name (fc/field-name)}
}
(fc/field-value)])) (fc/field-value)]))
(com/form-errors {:errors (:errors fc/*form-errors*)}) (com/form-errors {:errors (:errors fc/*form-errors*)})
(com/validated-save-button {:color :primary (com/validated-save-button {:color :primary
@@ -309,8 +303,7 @@
::route/import (-> import ::route/import (-> import
(wrap-schema-enforce :form-schema [:map [:tsv :string]]) (wrap-schema-enforce :form-schema [:map [:tsv :string]])
(wrap-nested-form-params) (wrap-nested-form-params)
(wrap-form-4xx-2 form)) (wrap-form-4xx-2 form))})
})
(fn [h] (fn [h]
(-> h (-> h
(wrap-admin) (wrap-admin)

View File

@@ -59,7 +59,6 @@
:else :else
(pr-str v))) (pr-str v)))
(defn inspect [{{:keys [entity-id]} :params :as request}] (defn inspect [{{:keys [entity-id]} :params :as request}]
(alog/info ::inspect (alog/info ::inspect
:request request) :request request)
@@ -187,6 +186,5 @@
(if entity-id (if entity-id
(result-table {:entity-id entity-id}) (result-table {:entity-id entity-id})
[:div#history-table]) [:div#history-table])
[:div#inspector] [:div#inspector]])
])
"History"))) "History")))

View File

@@ -288,10 +288,6 @@
[:transaction-rule/bank-account] [:transaction-rule/bank-account]
:form-params form-params))) :form-params form-params)))
(def transaction-read '[{:transaction/client [:client/name] (def transaction-read '[{:transaction/client [:client/name]
:transaction/bank-account [:bank-account/name]} :transaction/bank-account [:bank-account/name]}
:transaction/description-original :transaction/description-original
@@ -369,8 +365,6 @@
'[(>= ?dom ?dom-gte)]]} '[(>= ?dom ?dom-gte)]]}
:args [dom-gte]}) :args [dom-gte]})
true true
(merge-query {:query {:where ['[?e :transaction/id]]}})) (merge-query {:query {:where ['[?e :transaction/id]]}}))
results (->> results (->>
@@ -505,7 +499,6 @@
(com/data-grid-cell {:class "align-top"} (com/data-grid-cell {:class "align-top"}
(com/a-icon-button {"@click.prevent.stop" "show=false; setTimeout(() => $refs.p.remove(), 500)"} svg/x)))) (com/a-icon-button {"@click.prevent.stop" "show=false; setTimeout(() => $refs.p.remove(), 500)"} svg/x))))
(defn all-ids-not-locked [all-ids] (defn all-ids-not-locked [all-ids]
(->> all-ids (->> all-ids
(dc/q '[:find ?t (dc/q '[:find ?t

View File

@@ -203,8 +203,6 @@
(def row* (partial helper/row* grid-page)) (def row* (partial helper/row* grid-page))
(def table* (partial helper/table* grid-page)) (def table* (partial helper/table* grid-page))
(defn merge-submit [{:keys [form-params request-method identity] :as request}] (defn merge-submit [{:keys [form-params request-method identity] :as request}]
(if (= (:source-vendor form-params) (if (= (:source-vendor form-params)
(:target-vendor form-params)) (:target-vendor form-params))
@@ -245,7 +243,6 @@
(= i (dec (count steps))) (assoc :last? true)) (= i (dec (count steps))) (assoc :last? true))
n))))) n)))))
;; TODO add plaid merchant ;; TODO add plaid merchant
;; TODO each client only used once ;; TODO each client only used once
@@ -285,7 +282,6 @@
(com/data-grid-cell {:class "align-top"} (com/data-grid-cell {:class "align-top"}
(com/a-icon-button {"@click.prevent.stop" "show=false; setTimeout(() => $refs.p.remove(), 500)"} svg/x))))) (com/a-icon-button {"@click.prevent.stop" "show=false; setTimeout(() => $refs.p.remove(), 500)"} svg/x)))))
(defn automatically-paid-when-due-row [terms-override-cursor] (defn automatically-paid-when-due-row [terms-override-cursor]
(com/data-grid-row (com/data-grid-row
(-> {:x-data (hx/json {:show (boolean (not (fc/field-value (:new? terms-override-cursor))))}) (-> {:x-data (hx/json {:show (boolean (not (fc/field-value (:new? terms-override-cursor))))})
@@ -303,15 +299,12 @@
:value (fc/field-value) :value (fc/field-value)
:value-fn :db/id :value-fn :db/id
:content-fn #(pull-attr (dc/db conn) :client/name (:db/id %)) :content-fn #(pull-attr (dc/db conn) :client/name (:db/id %))
:size :small}))) :size :small})))
(com/data-grid-cell {:class "align-top"} (com/data-grid-cell {:class "align-top"}
(com/a-icon-button {"@click.prevent.stop" "show=false; setTimeout(() => $refs.p.remove(), 500)"} svg/x))))) (com/a-icon-button {"@click.prevent.stop" "show=false; setTimeout(() => $refs.p.remove(), 500)"} svg/x)))))
(defn- account-typeahead* (defn- account-typeahead*
[{:keys [name value client-id x-model]}] [{:keys [name value client-id x-model]}]
[:div.flex.flex-col [:div.flex.flex-col
@@ -370,12 +363,6 @@
(com/data-grid-cell {:class "align-top"} (com/data-grid-cell {:class "align-top"}
(com/a-icon-button {"@click.prevent.stop" "show=false; setTimeout(() => $refs.p.remove(), 500)"} svg/x)))))) (com/a-icon-button {"@click.prevent.stop" "show=false; setTimeout(() => $refs.p.remove(), 500)"} svg/x))))))
(defn dialog* [{:keys [entity form-params form-errors] :as params}] (defn dialog* [{:keys [entity form-params form-errors] :as params}]
(alog/peek ::dialog-entity form-params) (alog/peek ::dialog-entity form-params)
(fc/start-form form-params form-errors (fc/start-form form-params form-errors
@@ -868,7 +855,6 @@
(def vendor-wizard (->VendorWizard :info)) (def vendor-wizard (->VendorWizard :info))
(def key->handler (def key->handler
(apply-middleware-to-all-handlers (apply-middleware-to-all-handlers
(->> (->>

View File

@@ -14,7 +14,6 @@
:headers {"Location" "/login"} :headers {"Location" "/login"}
:session {}}) :session {}})
(defn impersonate [request] (defn impersonate [request]
{:status 200 {:status 200
:session {:identity (dissoc (jwt/unsign (get-in request [:query-params "jwt"]) :session {:identity (dissoc (jwt/unsign (get-in request [:query-params "jwt"])
@@ -45,8 +44,7 @@
:errorDetails "" :errorDetails ""
:showNotification false :showNotification false
:notificationDetails ""}) :notificationDetails ""})
"@htmx:response-error.camel" "errorDetails = $event.detail.xhr.response; showError=true;" "@htmx:response-error.camel" "errorDetails = $event.detail.xhr.response; showError=true;"}
}
[:div#app-contents.flex.overflow-hidden [:div#app-contents.flex.overflow-hidden
[:div#main-content {:class "relative w-full h-full overflow-y-auto px-4 bg-gray-100 dark:bg-gray-900 min-h-content "} [:div#main-content {:class "relative w-full h-full overflow-y-auto px-4 bg-gray-100 dark:bg-gray-900 min-h-content "}
[:div#notification-holder [:div#notification-holder
@@ -96,8 +94,7 @@
[:img {:src "/img/logo-big.png"}] [:img {:src "/img/logo-big.png"}]
[:div [:div
[:a.button.is-large.is-primary {:href (login-url (get (:query-params request) "redirect-to"))} "Login with Google"]] [:a.button.is-large.is-primary {:href (login-url (get (:query-params request) "redirect-to"))} "Login with Google"]]
"HELLO"]) "HELLO"])]]]])
]]] ])
(defn login [request] (defn login [request]
(base-page (base-page

View File

@@ -2,7 +2,6 @@
(:require [auto-ap.ssr.form-cursor :as fc] (:require [auto-ap.ssr.form-cursor :as fc]
[auto-ap.ssr.utils :refer [html-response wrap-schema-enforce]])) [auto-ap.ssr.utils :refer [html-response wrap-schema-enforce]]))
(defn add-new-entity-handler (defn add-new-entity-handler
([path render-fn] (add-new-entity-handler path ([path render-fn] (add-new-entity-handler path
render-fn render-fn

View File

@@ -33,8 +33,7 @@
(com/content-card {:class " w-[748px]" (com/content-card {:class " w-[748px]"
:hx-target "this" :hx-target "this"
:hx-swap "outerHTML"} :hx-swap "outerHTML"}
[:div.col-span-1.p-4 {:class "p-4 sm:p-6 space-y-4 overflow-visible " [:div.col-span-1.p-4 {:class "p-4 sm:p-6 space-y-4 overflow-visible "}
}
[:h3 {:class "mb-4 text-xl font-semibold dark:text-white"} [:h3 {:class "mb-4 text-xl font-semibold dark:text-white"}
"Signature"] "Signature"]
[:div#signature-notification.notification.block {:style {:display "none"}}] [:div#signature-notification.notification.block {:style {:display "none"}}]
@@ -58,7 +57,6 @@
:x-show "existing && !editing"}]) :x-show "existing && !editing"}])
[:canvas.rounded.rounded-lg.border.border-gray-300 [:canvas.rounded.rounded-lg.border.border-gray-300
{:style {:width 696 {:style {:width 696
:height 261} :height 261}
:x-init "signature= new SignaturePad($el); signature.off()" :x-init "signature= new SignaturePad($el); signature.off()"
@@ -67,7 +65,6 @@
:height 261 :height 261
:x-show "existing ? editing: true"}]] :x-show "existing ? editing: true"}]]
[:div.flex.gap-2.justify-end [:div.flex.gap-2.justify-end
(com/button {:color :primary (com/button {:color :primary
:x-show "!editing" :x-show "!editing"
@@ -92,8 +89,7 @@
#_#_:hx-target "#signature-notification" #_#_:hx-target "#signature-notification"
:hx-swap "outerHTML" :hx-swap "outerHTML"
:id "upload" :id "upload"
:hx-trigger "z" :hx-trigger "z"}
}
[:div.htmx-indicator [:div.htmx-indicator
[:div.bg-gray-100.flex.items-center.text-green-500.justify-center.rounded.rounded-lg.border.border-gray-400 {:style {:width "696px" :height "261px"}} [:div.bg-gray-100.flex.items-center.text-green-500.justify-center.rounded.rounded-lg.border.border-gray-400 {:style {:width "696px" :height "261px"}}
(svg/spinner {:class "w-4 h-4 text-primary-300"}) (svg/spinner {:class "w-4 h-4 text-primary-300"})
@@ -111,8 +107,6 @@
'text-green-700': hovering 'text-green-700': hovering
}"} }"}
[:input {:type "file" [:input {:type "file"
:name "file" :name "file"
:class "absolute inset-0 m-0 p-0 w-full h-full outline-none opacity-0", :class "absolute inset-0 m-0 p-0 w-full h-full outline-none opacity-0",
@@ -126,7 +120,6 @@
[:template {:x-for "f in files"} [:template {:x-for "f in files"}
[:li (com/pill {:color :primary :x-text "f.name"})]]]] [:li (com/pill {:color :primary :x-text "f.name"})]]]]
[:div.htmx-indicator-hidden "Drop a signature file (696x261 pixels jpeg) here."]]]]]]]))) [:div.htmx-indicator-hidden "Drop a signature file (696x261 pixels jpeg) here."]]]]]]])))
(defn upload-signature-data [{{:strs [signatureData]} :form-params client :client :as request}] (defn upload-signature-data [{{:strs [signatureData]} :form-params client :client :as request}]
@@ -276,7 +269,6 @@
(def search (wrap-json-response search)) (def search (wrap-json-response search))
(defn bank-account-search [{:keys [route-params query-params clients]}] (defn bank-account-search [{:keys [route-params query-params clients]}]
(let [valid-client-ids (set (map :db/id clients)) (let [valid-client-ids (set (map :db/id clients))
selected-client-id (Long/parseLong (get route-params :db/id)) selected-client-id (Long/parseLong (get route-params :db/id))

View File

@@ -129,8 +129,7 @@
(com/pill (com/pill
{:class "text-xs font-medium" {:class "text-xs font-medium"
:color :primary} :color :primary}
(str/capitalize t99-type)) (str/capitalize t99-type)))])}
)])}
{:key "tin" {:key "tin"
:name "TIN" :name "TIN"
:sort-key "tin" :sort-key "tin"
@@ -143,8 +142,7 @@
(when-let [tin-type (some-> vendor :vendor/legal-entity-tin-type :db/ident name)] (when-let [tin-type (some-> vendor :vendor/legal-entity-tin-type :db/ident name)]
(com/pill {:class "text-xs font-medium" (com/pill {:class "text-xs font-medium"
:color :yellow} :color :yellow}
(name tin-type)))] (name tin-type)))])}
)}
{:key "expense-account" {:key "expense-account"
:name "Expense Account" :name "Expense Account"
:show-starting "md" :show-starting "md"
@@ -176,8 +174,6 @@
:color :primary} :color :primary}
"Paid $" (Math/round paid)))}]})) "Paid $" (Math/round paid)))}]}))
(def table* (partial helper/table* grid-page)) (def table* (partial helper/table* grid-page))
(def row* (partial helper/row* grid-page)) (def row* (partial helper/row* grid-page))
@@ -185,7 +181,6 @@
{:keys [vendor-id]} :route-params {:keys [vendor-id]} :route-params
{:keys [client-id]} :query-params}] {:keys [client-id]} :query-params}]
(assert-can-see-client identity client-id) (assert-can-see-client identity client-id)
@(dc/transact conn [[:upsert-entity (-> form-params @(dc/transact conn [[:upsert-entity (-> form-params
@@ -203,15 +198,13 @@
(row* identity [(dc/pull (dc/db conn) [:db/id :client/code] client-id) (row* identity [(dc/pull (dc/db conn) [:db/id :client/code] client-id)
(dc/pull (dc/db conn) vendor-read vendor-id) (dc/pull (dc/db conn) vendor-read vendor-id)
(sum-for-client-vendor client-id vendor-id) (sum-for-client-vendor client-id vendor-id)] {:flash? true})
] {:flash? true})
:headers {"hx-trigger" "modalclose" :headers {"hx-trigger" "modalclose"
"hx-retarget" (format "#entity-table tr[data-id=\"%d\"]" vendor-id)})) "hx-retarget" (format "#entity-table tr[data-id=\"%d\"]" vendor-id)}))
(def default-vendor-read '[* {[:vendor/legal-entity-1099-type :xform iol-ion.query/ident] [:db/ident] (def default-vendor-read '[* {[:vendor/legal-entity-1099-type :xform iol-ion.query/ident] [:db/ident]
[:vendor/legal-entity-tin-type :xform iol-ion.query/ident] [:db/ident]}]) [:vendor/legal-entity-tin-type :xform iol-ion.query/ident] [:db/ident]}])
(def form-schema (mc/schema [:map (def form-schema (mc/schema [:map
[:vendor/address {:default {}} [:vendor/address {:default {}}
[:maybe [:maybe

View File

@@ -66,7 +66,6 @@
true (apply-sort-3 query-params) true (apply-sort-3 query-params)
true (apply-pagination query-params)))) true (apply-pagination query-params))))
(defn hydrate-results [ids db _] (defn hydrate-results [ids db _]
(let [results (pull-many-by-id db default-read ids)] (let [results (pull-many-by-id db default-read ids)]
(->> ids (->> ids
@@ -78,15 +77,12 @@
[(hydrate-results ids-to-retrieve db request) [(hydrate-results ids-to-retrieve db request)
matching-count])) matching-count]))
(defn plaid-link-script [token] (defn plaid-link-script [token]
(format "window.plaid = Plaid.create( (format "window.plaid = Plaid.create(
{ token: \"%s\", { token: \"%s\",
onSuccess: function (x) { htmx.trigger(\"#link-account\", \"linked\", {\"public_token\": x})} onSuccess: function (x) { htmx.trigger(\"#link-account\", \"linked\", {\"public_token\": x})}
})", token)) })", token))
(defn link [{{client-code "client_code" public-token "public_token"} :form-params (defn link [{{client-code "client_code" public-token "public_token"} :form-params
:keys [identity] :keys [identity]
:as request}] :as request}]
@@ -141,7 +137,6 @@
(com/button-icon {} svg/refresh) (com/button-icon {} svg/refresh)
"Start relink")]))) "Start relink")])))
(def grid-page (def grid-page
(helper/build (helper/build
{:id "plaid-table" {:id "plaid-table"
@@ -211,7 +206,6 @@
(when bad-integration (when bad-integration
" (detail)") " (detail)")
(when bad-integration (when bad-integration
[:template {:x-ref "tooltip"} [:template {:x-ref "tooltip"}
[:div.text-red-700 [:div.text-red-700
@@ -237,19 +231,16 @@
[:li [:svg.inline {:data-jdenticon-value (:db/id a) :width "24" :height "24"}] (:plaid-account/name a) " - " (:plaid-account/number a) " - updated " [:li [:svg.inline {:data-jdenticon-value (:db/id a) :width "24" :height "24"}] (:plaid-account/name a) " - " (:plaid-account/number a) " - updated "
(atime/unparse-local (:plaid-account/last-synced a) atime/normal-date)])])}]})) (atime/unparse-local (:plaid-account/last-synced a) atime/normal-date)])])}]}))
(def page (helper/page-route grid-page)) (def page (helper/page-route grid-page))
(def table (helper/table-route grid-page)) (def table (helper/table-route grid-page))
(def key->handler (def key->handler
(apply-middleware-to-all-handlers (apply-middleware-to-all-handlers
{ {:company-plaid page
:company-plaid page
:company-plaid-table table :company-plaid-table table
:company-plaid-link link :company-plaid-link link
:company-plaid-relink relink :company-plaid-relink relink}
}
(fn [h] (fn [h]
(-> h (-> h
(wrap-copy-qp-pqp) (wrap-copy-qp-pqp)

View File

@@ -32,8 +32,7 @@
[:maybe clj-date-schema]] [:maybe clj-date-schema]]
[:end-date {:optional true} [:end-date {:optional true}
[:maybe clj-date-schema]] [:maybe clj-date-schema]]
[:client {:optional true :default nil} [:maybe [:entity-map {:pull [:db/id :client/name]}]]] [:client {:optional true :default nil} [:maybe [:entity-map {:pull [:db/id :client/name]}]]]]
]
default-grid-fields-schema)])) default-grid-fields-schema)]))
(def default-read '[:db/id :report/client [:report/created :xform clj-time.coerce/from-date] :report/url :report/name :report/creator]) (def default-read '[:db/id :report/client [:report/created :xform clj-time.coerce/from-date] :report/url :report/name :report/creator])
@@ -45,13 +44,11 @@
:where '[[?e :report/client ?c]]} :where '[[?e :report/client ?c]]}
:args [db (:trimmed-clients request)]} :args [db (:trimmed-clients request)]}
(:sort query-params) (add-sorter-fields {"client" ['[?e :report/client ?c] (:sort query-params) (add-sorter-fields {"client" ['[?e :report/client ?c]
'[?c :client/name ?sort-client]] '[?c :client/name ?sort-client]]
"created" ['[?e :report/created ?sort-created]] "created" ['[?e :report/created ?sort-created]]
"creator" ['[?e :report/creator ?sort-creator]] "creator" ['[?e :report/creator ?sort-creator]]
"name" ['[?e :report/name ?sort-name] "name" ['[?e :report/name ?sort-name]]}
]}
query-params) query-params)
true true
@@ -147,7 +144,6 @@
{:flash? true {:flash? true
:delete-after-settle? true})))) :delete-after-settle? true}))))
(def key->handler (def key->handler
(apply-middleware-to-all-handlers (apply-middleware-to-all-handlers
(->> (->>

View File

@@ -66,8 +66,7 @@
[?e :invoice/total ?t] [?e :invoice/total ?t]
[?e :invoice/vendor ?v] [?e :invoice/vendor ?v]
[?v :vendor/name ?vn] [?v :vendor/name ?vn]
[?c :client/name ?cn] [?c :client/name ?cn]]}
]}
:args :args
[(dc/db conn) [(dc/db conn)
[(extract-client-ids (:clients request) [(extract-client-ids (:clients request)
@@ -86,7 +85,6 @@
end (time/minus starting (time/weeks (dec n)))]] end (time/minus starting (time/weeks (dec n)))]]
[(atime/as-local-time (coerce/to-date-time start)) (atime/as-local-time (coerce/to-date-time end))])))) [(atime/as-local-time (coerce/to-date-time start)) (atime/as-local-time (coerce/to-date-time end))]))))
(defn- best-week [d weeks] (defn- best-week [d weeks]
(reduce (reduce
(fn [acc [start end]] (fn [acc [start end]]
@@ -97,7 +95,6 @@
nil nil
weeks)) weeks))
(defn expense-breakdown-card* [request] (defn expense-breakdown-card* [request]
(com/card {:class "w-full h-full" :id "expense-breakdown-report"} (com/card {:class "w-full h-full" :id "expense-breakdown-report"}
[:div {:class "flex flex-col px-8 py-8 space-y-3 w-full h-full"} [:div {:class "flex flex-col px-8 py-8 space-y-3 w-full h-full"}
@@ -214,8 +211,7 @@
(let [data (lookup-invoice-total-data request) (let [data (lookup-invoice-total-data request)
companies (sort (set (map first data))) companies (sort (set (map first data)))
vendors (sort (set (map second data))) vendors (sort (set (map second data)))
result (by (juxt first second) last data) result (by (juxt first second) last data)]
]
(com/data-grid (com/data-grid
{:headers (into {:headers (into
[(com/data-grid-header {:class "sticky left-0 z-60 bg-gray-100"} "Vendor")] [(com/data-grid-header {:class "sticky left-0 z-60 bg-gray-100"} "Vendor")]

View File

@@ -67,7 +67,6 @@
(com/data-grid-cell {} (com/data-grid-cell {}
(format "$%,.2f" (:transaction/amount r))))))]]))))))]) (format "$%,.2f" (:transaction/amount r))))))]]))))))])
(defn reconciliation-card* [{:keys [request report]}] (defn reconciliation-card* [{:keys [request report]}]
(com/content-card {:class "w-full" :id "reconciliation-report"} (com/content-card {:class "w-full" :id "reconciliation-report"}
[:div {:class "flex flex-col px-8 py-8 space-y-3"} [:div {:class "flex flex-col px-8 py-8 space-y-3"}
@@ -100,8 +99,7 @@
(com/button {:color :primary :class "self-center w-24"} "Run")])] (com/button {:color :primary :class "self-center w-24"} "Run")])]
(if report (if report
(report* {:request request :report report}) (report* {:request request :report report})
[:div "Please choose a time range to run the report"]) [:div "Please choose a time range to run the report"])]]))
]]))
(defn page [request] (defn page [request]
(base-page (base-page

View File

@@ -46,7 +46,6 @@
'[?e :yodlee-provider-account/client ?xx]]} '[?e :yodlee-provider-account/client ?xx]]}
:args [db (:trimmed-clients request)]} :args [db (:trimmed-clients request)]}
(:sort query-params) (add-sorter-fields {"status" ['[?e :yodlee-provider-account/status ?sort-status]] (:sort query-params) (add-sorter-fields {"status" ['[?e :yodlee-provider-account/status ?sort-status]]
"client" ['[?e :yodlee-provider-account/client ?c] "client" ['[?e :yodlee-provider-account/client ?c]
'[?c :client/code ?sort-client]] '[?c :client/code ?sort-client]]
@@ -62,7 +61,6 @@
(apply-sort-3 query-params) (apply-sort-3 query-params)
(apply-pagination query-params)))) (apply-pagination query-params))))
(defn hydrate-results [ids db _] (defn hydrate-results [ids db _]
(let [results (->> (pull-many db default-read ids) (let [results (->> (pull-many db default-read ids)
(group-by :db/id))] (group-by :db/id))]
@@ -70,14 +68,12 @@
(map results) (map results)
(map first)))) (map first))))
(defn fetch-page [request] (defn fetch-page [request]
(let [db (dc/db conn) (let [db (dc/db conn)
{ids-to-retrieve :ids matching-count :count} (fetch-ids db request)] {ids-to-retrieve :ids matching-count :count} (fetch-ids db request)]
[(->> (hydrate-results ids-to-retrieve db request)) [(->> (hydrate-results ids-to-retrieve db request))
matching-count])) matching-count]))
(defn fastlink-dialog [{:keys [client]}] (defn fastlink-dialog [{:keys [client]}]
(modal-response (modal-response
(com/modal (com/modal
@@ -100,8 +96,7 @@ fastlink.open({fastLinkURL: '%s',
}}, }},
'fa-spot'); 'fa-spot');
" (:yodlee2-fastlink env) (yodlee/get-access-token (:client/code client))))] " (:yodlee2-fastlink env) (yodlee/get-access-token (:client/code client))))]]
]
[:div])))) [:div]))))
(defn reauthenticate [{:keys [form-params identity]}] (defn reauthenticate [{:keys [form-params identity]}]
@@ -168,8 +163,7 @@ fastlink.open({fastLinkURL: '%s',
(when-not (:client request) (when-not (:client request)
[:div.text-xs "Note: please select a specific customer to link a new account."])]]) [:div.text-xs "Note: please select a specific customer to link a new account."])]])
:row-buttons (fn [request _] :row-buttons (fn [request _]
[ [(com/button {:hx-put (bidi/path-for ssr-routes/only-routes
(com/button {:hx-put (bidi/path-for ssr-routes/only-routes
:company-yodlee-provider-account-reauthenticate) :company-yodlee-provider-account-reauthenticate)
:color :primary :color :primary
:hx-target "#modal-holder"} :hx-target "#modal-holder"}
@@ -230,14 +224,11 @@ fastlink.open({fastLinkURL: '%s',
provider-account provider-account
{:flash? true})))) {:flash? true}))))
(def key->handler (def key->handler
(apply-middleware-to-all-handlers (apply-middleware-to-all-handlers
{ {:company-yodlee page
:company-yodlee page
:company-yodlee-table table :company-yodlee-table table
:company-yodlee-fastlink-dialog fastlink-dialog :company-yodlee-fastlink-dialog fastlink-dialog}
}
(fn [h] (fn [h]
(-> h (-> h
(wrap-copy-qp-pqp) (wrap-copy-qp-pqp)

View File

@@ -15,7 +15,6 @@
[hiccup2.core :as hiccup] [hiccup2.core :as hiccup]
[iol-ion.query :refer [can-see-client?]])) [iol-ion.query :refer [can-see-client?]]))
(defn dropdown-search-results* [{:keys [options]}] (defn dropdown-search-results* [{:keys [options]}]
[:ul [:ul
(for [{:keys [id name group]} options] (for [{:keys [id name group]} options]
@@ -44,9 +43,6 @@
:hx-trigger "click"} :hx-trigger "click"}
name])]])]) name])]])])
(defn get-clients [identity query] (defn get-clients [identity query]
(let [raw-query (not-empty (strip-special query)) (let [raw-query (not-empty (strip-special query))
cleansed-query (not-empty (cleanse-query query)) cleansed-query (not-empty (cleanse-query query))

View File

@@ -83,7 +83,6 @@
[:div {:class "overflow-y-auto py-5 px-3 h-full bg-gray-50 border-r border-gray-200 dark:bg-gray-800 dark:border-gray-700"} [:div {:class "overflow-y-auto py-5 px-3 h-full bg-gray-50 border-r border-gray-200 dark:bg-gray-800 dark:border-gray-700"}
nav nav
(when page-specific (when page-specific
[:div {:class " pt-5 mt-5 space-y-2 border-t border-gray-200 dark:border-gray-700"} [:div {:class " pt-5 mt-5 space-y-2 border-t border-gray-200 dark:border-gray-700"}
page-specific])]]) page-specific])]])
@@ -147,7 +146,6 @@
:hx-boost "true"} :hx-boost "true"}
"Voided") "Voided")
(when (can? (:identity request) (when (can? (:identity request)
{:subject :invoice {:subject :invoice
:activity :import}) :activity :import})
@@ -156,7 +154,6 @@
:active? (= ::invoice-route/import-page (:matched-route request)) :active? (= ::invoice-route/import-page (:matched-route request))
:hx-boost "true"} "Import")) :hx-boost "true"} "Import"))
#_(when (can? (:identity request) #_(when (can? (:identity request)
{:subject :invoice {:subject :invoice
:activity :import}) :activity :import})
@@ -168,7 +165,6 @@
"Glimpse" "Glimpse"
(tags/pill- {:color :secondary} "Beta")])) (tags/pill- {:color :secondary} "Beta")]))
(when (can? (:identity request) (when (can? (:identity request)
{:subject :ar-invoice {:subject :ar-invoice
:activity :read}) :activity :read})
@@ -288,7 +284,6 @@
(menu-button- {:href (bidi/path-for ssr-routes/only-routes (menu-button- {:href (bidi/path-for ssr-routes/only-routes
:transaction-insights)} "Insights")))] :transaction-insights)} "Insights")))]
(when (can? (:identity request) (when (can? (:identity request)
{:subject :ledger-page}) {:subject :ledger-page})
(list (list
@@ -339,7 +334,6 @@
"Balance Sheet" "Balance Sheet"
(tags/pill- {:color :secondary} "WIP")]) (tags/pill- {:color :secondary} "WIP")])
(menu-button- {:href (hu/url (bidi/path-for ssr-routes/only-routes (menu-button- {:href (hu/url (bidi/path-for ssr-routes/only-routes
::ledger-routes/external-import-page) ::ledger-routes/external-import-page)
{:date-range "month"}) {:date-range "month"})
@@ -349,7 +343,6 @@
"External Import" "External Import"
(tags/pill- {:color :secondary} "WIP")]))))])) (tags/pill- {:color :secondary} "WIP")]))))]))
(defn company-aside-nav- [request] (defn company-aside-nav- [request]
[:ul {:class "space-y-2" :hx-boost "true"} [:ul {:class "space-y-2" :hx-boost "true"}
[:li [:li
@@ -465,7 +458,6 @@
:hx-boost true} :hx-boost true}
"Background Jobs")] "Background Jobs")]
(menu-button- {:icon svg/arrow-in (menu-button- {:icon svg/arrow-in
"@click.prevent" "if (selected == 'import') {selected = null } else { selected = 'import'} "} "@click.prevent" "if (selected == 'import') {selected = null } else { selected = 'import'} "}
"Import") "Import")

View File

@@ -11,7 +11,7 @@
[:li [:li
[:div {:class "flex items-center"} [:div {:class "flex items-center"}
[:div {:class "w-6 h-6 text-gray-400",} [:div {:class "w-6 h-6 text-gray-400"}
svg/breadcrumb-component] svg/breadcrumb-component]
(update-in p [1 :class] str " ml-1 text-sm font-medium text-gray-700 hover:text-blue-600 md:ml-2 dark:text-gray-400 dark:hover:text-white")]]) (update-in p [1 :class] str " ml-1 text-sm font-medium text-gray-700 hover:text-blue-600 md:ml-2 dark:text-gray-400 dark:hover:text-white")]])

View File

@@ -162,8 +162,6 @@
[:div.ml-3 "Loading..."]] [:div.ml-3 "Loading..."]]
(into [:div.htmx-indicator-hidden] children)]) (into [:div.htmx-indicator-hidden] children)])
(defn group-button- [{:keys [size] :or {size :normal} :as params} & children] (defn group-button- [{:keys [size] :or {size :normal} :as params} & children]
(into [:button (cond-> params (into [:button (cond-> params
true (assoc :type (or (:type params) "button")) true (assoc :type (or (:type params) "button"))
@@ -231,7 +229,6 @@
[:span {:class "sr-only"} "Confirmation"] [:span {:class "sr-only"} "Confirmation"]
[:h3 {:class "font-medium"} "5. Confirmation"]]]]]) [:h3 {:class "font-medium"} "5. Confirmation"]]]]])
(defn validated-save-button- [{:keys [errors class] :as params} & children] (defn validated-save-button- [{:keys [errors class] :as params} & children]
(button- (-> {:color (or (:color params) :primary) (button- (-> {:color (or (:color params) :primary)
:type "submit" :class (cond-> (or class "") :type "submit" :class (cond-> (or class "")

View File

@@ -155,6 +155,5 @@
:hx-trigger "newRow" :hx-trigger "newRow"
:hx-vals (hiccup/raw "js:{index: event.detail.index }") :hx-vals (hiccup/raw "js:{index: event.detail.index }")
:hx-target "closest .new-row" :hx-target "closest .new-row"
:hx-swap "beforebegin" :hx-swap "beforebegin"})
})
content)]))) content)])))

View File

@@ -5,7 +5,6 @@
[auto-ap.ssr.hx :as hx] [auto-ap.ssr.hx :as hx]
[auto-ap.ssr.svg :as svg])) [auto-ap.ssr.svg :as svg]))
(defn modal- (defn modal-
"This modal function is used to create a modal window with a stack that allows for transitioning between modals. "This modal function is used to create a modal window with a stack that allows for transitioning between modals.
@@ -45,7 +44,6 @@
[:div {:class "flex items-start justify-between p-4 border-b rounded-t dark:border-gray-600 shrink-0"} [:div {:class "flex items-start justify-between p-4 border-b rounded-t dark:border-gray-600 shrink-0"}
children]) children])
(defn modal-header-attachment- [params & children] (defn modal-header-attachment- [params & children]
[:div {:class "flex items-start justify-between p-4 border-b shrink-0"} [:div {:class "flex items-start justify-between p-4 border-b shrink-0"}
children]) children])

View File

@@ -8,7 +8,6 @@
[clojure.string :as str] [clojure.string :as str]
[hiccup2.core :as hiccup])) [hiccup2.core :as hiccup]))
(def default-input-classes (def default-input-classes
["bg-gray-50" "border" "text-sm" "rounded-lg" "" "block" ["bg-gray-50" "border" "text-sm" "rounded-lg" "" "block"
"p-2.5" "border-gray-300" "text-gray-900" "focus:ring-blue-500" "focus:border-blue-500" "p-2.5" "border-gray-300" "text-gray-900" "focus:ring-blue-500" "focus:border-blue-500"
@@ -149,7 +148,6 @@
[:li {":style" "index == 0 && 'border: 0 !important;'"} [:li {":style" "index == 0 && 'border: 0 !important;'"}
[:label {:class "p-3 group rounded flex gap-2 items-center outline-0 focus:bg-neutral-100 hover:bg-neutral-100 whitespace-nowrap [&.active]:bg-primary-300 [&.active]:dark:bg-primary-700 [&.implied]:text-gray-500 text-gray-800 dark:text-gray-100 cursor-pointer" [:label {:class "p-3 group rounded flex gap-2 items-center outline-0 focus:bg-neutral-100 hover:bg-neutral-100 whitespace-nowrap [&.active]:bg-primary-300 [&.active]:dark:bg-primary-700 [&.implied]:text-gray-500 text-gray-800 dark:text-gray-100 cursor-pointer"
:href "#" :href "#"
":class" (hx/json {"active" (hx/js-fn "active==index") ":class" (hx/json {"active" (hx/js-fn "active==index")
"implied" (hx/js-fn "all_selected && index != 0")}) "implied" (hx/js-fn "all_selected && index != 0")})
@@ -178,7 +176,6 @@
:x-show "value.size > 0"} :x-show "value.size > 0"}
svg/x]]) svg/x]])
(defn multi-typeahead- [params] (defn multi-typeahead- [params]
[:div.relative {:x-data (hx/json {:baseUrl (str (:url params)) [:div.relative {:x-data (hx/json {:baseUrl (str (:url params))
:reset_elements (js-fn "function(e) { :reset_elements (js-fn "function(e) {
@@ -268,21 +265,17 @@
:x-effect "if (value.warning) { $nextTick(()=> warning_badge.update()) }"} :x-effect "if (value.warning) { $nextTick(()=> warning_badge.update()) }"}
(tags/badge- {:class "peer"} "!") (tags/badge- {:class "peer"} "!")
[:div {:x-show "value.warning" [:div {:x-show "value.warning"
:x-ref "warning_pop" :x-ref "warning_pop"
:class "hidden peer-hover:block bg-red-50 dark:bg-gray-600 rounded-lg shadow-2xl w-max z-50 p-4" :class "hidden peer-hover:block bg-red-50 dark:bg-gray-600 rounded-lg shadow-2xl w-max z-50 p-4"
:x-text "value.warning"}]]] :x-text "value.warning"}]]]
(multi-typeahead-dropdown- params)])]) (multi-typeahead-dropdown- params)])])
(defn use-size [size] (defn use-size [size]
(if (= :small size) (if (= :small size)
(str " " "text-xs p-2") (str " " "text-xs p-2")
(str " " "text-sm p-2.25"))) (str " " "text-sm p-2.25")))
(defn text-input- [{:keys [size error?] :as params}] (defn text-input- [{:keys [size error?] :as params}]
[:input [:input
(-> params (-> params
@@ -415,8 +408,6 @@
(update :class #(str % (use-size size) " w-full")) (update :class #(str % (use-size size) " w-full"))
(dissoc :size :name :x-model :x-modelable))]])) (dissoc :size :name :x-model :x-modelable))]]))
(defn field-errors- [{:keys [source key]} & rest] (defn field-errors- [{:keys [source key]} & rest]
(let [errors (:errors (cond-> (meta source) (let [errors (:errors (cond-> (meta source)
key (get key)))] key (get key)))]
@@ -469,8 +460,6 @@
(defn hidden- [{:keys [name value] :as params}] (defn hidden- [{:keys [name value] :as params}]
[:input (merge {:type "hidden" :value value :name name} params)]) [:input (merge {:type "hidden" :value value :name name} params)])
(defn toggle- [params & children] (defn toggle- [params & children]
[:label {:class "inline-flex items-center cursor-pointer"} [:label {:class "inline-flex items-center cursor-pointer"}
[:input (merge {:type "checkbox", :class "sr-only peer"} params)] [:input (merge {:type "checkbox", :class "sr-only peer"} params)]

View File

@@ -8,8 +8,7 @@
[:div {:x-data (hx/json {})} [:div {:x-data (hx/json {})}
(com/a-icon-button {:class "relative" (com/a-icon-button {:class "relative"
"@click.prevent" "$tooltip($refs.tooltip, {content: ()=>$refs.tooltip.innerHTML, theme: 'light', allowHTML: true, interactive:true, popperOptions: {strategy: 'fixed', modifiers: [{name: 'flip', options: {fallbackPlacements: ['top']}}]}})" "@click.prevent" "$tooltip($refs.tooltip, {content: ()=>$refs.tooltip.innerHTML, theme: 'light', allowHTML: true, interactive:true, popperOptions: {strategy: 'fixed', modifiers: [{name: 'flip', options: {fallbackPlacements: ['top']}}]}})"}
}
svg/paperclip svg/paperclip
(com/badge {:color "blue"} (count links))) (com/badge {:color "blue"} (count links)))
[:template {:x-ref "tooltip"} [:template {:x-ref "tooltip"}

View File

@@ -15,7 +15,6 @@
[malli.core :as mc] [malli.core :as mc]
[malli.core :as m])) [malli.core :as m]))
(def default-form-props {:hx-ext "response-targets" (def default-form-props {:hx-ext "response-targets"
:hx-swap "outerHTML" :hx-swap "outerHTML"
:hx-target-400 "#form-errors .error-content" :hx-target-400 "#form-errors .error-content"
@@ -57,7 +56,6 @@
(or (get-in (:snapshot multi-form-state) edit-path) (or (get-in (:snapshot multi-form-state) edit-path)
default))) default)))
(defn merge-multi-form-state [{:keys [snapshot edit-path step-params] :as multi-form-state}] (defn merge-multi-form-state [{:keys [snapshot edit-path step-params] :as multi-form-state}]
(let [cursor (cursor/cursor (or snapshot {})) (let [cursor (cursor/cursor (or snapshot {}))
;; this hack makes sure that, in the event of a missing vector entry, will make sure to add it first ;; this hack makes sure that, in the event of a missing vector entry, will make sure to add it first
@@ -87,8 +85,6 @@
(fn encode-step-key [sk] (fn encode-step-key [sk]
(mc/encode step-key-schema sk main-transformer)))) (mc/encode step-key-schema sk main-transformer))))
(defn render-timeline [linear-wizard current-step validation-route] (defn render-timeline [linear-wizard current-step validation-route]
(let [step-names (map #(step-name (get-step linear-wizard %)) (steps linear-wizard)) (let [step-names (map #(step-name (get-step linear-wizard %)) (steps linear-wizard))
active-index (.indexOf step-names (step-name current-step))] active-index (.indexOf step-names (step-name current-step))]
@@ -361,8 +357,6 @@
(render-wizard wizard request)]) (render-wizard wizard request)])
(get query-params :replace-modal) (assoc-in [:headers "hx-trigger"] "modalswap"))) (get query-params :replace-modal) (assoc-in [:headers "hx-trigger"] "modalswap")))
(defn wrap-init-multi-form-state [handler get-multi-form-state] (defn wrap-init-multi-form-state [handler get-multi-form-state]
(-> (->
(fn init-multi-form [request] (fn init-multi-form [request]

Some files were not shown because too many files have changed in this diff Show More