From 922c449bb0a0105d18f44b593f409d61d1f0c9ef Mon Sep 17 00:00:00 2001 From: Bryce Covert Date: Fri, 4 Jun 2021 10:50:27 -0700 Subject: [PATCH] Improves IOL. Adds saved queries. Adds expected deposits in app. --- resources/public/img/logo-big.png | Bin 0 -> 13612 bytes src/clj/auto_ap/graphql.clj | 18 +++ src/clj/auto_ap/graphql/expected_deposit.clj | 5 + src/clj/auto_ap/handler.clj | 2 +- src/clj/auto_ap/routes/queries.clj | 142 ++++++++++-------- src/clj/auto_ap/square/core.clj | 7 +- src/cljc/auto_ap/client_routes.cljc | 3 +- .../auto_ap/views/components/layouts.cljs | 2 +- src/cljs/auto_ap/views/main.cljs | 6 +- .../views/pages/pos/expected_deposits.cljs | 72 +++++++++ .../pages/pos/expected_deposits/table.cljs | 47 ++++++ .../pages/{sales_orders => pos}/form.cljs | 2 +- .../views/pages/{ => pos}/sales_orders.cljs | 8 +- .../pages/{sales_orders => pos}/side_bar.cljs | 17 ++- .../pages/{sales_orders => pos}/table.cljs | 7 +- 15 files changed, 256 insertions(+), 82 deletions(-) create mode 100644 resources/public/img/logo-big.png create mode 100644 src/cljs/auto_ap/views/pages/pos/expected_deposits.cljs create mode 100644 src/cljs/auto_ap/views/pages/pos/expected_deposits/table.cljs rename src/cljs/auto_ap/views/pages/{sales_orders => pos}/form.cljs (99%) rename src/cljs/auto_ap/views/pages/{ => pos}/sales_orders.cljs (93%) rename src/cljs/auto_ap/views/pages/{sales_orders => pos}/side_bar.cljs (62%) rename src/cljs/auto_ap/views/pages/{sales_orders => pos}/table.cljs (91%) diff --git a/resources/public/img/logo-big.png b/resources/public/img/logo-big.png new file mode 100644 index 0000000000000000000000000000000000000000..01f336f4c0359c3e10d4fb05f9db374bfd3d1ee0 GIT binary patch literal 13612 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 (first (d-expected-deposit/get-graphql (assoc (<-graphql args) :count Integer/MAX_VALUE))))) + +(defn get-expected-deposit-page [context args value] + (let [args (assoc args :id (:id context)) + [expected-deposits expected-deposit-count] (d-expected-deposit/get-graphql (<-graphql args))] + (result->page expected-deposits expected-deposit-count :expected_deposits args ))) diff --git a/src/clj/auto_ap/handler.clj b/src/clj/auto_ap/handler.clj index 3deb281b..4f43c6b8 100644 --- a/src/clj/auto_ap/handler.clj +++ b/src/clj/auto_ap/handler.clj @@ -57,7 +57,7 @@ exports/export-routes yodlee/routes yodlee2/routes - queries/query-routes + queries/query2-routes invoices/routes graphql/routes auth/routes diff --git a/src/clj/auto_ap/routes/queries.clj b/src/clj/auto_ap/routes/queries.clj index bd8a748f..8d83388a 100644 --- a/src/clj/auto_ap/routes/queries.clj +++ b/src/clj/auto_ap/routes/queries.clj @@ -51,68 +51,82 @@ (into (list) (apply d/q (clojure.edn/read-string query-string) (into [(d/db conn)] (clojure.edn/read-string (get query-params "args" "[]"))))))))) -(def query-routes + +(def json-routes + (context "/queries" [] + (POST "/" {:keys [query-params identity] :as request} + (assert-admin identity) + (let [uuid (str (UUID/randomUUID)) + body (body-string request)] + (s3/put-object :bucket-name (:data-bucket env) + :key (str "queries/" uuid) + :input-stream (io/make-input-stream (.getBytes body) {}) + :metadata {:content-type "application/text" + :user-metadata {:note (query-params "note")}}) + {:body {:query body + :id uuid + :results-url (str "/api/queries/" uuid "/results") + :csv-results-url (str "/api/queries/" uuid "/results/csv") + :json-results-url (str "/api/queries/" uuid "/results/json")}}) + + ) + (PUT "/:query-id" {:keys [query-params identity params] :as request} + (assert-admin identity) + (log/info "Note" (query-params "note")) + (let [body (body-string request)] + (s3/put-object :bucket-name (:data-bucket env) + :key (str "queries/" (:query-id params)) + :input-stream (io/make-input-stream (.getBytes body) {}) + :metadata {:content-type "application/text" + :user-metadata {:note (query-params "note")}}) + {:body {:query body + :id (:query-id params) + :csv-results-url (str "/api/queries/" (:query-id params) "/results/csv") + :json-results-url (str "/api/queries/" (:query-id params) "/results/json")}})) + (GET "/:query-id" {:keys [query-params identity params]} + (assert-admin identity) + (let [{:keys [query-id]} params + obj (s3/get-object :bucket-name (:data-bucket env) + :key (str "queries/" query-id)) + query-string (str (slurp (:object-content obj)))] + (log/info obj) + {:body {:query query-string + :note (:note (:user-metadata (:object-metadata obj))) + :id query-id + :csv-results-url (str "/api/queries/" query-id "/results/csv") + :json-results-url (str "/api/queries/" query-id "/results/json")}})) + + + (GET "/" {:keys [query-params identity params]} + (assert-admin identity) + (let [{:keys [query-id]} params + obj (s3/list-objects :bucket-name (:data-bucket env) + :prefix (str "queries/"))] + (log/info obj) + {:body {}})) + + (GET "/:query-id/results/json" {:keys [query-params identity params]} + {:body (execute-query query-params params)}) + )) + + +(def raw-routes + (context "/queries" [] + (GET "/:query-id/raw" {:keys [query-params identity params]} + (assert-admin identity) + (let [{:keys [query-id]} params + obj (s3/get-object :bucket-name (:data-bucket env) + :key (str "queries/" query-id)) + query-string (str (slurp (:object-content obj)))] + (log/info obj) + {:body query-string})))) + +(def csv-routes + (context "/queries" [] + (GET "/:query-id/results/csv" {:keys [query-params identity params]} + {:body (execute-query query-params params)}))) +(defroutes query2-routes (routes - (wrap-json-response (POST "/queries" {:keys [query-params identity] :as request} - (assert-admin identity) - (let [uuid (str (UUID/randomUUID)) - body (body-string request)] - (s3/put-object :bucket-name (:data-bucket env) - :key (str "queries/" uuid) - :input-stream (io/make-input-stream (.getBytes body) {}) - :metadata {:content-type "application/text" - :user-metadata {:note (query-params "note")}}) - {:body {:query body - :id uuid - :results-url (str "/api/queries/" uuid "/results") - :csv-results-url (str "/api/queries/" uuid "/results/csv") - :json-results-url (str "/api/queries/" uuid "/results/json")}}) - - )) - (wrap-json-response (PUT "/queries/:query-id" {:keys [query-params identity params] :as request} - (assert-admin identity) - (log/info "Note" (query-params "note")) - (let [body (body-string request)] - (s3/put-object :bucket-name (:data-bucket env) - :key (str "queries/" (:query-id params)) - :input-stream (io/make-input-stream (.getBytes body) {}) - :metadata {:content-type "application/text" - :user-metadata {:note (query-params "note")}}) - {:body {:query body - :id (:query-id params) - :csv-results-url (str "/api/queries/" (:query-id params) "/results/csv") - :json-results-url (str "/api/queries/" (:query-id params) "/results/json")}}))) - (wrap-json-response (GET "/queries/:query-id" {:keys [query-params identity params]} - (assert-admin identity) - (let [{:keys [query-id]} params - obj (s3/get-object :bucket-name (:data-bucket env) - :key (str "queries/" query-id)) - query-string (str (slurp (:object-content obj)))] - (log/info obj) - {:body {:query query-string - :note (:note (:user-metadata (:object-metadata obj))) - :id query-id - :csv-results-url (str "/api/queries/" query-id "/results/csv") - :json-results-url (str "/api/queries/" query-id "/results/json")}}))) - (GET "/queries/:query-id/raw" {:keys [query-params identity params]} - (assert-admin identity) - (let [{:keys [query-id]} params - obj (s3/get-object :bucket-name (:data-bucket env) - :key (str "queries/" query-id)) - query-string (str (slurp (:object-content obj)))] - (log/info obj) - {:body query-string})) - - (wrap-json-response (GET "/queries/" {:keys [query-params identity params]} - (assert-admin identity) - (let [{:keys [query-id]} params - obj (s3/list-objects :bucket-name (:data-bucket env) - :prefix (str "queries/"))] - (log/info obj) - {:body {}}))) - - (wrap-json-response (GET "/queries/:query-id/results/json" {:keys [query-params identity params]} - {:body (execute-query query-params params)})) - (wrap-csv-response (GET "/queries/:query-id/results/csv" {:keys [query-params identity params]} - {:body (execute-query query-params params)})) - )) + (wrap-routes json-routes + wrap-json-response) + (wrap-routes csv-routes wrap-csv-response))) diff --git a/src/clj/auto_ap/square/core.clj b/src/clj/auto_ap/square/core.clj index 4a857f46..036f401e 100644 --- a/src/clj/auto_ap/square/core.clj +++ b/src/clj/auto_ap/square/core.clj @@ -23,7 +23,7 @@ (defn fetch-catalog [i] (if i - (do + (try (log/info "looking up catalog for" (str "https://connect.squareup.com/v2/catalog/object/" i)) (->> (client/get (str "https://connect.squareup.com/v2/catalog/object/" i) {:headers {"Square-Version" "2020-08-12" @@ -32,7 +32,10 @@ :query-params {"include_related_items" "true"} :as :json}) :body - :object)) + :object) + (catch Exception e + (log/error e) + nil)) (log/warn "Trying to look up non existant "))) (def fetch-catalog-fast (memoize fetch-catalog)) diff --git a/src/cljc/auto_ap/client_routes.cljc b/src/cljc/auto_ap/client_routes.cljc index 5c196cd6..0ff3b14f 100644 --- a/src/cljc/auto_ap/client_routes.cljc +++ b/src/cljc/auto_ap/client_routes.cljc @@ -22,7 +22,8 @@ "paid" :paid-invoices "voided" :voided-invoices "new" :new-invoice} - "sales-orders/" {"" :sales-orders} + "pos/" {"sales-orders" :sales-orders + "expected-deposits" :expected-deposits} "transactions/" {"" :transactions "unapproved" :unapproved-transactions "approved" :approved-transactions diff --git a/src/cljs/auto_ap/views/components/layouts.cljs b/src/cljs/auto_ap/views/components/layouts.cljs index 2f8c3cb8..ae89f6f5 100644 --- a/src/cljs/auto_ap/views/components/layouts.cljs +++ b/src/cljs/auto_ap/views/components/layouts.cljs @@ -112,7 +112,7 @@ (when (= "admin" (:user/role @user)) [:a.navbar-item {:class [(active-when ap = :sales-orders)] :href (bidi/path-for routes/routes :sales-orders)} - "Sales Orders" ]) + "POS" ]) [:a.navbar-item {:class [(active-when ap = :transactions)] :href (bidi/path-for routes/routes :transactions)} "Transactions" ] diff --git a/src/cljs/auto_ap/views/main.cljs b/src/cljs/auto_ap/views/main.cljs index 3637815a..0a4b3855 100644 --- a/src/cljs/auto_ap/views/main.cljs +++ b/src/cljs/auto_ap/views/main.cljs @@ -19,7 +19,8 @@ [auto-ap.views.pages.ledger.profit-and-loss :refer [profit-and-loss-page]] [auto-ap.views.pages.login :refer [login-page]] [auto-ap.views.pages.payments :refer [payments-page]] - [auto-ap.views.pages.sales-orders :refer [sales-orders-page]] + [auto-ap.views.pages.pos.sales-orders :refer [sales-orders-page]] + [auto-ap.views.pages.pos.expected-deposits :refer [expected-deposits-page]] [auto-ap.views.pages.admin :refer [admin-page]] [auto-ap.views.pages.home :refer [home-page]] [auto-ap.views.pages.admin.clients :refer [admin-clients-page]] @@ -59,6 +60,9 @@ (defmethod page :sales-orders [_] [sales-orders-page]) +(defmethod page :expected-deposits [_] + [expected-deposits-page]) + (defmethod page :transactions [_] (transactions-page {})) diff --git a/src/cljs/auto_ap/views/pages/pos/expected_deposits.cljs b/src/cljs/auto_ap/views/pages/pos/expected_deposits.cljs new file mode 100644 index 00000000..4a39b7c8 --- /dev/null +++ b/src/cljs/auto_ap/views/pages/pos/expected_deposits.cljs @@ -0,0 +1,72 @@ +(ns auto-ap.views.pages.pos.expected-deposits + (:require [auto-ap.forms :as forms] + [auto-ap.subs :as subs] + [auto-ap.views.components.layouts :refer [side-bar-layout appearing-side-bar]] + [auto-ap.views.pages.data-page :as data-page] + [auto-ap.views.pages.pos.form :as form] + [auto-ap.views.pages.pos.side-bar :as side-bar] + [auto-ap.views.pages.pos.expected-deposits.table :as table] + [auto-ap.views.utils :refer [with-user]] + [clojure.set :as set] + [re-frame.core :as re-frame] + [reagent.core :as reagent] + [vimsical.re-frame.fx.track :as track])) + +(re-frame/reg-event-fx + ::params-change + [with-user] + (fn [{:keys [user db ]}[_ params]] + {:graphql {:token user + :owns-state {:single [::data-page/page ::page]} + :query-obj {:venia/queries [[:expected_deposit_page + {:start (:start params 0) + :sort (:sort params) + :per-page (:per-page params) + :total-gte (:amount-gte (:total-range params)) + :total-lte (:amount-lte (:total-range params)) + :date-range (:date-range params) + :client-id (:id @(re-frame/subscribe [::subs/client]))} + [[:expected-deposits [:id :total :fee :location :date + [:client [:name :id]]]] + :total + :start + :end]]]} + :on-success (fn [result] + (let [result (set/rename-keys (:expected-deposit-page result) + {:expected-deposits :data})] + [::data-page/received ::page result]))}})) + + +(re-frame/reg-event-fx + ::unmounted + (fn [{:keys [db]} _] + {:dispatch [::data-page/dispose ::page] + ::track/dispose {:id ::params}})) + +(re-frame/reg-event-fx + ::mounted + (fn [{:keys [db]} _] + {::track/register {:id ::params + :subscription [::data-page/params ::page] + :event-fn (fn [params] + [::params-change params])}})) + +(defn content [] + [:div + [:h1.title "Expected Deposits"] + [table/table {:id :expected-deposits + :data-page ::page}]]) + +(defn expected-deposits-page [] + (reagent/create-class + {:display-name "expected-deposits-page" + :component-will-unmount #(re-frame/dispatch-sync [::unmounted]) + :component-did-mount #(re-frame/dispatch [::mounted]) + :reagent-render + (fn [] + (let [{form-active? :active?} @(re-frame/subscribe [::forms/form ::form/form])] + [side-bar-layout {:side-bar [side-bar/side-bar {:data-page ::page}] + :main [content] + :right-side-bar [appearing-side-bar {:visible? form-active?} + [form/form {}]]}]))})) + diff --git a/src/cljs/auto_ap/views/pages/pos/expected_deposits/table.cljs b/src/cljs/auto_ap/views/pages/pos/expected_deposits/table.cljs new file mode 100644 index 00000000..2234b275 --- /dev/null +++ b/src/cljs/auto_ap/views/pages/pos/expected_deposits/table.cljs @@ -0,0 +1,47 @@ + +(ns auto-ap.views.pages.pos.expected-deposits.table + (:require [auto-ap.subs :as subs] + [auto-ap.views.components.buttons :as buttons] [auto-ap.views.components.grid :as grid] + [auto-ap.views.pages.data-page :as data-page] + [auto-ap.views.pages.pos.form :as form] + [auto-ap.views.utils :refer [date->str nf]] + [clojure.string :as str] + [re-frame.core :as re-frame])) + +(defn row [{sales-order :sales-order + selected-client :selected-client}] + (let [{:keys [client location date total fee id]} sales-order] + [grid/row {:class (:class sales-order) :id id} + (when-not selected-client + [grid/cell {} (:name client)]) + [grid/cell location ] + [grid/cell {} (date->str date) ] + [grid/cell {:class "has-text-right"} (nf total )] + [grid/cell {:class "has-text-right"} (nf fee )] + +[grid/button-cell {} + [:div.buttons + [buttons/fa-icon {:event [::form/editing sales-order] :icon "fa-pencil"}]]]])) + +(defn table [{:keys [data-page]}] + (let [selected-client @(re-frame/subscribe [::subs/client]) + {:keys [data status]} @(re-frame/subscribe [::data-page/page data-page])] + [grid/grid {:data-page data-page + :column-count (if selected-client 7 8)} + [grid/controls data] + [grid/table {:fullwidth true} + [grid/header {} + [grid/row {} + (when-not selected-client + [grid/sortable-header-cell {:sort-key "client" :sort-name "Client"} "Client"]) + [grid/sortable-header-cell {:sort-key "location" :sort-name "Location" :style {:width "7em"}} "Location"] + [grid/sortable-header-cell {:sort-key "date" :sort-name "Date" :style {:width "8em"}} "Date"] + [grid/sortable-header-cell {:sort-key "total" :sort-name "Total" :class "has-text-right" :style {:width "8em"}} "Total"] + [grid/sortable-header-cell {:sort-key "fee" :sort-name "Fee" :class "has-text-right" :style {:width "7em"}} "Fee"] + + [grid/header-cell {:style {:width "4em"}}]]] + [grid/body + (for [sales-order (:data data)] + ^{:key (:id sales-order)} + [row {:sales-order sales-order + :selected-client selected-client}])]]])) diff --git a/src/cljs/auto_ap/views/pages/sales_orders/form.cljs b/src/cljs/auto_ap/views/pages/pos/form.cljs similarity index 99% rename from src/cljs/auto_ap/views/pages/sales_orders/form.cljs rename to src/cljs/auto_ap/views/pages/pos/form.cljs index d6e708f4..58e2d5f0 100644 --- a/src/cljs/auto_ap/views/pages/sales_orders/form.cljs +++ b/src/cljs/auto_ap/views/pages/pos/form.cljs @@ -1,4 +1,4 @@ -(ns auto-ap.views.pages.sales-orders.form +(ns auto-ap.views.pages.pos.form (:require [auto-ap.events :as events] [auto-ap.forms :as forms] diff --git a/src/cljs/auto_ap/views/pages/sales_orders.cljs b/src/cljs/auto_ap/views/pages/pos/sales_orders.cljs similarity index 93% rename from src/cljs/auto_ap/views/pages/sales_orders.cljs rename to src/cljs/auto_ap/views/pages/pos/sales_orders.cljs index 9a277f8c..68965801 100644 --- a/src/cljs/auto_ap/views/pages/sales_orders.cljs +++ b/src/cljs/auto_ap/views/pages/pos/sales_orders.cljs @@ -1,11 +1,11 @@ -(ns auto-ap.views.pages.sales-orders +(ns auto-ap.views.pages.pos.sales-orders (:require [auto-ap.forms :as forms] [auto-ap.subs :as subs] [auto-ap.views.components.layouts :refer [side-bar-layout appearing-side-bar]] [auto-ap.views.pages.data-page :as data-page] - [auto-ap.views.pages.sales-orders.form :as form] - [auto-ap.views.pages.sales-orders.side-bar :as side-bar] - [auto-ap.views.pages.sales-orders.table :as table] + [auto-ap.views.pages.pos.form :as form] + [auto-ap.views.pages.pos.side-bar :as side-bar] + [auto-ap.views.pages.pos.table :as table] [auto-ap.views.utils :refer [with-user]] [clojure.set :as set] [re-frame.core :as re-frame] diff --git a/src/cljs/auto_ap/views/pages/sales_orders/side_bar.cljs b/src/cljs/auto_ap/views/pages/pos/side_bar.cljs similarity index 62% rename from src/cljs/auto_ap/views/pages/sales_orders/side_bar.cljs rename to src/cljs/auto_ap/views/pages/pos/side_bar.cljs index d630ba72..5474ea2b 100644 --- a/src/cljs/auto_ap/views/pages/sales_orders/side_bar.cljs +++ b/src/cljs/auto_ap/views/pages/pos/side_bar.cljs @@ -1,4 +1,4 @@ -(ns auto-ap.views.pages.sales-orders.side-bar +(ns auto-ap.views.pages.pos.side-bar (:require [auto-ap.routes :as routes] [auto-ap.subs :as subs] [auto-ap.views.utils :refer [active-when dispatch-value-change]] @@ -13,9 +13,20 @@ (let [ap @(re-frame/subscribe [::subs/active-page]) user @(re-frame/subscribe [::subs/user])] [:div - [:div - + [:div [:p.menu-label "Type"] + [:ul.menu-list + [:li.menu-item + [:a.item {:href (bidi/path-for routes/routes :sales-orders) + :class [(active-when ap = :sales-orders)]} + [:span {:class "icon icon-accounting-invoice-mail" :style {:font-size "25px"}}] + [:span {:class "name"} "Sales Orders"]]] + [:li.menu-item + [:a.item {:href (bidi/path-for routes/routes :expected-deposits) + :class [(active-when ap = :expected-deposits)]} + [:span {:class "icon icon-accounting-invoice-mail" :style {:font-size "25px"}}] + [:span {:class "name"} "Expected Deposits"]]]]] + [:div [:p.menu-label "Date Range"] [:div [date-range-filter diff --git a/src/cljs/auto_ap/views/pages/sales_orders/table.cljs b/src/cljs/auto_ap/views/pages/pos/table.cljs similarity index 91% rename from src/cljs/auto_ap/views/pages/sales_orders/table.cljs rename to src/cljs/auto_ap/views/pages/pos/table.cljs index c7f2a5d2..7bd01c2c 100644 --- a/src/cljs/auto_ap/views/pages/sales_orders/table.cljs +++ b/src/cljs/auto_ap/views/pages/pos/table.cljs @@ -1,9 +1,8 @@ -(ns auto-ap.views.pages.sales-orders.table +(ns auto-ap.views.pages.pos.table (:require [auto-ap.subs :as subs] - [auto-ap.views.components.buttons :as buttons] - [auto-ap.views.components.grid :as grid] + [auto-ap.views.components.buttons :as buttons] [auto-ap.views.components.grid :as grid] [auto-ap.views.pages.data-page :as data-page] - [auto-ap.views.pages.sales-orders.form :as form] + [auto-ap.views.pages.pos.form :as form] [auto-ap.views.utils :refer [date->str nf]] [clojure.string :as str] [re-frame.core :as re-frame]))