108 lines
6.3 KiB
Clojure
108 lines
6.3 KiB
Clojure
(ns auto-ap.datomic.clients
|
|
(:require
|
|
[auto-ap.datomic :refer [conn]]
|
|
[auto-ap.search :as search]
|
|
[clj-time.coerce :as coerce]
|
|
[clojure.string :as str]
|
|
[datomic.client.api :as dc]))
|
|
|
|
(defn cleanse [e]
|
|
(-> e
|
|
(assoc :client/yodlee-provider-accounts (get e :yodlee-provider-account/_client))
|
|
(assoc :client/plaid-items (get e :plaid-item/_client))
|
|
(update :client/locked-until #(some-> % coerce/to-date-time))
|
|
(update-in [:client/square-integration-status :integration-status/state] :db/ident)
|
|
(update-in [:client/square-integration-status :integration-status/last-attempt] #(some-> % coerce/to-date-time))
|
|
(update-in [:client/square-integration-status :integration-status/last-updated] #(some-> % coerce/to-date-time))
|
|
(update :client/location-matches
|
|
(fn [lms]
|
|
(map #(assoc % :location-match/match (first (:location-match/matches %))) lms)))
|
|
(update :client/bank-accounts
|
|
(fn [bas]
|
|
(map (fn [i ba]
|
|
(-> ba
|
|
(update :bank-account/type :db/ident )
|
|
(update-in [:bank-account/integration-status :integration-status/state] :db/ident)
|
|
(update-in [:bank-account/integration-status :integration-status/last-attempt] #(some-> % coerce/to-date-time))
|
|
(update-in [:bank-account/integration-status :integration-status/last-updated] #(some-> % coerce/to-date-time))
|
|
(update :bank-account/start-date #(some-> % (coerce/to-date-time)))
|
|
(update :bank-account/sort-order (fn [so] (or so i)))))
|
|
(range) bas)))))
|
|
(defn get-all []
|
|
(->> (dc/q '[:find (pull ?e [*
|
|
{:client/square-integration-status [:integration-status/message
|
|
:integration-status/last-attempt
|
|
:integration-status/last-updated
|
|
:db/id
|
|
{:integration-status/state [:db/ident]}]}
|
|
{:client/address [*]}
|
|
{:client/square-locations [:square-location/square-id
|
|
:square-location/name
|
|
:square-location/client-location
|
|
:db/id]}
|
|
|
|
{:client/ezcater-locations [{:ezcater-location/caterer [:ezcater-caterer/name :db/id]}
|
|
:ezcater-location/location
|
|
:db/id]}
|
|
{:client/bank-accounts [* {:bank-account/type [*]
|
|
:bank-account/yodlee-account [:yodlee-account/name :yodlee-account/id :yodlee-account/number]
|
|
:bank-account/plaid-account [:plaid-account/name :db/id :plaid-account/number :plaid-account/balance]
|
|
:bank-account/intuit-bank-account [:intuit-bank-account/name :intuit-bank-account/external-id :db/id]
|
|
:bank-account/integration-status [:integration-status/message
|
|
:db/id
|
|
:integration-status/last-attempt
|
|
:integration-status/last-updated
|
|
{:integration-status/state [:db/ident]}]}
|
|
]}
|
|
{:yodlee-provider-account/_client [*]}
|
|
{:plaid-item/_client [*]}
|
|
{:client/emails [:db/id :email-contact/email :email-contact/description]}])
|
|
:where [?e :client/name]]
|
|
(dc/db conn))
|
|
(map first)
|
|
(map cleanse)))
|
|
|
|
(defn get-by-id [id]
|
|
(->>
|
|
(dc/pull (dc/db conn )
|
|
'[* {:client/bank-accounts [* {:bank-account/type [*]
|
|
:bank-account/yodlee-account [:yodlee-account/name :yodlee-account/id :yodlee-account/number]
|
|
:bank-account/intuit-bank-account [:intuit-bank-account/name :intuit-bank-account/external-id :db/id]
|
|
:bank-account/plaid-account [:plaid-account/name :db/id :plaid-account/number :plaid-account/balance]}]
|
|
:client/emails [:db/id :email-contact/email :email-contact/description]}
|
|
{:client/ezcater-locations [{:ezcater-location/caterer [:ezcater-caterer/name :db/id]}
|
|
:ezcater-location/location
|
|
:db/id]}
|
|
{:yodlee-provider-account/_client [*]}
|
|
{:plaid-item/_client [*]}]
|
|
id)
|
|
(cleanse)))
|
|
|
|
(defn code->id [code]
|
|
(->>
|
|
(dc/q (-> {:query {:find ['?e]
|
|
:in ['$ '?code]
|
|
:where [['?e :client/code '?code ]]}
|
|
:args [(dc/db conn) code]}))
|
|
(first)
|
|
(first)))
|
|
|
|
(defn best-match [identifier]
|
|
(first (search/search-ids {:q (str/replace identifier #"[\(\)\-/\*\]\[\#:\&]" " ")} "client")))
|
|
|
|
(defn exact-match [identifier]
|
|
(first (search/search-ids {:exact-match (str/upper-case identifier)} "client")))
|
|
|
|
(defn rebuild-search-index []
|
|
(search/full-index-query
|
|
(for [result (map first (dc/q '[:find (pull ?v [:client/name :client/matches :db/id])
|
|
:in $
|
|
:where [?v :client/code]]
|
|
(dc/db conn)))
|
|
match (conj (or (:client/matches result) [])
|
|
(:client/name result))]
|
|
{:id (:db/id result)
|
|
:text match
|
|
:exact-match (str/upper-case match)})
|
|
"client"))
|