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

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

View File

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

View File

@@ -22,7 +22,6 @@
(defn local-now []
(localize (time/now)))
(defn recent-date
([]
(recent-date 90))
@@ -53,9 +52,6 @@
[client start]
[client end]))))
(defn can-see-client? [identity client]
(when (not 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))) client)))
(defn ->pattern [x]
(. java.util.regex.Pattern (compile x java.util.regex.Pattern/CASE_INSENSITIVE)))
(defn dom [^java.util.Date x]
(-> x
(.toInstant)
@@ -164,8 +158,7 @@
(defn 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]
(.write writer (format "Line %d: client:%d account:%d location:%s date:%s"
@@ -175,12 +168,10 @@
(.-location entity)
(iso-date (.-date entity)))))
(defn ->line [{[current-client current-account current-location current-date debit credit running-balance]
:v
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]
@@ -269,7 +260,6 @@
(do
[client-id account-id location debits credits current-balance count sample]))))
(comment
(->>
(detailed-account-snapshot (dc/db auto-ap.datomic/conn)

View File

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

View File

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

View File

@@ -7,8 +7,7 @@
(fn [m k v]
(if (not (nil? v))
(assoc m k v)
m
))
m))
{}
m)]
(if (seq result)
@@ -49,22 +48,19 @@
:journal-entry/line-items (into [(cond-> {:db/id (str raw-invoice-id "-" 0)
:journal-entry-line/account :account/accounts-payable
:journal-entry-line/location "A"
}
:journal-entry-line/location "A"}
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))))]
(map-indexed (fn [i ea]
(cond->
{:db/id (str raw-invoice-id "-" (inc i))
:journal-entry-line/account (:db/id (:invoice-expense-account/account ea))
:journal-entry-line/location (or (:invoice-expense-account/location ea) "HQ")
}
: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)))
(not credit-invoice?) (assoc :journal-entry-line/debit (Math/abs (:invoice-expense-account/amount ea)))))
(:invoice/expense-accounts entity)))
: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]
(let [last-tx (dc/t->tx (dc/basis-t db))

View File

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

View File

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

View File

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

View File

@@ -27,8 +27,7 @@
(fn [m k v]
(if (not (nil? v))
(assoc m k v)
m
))
m))
{}
m)]
(if (seq result)

File diff suppressed because one or more lines are too long

View File

@@ -2,8 +2,7 @@
(:require [amazonica.core :as amz])
(: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 StartExpenseAnalysisRequest])
#_(import '[com.amazonaws.services.textract.model GetExpenseAnalysisRequest])

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -174,8 +174,6 @@
(let [error (str "Expense account total (" expense-account-total ") does not equal invoice total (" total ")")]
(throw (ex-info error {:validation-error error}))))))
(defn add-invoice [context {{:keys [expense_accounts client_id vendor_id] :as in} :invoice} _]
(assert-no-conflicting in)
(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)
(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} _]
(mu/trace ::validating-invoice [:invoice in]
(do
@@ -261,7 +257,6 @@
(-> (d-invoices/get-by-id id) (->graphql (:id context)))))
(defn get-ids-matching-filters [args]
(let [ids (some-> args
:filters
@@ -448,8 +443,6 @@
[])]
accounts)))
(defn bulk-change-invoices [context args _]
(assert-admin (:id context))
(when-not (:client_id args)

View File

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

View File

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

View File

@@ -17,7 +17,6 @@
->graphql
(first (d-sales-orders2/get-graphql (assoc (<-graphql args) :count Integer/MAX_VALUE)))))
(def objects
{:sales_order_page
{:fields {:sales_orders {:type '(list :sales_order)}
@@ -93,8 +92,7 @@
(def resolvers
{: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]
(->

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -11,7 +11,6 @@
(t/is (= #inst "2021-01-01T00:00:00-08:00" (:transaction/date (sut/intuit->transaction (assoc base-transaction :Date "2021-01-01")))))
(t/is (= #inst "2021-06-01T00:00:00-07:00" (:transaction/date (sut/intuit->transaction (assoc base-transaction :Date "2021-06-01")))))))
(t/deftest intuits->transactions
(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"

View File

@@ -7,8 +7,6 @@
[clojure.data.csv :as csv]
[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])
(defn tabulate-data [data]

View File

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

View File

@@ -29,7 +29,6 @@
nil))
nil))
(defn transaction->existing-payment [_ check-number client-id bank-account-id amount id]
(alog/info ::searching
: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 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]
(when date
@@ -187,12 +184,10 @@
[?ed :expected-deposit/date ?d]
[(>= ?d ?d-start)]
[?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))))
ffirst)))
(defn categorize-transaction [transaction bank-account existing]
(cond (= :transaction-approval-status/suppressed (existing (:transaction/id transaction)))
:suppressed
@@ -235,7 +230,6 @@
(assoc transaction :transaction/check-number check-number)
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)]
(assoc transaction
@@ -266,8 +260,7 @@
:transaction-account/amount amount
:transaction-account/location "A"}]
: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]
(mu/trace
@@ -304,7 +297,6 @@
(maybe-apply-default-vendor)
remove-nils)))
(defn get-existing [bank-account]
(into {}
(dc/q '[:find ?tid ?as2
@@ -410,8 +402,6 @@
:import-batch/status :import-status/completed}
@stats)])))))
(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))

