816 lines
32 KiB
Clojure
816 lines
32 KiB
Clojure
(ns auto-ap.datomic
|
|
(:require
|
|
[auto-ap.utils :refer [default-pagination-size by]]
|
|
[clojure.tools.logging :as log]
|
|
[clojure.edn :as edn]
|
|
[config.core :refer [env]]
|
|
[datomic.client.api :as dc]
|
|
[com.brunobonacci.mulog :as mu]
|
|
[mount.core :as mount]
|
|
[clojure.java.io :as io])
|
|
(:import
|
|
(java.util UUID)))
|
|
|
|
(def uri (:datomic-url env))
|
|
|
|
(mount/defstate client
|
|
:start (dc/client (:client-config env))
|
|
:stop nil)
|
|
(mount/defstate conn
|
|
:start (dc/connect client {:db-name (:db-name env)})
|
|
:stop nil)
|
|
|
|
#_(def uri "datomic:mem://datomic-transactor:4334/invoice")
|
|
|
|
#_{:clj-kondo/ignore [:clojure-lsp/unused-public-var]}
|
|
#_(defn create-database []
|
|
(d/create-database uri))
|
|
|
|
#_{:clj-kondo/ignore [:clojure-lsp/unused-public-var]}
|
|
#_(defn drop-database []
|
|
(d/delete-database uri))
|
|
|
|
(defn remove-nils [m]
|
|
(let [result (reduce-kv
|
|
(fn [m k v]
|
|
(if (not (nil? v))
|
|
(assoc m k v)
|
|
m
|
|
))
|
|
{}
|
|
m)]
|
|
(if (seq result)
|
|
result
|
|
nil)))
|
|
|
|
(def vendor-schema
|
|
[{:db/ident :vendor/original-id
|
|
:db/valueType :db.type/long
|
|
:db/cardinality :db.cardinality/one
|
|
:db/unique :db.unique/identity
|
|
:db/doc "Original id from the old system"}
|
|
{:db/ident :vendor/name
|
|
:db/valueType :db.type/string
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "A vendor's human-friendly name"}
|
|
{:db/ident :vendor/code
|
|
:db/valueType :db.type/string
|
|
:db/unique :db.unique/identity
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "A vendor's computer-friendly name"}
|
|
{:db/ident :vendor/print-as
|
|
:db/valueType :db.type/string
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "Set if you want to override how this vendor's name is printed on checks"}
|
|
{:db/ident :vendor/email
|
|
:db/valueType :db.type/string
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "A vendor's email address"}
|
|
|
|
{:db/ident :vendor/phone
|
|
:db/valueType :db.type/string
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "A vendor's phone number"}
|
|
{:db/ident :vendor/invoice-reminder-schedule
|
|
:db/valueType :db.type/keyword
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "How often to email this vendor about invoices"}
|
|
{:db/ident :vendor/default-expense-account
|
|
:db/valueType :db.type/long
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "The vendor's default expense account"}
|
|
{:db/ident :vendor/primary-contact
|
|
:db/valueType :db.type/ref
|
|
:db/cardinality :db.cardinality/one
|
|
:db/isComponent true
|
|
:db/doc "The vendor's primary contact"}
|
|
{:db/ident :vendor/secondary-contact
|
|
:db/valueType :db.type/ref
|
|
:db/isComponent true
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "The vendor's secondary contact"}
|
|
{:db/ident :vendor/address
|
|
:db/valueType :db.type/ref
|
|
:db/cardinality :db.cardinality/one
|
|
:db/isComponent true
|
|
:db.install/_attribute :db.part/db
|
|
:db/doc "The vendor's address"}
|
|
])
|
|
|
|
(def client-schema
|
|
[{:db/ident :client/original-id
|
|
:db/valueType :db.type/long
|
|
:db/cardinality :db.cardinality/one
|
|
:db/unique :db.unique/identity
|
|
:db/doc "Original id from the old system"}
|
|
{:db/ident :client/name
|
|
:db/valueType :db.type/string
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "A client's human-friendly name"}
|
|
{:db/ident :client/email
|
|
:db/valueType :db.type/string
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "hello@example.com"}
|
|
{:db/ident :client/code
|
|
:db/valueType :db.type/string
|
|
:db/unique :db.unique/identity
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "A client's computer-friendly name"}
|
|
{:db/ident :client/signature-file
|
|
:db/valueType :db.type/string
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "A check signature image"}
|
|
|
|
{:db/ident :client/locations
|
|
:db/valueType :db.type/string
|
|
:db/cardinality :db.cardinality/many
|
|
:db/doc "A client's locations"}
|
|
{:db/ident :client/address
|
|
:db/valueType :db.type/ref
|
|
:db/cardinality :db.cardinality/one
|
|
:db/isComponent true
|
|
:db/doc "Address of the client"}
|
|
{:db/ident :client/bank-accounts
|
|
:db/valueType :db.type/ref
|
|
:db/cardinality :db.cardinality/many
|
|
:db/isComponent true
|
|
:db/doc "Bank accounts for the client"}])
|
|
|
|
(def address-schema
|
|
[
|
|
{:db/ident :address/street1
|
|
:db/valueType :db.type/string
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "123 main st"}
|
|
{:db/ident :address/street2
|
|
:db/valueType :db.type/string
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "Apt A"}
|
|
{:db/ident :address/city
|
|
:db/valueType :db.type/string
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "Campbell"}
|
|
{:db/ident :address/state
|
|
:db/valueType :db.type/string
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "CA"}
|
|
{:db/ident :address/zip
|
|
:db/valueType :db.type/string
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "95014"}])
|
|
|
|
(def contact-schema
|
|
[
|
|
{:db/ident :contact/name
|
|
:db/valueType :db.type/string
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "John Smith"}
|
|
{:db/ident :contact/phone
|
|
:db/valueType :db.type/string
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "4255773578"}
|
|
{:db/ident :contact/email
|
|
:db/valueType :db.type/string
|
|
: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
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "Identifier for bank account"}
|
|
{:db/ident :bank-account/original-id
|
|
:db/valueType :db.type/string
|
|
:db/cardinality :db.cardinality/one
|
|
:db/unique :db.unique/identity
|
|
:db/doc "matching the orignal tuple of [company,bank]"}
|
|
{:db/ident :bank-account/name
|
|
:db/valueType :db.type/string
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "A1127 Chase Card"}
|
|
{:db/ident :bank-account/bank-name
|
|
:db/valueType :db.type/string
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "e.g. Bank of America"}
|
|
{:db/ident :bank-account/bank-code
|
|
:db/valueType :db.type/string
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "The code to list under the bank's name"}
|
|
{:db/ident :bank-account/routing
|
|
:db/valueType :db.type/string
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "The bank's routing number"}
|
|
{:db/ident :bank-account/number
|
|
:db/valueType :db.type/string
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "The account number"}
|
|
{:db/ident :bank-account/type
|
|
:db/valueType :db.type/ref
|
|
:db/cardinality :db.cardinality/one
|
|
:db/isComponent true
|
|
:db/doc "The type of account number, either :bank-account-type/check or :bank-account-type/cash"}
|
|
{:db/ident :bank-account/yodlee-account-id
|
|
:db/valueType :db.type/long
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "yodlee's account identifier"}
|
|
{:db/ident :bank-account/check-number
|
|
:db/valueType :db.type/long
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "Current check number"}
|
|
|
|
{:db/ident :bank-account-type/check}
|
|
{:db/ident :bank-account-type/cash}])
|
|
|
|
(def invoice-schema
|
|
[{:db/ident :invoice/original-id
|
|
:db/valueType :db.type/long
|
|
:db/cardinality :db.cardinality/one
|
|
:db/unique :db.unique/identity
|
|
:db/doc "Original id in old system"}
|
|
{:db/ident :invoice/invoice-number
|
|
:db/valueType :db.type/string
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "A vendor-specified number for the invoice"}
|
|
{:db/ident :invoice/customer-identifier
|
|
:db/valueType :db.type/string
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "An identifier found to suggest the customer"}
|
|
{:db/ident :invoice/status
|
|
:db/valueType :db.type/ref
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "Status of payment/import of the invoice [:paid, :unpaid]"}
|
|
|
|
{:db/ident :invoice/client
|
|
:db/valueType :db.type/ref
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "Which client this invoice is for"}
|
|
|
|
{:db/ident :invoice/vendor
|
|
:db/valueType :db.type/ref
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "Which vendor this invoice is for"}
|
|
|
|
{:db/ident :invoice/date
|
|
:db/valueType :db.type/instant
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "Date for this invoice"}
|
|
|
|
{:db/ident :invoice/total
|
|
:db/valueType :db.type/double
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "Total $ for this invoice"}
|
|
|
|
{:db/ident :invoice/outstanding-balance
|
|
:db/valueType :db.type/double
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "The unpaid balance of this invoice"}
|
|
|
|
{:db/ident :invoice/default-location
|
|
:db/valueType :db.type/string
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "The default location that expense-accounts will be created with for this invoice"}
|
|
|
|
{:db/ident :invoice/default-expense-account
|
|
:db/valueType :db.type/long
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "The default expense account for this invoice"}
|
|
|
|
{:db/ident :invoice/expense-accounts
|
|
:db/valueType :db.type/ref
|
|
:db/cardinality :db.cardinality/many
|
|
: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}])
|
|
|
|
(def invoice-expense-account-schema
|
|
[{:db/ident :invoice-expense-account/original-id
|
|
:db/valueType :db.type/long
|
|
:db/cardinality :db.cardinality/one
|
|
:db/unique :db.unique/identity
|
|
:db/doc "Original id in old system"}
|
|
{:db/ident :invoice-expense-account/expense-account-id
|
|
:db/valueType :db.type/long
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "The code for the expense account"}
|
|
{:db/ident :invoice-expense-account/location
|
|
:db/valueType :db.type/string
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "Location for this expense account"}
|
|
{:db/ident :invoice-expense-account/amount
|
|
:db/valueType :db.type/double
|
|
: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
|
|
:db/cardinality :db.cardinality/one
|
|
:db/unique :db.unique/identity
|
|
:db/doc "The id in the old system"}
|
|
{:db/ident :payment/s3-uuid
|
|
:db/valueType :db.type/string
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "The uuid that matches the key for this check"}
|
|
{:db/ident :payment/s3-key
|
|
:db/valueType :db.type/string
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "The s3 key with pdf of this check"}
|
|
{:db/ident :payment/s3-url
|
|
:db/valueType :db.type/string
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "The s3 url with pdf of this check"}
|
|
{:db/ident :payment/check-number
|
|
:db/valueType :db.type/long
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "The check number"}
|
|
{:db/ident :payment/memo
|
|
:db/valueType :db.type/string
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "The check's memo line"}
|
|
{:db/ident :payment/date
|
|
:db/valueType :db.type/instant
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "The date the payment was made"}
|
|
{:db/ident :payment/amount
|
|
:db/valueType :db.type/double
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "The amount that was paid to the vendor"}
|
|
{:db/ident :payment/paid-to
|
|
:db/valueType :db.type/string
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "Who the paid was made out to"}
|
|
{:db/ident :payment/status
|
|
:db/valueType :db.type/ref
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "The status of the payment [:pending :cleared :voided]"}
|
|
{:db/ident :payment/type
|
|
:db/valueType :db.type/ref
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "The type of the payment [:cash :check :debit]"}
|
|
{:db/ident :payment/pdf-data
|
|
:db/valueType :db.type/string
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "raw data used to generate check pdf"}
|
|
|
|
|
|
;; relations
|
|
{:db/ident :payment/vendor
|
|
:db/valueType :db.type/ref
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "The vendor for which this payment was for"}
|
|
{:db/ident :payment/client
|
|
:db/valueType :db.type/ref
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "The client for which this payment"}
|
|
{:db/ident :payment/bank-account
|
|
:db/valueType :db.type/ref
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "The bank account that was used to pay"}
|
|
{:db/ident :payment/invoices
|
|
:db/valueType :db.type/ref
|
|
:db/cardinality :db.cardinality/many
|
|
:db/doc "Any invoices this payment is related to"}
|
|
|
|
;; enums
|
|
{:db/ident :payment-status/pending}
|
|
{:db/ident :payment-status/voided}
|
|
{:db/ident :payment-status/cleared}
|
|
|
|
{:db/ident :payment-type/cash}
|
|
{:db/ident :payment-type/check}
|
|
{:db/ident :payment-type/debit}
|
|
])
|
|
|
|
(def invoice-payment-schema
|
|
[{:db/ident :invoice-payment/original-id
|
|
:db/valueType :db.type/long
|
|
:db/cardinality :db.cardinality/one
|
|
:db/unique :db.unique/identity
|
|
:db/doc "The id in the old system"}
|
|
|
|
{:db/ident :invoice-payment/amount
|
|
:db/valueType :db.type/double
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "The amount that was paid to this invoice"}
|
|
|
|
;; relations
|
|
{:db/ident :invoice-payment/invoice
|
|
:db/valueType :db.type/ref
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "The invoice for this payment"}
|
|
{:db/ident :invoice-payment/payment
|
|
:db/valueType :db.type/ref
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "The total payment for this payment"}])
|
|
|
|
(def transaction-schema
|
|
[{:db/ident :transaction/original-id
|
|
:db/valueType :db.type/string
|
|
:db/cardinality :db.cardinality/one
|
|
:db/unique :db.unique/identity
|
|
:db/doc "The id in the old system"}
|
|
{:db/ident :transaction/amount
|
|
:db/valueType :db.type/double
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "The amount of the transaction"}
|
|
{:db/ident :transaction/description-original
|
|
:db/valueType :db.type/string
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "full description of the transaction"}
|
|
{:db/ident :transaction/description-simple
|
|
:db/valueType :db.type/string
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "short description of the transaction"}
|
|
{:db/ident :transaction/merchant-id
|
|
:db/valueType :db.type/long
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "a yodlee id for the merchant"}
|
|
{:db/ident :transaction/merchant-name
|
|
:db/valueType :db.type/string
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "a name for the merchant"}
|
|
{:db/ident :transaction/id
|
|
:db/valueType :db.type/string
|
|
:db/cardinality :db.cardinality/one
|
|
:db/unique :db.unique/identity
|
|
:db/doc "A key to match against"}
|
|
{:db/ident :transaction/date
|
|
:db/valueType :db.type/instant
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "Date that the transaction showed up"}
|
|
{:db/ident :transaction/post-date
|
|
:db/valueType :db.type/instant
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "Date that the transaction posted"}
|
|
{:db/ident :transaction/type
|
|
:db/valueType :db.type/string
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "Yodlee description of the transaction"}
|
|
{:db/ident :transaction/status
|
|
:db/valueType :db.type/string
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "Yodlee status of the transaction"}
|
|
{:db/ident :transaction/account-id
|
|
:db/valueType :db.type/long
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "Yodlee account id"}
|
|
{:db/ident :transaction/check-number
|
|
:db/valueType :db.type/long
|
|
: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
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "Vendor for who we think this transaction is from"}
|
|
{:db/ident :transaction/client
|
|
:db/valueType :db.type/ref
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "Client for who we think this transaction is for"}
|
|
{:db/ident :transaction/bank-account
|
|
:db/valueType :db.type/ref
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "The bank accout used for this transaction"}
|
|
{:db/ident :transaction/payment
|
|
:db/valueType :db.type/ref
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "The payment that this transaction matched to"}
|
|
])
|
|
|
|
(def user-schema
|
|
[{:db/ident :user/original-id
|
|
:db/valueType :db.type/long
|
|
:db/cardinality :db.cardinality/one
|
|
:db/unique :db.unique/identity
|
|
:db/doc "The id in the old system"}
|
|
{:db/ident :user/provider
|
|
:db/valueType :db.type/string
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "Provider for oauth for the user"}
|
|
{:db/ident :user/provider-id
|
|
:db/valueType :db.type/string
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "the id from the provider"}
|
|
{:db/ident :user/role
|
|
:db/valueType :db.type/ref
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "The role [:user :admin :none]"}
|
|
{:db/ident :user/name
|
|
:db/valueType :db.type/string
|
|
:db/cardinality :db.cardinality/one
|
|
:db/doc "name of the user"}
|
|
{:db/ident :user/clients
|
|
:db/valueType :db.type/ref
|
|
:db/cardinality :db.cardinality/many
|
|
:db/doc "The clients this user can view"}
|
|
|
|
;;enums
|
|
{:db/ident :user-role/admin}
|
|
{:db/ident :user-role/user}
|
|
{: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 [_]
|
|
[[]])
|
|
|
|
#_{:clj-kondo/ignore [:clojure-lsp/unused-public-var]}
|
|
(defn migrate-clients [_]
|
|
[[]])
|
|
|
|
#_{:clj-kondo/ignore [:clojure-lsp/unused-public-var]}
|
|
(defn migrate-invoices [_]
|
|
[[]])
|
|
|
|
#_{:clj-kondo/ignore [:clojure-lsp/unused-public-var]}
|
|
(defn migrate-payments [_]
|
|
[[]])
|
|
|
|
#_{:clj-kondo/ignore [:clojure-lsp/unused-public-var]}
|
|
(defn migrate-invoices-payments [_]
|
|
[[]])
|
|
|
|
#_{:clj-kondo/ignore [:clojure-lsp/unused-public-var]}
|
|
(defn migrate-invoices-expense-accounts [_]
|
|
[[]])
|
|
|
|
#_{:clj-kondo/ignore [:clojure-lsp/unused-public-var]}
|
|
(defn migrate-transactions [_]
|
|
[[]])
|
|
|
|
#_{:clj-kondo/ignore [:clojure-lsp/unused-public-var]}
|
|
(defn migrate-users [_]
|
|
[[]])
|
|
|
|
(defn merge-query [query-part-1 query-part-2]
|
|
(-> query-part-1
|
|
(update-in [:query :find] into (get-in query-part-2 [:query :find]))
|
|
(update-in [:query :in] into (get-in query-part-2 [:query :in]))
|
|
(update-in [:query :where] into (get-in query-part-2 [:query :where]))
|
|
(update-in [:args] into (get-in query-part-2 [:args]))))
|
|
|
|
(defn add-sorter-fields [q sort-map args]
|
|
(reduce
|
|
(fn [q {:keys [sort-key]}]
|
|
(merge-query q
|
|
{:query {:find [(symbol (str "?sort-" sort-key))]
|
|
:where (sort-map
|
|
sort-key
|
|
(println "Warning, trying to sort by unsupported field" sort-key))}}))
|
|
q
|
|
(:sort args)))
|
|
|
|
(defn add-sorter-fields-2 [q sort-map args]
|
|
(reduce
|
|
(fn [q {:keys [sort-key]}]
|
|
(merge-query q
|
|
{:query {:find [(last (last (sort-map
|
|
sort-key
|
|
(println "Warning, trying to sort by unsupported field" sort-key))))]
|
|
:where (sort-map
|
|
sort-key
|
|
(println "Warning, trying to sort by unsupported field" sort-key))}}))
|
|
q
|
|
(:sort args)))
|
|
|
|
(defn apply-sort-3 [args results]
|
|
(let [sort-bys (conj (:sort args)
|
|
{:sort-key "default" :asc (if (contains? args :default-asc?)
|
|
(:default-asc? args)
|
|
true)})
|
|
length (count sort-bys)
|
|
comparator (fn [xs ys]
|
|
(reduce
|
|
(fn [_ i]
|
|
(let [comparison (if (:asc (nth sort-bys i))
|
|
(compare (nth xs i) (nth ys i))
|
|
(compare (nth ys i) (nth xs i)))]
|
|
|
|
(if (not= 0 comparison)
|
|
(reduced comparison)
|
|
0)))
|
|
0
|
|
(range length)))]
|
|
(sort comparator results )))
|
|
|
|
(defn apply-pagination [args results]
|
|
(log/info (take 4 results))
|
|
|
|
{:ids (->> results
|
|
(drop (:start args 0))
|
|
(take (:count args (or (:per-page args) default-pagination-size)))
|
|
(map last))
|
|
:count (count results)})
|
|
|
|
(defn audit-transact-batch [txes id]
|
|
(let [batch-id (.toString (java.util.UUID/randomUUID))]
|
|
(reduce
|
|
(fn [full-tx batch]
|
|
(let [batch (conj (vec batch) {:db/id "datomic.tx"
|
|
:audit/user (str (:user/role id) "-" (:user/name id))
|
|
:audit/batch batch-id})
|
|
_ (mu/log ::transacting-batch
|
|
:batch batch-id
|
|
:count (count batch))
|
|
tx-result (dc/transact conn {:tx-data batch})]
|
|
|
|
(cond-> full-tx
|
|
(:tx-data full-tx) (update :tx-data #(into % (:tx-data tx-result)))
|
|
(not (:tx-data full-tx)) (assoc :tx-data (vec (:tx-data tx-result)))
|
|
(not (:db-before full-tx)) (assoc :db-before (:db-before tx-result))
|
|
true (assoc :db-after (:db-after tx-result))
|
|
true (update :tempids merge (:tempids tx-result)))))
|
|
|
|
{}
|
|
(partition-all 50 txes))))
|
|
|
|
(defn audit-transact [txes id]
|
|
(dc/transact conn {:tx-data (conj txes {:db/id "datomic.tx"
|
|
:audit/user (str (:user/role id) "-" (:user/name id))})}))
|
|
|
|
(defn pull-many [db read ids ]
|
|
(->> (dc/q '[:find (pull ?e r)
|
|
:in $ [?e ...] r]
|
|
db
|
|
ids
|
|
read)
|
|
(map first)))
|
|
|
|
(defn pull-many-by-id [db read ids ]
|
|
(into {}
|
|
(map (fn [[e]]
|
|
[(:db/id e) e]))
|
|
(dc/q '[:find (pull ?e r)
|
|
:in $ [?e ...] r]
|
|
db
|
|
ids
|
|
read)))
|
|
|
|
(defn random-tempid []
|
|
(str (UUID/randomUUID)))
|
|
|
|
(defn pull-attr [db k id]
|
|
(get (dc/pull db [k] id) k))
|
|
|
|
(defn pull-ref [db k id]
|
|
(:db/id (pull-attr db k id)))
|
|
|
|
|
|
(defn plus [db e a amount]
|
|
[[:db/add e a (-> (dc/pull db [a] e) a (+ amount))]])
|
|
|
|
#_(comment
|
|
(dc/pull (dc/db conn) '[*] 175921860633685)
|
|
|
|
(upsert-entity (dc/db conn) {:db/id 175921860633685 :invoice/invoice-number nil :invoice/date #inst "2021-01-01" :invoice/expense-accounts [:reset-rels [{:db/id "new" :invoice-expense-account/amount 1}]]})
|
|
|
|
(upsert-entity (dc/db conn) {:invoice/client #:db{:id 79164837221949},
|
|
:invoice/status #:db{:id 101155069755470, :ident :invoice-status/paid},
|
|
:invoice/due #inst "2020-12-23T08:00:00.000-00:00",
|
|
:invoice/invoice-number "12648",
|
|
:invoice/import-status
|
|
:import-status/imported,
|
|
:invoice/vendor nil,
|
|
:invoice/date #inst "2020-12-16T08:00:00.000-00:00",
|
|
:entity/migration-key 17592234924273,
|
|
:db/id 175921860633685,
|
|
:invoice/outstanding-balance 0.0,
|
|
:invoice/expense-accounts
|
|
[{:entity/migration-key 17592234924274,
|
|
:invoice-expense-account/location nil
|
|
:invoice-expense-account/amount 360.0,
|
|
: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",
|
|
:client/square-locations
|
|
[{:db/id 83562883711605,
|
|
:entity/migration-key 17592258901782,
|
|
:square-location/square-id "L2579ATQ0X1ET",
|
|
:square-location/name "20Twenty",
|
|
:square-location/client-location "WG"}],
|
|
:client/square-auth-token
|
|
"EAAAEEr749Ea6AdPTdngsmUPwIM3ETbPwcx3QQl_NS0KWuIL-JNzAg4f3W9DGQhb",
|
|
:client/bank-accounts
|
|
[{:bank-account/sort-order 2,
|
|
:bank-account/include-in-reports true,
|
|
:bank-account/number "3467",
|
|
:bank-account/code "20TY-WFCC3467",
|
|
:bank-account/locations ["WG"],
|
|
:entity/migration-key 17592245102834,
|
|
:bank-account/current-balance 11160.289999999979,
|
|
:bank-account/name "Wells Fargo CC - 3467",
|
|
:db/id 83562883732805,
|
|
:bank-account/start-date #inst "2021-12-01T08:00:00.000-00:00",
|
|
:bank-account/visible true,
|
|
:bank-account/type
|
|
#:db{:id 101155069755504, :ident :bank-account-type/credit},
|
|
:bank-account/intuit-bank-account #:db{:id 105553116286744},
|
|
:bank-account/integration-status
|
|
{:db/id 74766790691480,
|
|
:entity/migration-key 17592267080690,
|
|
:integration-status/last-updated #inst "2022-08-23T03:47:44.892-00:00",
|
|
:integration-status/last-attempt #inst "2022-08-23T03:47:44.892-00:00",
|
|
:integration-status/state
|
|
#:db{:id 101155069755529, :ident :integration-state/success}},
|
|
:bank-account/bank-name "Wells Fargo"}
|
|
{:bank-account/sort-order 0,
|
|
:bank-account/include-in-reports true,
|
|
:bank-account/numeric-code 11301,
|
|
:bank-account/check-number 301,
|
|
:bank-account/number "1734742859",
|
|
:bank-account/code "20TY-WF2882",
|
|
:bank-account/locations ["WG"],
|
|
:bank-account/bank-code "11-4288/1210 4285",
|
|
:entity/migration-key 17592241193004,
|
|
:bank-account/current-balance -47342.54000000085,
|
|
:bank-account/name "Wells Fargo Main - 2859",
|
|
:db/id 83562883732846,
|
|
:bank-account/start-date #inst "2021-12-01T08:00:00.000-00:00",
|
|
:bank-account/visible true,
|
|
:bank-account/type
|
|
#:db{:id 101155069755468, :ident :bank-account-type/check},
|
|
:bank-account/intuit-bank-account #:db{:id 105553116286745},
|
|
:bank-account/routing "121042882",
|
|
:bank-account/integration-status
|
|
{:db/id 74766790691458,
|
|
:entity/migration-key 17592267080255,
|
|
:integration-status/last-updated #inst "2022-08-23T03:46:45.879-00:00",
|
|
:integration-status/last-attempt #inst "2022-08-23T03:46:45.879-00:00",
|
|
:integration-status/state
|
|
#:db{:id 101155069755529, :ident :integration-state/success}},
|
|
:bank-account/bank-name "Wells Fargo"}
|
|
{:bank-account/sort-order 1,
|
|
:bank-account/include-in-reports true,
|
|
:bank-account/numeric-code 20101,
|
|
:bank-account/yodlee-account-id 27345526,
|
|
:bank-account/number "41006",
|
|
:bank-account/code "20TY-Amex41006",
|
|
:bank-account/locations ["WG"],
|
|
:entity/migration-key 17592241193006,
|
|
:bank-account/current-balance 9674.069999999963,
|
|
:bank-account/name "Amex - 41006",
|
|
:db/id 83562883732847,
|
|
:bank-account/visible true,
|
|
:bank-account/type
|
|
#:db{:id 101155069755504, :ident :bank-account-type/credit},
|
|
:bank-account/bank-name "American Express"}
|
|
{:bank-account/sort-order 3,
|
|
:bank-account/include-in-reports true,
|
|
:bank-account/numeric-code 11101,
|
|
:bank-account/code "20TY-0",
|
|
:bank-account/locations ["WG"],
|
|
:entity/migration-key 17592241193005,
|
|
:bank-account/current-balance 0.0,
|
|
:bank-account/name "CASH",
|
|
:db/id 83562883732848,
|
|
:bank-account/visible true,
|
|
:bank-account/type
|
|
#:db{:id 101155069755469, :ident :bank-account-type/cash}}],
|
|
:entity/migration-key 17592241193003,
|
|
:db/id 79164837221904,
|
|
:client/address
|
|
{:db/id 105553116285906,
|
|
:entity/migration-key 17592250661126,
|
|
:address/street1 "1389 Lincoln Ave",
|
|
:address/city "San Jose",
|
|
:address/state "CA",
|
|
:address/zip "95125"},
|
|
:client/code "NY",
|
|
:client/locations ["WE" "NG"],
|
|
:client/square-integration-status
|
|
{:db/id 74766790691447,
|
|
:entity/migration-key 17592267072653,
|
|
: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}}})
|
|
|
|
)
|
|
|
|
|
|
|
|
(defn transact-schema [conn]
|
|
(dc/transact conn
|
|
{:tx-data (edn/read-string (slurp (io/resource "schema.edn")))})
|
|
|
|
;; this is temporary for any new stuff that needs to be asserted for cloud migration.
|
|
(dc/transact conn
|
|
{:tx-data (edn/read-string (slurp (io/resource "cloud-migration-schema.edn")))}))
|