From 7b622b945a5629c98a6c2d6b1681f0852560bdfb Mon Sep 17 00:00:00 2001 From: Bryce Date: Fri, 8 Mar 2024 19:19:22 -0800 Subject: [PATCH] Adds little indicator on bank account form --- src/clj/auto_ap/graphql.fiddle | 0 src/clj/auto_ap/import/intuit.fiddle | 19 +++++ src/clj/auto_ap/plaid/core.fiddle | 15 ++++ src/clj/auto_ap/ssr/admin/clients.clj | 95 ++++++++++++++++--------- src/clj/auto_ap/ssr/core.clj | 5 +- src/clj/auto_ap/ssr/indicators.clj | 40 +++++++++++ src/cljc/auto_ap/routes/indicators.cljc | 6 ++ src/cljc/auto_ap/ssr_routes.cljc | 2 + 8 files changed, 149 insertions(+), 33 deletions(-) create mode 100644 src/clj/auto_ap/graphql.fiddle create mode 100644 src/clj/auto_ap/import/intuit.fiddle create mode 100644 src/clj/auto_ap/plaid/core.fiddle create mode 100644 src/clj/auto_ap/ssr/indicators.clj create mode 100644 src/cljc/auto_ap/routes/indicators.cljc diff --git a/src/clj/auto_ap/graphql.fiddle b/src/clj/auto_ap/graphql.fiddle new file mode 100644 index 00000000..e69de29b diff --git a/src/clj/auto_ap/import/intuit.fiddle b/src/clj/auto_ap/import/intuit.fiddle new file mode 100644 index 00000000..f26b0196 --- /dev/null +++ b/src/clj/auto_ap/import/intuit.fiddle @@ -0,0 +1,19 @@ +(ns auto-ap.import.intuit + (:require + [auto-ap.datomic :refer [conn]] + [auto-ap.import.common :refer [wrap-integration]] + [auto-ap.import.transactions :as t] + [auto-ap.intuit.core :as i] + [auto-ap.logging :as alog] + [auto-ap.time :as atime] + [clj-time.coerce :as coerce] + [clj-time.core :as time] + [clojure.string :as str] + [com.unbounce.dogstatsd.core :as statsd] + [datomic.api :as dc])) +(for [[e] (take 5 (get-intuit-bank-accounts (dc/db conn)))] + + (i/get-transactions "2023-02-01" + "2023-02-05" + e)) + diff --git a/src/clj/auto_ap/plaid/core.fiddle b/src/clj/auto_ap/plaid/core.fiddle new file mode 100644 index 00000000..45ee7ed4 --- /dev/null +++ b/src/clj/auto_ap/plaid/core.fiddle @@ -0,0 +1,15 @@ +(let [client-code "NGKG-CH2231" + [[external-id token]] (seq (dc/q '[:find ?external-id ?t + :in $ ?ba + :where + [?ba :bank-account/plaid-account ?pa] + [?pa :plaid-account/external-id ?external-id] + [?pi :plaid-item/accounts ?pa] + [?pi :plaid-item/access-token ?t]] + (dc/db conn) + [:bank-account/code client-code])) + end (atime/local-now) + start (clj-time.core/plus end (clj-time.core/days -30)) + ] + (get-transactions token start end)) + diff --git a/src/clj/auto_ap/ssr/admin/clients.clj b/src/clj/auto_ap/ssr/admin/clients.clj index 8337e16d..0d620d01 100644 --- a/src/clj/auto_ap/ssr/admin/clients.clj +++ b/src/clj/auto_ap/ssr/admin/clients.clj @@ -7,6 +7,8 @@ [auto-ap.logging :as alog] [auto-ap.routes.admin.clients :as route] [auto-ap.routes.queries :as q] + [auto-ap.routes.indicators :as indicators] + [auto-ap.ssr.indicators :as i] [auto-ap.routes.utils :refer [wrap-admin wrap-client-redirect-unauthenticated]] [auto-ap.solr :as solr] @@ -797,23 +799,33 @@ :value (fc/field-value)})])) (fc/with-field :bank-account/start-date - (com/validated-field {:errors (fc/field-errors) - :label "Start Date"} - [:div {:class "w-[7em]"} - (com/date-input {:name (fc/field-name) - :error? (fc/error?) - :placeholder "12/01/2023" - :class "w-[5em]" - :value (some-> (fc/field-value) + [:div.flex.space-x-2.items-center + (com/validated-field {:errors (fc/field-errors) + :label "Start Date"} + [:div {:class "w-[7em]"} + (com/date-input {:name (fc/field-name) + :error? (fc/error?) + :placeholder "12/01/2023" + :hx-get (bidi/path-for ssr-routes/only-routes + ::indicators/days-ago) + :hx-trigger "change" + :hx-target "#days-indicator" + :hx-vals "js:{date: event.target.value}" + :hx-swap "innerHTML" + :class "w-[5em]" + :value (some-> (fc/field-value) + (clj-time.coerce/to-date-time) + ;; todo do date coercion in the input + (atime/unparse-local atime/normal-date))})]) + [:div#days-indicator + (i/days-ago* (some-> (fc/field-value)))]]) - (clj-time.coerce/to-date-time) - (atime/unparse-local atime/normal-date))})])) (fc/with-field :bank-account/include-in-reports (com/checkbox {:name (fc/field-name) :value (boolean (fc/field-value)) :checked (fc/field-value)} "Include in reports")) - [:div + [:div (fc/with-field :bank-account/visible (com/checkbox {:name (fc/field-name) :value (boolean (fc/field-value)) @@ -938,17 +950,27 @@ :value (fc/field-value)})])) (fc/with-field :bank-account/start-date - (com/validated-field {:errors (fc/field-errors) - :label "Start Date"} - [:div {:class "w-[7em]"} - (com/date-input {:name (fc/field-name) - :error? (fc/error?) - :placeholder "12/01/2023" - :class "w-[5em]" - :value (some-> (fc/field-value) - (clj-time.coerce/to-date-time) + [:div.flex.space-x-2.items-center + (com/validated-field {:errors (fc/field-errors) + :label "Start Date"} + [:div {:class "w-[7em]"} + (com/date-input {:name (fc/field-name) + :error? (fc/error?) + :placeholder "12/01/2023" + :hx-get (bidi/path-for ssr-routes/only-routes + ::indicators/days-ago) + :hx-trigger "change" + :hx-target "#days-indicator" + :hx-vals "js:{date: event.target.value}" + :hx-swap "innerHTML" + :class "w-[5em]" + :value (some-> (fc/field-value) + (clj-time.coerce/to-date-time) ;; todo do date coercion in the input - (atime/unparse-local atime/normal-date))})])) + (atime/unparse-local atime/normal-date))})]) + [:div#days-indicator + (i/days-ago* (some-> (fc/field-value))) ]]) + (fc/with-field :bank-account/include-in-reports (com/checkbox {:name (fc/field-name) @@ -956,7 +978,7 @@ :checked (fc/field-value)} "Include in reports")) - [:div + [:div (fc/with-field :bank-account/visible (com/checkbox {:name (fc/field-name) :value (boolean (fc/field-value)) @@ -1038,17 +1060,26 @@ :value (fc/field-value)})])) (fc/with-field :bank-account/start-date - (com/validated-field {:errors (fc/field-errors) - :label "Start Date"} - [:div {:class "w-[7em]"} - (com/date-input {:name (fc/field-name) - :error? (fc/error?) - :placeholder "12/01/2023" - :class "w-[5em]" - :value (some-> (fc/field-value) - (clj-time.coerce/to-date-time) + [:div.flex.space-x-2.items-center + (com/validated-field {:errors (fc/field-errors) + :label "Start Date"} + [:div {:class "w-[7em]"} + (com/date-input {:name (fc/field-name) + :error? (fc/error?) + :placeholder "12/01/2023" + :hx-get (bidi/path-for ssr-routes/only-routes + ::indicators/days-ago) + :hx-trigger "change" + :hx-target "#days-indicator" + :hx-vals "js:{date: event.target.value}" + :hx-swap "innerHTML" + :class "w-[5em]" + :value (some-> (fc/field-value) + (clj-time.coerce/to-date-time) ;; todo do date coercion in the input - (atime/unparse-local atime/normal-date))})])) + (atime/unparse-local atime/normal-date))})]) + [:div#days-indicator + (i/days-ago* (some-> (fc/field-value))) ]]) (fc/with-field :bank-account/include-in-reports (com/checkbox {:name (fc/field-name) diff --git a/src/clj/auto_ap/ssr/core.clj b/src/clj/auto_ap/ssr/core.clj index f02a77f3..c808e95a 100644 --- a/src/clj/auto_ap/ssr/core.clj +++ b/src/clj/auto_ap/ssr/core.clj @@ -14,6 +14,7 @@ [auto-ap.ssr.admin.vendors :as admin-vendors] [auto-ap.ssr.admin.clients :as admin-clients] [auto-ap.ssr.auth :as auth] + [auto-ap.ssr.indicators :as indicators] [auto-ap.ssr.company :as company] [auto-ap.ssr.company-dropdown :as company-dropdown] [auto-ap.ssr.company.company-1099 :as company-1099] @@ -92,5 +93,7 @@ (into admin-jobs/key->handler) (into admin-vendors/key->handler) (into admin-clients/key->handler) - (into admin-rules/key->handler))) + (into admin-rules/key->handler) + (into indicators/key->handler))) + diff --git a/src/clj/auto_ap/ssr/indicators.clj b/src/clj/auto_ap/ssr/indicators.clj new file mode 100644 index 00000000..e9ef753e --- /dev/null +++ b/src/clj/auto_ap/ssr/indicators.clj @@ -0,0 +1,40 @@ +(ns auto-ap.ssr.indicators + (:require [auto-ap.routes.indicators :as route] + [auto-ap.ssr.components :as com] + [auto-ap.ssr.utils :refer [html-response wrap-schema-enforce]] + [auto-ap.time :as atime] + [clj-time.coerce :as c] + [clj-time.core :as t])) + +(defn days-ago* [date] + (if date + (let [start (c/to-date-time date) + today (t/now)] + + (if (t/before? start today) + (let [days (t/in-days (t/interval start today))] + (com/pill {:color (cond (< days 30) + :primary + (< days 60) + :secondary + (< days 90) + :yellow + :else + :red)} + (str days " days ago"))) + (com/pill {:color :primary} + (str (inc (t/in-days (t/interval today start))) " days from now")))) + [:div])) + +(defn days-ago [request] + (html-response (days-ago* (:date (:query-params request))))) + +(def key->handler + {::route/days-ago (wrap-schema-enforce days-ago + :query-schema + [:map [:date {:optional false + :decode/arbitrary (fn [m] + (if (string? m) + (c/to-date (atime/parse m atime/normal-date)) + m))} + inst?]])}) \ No newline at end of file diff --git a/src/cljc/auto_ap/routes/indicators.cljc b/src/cljc/auto_ap/routes/indicators.cljc new file mode 100644 index 00000000..21306d34 --- /dev/null +++ b/src/cljc/auto_ap/routes/indicators.cljc @@ -0,0 +1,6 @@ +(ns auto-ap.routes.indicators) +(def routes + {"/days-ago" ::days-ago}) + + + diff --git a/src/cljc/auto_ap/ssr_routes.cljc b/src/cljc/auto_ap/ssr_routes.cljc index d7f11681..25668388 100644 --- a/src/cljc/auto_ap/ssr_routes.cljc +++ b/src/cljc/auto_ap/ssr_routes.cljc @@ -2,6 +2,7 @@ (:require [auto-ap.routes.admin.excel-invoices :as ei-routes] [auto-ap.routes.admin.import-batch :as ib-routes] + [auto-ap.routes.indicators :as indicator-routes] [auto-ap.routes.admin.vendors :as v-routes] [auto-ap.routes.admin.clients :as ac-routes] [auto-ap.routes.admin.transaction-rules :as tr-routes])) @@ -9,6 +10,7 @@ (def routes {"impersonate" :impersonate "logout" :logout "search" :search + "indicators" indicator-routes/routes "invoice" {"/glimpse" {"" {:get :invoice-glimpse :post :invoice-glimpse-upload ["/" [#"\w+" :textract-invoice-id]] {:get :invoice-glimpse-textract-invoice