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:
@@ -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');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)}]))))))
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|
||||||
)
|
|
||||||
@@ -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
@@ -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])
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)))
|
||||||
|
|||||||
@@ -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)))
|
||||||
|
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
@@ -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)]
|
||||||
|
|||||||
@@ -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)))))
|
||||||
|
|||||||
@@ -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)]
|
||||||
|
|||||||
@@ -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]
|
||||||
|
|||||||
@@ -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]))
|
||||||
|
|||||||
@@ -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]
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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))))
|
||||||
|
|||||||
@@ -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]
|
||||||
|
|||||||
@@ -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
|
||||||
(->>
|
(->>
|
||||||
|
|||||||
@@ -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]]]]]]]}))
|
||||||
|
|||||||
@@ -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."
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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}}}})
|
||||||
|
|||||||
@@ -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}}
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -21,8 +21,6 @@
|
|||||||
:name (first name)}))
|
:name (first name)}))
|
||||||
[]))
|
[]))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(defn attach [schema]
|
(defn attach [schema]
|
||||||
(->
|
(->
|
||||||
(merge-with merge schema
|
(merge-with merge schema
|
||||||
|
|||||||
@@ -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]
|
||||||
(->
|
(->
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -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"})]
|
||||||
|
|||||||
@@ -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]
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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]
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)]]
|
||||||
|
|||||||
@@ -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))))
|
||||||
|
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|
||||||
)
|
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
@@ -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})
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|
||||||
@@ -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))
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)]
|
||||||
|
|||||||
@@ -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 & _]
|
||||||
|
|||||||
@@ -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)))
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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]
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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")))
|
||||||
|
|
||||||
)
|
|
||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)})
|
||||||
|
|||||||
@@ -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)})
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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))))
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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]
|
||||||
|
|||||||
@@ -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")))))
|
||||||
|
|
||||||
)
|
|
||||||
|
|
||||||
)
|
|
||||||
|
|||||||
@@ -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))
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
(->>
|
(->>
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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")))
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
(->>
|
(->>
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
(->>
|
(->>
|
||||||
|
|||||||
@@ -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")]
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|||||||
@@ -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")]])
|
||||||
|
|||||||
@@ -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 "")
|
||||||
|
|||||||
@@ -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)])))
|
||||||
|
|||||||
@@ -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])
|
||||||
|
|||||||
@@ -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)]
|
||||||
|
|||||||
@@ -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"}
|
||||||
|
|||||||
@@ -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
Reference in New Issue
Block a user