View File

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

View File

@@ -15,7 +15,6 @@
;; (def base-url "https://sandbox-quickbooks.api.intuit.com/v3")
(def prod-client-id "ABFRwAiOqQiLN66HKplXfyRE3ipD390DHsrUquflRCiOa81mxa")
(def prod-client-secret "xDUj04GeQXpLvrhxep1jjDYwjJWbzzOPrirUQTKF")
@@ -27,11 +26,8 @@
;; "accessToken":,
;;
(def prod-company-id "123146163906404")
(def prod-base-url "https://quickbooks.api.intuit.com/v3")
(defn set-access-token [t]
@@ -53,7 +49,6 @@
:bucket-name "data.prod.app.integreatconsult.com"
:key "intuit/refresh-token")))))
#_{:clj-kondo/ignore [:clojure-lsp/unused-public-var]}
(defn init-tokens [access refresh]
(set-access-token access)
@@ -74,7 +69,6 @@
(defn get-basic-auth []
(Base64/encodeBase64String (.getBytes (str prod-client-id ":" prod-client-secret))))
(defn get-fresh-access-token []
(let [refresh-token (lookup-refresh-token)
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"}}))
:QueryResponse))
(defn get-bank-accounts [token]
(->> (:body (client/get (str prod-base-url "/company/" prod-company-id "/query")
{:headers
@@ -124,7 +117,6 @@
:last-updated (c/to-date-time (-> metadata :LastUpdatedTime))
:current-balance (try (double current-balance) (catch Exception _ nil))}))))
(defn get-all-transactions [start end]
(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)

View File

@@ -12,7 +12,6 @@
(defn line->id [{:keys [source id client-code]}]
(str client-code "-" source "-" id))
(defn csv->graphql-rows [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)]]

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -39,7 +39,6 @@
(dc/db conn)
number)))
(defn delete-all []
@(dc/transact-async conn
(->>
@@ -49,8 +48,6 @@
(map (fn [[ss]]
[:db/retractEntity ss])))))
(defn dirty-sales-summaries [c]
(let [client-id (dc/entid (dc/db conn) c)]
(->> (dc/index-pull (dc/db conn)
@@ -192,8 +189,6 @@
:ledger-mapped/amount v
:ledger-mapped/ledger-side :ledger-side/credit}))))
(defn get-fees [c date]
(when-let [fee (get-fee c date)]
{:db/id (str (java.util.UUID/randomUUID))
@@ -315,7 +310,6 @@
@(dc/transact conn [[:upsert-sales-summary result]]))
@(dc/transact conn [{:db/id id :sales-summary/dirty false}]))))))
(defn reset-summaries []
@(dc/transact conn (->> (dc/q '[:find ?sos
:in $
@@ -324,9 +318,6 @@
(map (fn [[sos]]
[:db/retractEntity sos])))))
(comment
(auto-ap.datomic/transact-schema conn)
@@ -336,26 +327,19 @@
(dirty-sales-summaries [:client/code "NGWH"])
(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/upsert-sales-summary (dc/db conn) {:db/id 17592314241429})
(mark-all-dirty 5)
(delete-all)
(sales-summaries-v2)
1
(dc/q '[:find (pull ?sos [* {:sales-summary/sales-items [*]}])
:in $
: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}
{: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 [& _]
(execute "sales-summaries" sales-summaries-v2))

View File

@@ -44,7 +44,6 @@
(dc/db conn)
50000))))
(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"])
@@ -64,7 +63,6 @@
first
first)))
(defn read-sysco-csv [k]
(-> (s3/get-object {:bucket-name bucket-name
:key k})
@@ -84,11 +82,9 @@
(fn [acc row]
(update acc (get-line-account (nth row item-name-index))
(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")
(fnil + 0.0)
tax)
@@ -186,22 +182,16 @@
(nth (->> (s3/list-objects-v2 {:bucket-name "data.prod.app.integreatconsult.com"
:prefix "sysco/imported"})
:object-summaries
(map :key)
)
(map :key))
i)))
(comment
(with-bindings {#'bucket-name "data.prod.app.integreatconsult.com"}
(doall
(for [n (range 930 940)
:let [result (-> (get-test-invoice-file n)
read-sysco-csv
(extract-invoice-details (get-sysco-vendor))
)]
(extract-invoice-details (get-sysco-vendor)))]
#_#_:when (not (check-okay-amount? result))]
result)))
@@ -209,12 +199,9 @@
(with-bindings {#'bucket-name "data.prod.app.integreatconsult.com"}
(let [result (-> "sysco/error/SYSCO050_00175962_20241010122639019.csv"
read-sysco-csv
(extract-invoice-details (get-sysco-vendor))
)]
(extract-invoice-details (get-sysco-vendor)))]
result))
)
result)))
(defn import-sysco []
(let [sysco-vendor (get-sysco-vendor)
@@ -223,7 +210,6 @@
:object-summaries
(map :key))]
(alog/info ::importing-sysco
:count (count keys)
:keys (pr-str keys))
@@ -256,6 +242,5 @@
(doseq [k keys]
(mark-key k))))
(defn -main [& _]
(execute "sysco" import-sysco))

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -213,8 +213,7 @@
(map (fn [client]
(format "'%s'" (pull-attr (dc/db conn)
: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.
)
{:keys [tempids]} (audit-transact [[:upsert-entity (cond-> entity
@@ -279,8 +278,7 @@
(fc/start-form form-params form-errors
[: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))})
:hx-target "this"
}
:hx-target "this"}
(com/modal
{}
[:form (-> {:hx-ext "response-targets"
@@ -416,9 +414,6 @@
{})
:form-errors form-errors})))
(def key->handler
(apply-middleware-to-all-handlers
(->>

View File

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

View File

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

View File

@@ -38,7 +38,6 @@
invoice)
(defn reset-id [i]
(update i :invoice-number
(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))
client-id))
(defn invoice-rows->transaction [rows user]
(->> rows
(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
:in $ ?c
: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)
client-id))]
[: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")
:transaction-account/account (:db/id (a/get-account-by-numeric-code-and-sets 21000 ["default"]))
: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))
account-id)]
(some-> payment remove-nils)
@@ -158,8 +154,7 @@
(dc/q '[:find ?n ?v
:in $ [?n ...]
:where [?v :vendor/name ?n]]
(dc/db conn)
)
(dc/db conn))
(into {}))
all-clients (merge (into {} (dc/q '[:find ?n (pull ?v [:db/id :client/locations])
:in $
@@ -226,8 +221,7 @@
(com/validated-field {:label "Tab-separated invoices"
:errors (fc/field-errors)}
[: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)]))
(com/form-errors {:errors (:errors fc/*form-errors*)})
(com/validated-save-button {:color :primary
@@ -309,8 +303,7 @@
::route/import (-> import
(wrap-schema-enforce :form-schema [:map [:tsv :string]])
(wrap-nested-form-params)
(wrap-form-4xx-2 form))
})
(wrap-form-4xx-2 form))})
(fn [h]
(-> h
(wrap-admin)

View File

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

View File

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

View File

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

View File

@@ -14,7 +14,6 @@
:headers {"Location" "/login"}
:session {}})
(defn impersonate [request]
{:status 200
:session {:identity (dissoc (jwt/unsign (get-in request [:query-params "jwt"])
@@ -45,8 +44,7 @@
:errorDetails ""
:showNotification false
: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#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
@@ -96,8 +94,7 @@
[:img {:src "/img/logo-big.png"}]
[:div
[:a.button.is-large.is-primary {:href (login-url (get (:query-params request) "redirect-to"))} "Login with Google"]]
"HELLO"])
]]] ])
"HELLO"])]]]])
(defn login [request]
(base-page

View File

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

View File

@@ -33,8 +33,7 @@
(com/content-card {:class " w-[748px]"
:hx-target "this"
: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"}
"Signature"]
[:div#signature-notification.notification.block {:style {:display "none"}}]
@@ -58,7 +57,6 @@
:x-show "existing && !editing"}])
[:canvas.rounded.rounded-lg.border.border-gray-300
{:style {:width 696
:height 261}
:x-init "signature= new SignaturePad($el); signature.off()"
@@ -67,7 +65,6 @@
:height 261
:x-show "existing ? editing: true"}]]
[:div.flex.gap-2.justify-end
(com/button {:color :primary
:x-show "!editing"
@@ -92,8 +89,7 @@
#_#_:hx-target "#signature-notification"
:hx-swap "outerHTML"
:id "upload"
:hx-trigger "z"
}
:hx-trigger "z"}
[: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"}}
(svg/spinner {:class "w-4 h-4 text-primary-300"})
@@ -111,8 +107,6 @@
'text-green-700': hovering
}"}
[:input {:type "file"
:name "file"
: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"}
[:li (com/pill {:color :primary :x-text "f.name"})]]]]
[:div.htmx-indicator-hidden "Drop a signature file (696x261 pixels jpeg) here."]]]]]]])))
(defn upload-signature-data [{{:strs [signatureData]} :form-params client :client :as request}]
@@ -276,7 +269,6 @@
(def search (wrap-json-response search))
(defn bank-account-search [{:keys [route-params query-params clients]}]
(let [valid-client-ids (set (map :db/id clients))
selected-client-id (Long/parseLong (get route-params :db/id))

View File

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

View File

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

View File

@@ -32,8 +32,7 @@
[:maybe clj-date-schema]]
[:end-date {:optional true}
[: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)]))
(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]]}
:args [db (:trimmed-clients request)]}
(:sort query-params) (add-sorter-fields {"client" ['[?e :report/client ?c]
'[?c :client/name ?sort-client]]
"created" ['[?e :report/created ?sort-created]]
"creator" ['[?e :report/creator ?sort-creator]]
"name" ['[?e :report/name ?sort-name]
]}
"name" ['[?e :report/name ?sort-name]]}
query-params)
true
@@ -147,7 +144,6 @@
{:flash? true
:delete-after-settle? true}))))
(def key->handler
(apply-middleware-to-all-handlers
(->>

View File

@@ -66,8 +66,7 @@
[?e :invoice/total ?t]
[?e :invoice/vendor ?v]
[?v :vendor/name ?vn]
[?c :client/name ?cn]
]}
[?c :client/name ?cn]]}
:args
[(dc/db conn)
[(extract-client-ids (:clients request)
@@ -86,7 +85,6 @@
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))]))))
(defn- best-week [d weeks]
(reduce
(fn [acc [start end]]
@@ -97,7 +95,6 @@
nil
weeks))
(defn expense-breakdown-card* [request]
(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"}
@@ -214,8 +211,7 @@
(let [data (lookup-invoice-total-data request)
companies (sort (set (map first data)))
vendors (sort (set (map second data)))
result (by (juxt first second) last data)
]
result (by (juxt first second) last data)]
(com/data-grid
{:headers (into
[(com/data-grid-header {:class "sticky left-0 z-60 bg-gray-100"} "Vendor")]

View File

@@ -67,7 +67,6 @@
(com/data-grid-cell {}
(format "$%,.2f" (:transaction/amount r))))))]]))))))])
(defn reconciliation-card* [{:keys [request report]}]
(com/content-card {:class "w-full" :id "reconciliation-report"}
[: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")])]
(if 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]
(base-page

View File

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

View File

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

View File

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

View File

@@ -11,7 +11,7 @@
[:li
[: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]
(update-in p [1 :class] str " ml-1 text-sm font-medium text-gray-700 hover:text-blue-600 md:ml-2 dark:text-gray-400 dark:hover:text-white")]])

View File

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

View File

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

View File

@@ -5,7 +5,6 @@
[auto-ap.ssr.hx :as hx]
[auto-ap.ssr.svg :as svg]))
(defn modal-
"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"}
children])
(defn modal-header-attachment- [params & children]
[:div {:class "flex items-start justify-between p-4 border-b shrink-0"}
children])

View File

@@ -8,7 +8,6 @@
[clojure.string :as str]
[hiccup2.core :as hiccup]))
(def default-input-classes
["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"
@@ -149,7 +148,6 @@
[: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"
:href "#"
":class" (hx/json {"active" (hx/js-fn "active==index")
"implied" (hx/js-fn "all_selected && index != 0")})
@@ -178,7 +176,6 @@
:x-show "value.size > 0"}
svg/x]])
(defn multi-typeahead- [params]
[:div.relative {:x-data (hx/json {:baseUrl (str (:url params))
:reset_elements (js-fn "function(e) {
@@ -268,21 +265,17 @@
:x-effect "if (value.warning) { $nextTick(()=> warning_badge.update()) }"}
(tags/badge- {:class "peer"} "!")
[:div {:x-show "value.warning"
: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"
:x-text "value.warning"}]]]
(multi-typeahead-dropdown- params)])])
(defn use-size [size]
(if (= :small size)
(str " " "text-xs p-2")
(str " " "text-sm p-2.25")))
(defn text-input- [{:keys [size error?] :as params}]
[:input
(-> params
@@ -415,8 +408,6 @@
(update :class #(str % (use-size size) " w-full"))
(dissoc :size :name :x-model :x-modelable))]]))
(defn field-errors- [{:keys [source key]} & rest]
(let [errors (:errors (cond-> (meta source)
key (get key)))]
@@ -469,8 +460,6 @@
(defn hidden- [{:keys [name value] :as params}]
[:input (merge {:type "hidden" :value value :name name} params)])
(defn toggle- [params & children]
[:label {:class "inline-flex items-center cursor-pointer"}
[:input (merge {:type "checkbox", :class "sr-only peer"} params)]

View File

@@ -8,8 +8,7 @@
[:div {:x-data (hx/json {})}
(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
(com/badge {:color "blue"} (count links)))
[:template {:x-ref "tooltip"}

View File

@@ -15,7 +15,6 @@
[malli.core :as mc]
[malli.core :as m]))
(def default-form-props {:hx-ext "response-targets"
:hx-swap "outerHTML"
:hx-target-400 "#form-errors .error-content"
@@ -57,7 +56,6 @@
(or (get-in (:snapshot multi-form-state) edit-path)
default)))
(defn merge-multi-form-state [{:keys [snapshot edit-path step-params] :as multi-form-state}]
(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
@@ -87,8 +85,6 @@
(fn encode-step-key [sk]
(mc/encode step-key-schema sk main-transformer))))
(defn render-timeline [linear-wizard current-step validation-route]
(let [step-names (map #(step-name (get-step linear-wizard %)) (steps linear-wizard))
active-index (.indexOf step-names (step-name current-step))]
@@ -361,8 +357,6 @@
(render-wizard wizard request)])
(get query-params :replace-modal) (assoc-in [:headers "hx-trigger"] "modalswap")))
(defn wrap-init-multi-form-state [handler get-multi-form-state]
(->
(fn init-multi-form [request]

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