From 8a74f4a4e235d1b68bd61d45f994e54c697f6137 Mon Sep 17 00:00:00 2001 From: Bryce Covert Date: Thu, 23 Aug 2018 18:46:08 -0700 Subject: [PATCH 01/13] filtering down to just active invoices/etc. --- src/clj/auto_ap/db/checks.clj | 5 +++-- src/clj/auto_ap/db/invoices.clj | 4 +++- src/clj/auto_ap/graphql.clj | 6 ++++-- src/clj/auto_ap/routes/exports.clj | 7 +++++-- 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/clj/auto_ap/db/checks.clj b/src/clj/auto_ap/db/checks.clj index a2e612c2..afca5202 100644 --- a/src/clj/auto_ap/db/checks.clj +++ b/src/clj/auto_ap/db/checks.clj @@ -80,7 +80,7 @@ :else q))) -(defn base-graphql [{:keys [company-id vendor-id check-number bank-account-id status amount id]}] +(defn base-graphql [{:keys [company-id vendor-id check-number bank-account-id status amount id statuses]}] (cond-> base-query (limited-companies id) (helpers/merge-where [:in :company-id (limited-companies id)]) @@ -89,7 +89,8 @@ (not (nil? vendor-id)) (helpers/merge-where [:= :vendor-id vendor-id]) (not (nil? check-number)) (helpers/merge-where [:= :check-number check-number]) (not (nil? status)) (helpers/merge-where [:= :status status]) - (not (nil? amount)) (helpers/merge-where [:= :amount amount]))) + (not (nil? amount)) (helpers/merge-where [:= :amount amount]) + (seq statuses ) (helpers/merge-where [:in :status statuses]))) (defn get-graphql [{:keys [start sort-by asc id limit] :as args :or {limit 20}}] (query diff --git a/src/clj/auto_ap/db/invoices.clj b/src/clj/auto_ap/db/invoices.clj index 53062c44..a68f6bfd 100644 --- a/src/clj/auto_ap/db/invoices.clj +++ b/src/clj/auto_ap/db/invoices.clj @@ -142,9 +142,10 @@ -(defn base-graphql [{:keys [imported company-id status id]}] +(defn base-graphql [{:keys [imported company-id status id statuses]}] (cond-> base-query (limited-companies id) (helpers/merge-where [:in :company-id (limited-companies id)]) + (seq statuses ) (helpers/merge-where [:in :status statuses]) (not (nil? imported)) (helpers/merge-where [:= :imported imported]) (not (nil? status)) (helpers/merge-where [:= :status status]) (not (nil? company-id)) (helpers/merge-where [:= :company-id company-id]))) @@ -152,6 +153,7 @@ (defn get-graphql [{:keys [start sort-by asc limit] :as args :or {limit 20}}] (query (cond-> (base-graphql args) + true (add-sort-by sort-by asc) true (assoc :limit limit) start (assoc :offset start)))) diff --git a/src/clj/auto_ap/graphql.clj b/src/clj/auto_ap/graphql.clj index 02c88bcf..50b28313 100644 --- a/src/clj/auto_ap/graphql.clj +++ b/src/clj/auto_ap/graphql.clj @@ -203,11 +203,13 @@ :resolve :get-invoice-page} :all_invoices {:type '(list :invoice) - :args {:company_id {:type 'Int}} + :args {:company_id {:type 'Int} + :statuses {:type '(list String)}} :resolve :get-all-invoices} :all_checks {:type '(list :check) - :args {:company_id {:type 'Int}} + :args {:company_id {:type 'Int} + :statuses {:type '(list String)}} :resolve :get-all-checks} :transaction_page {:type '(list :transaction_page) diff --git a/src/clj/auto_ap/routes/exports.clj b/src/clj/auto_ap/routes/exports.clj index 994b8834..30823ab1 100644 --- a/src/clj/auto_ap/routes/exports.clj +++ b/src/clj/auto_ap/routes/exports.clj @@ -25,7 +25,9 @@ (GET "/invoices/export" {:keys [query-params identity] :as request} (assert-admin identity) (let [query [[:all_invoices - {:company-id (query-params "company")} + {:company-id (query-params "company") + :statuses ["unpaid" "paid"]} + [:id :total :outstanding-balance :invoice-number :date [:checks [:amount [:check [:check-number :memo [:bank_account [:id :number :bank-name :bank-code]]]]]] [:vendor [:name :id :primary_contact [:address [:street1 :city :state :zip]]]] @@ -37,7 +39,8 @@ (GET "/checks/export" {:keys [query-params identity]} (assert-admin identity) (let [query [[:all_checks - {:company-id (query-params "company")} + {:company-id (query-params "company") + :statuses ["pending" "cleared"]} [:id :check-number :amount :memo :date [:invoices [:invoice-id :amount]] [:bank-account [:number :bank-name :bank-code :id]] From 4fd5e8a156897ffc0f7a91b401f914178ea7db23 Mon Sep 17 00:00:00 2001 From: Bryce Covert Date: Thu, 23 Aug 2018 20:15:29 -0700 Subject: [PATCH 02/13] at least fixing one of the duplication issues. --- src/clj/auto_ap/yodlee/import.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/clj/auto_ap/yodlee/import.clj b/src/clj/auto_ap/yodlee/import.clj index 0350ab53..b36ed7d6 100644 --- a/src/clj/auto_ap/yodlee/import.clj +++ b/src/clj/auto_ap/yodlee/import.clj @@ -93,7 +93,7 @@ (defn manual-import [manual-transactions company-id] (let [transformed-transactions (->> manual-transactions (filter #(= "posted" (:status %))) - (group-by #(select-keys % [:date :original-description :amount])) + (group-by #(select-keys % [:date :description-original :amount])) (vals) From e0f7b5f12876e35932ad405758b7e6fc742f8b33 Mon Sep 17 00:00:00 2001 From: Bryce Covert Date: Fri, 24 Aug 2018 08:33:29 -0700 Subject: [PATCH 03/13] includes all, but tells you when voided. --- src/clj/auto_ap/graphql.clj | 1 + src/clj/auto_ap/routes/exports.clj | 10 ++++------ 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/clj/auto_ap/graphql.clj b/src/clj/auto_ap/graphql.clj index 50b28313..ad844674 100644 --- a/src/clj/auto_ap/graphql.clj +++ b/src/clj/auto_ap/graphql.clj @@ -150,6 +150,7 @@ :total {:type 'String} :outstanding_balance {:type 'String} :invoice_number {:type 'String} + :status {:type 'String} :expense_accounts {:type '(list :invoices_expense_accounts) :resolve :get-invoices-expense-accounts} :date {:type 'String} diff --git a/src/clj/auto_ap/routes/exports.clj b/src/clj/auto_ap/routes/exports.clj index 30823ab1..5bcb76c4 100644 --- a/src/clj/auto_ap/routes/exports.clj +++ b/src/clj/auto_ap/routes/exports.clj @@ -25,10 +25,9 @@ (GET "/invoices/export" {:keys [query-params identity] :as request} (assert-admin identity) (let [query [[:all_invoices - {:company-id (query-params "company") - :statuses ["unpaid" "paid"]} + {:company-id (query-params "company")} - [:id :total :outstanding-balance :invoice-number :date + [:id :total :outstanding-balance :invoice-number :date :status [:checks [:amount [:check [:check-number :memo [:bank_account [:id :number :bank-name :bank-code]]]]]] [:vendor [:name :id :primary_contact [:address [:street1 :city :state :zip]]]] [:expense_accounts [:amount :id :expense_account_id :location @@ -39,9 +38,8 @@ (GET "/checks/export" {:keys [query-params identity]} (assert-admin identity) (let [query [[:all_checks - {:company-id (query-params "company") - :statuses ["pending" "cleared"]} - [:id :check-number :amount :memo :date + {:company-id (query-params "company")} + [:id :check-number :amount :memo :date :status [:invoices [:invoice-id :amount]] [:bank-account [:number :bank-name :bank-code :id]] [:vendor [:name :id :primary-contact :primary-email :primary-phone :default-expense-account [:address [:street1 :city :state :zip]]]] From b17d564cdf8c1f2b29399998b1e80ace39daa998 Mon Sep 17 00:00:00 2001 From: Bryce Covert Date: Fri, 24 Aug 2018 08:41:01 -0700 Subject: [PATCH 04/13] Some nice-to-haves --- src/clj/auto_ap/graphql.clj | 5 ++++- src/cljs/auto_ap/views/pages/transactions.cljs | 9 +++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/clj/auto_ap/graphql.clj b/src/clj/auto_ap/graphql.clj index ad844674..c5617007 100644 --- a/src/clj/auto_ap/graphql.clj +++ b/src/clj/auto_ap/graphql.clj @@ -47,7 +47,8 @@ :check_number {:type 'Int} :name {:type 'String} :bank_code {:type 'String} - :bank_name {:type 'String}}} + :bank_name {:type 'String} + :yodlee_account_id {:type 'Int}}} :address {:fields {:street1 {:type 'String} :street2 {:type 'String} @@ -109,6 +110,8 @@ :description_original {:type 'String} :description_simple {:type 'String} :status {:type 'String} + :bank_account {:type :bank_account + :resolve :bank-account-for-check} :company {:type :company :resolve :get-company-for-transaction} :check {:type :check diff --git a/src/cljs/auto_ap/views/pages/transactions.cljs b/src/cljs/auto_ap/views/pages/transactions.cljs index bc0e360f..e4c97649 100644 --- a/src/cljs/auto_ap/views/pages/transactions.cljs +++ b/src/cljs/auto_ap/views/pages/transactions.cljs @@ -40,6 +40,7 @@ :post_date :status :description_original + [:bank-account [:name :yodlee-account-id]] [:check [:check_number :s3_url]] [:company [:name :id]]]] :total @@ -68,7 +69,7 @@ (let [{:keys [sort-by asc]} @state {:keys [transactions start end count total]} @transaction-page selected-company @(re-frame/subscribe [::subs/company]) - percentage-size (if selected-company "100%" "50%")] + percentage-size (if selected-company "25%" "33%")] [:div [paginator {:start start :end end :count count :total total :on-change (fn [p ] @@ -111,6 +112,8 @@ :sort-by sort-by :asc asc} "Status"] + [:th {:width percentage-size} "Bank account"] + [:th {:width percentage-size} "Yodlee bank account"] [:th {:style {:width "10em"}} "" ]]] @@ -119,7 +122,7 @@ [:tr [:td {:col-span 5} [:i.fa.fa-spin.fa-spinner]]] - (for [{:keys [company check status description-original date amount id ] :as i} (:transactions @transaction-page)] + (for [{:keys [company check status bank-account description-original date amount id ] :as i} (:transactions @transaction-page)] ^{:key id} [:tr {:class (:class i)} @@ -129,6 +132,8 @@ [:td (date->str date) ] [:td (gstring/format "$%.2f" amount )] [:td status] + [:td (:name bank-account )] + [:td (:yodlee-account-id bank-account )] [:td From 52cbddcbde89746ebc5485babf0a9a7d49350450 Mon Sep 17 00:00:00 2001 From: Bryce Covert Date: Tue, 18 Sep 2018 07:21:53 -0700 Subject: [PATCH 05/13] fixing issue with unauthorized. --- src/clj/auto_ap/graphql/utils.clj | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/clj/auto_ap/graphql/utils.clj b/src/clj/auto_ap/graphql/utils.clj index ea0e95a4..6efc440d 100644 --- a/src/clj/auto_ap/graphql/utils.clj +++ b/src/clj/auto_ap/graphql/utils.clj @@ -47,7 +47,8 @@ (defn can-see-company? [identity company] (or (= "admin" (:role identity)) - ((set (:companies identity)) (:id company)))) + ((set (:companies identity)) (:id company)) + ((set (:companies identity)) company))) (defn assert-can-see-company [identity company] (when-not (can-see-company? identity company) From 5fe4d7e0b38ab184ab0bd698f5821f1ab3c31091 Mon Sep 17 00:00:00 2001 From: Bryce Covert Date: Tue, 18 Sep 2018 08:36:56 -0700 Subject: [PATCH 06/13] voiding invoice voids expense accounts too --- src/clj/auto_ap/graphql/invoices.clj | 1 + 1 file changed, 1 insertion(+) diff --git a/src/clj/auto_ap/graphql/invoices.clj b/src/clj/auto_ap/graphql/invoices.clj index 34d4e827..82074fd1 100644 --- a/src/clj/auto_ap/graphql/invoices.clj +++ b/src/clj/auto_ap/graphql/invoices.clj @@ -62,6 +62,7 @@ :total 0 :outstanding-balance 0 :status "voided"})] + (invoices-expense-accounts/replace-for-invoice id []) (-> updated-invoice (->graphql)))) From 0fe9dd544a2166329cae78a00ee02ffda1d6328f Mon Sep 17 00:00:00 2001 From: Bryce Covert Date: Tue, 18 Sep 2018 19:53:54 -0700 Subject: [PATCH 07/13] you can now type expense account --- src/clj/auto_ap/yodlee/core.clj | 38 +++++++++++++++++++ .../auto_ap/views/pages/unpaid_invoices.cljs | 2 +- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/clj/auto_ap/yodlee/core.clj b/src/clj/auto_ap/yodlee/core.clj index 636f78ca..3714566b 100644 --- a/src/clj/auto_ap/yodlee/core.clj +++ b/src/clj/auto_ap/yodlee/core.clj @@ -77,6 +77,44 @@ (recur (concat transactions transaction-batch) (+ batch-size skip)) transactions))))) +(defn get-provider-accounts [] + (let [cob-session (login-cobrand) + user-session (login-user cob-session) + batch-size 100 + get-transaction-batch (fn [skip] + (-> (str (:yodlee-base-url env) "/providerAccounts") + + (client/get {:headers (doto + (merge base-headers {"Authorization" (auth-header cob-session user-session)}) + println) + :as :json}) + :body + ))] + + (get-transaction-batch))) +(defn get-specific-transactions [] + (let [cob-session (login-cobrand) + user-session (login-user cob-session) + batch-size 100 + get-transaction-batch (fn [skip] + (-> (str (:yodlee-base-url env) "/transactions?top=" batch-size "&skip=" skip "&accountId=16422358") + (doto println) + + (client/get {:headers (doto + (merge base-headers {"Authorization" (auth-header cob-session user-session)}) + println) + :as :json}) + :body + :transaction + ))] + + (loop [transactions [] + skip 0] + (let [transaction-batch (get-transaction-batch skip)] + (if (seq transaction-batch) + (recur (concat transactions transaction-batch) (+ batch-size skip)) + transactions))))) + (defn get-access-token [] (let [cob-session (login-cobrand) user-session (login-user cob-session) diff --git a/src/cljs/auto_ap/views/pages/unpaid_invoices.cljs b/src/cljs/auto_ap/views/pages/unpaid_invoices.cljs index a054bcd9..0801ff1d 100644 --- a/src/cljs/auto_ap/views/pages/unpaid_invoices.cljs +++ b/src/cljs/auto_ap/views/pages/unpaid_invoices.cljs @@ -481,7 +481,7 @@ [:tr [:td.expandable [:div.control [bind-field - [typeahead {:matches (map (fn [x] [(:id x) (:name x)]) chooseable-expense-accounts) + [typeahead {:matches (map (fn [x] [(:id x) (str (:id x) " - " (:name x))]) chooseable-expense-accounts) :type "typeahead" :field [:invoice :expense-accounts index :expense-account-id] :event change-event From ff4be6d20e203b567bdfa8fc46a061b3d192cbd4 Mon Sep 17 00:00:00 2001 From: Bryce Covert Date: Thu, 20 Sep 2018 18:12:40 -0700 Subject: [PATCH 08/13] minor fixes. --- project.clj | 2 +- resources/BellaSaratoga.jpg | Bin 0 -> 29814 bytes resources/Dan_Sig.1.jpg | Bin 0 -> 37752 bytes resources/MioVicino.jpg | Bin 0 -> 36111 bytes resources/iguanas.jpg | Bin 0 -> 34435 bytes src/clj/auto_ap/yodlee/core.clj | 32 +++++++++++++++++++++++++++++--- 6 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 resources/BellaSaratoga.jpg create mode 100644 resources/Dan_Sig.1.jpg create mode 100644 resources/MioVicino.jpg create mode 100644 resources/iguanas.jpg diff --git a/project.clj b/project.clj index 6607ec49..d266860c 100644 --- a/project.clj +++ b/project.clj @@ -73,7 +73,7 @@ :plugins [[lein-figwheel "0.5.13"] [lein-pdo "0.1.1"] [cider/cider-nrepl "0.16.0"]] - :jvm-opts ["-Dconfig=config/dev.edn" #_#_"--add-modules" "java.xml.bind"]} + :jvm-opts ["-Dconfig=config/dev.edn" "--add-modules" "java.xml.bind"]} :uberjar {:prep-tasks [["cljsbuild" "once" "min"] "compile"]} :provided {:dependencies [[org.clojure/clojurescript "1.10.238"] [reagent "0.7.0"] diff --git a/resources/BellaSaratoga.jpg b/resources/BellaSaratoga.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5a75346e541e1d24ac937f4aec4403e1ae292acd GIT binary patch literal 29814 zcmeIacR*7~*EoDb=tXJ}0U-iXg7hlVJ0d-yE0Pc}l!V?DY^YIGP_dx¬C3Du^xi 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 literal 0 HcmV?d00001 diff --git a/resources/MioVicino.jpg b/resources/MioVicino.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ed1c0e21bf9770f7a677e5b9c70ccd57181c48d7 GIT binary patch literal 36111 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 M>;G{LtXJOu7hWepApigX literal 0 HcmV?d00001 diff --git a/resources/iguanas.jpg b/resources/iguanas.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2b9ccc66bd84d7315396dc2c283970abc7ae0d20 GIT binary patch literal 34435 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 literal 0 HcmV?d00001 diff --git a/src/clj/auto_ap/yodlee/core.clj b/src/clj/auto_ap/yodlee/core.clj index 3714566b..225bc415 100644 --- a/src/clj/auto_ap/yodlee/core.clj +++ b/src/clj/auto_ap/yodlee/core.clj @@ -47,12 +47,24 @@ :body :account))) +(defn get-account [i] + (let [cob-session (login-cobrand) + user-session (login-user cob-session)] + (-> (str (:yodlee-base-url env) (str "/accounts/" i)) + (client/get {:headers (merge base-headers {"Authorization" (auth-header cob-session user-session)}) + :as :json}) + :body + :account))) + (defn get-provider-accounts [] (let [cob-session (login-cobrand) user-session (login-user cob-session)] (-> (str (:yodlee-base-url env) "/providerAccounts") - (client/get {:headers (merge base-headers {"Authorization" (auth-header cob-session user-session)}) - :as :json})))) + (-> (client/get {:headers (merge base-headers {"Authorization" (auth-header cob-session user-session)}) + :as :json}) + :body + :providerAccount) + ))) (defn get-transactions [] (let [cob-session (login-cobrand) @@ -81,7 +93,7 @@ (let [cob-session (login-cobrand) user-session (login-user cob-session) batch-size 100 - get-transaction-batch (fn [skip] + get-transaction-batch (fn [] (-> (str (:yodlee-base-url env) "/providerAccounts") (client/get {:headers (doto @@ -92,6 +104,20 @@ ))] (get-transaction-batch))) + +(defn update-provider-account [pa] + (let [cob-session (login-cobrand) + user-session (login-user cob-session) + batch-size 100] + + (-> (str (:yodlee-base-url env) "/providerAccounts?providerAccountIds=" pa) + + (client/put {:headers (doto + (merge base-headers {"Authorization" (auth-header cob-session user-session)}) + println) + :body "{\"dataSetName\": [\"BASIC_AGG_DATA\"]}" + :as :json})))) + (defn get-specific-transactions [] (let [cob-session (login-cobrand) user-session (login-user cob-session) From 43555a4e2533cbe9e49aa49f5330c91340609977 Mon Sep 17 00:00:00 2001 From: BC Date: Thu, 20 Sep 2018 18:40:02 -0700 Subject: [PATCH 09/13] Fixed issue with duplicate import problem. Which account that was used for import is important. --- src/clj/auto_ap/yodlee/import.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/clj/auto_ap/yodlee/import.clj b/src/clj/auto_ap/yodlee/import.clj index b36ed7d6..31e9112c 100644 --- a/src/clj/auto_ap/yodlee/import.clj +++ b/src/clj/auto_ap/yodlee/import.clj @@ -100,7 +100,7 @@ (mapcat (fn [transaction-group] (map (fn [index {:keys [date description-original high-level-category amount account-id] :as transaction}] - {:id (str date "-" description-original "-" amount "-" index "-" company-id) + {:id (str date "-" account-id "-" description-original "-" amount "-" index "-" company-id) :bank-account-id account-id :date (time/unparse date "YYYY-MM-dd") :amount {:amount amount} From 6c6ed0ebb7c540510d109cfae5ac0b4bc58abf86 Mon Sep 17 00:00:00 2001 From: BC Date: Thu, 20 Sep 2018 18:56:02 -0700 Subject: [PATCH 10/13] including a more verbose description. --- src/clj/auto_ap/routes/checks.clj | 26 +++++++++++++------------- src/clj/auto_ap/routes/exports.clj | 2 +- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/clj/auto_ap/routes/checks.clj b/src/clj/auto_ap/routes/checks.clj index e35e9f96..61bc2400 100644 --- a/src/clj/auto_ap/routes/checks.clj +++ b/src/clj/auto_ap/routes/checks.clj @@ -189,10 +189,17 @@ (s3/put-object :bucket-name (:data-bucket env) :key (str "merged-checks/" uuid ".pdf") :input-stream (io/make-input-stream (.toByteArray merged-pdf-stream) {}) - :metadata {:content-length (count (.toByteArray merged-pdf-stream)) + :metadata {:content-length (count (.toByteArray merged-pdf-stream)) :content-type "application/pdf"}) (str "http://" (:data-bucket env) ".s3-website-us-east-1.amazonaws.com/merged-checks/" uuid ".pdf"))) +(defn get-memo [invoices invoice-amounts] + (str "Invoice #'s: " + (str/join ", " + (map (fn [i] + (str (:invoice-number i) "(" (invoice-amounts (:id i)) ")")) + invoices)))) + (defmulti check-for-invoices (fn [invoices vendor-id vendors company bank-account type index invoice-amounts] @@ -200,14 +207,7 @@ (defmethod check-for-invoices "check" [invoices vendor-id vendors company bank-account type index invoice-amounts] (let [uuid (str (UUID/randomUUID)) - vendor (vendors vendor-id) - - - memo (str "Invoice #'s: " - (str/join ", " - (map (fn [i] - (str (:invoice-number i) "(" (invoice-amounts (:id i)) ")")) - invoices)))] + vendor (vendors vendor-id)] {:s3-uuid uuid :s3-key (str "checks/" uuid ".pdf") :s3-url (str "http://" (:data-bucket env) ".s3-website-us-east-1.amazonaws.com/checks/" uuid ".pdf") @@ -215,7 +215,7 @@ :type "check" :bank-account-id (:id bank-account) :amount (reduce + 0 (map (comp invoice-amounts :id) invoices)) - :memo memo + :memo (get-memo invoices invoice-amounts) :vendor-id (:id vendor) :company-id (:id company) :date (time/now) @@ -223,7 +223,7 @@ :paid-to (:name vendor) :amount (reduce + 0 (map (comp invoice-amounts :id) invoices)) :check (str (+ index (:check-number bank-account))) - :memo memo + :memo (get-memo invoices invoice-amounts) :date (date->str (local-now)) :company {:name (:name company) :address (:address company) @@ -241,7 +241,7 @@ :bank-account-id (:id bank-account) :amount (reduce + 0 (map (comp invoice-amounts :id) invoices)) :status "cleared" - :memo "Debit" + :memo (str "Debit " (get-memo invoices invoice-amounts)) :vendor-id (:id vendor) :company-id (:id company) :date (time/now) @@ -253,7 +253,7 @@ :bank-account-id (:id bank-account) :amount (reduce + 0 (map (comp invoice-amounts :id) invoices)) :status "cleared" - :memo "Cash" + :memo (str "Cash " (get-memo invoices invoice-amounts)) :vendor-id (:id vendor) :company-id (:id company) :date (time/now) diff --git a/src/clj/auto_ap/routes/exports.clj b/src/clj/auto_ap/routes/exports.clj index 5bcb76c4..e14e5989 100644 --- a/src/clj/auto_ap/routes/exports.clj +++ b/src/clj/auto_ap/routes/exports.clj @@ -39,7 +39,7 @@ (assert-admin identity) (let [query [[:all_checks {:company-id (query-params "company")} - [:id :check-number :amount :memo :date :status + [:id :check-number :amount :memo :date :status :type [:invoices [:invoice-id :amount]] [:bank-account [:number :bank-name :bank-code :id]] [:vendor [:name :id :primary-contact :primary-email :primary-phone :default-expense-account [:address [:street1 :city :state :zip]]]] From 82f56c37cda180afbac8f8dcbc8e54548cbd4d8a Mon Sep 17 00:00:00 2001 From: BC Date: Thu, 20 Sep 2018 20:49:38 -0700 Subject: [PATCH 11/13] adding approach to fixing sql. --- scratch-sessions/fix-account-id.sql | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 scratch-sessions/fix-account-id.sql diff --git a/scratch-sessions/fix-account-id.sql b/scratch-sessions/fix-account-id.sql new file mode 100644 index 00000000..1e41da23 --- /dev/null +++ b/scratch-sessions/fix-account-id.sql @@ -0,0 +1,18 @@ + + +(defn original-base-id [{:keys [date bank-account-id description-original company-id amount]} index] + (str (t/to-time-zone date (t/time-zone-for-offset -7)) "-" description-original "-" (double amount) "-" index "-" company-id)) + +(defn new-base-id [{:keys [date bank-account-id description-original company-id amount]} index] + (str (t/to-time-zone date (t/time-zone-for-offset -7)) "-" bank-account-id "-" description-original "-" (double amount) "-" index "-" company-id)) + +(defn replacements [] + (loop [rows (get-graphql {:limit 100000}) + replacements [] + i 0] + (let [result (->> rows + (filter #(= (:id %) (sha-256 (original-base-id % i)))) + (map #(assoc % :new-id (sha-256 (new-base-id % i)))))] + (if (= 10 i) + (into replacements result) + (recur rows (into replacements result ) (inc i)))))) From 4a237a82246bd89ff149e64d2c172d053804cbcc Mon Sep 17 00:00:00 2001 From: BC Date: Thu, 20 Sep 2018 23:17:45 -0700 Subject: [PATCH 12/13] editing users uses datomic. --- src/clj/auto_ap/datomic.clj | 6 +- src/clj/auto_ap/datomic/users.clj | 15 ++++ src/clj/auto_ap/graphql.clj | 69 +++---------------- src/clj/auto_ap/graphql/checks.clj | 2 - src/clj/auto_ap/graphql/invoices.clj | 8 --- src/clj/auto_ap/graphql/transactions.clj | 12 ---- src/clj/auto_ap/graphql/users.clj | 32 +++++++-- src/cljs/auto_ap/views/pages/admin/users.cljs | 18 ++--- 8 files changed, 63 insertions(+), 99 deletions(-) diff --git a/src/clj/auto_ap/datomic.clj b/src/clj/auto_ap/datomic.clj index 7931b34f..58e18920 100644 --- a/src/clj/auto_ap/datomic.clj +++ b/src/clj/auto_ap/datomic.clj @@ -517,10 +517,10 @@ :db/valueType :db.type/string :db/cardinality :db.cardinality/one :db/doc "name of the user"} - {:db/ident :user/companies + {:db/ident :user/clients :db/valueType :db.type/ref :db/cardinality :db.cardinality/many - :db/doc "The companies this user can view"} + :db/doc "The clients this user can view"} ;;enums {:db/ident :user-role/admin} @@ -706,7 +706,7 @@ :role (keyword "user-role" role) :provider-id provider-id :provider provider - :companies (map (fn [c] [:client/original-id c]) companies)}))) + :clients (map (fn [c] [:client/original-id c]) companies)}))) (d/transact (d/connect uri)))) (defn query-vendors [] diff --git a/src/clj/auto_ap/datomic/users.clj b/src/clj/auto_ap/datomic/users.clj index b05813ef..091c1b88 100644 --- a/src/clj/auto_ap/datomic/users.clj +++ b/src/clj/auto_ap/datomic/users.clj @@ -11,6 +11,21 @@ (update-in [:query :where] conj where))] (reduce #(update-in %1 [:query :where] conj %2) query rest))) +(defn get-by-id [id] + (let [query (-> {:query {:find ['(pull ?e [* + {:user/clients [*]} + {:user/role [:db/ident]}])] + :in ['$] + :where []} + :args [(d/db (d/connect uri))]} + (add-arg '?e (cond-> id (string? id) Long/parseLong) ['?e]) + (doto println))] + + (->> (d/query query) + (map first) + (map #(update % :user/role :db/ident)) + first))) + (defn raw-graphql [args] (let [query (cond-> {:query {:find ['(pull ?e [* {:user/clients [*]} diff --git a/src/clj/auto_ap/graphql.clj b/src/clj/auto_ap/graphql.clj index df492f21..6ea17000 100644 --- a/src/clj/auto_ap/graphql.clj +++ b/src/clj/auto_ap/graphql.clj @@ -6,26 +6,18 @@ [com.walmartlabs.lacinia.executor :as executor] [com.walmartlabs.lacinia.resolve :as resolve] [buddy.auth :refer [throw-unauthorized]] - [auto-ap.db.invoices :as invoices] [auto-ap.utils :refer [by]] [auto-ap.graphql.utils :refer [assert-admin can-see-company? assert-can-see-company]] - [auto-ap.db.vendors :as vendors] - [auto-ap.db.companies :as companies] [auto-ap.datomic.clients :as d-clients] [auto-ap.datomic.checks :as d-checks] [auto-ap.datomic.users :as d-users] [auto-ap.datomic.invoices :as d-invoices] [auto-ap.datomic.vendors :as d-vendors] - [auto-ap.db.users :as users] - [auto-ap.db.checks :as checks] [auto-ap.graphql.users :as gq-users] [auto-ap.graphql.checks :as gq-checks] [auto-ap.graphql.expense-accounts :as expense-accounts] [auto-ap.graphql.invoices :as gq-invoices] [auto-ap.graphql.transactions :as gq-transactions] - [auto-ap.db.reminders :as reminders] - [auto-ap.db.invoices-checks :as invoices-checks] - [auto-ap.db.utils :as utils] [clojure.walk :as walk] [clojure.string :as str]) (:import @@ -131,8 +123,7 @@ :status {:type 'String} :client {:type :client} :payment {:type :payment} - :bank_account {:type :bank_account - :resolve :bank-account-for-check} + :bank_account {:type :bank_account} :date {:type 'String} :post_date {:type 'String}}} :invoice_payment @@ -144,10 +135,10 @@ :invoice {:type :invoice}}} :user - {:fields {:id {:type 'Int} + {:fields {:id {:type 'String} :name {:type 'String} :role {:type 'String} - :clients {:type '(list :company)}}} + :clients {:type '(list :client)}}} :expense_account {:fields {:id {:type 'Int} :location {:type 'String} @@ -245,12 +236,7 @@ :asc {:type 'Boolean}} :resolve :get-payment-page} - :reminder_page {:type '(list :reminder_page) - :args {:start {:type 'Int} - :sort_by {:type 'String} - :asc {:type 'Boolean}} - - :resolve :get-reminder-page} + :company {:type '(list :company) :resolve :get-company} :client {:type '(list :company) @@ -266,10 +252,10 @@ :amount {:type 'Float}}} :edit_user - {:fields {:id {:type 'Int} + {:fields {:id {:type 'String} :name {:type 'String} :role {:type 'String} - :companies {:type '(list Int)}}} + :clients {:type '(list String)}}} :edit_expense_account {:fields {:id {:type 'String} @@ -399,22 +385,6 @@ (d-checks/get-graphql (assoc (<-graphql args) :limit Integer/MAX_VALUE)))) -(defn get-reminder-page [context args value] - (assert-admin (:id context)) - (let [extra-context - (cond-> {} - (executor/selects-field? context :reminder/vendor) (assoc :vendor-cache (by :id (vendors/get-all)))) - - reminders (map - ->graphql - (reminders/get-graphql (<-graphql args))) - reminder-count (reminders/count-graphql (<-graphql args))] - (resolve/with-context - [{:reminders reminders - :total reminder-count - :count (count reminders) - :start (:start args 0) - :end (+ (:start args 0) (count reminders))}] extra-context))) @@ -425,18 +395,7 @@ -(defn bank-account-for-check [context args value] - (->graphql - (let [company (if-let [company-cache (:company-cache context)] - (company-cache (:company_id value)) - (companies/get-by-id (:company_id value)))] - (first (filter #(= (:id %) (:bank_account_id value)) (:bank-accounts company))) ))) -(defn get-user-companies [context args value] - (->graphql - (if-let [company-cache (:company-cache context)] - (map company-cache (:companies value)) - (map companies/get-by-id (:companies value))))) @@ -445,18 +404,12 @@ (filter #(can-see-company? (:id context) %) (d-clients/get-all)))) -(defn join-companies [users] - (let [companies (by :id (companies/get-all))] - (map - (fn [u] - (update u :companies #(map companies %))) - users))) - (defn get-user [context args value] (assert-admin (:id context)) - (let [users (d-users/get-graphql args)] - (->graphql users))) + (doto (let [users (d-users/get-graphql args)] + (->graphql users)) + println)) (defn get-vendor [context args value] (->graphql @@ -480,13 +433,11 @@ (attach-resolvers {:get-invoice-page get-invoice-page :get-all-invoices get-all-invoices :get-all-payments get-all-payments - :bank-account-for-check bank-account-for-check :get-payment-page gq-checks/get-payment-page :get-transaction-page gq-transactions/get-transaction-page - :get-reminder-page get-reminder-page + :get-company get-company :get-user get-user - :get-user-companies get-user-companies :mutation/add-handwritten-check gq-checks/add-handwritten-check :mutation/print-checks print-checks :mutation/edit-user gq-users/edit-user diff --git a/src/clj/auto_ap/graphql/checks.clj b/src/clj/auto_ap/graphql/checks.clj index 986cec4e..b84ae0f0 100644 --- a/src/clj/auto_ap/graphql/checks.clj +++ b/src/clj/auto_ap/graphql/checks.clj @@ -2,11 +2,9 @@ (:require [auto-ap.graphql.utils :refer [->graphql <-graphql assert-can-see-company]] [datomic.api :as d] [clojure.edn :as edn] - [com.walmartlabs.lacinia :refer [execute]] [com.walmartlabs.lacinia.executor :as executor] [com.walmartlabs.lacinia.resolve :as resolve] - [auto-ap.datomic.checks :as d-checks] [auto-ap.datomic.invoices :as d-invoices] [auto-ap.datomic.vendors :as d-vendors] diff --git a/src/clj/auto_ap/graphql/invoices.clj b/src/clj/auto_ap/graphql/invoices.clj index 949bd26f..7aedc320 100644 --- a/src/clj/auto_ap/graphql/invoices.clj +++ b/src/clj/auto_ap/graphql/invoices.clj @@ -1,11 +1,8 @@ (ns auto-ap.graphql.invoices (:require [auto-ap.graphql.utils :refer [->graphql assert-can-see-company]] - [auto-ap.db.vendors :as vendors] [auto-ap.datomic.vendors :as d-vendors] [auto-ap.datomic.invoices :as d-invoices] - [auto-ap.db.companies :as companies] - [auto-ap.db.invoices-expense-accounts :as invoices-expense-accounts] [auto-ap.expense-accounts :as expense-accounts] [auto-ap.time :refer [parse iso-date]] [datomic.api :as d] @@ -13,11 +10,6 @@ [clj-time.coerce :as coerce] [clojure.set :as set])) -(defn -create-or-get-vendor [vendor-id vendor-name] - (if vendor-id - (vendors/get-by-id vendor-id) - (vendors/insert {:name vendor-name :default-expense-account 0}))) - (defn add-invoice [context {{:keys [total invoice_number location client_id vendor_id vendor_name date] :as in} :invoice} value] (when (seq (d-invoices/find-conflicting {:invoice/invoice-number invoice_number :invoice/vendor (Long/parseLong vendor_id) diff --git a/src/clj/auto_ap/graphql/transactions.clj b/src/clj/auto_ap/graphql/transactions.clj index f8f1336c..149cb45a 100644 --- a/src/clj/auto_ap/graphql/transactions.clj +++ b/src/clj/auto_ap/graphql/transactions.clj @@ -5,23 +5,11 @@ [com.walmartlabs.lacinia :refer [execute]] [com.walmartlabs.lacinia.executor :as executor] [com.walmartlabs.lacinia.resolve :as resolve] - [auto-ap.db.transactions :as transactions] - [auto-ap.db.vendors :as vendors] [auto-ap.db.checks :as checks] [auto-ap.utils :refer [by]] [auto-ap.db.companies :as companies] [auto-ap.time :refer [parse normal-date]])) -(defn get-check-for-transaction [context args value] - (->graphql - (checks/get-by-id (:check_id value)))) - -(defn get-company-for-transaction [context args value] - (->graphql - (if-let [company-cache (:company-cache context)] - (company-cache (:company_id value)) - (companies/get-by-id (:company_id value))))) - (defn get-transaction-page [context args value] (let [args (assoc args :id (:id context)) transactions (map diff --git a/src/clj/auto_ap/graphql/users.clj b/src/clj/auto_ap/graphql/users.clj index 7a2b12a5..3d859c09 100644 --- a/src/clj/auto_ap/graphql/users.clj +++ b/src/clj/auto_ap/graphql/users.clj @@ -1,10 +1,30 @@ (ns auto-ap.graphql.users - (:require [auto-ap.db.users :as users] + (:require [auto-ap.datomic.users :as d-users] + [datomic.api :as d] + [auto-ap.datomic :refer [uri]] [auto-ap.graphql.utils :refer [->graphql assert-admin]])) -(defn edit-user [context args value] - (assert-admin (:id context)) - (users/update! (:edit_user args)) - (->graphql - (users/get-by-id (:id (:edit_user args))))) +(def role->datomic-role {":none" :user-role/none + ":admin" :user-role/admin + ":user" :user-role/user}) + +(defn edit-user [context {:keys [edit_user] :as args} value] + (println args edit_user) + (assert-admin (:id context)) + (let [user (d-users/get-by-id (:id edit_user)) + new-clients (set (map #(Long/parseLong %) (:clients edit_user))) + clients-to-remove (->> (:user/clients user) + (map :db/id) + (filter #(not (new-clients %)) ))] + + + @(d/transact (d/connect uri) + + (doto (-> [{:db/id (:db/id user) + :user/role (role->datomic-role (:role edit_user)) + :user/clients new-clients}] + (into (map (fn [c] [:db/retract (:db/id user) :user/clients c]) clients-to-remove))) + clojure.pprint/pprint)) + (->graphql + (d-users/get-by-id (:id edit_user))))) diff --git a/src/cljs/auto_ap/views/pages/admin/users.cljs b/src/cljs/auto_ap/views/pages/admin/users.cljs index f6d1e16c..22534df3 100644 --- a/src/cljs/auto_ap/views/pages/admin/users.cljs +++ b/src/cljs/auto_ap/views/pages/admin/users.cljs @@ -58,13 +58,13 @@ ::add-company (fn [db [_ d]] (let [company (get @(re-frame/subscribe [::subs/companies-by-id]) - (js/parseInt (get-in db [::editing :adding-company])))] - (update-in db [::editing :user :companies] conj company)))) + (get-in db [::editing :adding-company]))] + (update-in db [::editing :user :clients] conj company)))) (re-frame/reg-event-db ::remove-company (fn [db [_ d]] - (update-in db [::editing :user :companies] #(filter (fn [c] (not= (:id c) d)) %)))) + (update-in db [::editing :user :clients] #(filter (fn [c] (not= (:id c) d)) %)))) (re-frame/reg-event-fx ::save @@ -78,7 +78,7 @@ :operation/name "EditUser"} :venia/queries [{:query/data [:edit-user - {:edit-user (update (get-in db [::editing :user]) :companies #(map :id %))} + {:edit-user (update (get-in db [::editing :user]) :clients #(map :id %))} [:id :name :role [:clients [:id :name]]]]}]} :on-success [::saved]}})) @@ -101,7 +101,7 @@ [:tr [:th "User"] [:th "Role"] - [:th "Companies"]]] + [:th "Clients"]]] [:tbody (for [{:keys [id name role clients] :as c} @users] ^{:key (str name "-" id )} [:tr {:on-click (fn [] (re-frame/dispatch [::edit id])) @@ -145,12 +145,12 @@ :spec ::entity/name :event ::change :subscription editing} - [:option {:value "none"} "None"] - [:option {:value "user"} "User"] - [:option {:value "admin"} "Admin"]]]]]] + [:option {:value ":none"} "None"] + [:option {:value ":user"} "User"] + [:option {:value ":admin"} "Admin"]]]]]] - (when (= "user" (:role (:user editing))) + (when (= ":user" (:role (:user editing))) [horizontal-field [:label.label "Clients"] [:div.control From 951f8ceaea1495ac968d59ff8a48a35dd28347a7 Mon Sep 17 00:00:00 2001 From: BC Date: Thu, 20 Sep 2018 23:34:57 -0700 Subject: [PATCH 13/13] almost there; datomic works for everything except http routes and import. --- src/clj/auto_ap/background/mail.clj | 7 ++----- src/clj/auto_ap/graphql/transactions.clj | 3 --- src/clj/auto_ap/handler.clj | 9 +-------- src/clj/auto_ap/routes/companies.clj | 14 +++++--------- src/clj/auto_ap/routes/events.clj | 5 +---- src/clj/auto_ap/routes/exports.clj | 7 ------- src/clj/auto_ap/routes/graphql.clj | 4 +--- src/clj/auto_ap/routes/reminders.clj | 14 ++++++-------- src/clj/auto_ap/routes/vendors.clj | 2 +- src/clj/auto_ap/routes/yodlee.clj | 1 - 10 files changed, 17 insertions(+), 49 deletions(-) diff --git a/src/clj/auto_ap/background/mail.clj b/src/clj/auto_ap/background/mail.clj index bf484c06..dd632e06 100644 --- a/src/clj/auto_ap/background/mail.clj +++ b/src/clj/auto_ap/background/mail.clj @@ -1,9 +1,6 @@ (ns auto-ap.background.mail (:require [amazonica.aws.s3 :as s3] [amazonica.aws.sqs :as sqs] - [auto-ap.db.companies :as companies] - [auto-ap.db.vendors :as vendors] - [auto-ap.db.invoices :as invoices] [auto-ap.parse :as parse] [clojure-mail.message :as message] [clojure.data.json :as json] @@ -14,7 +11,7 @@ (javax.mail.internet MimeMessage))) -(defn process-sqs [] +#_(defn process-sqs [] (try (println "Fetching messages from sqs...") (let [companies (companies/get-all) @@ -43,6 +40,6 @@ (catch Exception e (println e)))) -(defn always-process-sqs [] +#_(defn always-process-sqs [] (while (not (Thread/interrupted)) (process-sqs))) diff --git a/src/clj/auto_ap/graphql/transactions.clj b/src/clj/auto_ap/graphql/transactions.clj index 149cb45a..7fa85e64 100644 --- a/src/clj/auto_ap/graphql/transactions.clj +++ b/src/clj/auto_ap/graphql/transactions.clj @@ -1,13 +1,10 @@ (ns auto-ap.graphql.transactions (:require [auto-ap.graphql.utils :refer [->graphql <-graphql]] [auto-ap.datomic.transactions :as d-transactions] - [com.walmartlabs.lacinia :refer [execute]] [com.walmartlabs.lacinia.executor :as executor] [com.walmartlabs.lacinia.resolve :as resolve] - [auto-ap.db.checks :as checks] [auto-ap.utils :refer [by]] - [auto-ap.db.companies :as companies] [auto-ap.time :refer [parse normal-date]])) (defn get-transaction-page [context args value] diff --git a/src/clj/auto_ap/handler.clj b/src/clj/auto_ap/handler.clj index ac494468..fa0edbd5 100644 --- a/src/clj/auto_ap/handler.clj +++ b/src/clj/auto_ap/handler.clj @@ -10,7 +10,6 @@ [auto-ap.routes.events :as events] [auto-ap.routes.checks :as checks] [auto-ap.routes.exports :as exports] - [auto-ap.db.utils :as u] [buddy.auth.backends.token :refer [jws-backend]] [buddy.auth.middleware :refer [wrap-authentication wrap-authorization]] @@ -48,13 +47,7 @@ (defn wrap-transaction [handler] (fn [request] - (jdbc/with-db-transaction [t (u/get-conn)] - (binding [u/current-conn t] - (try - (handler (assoc request :db-conn t)) - (catch Exception e - (jdbc/db-set-rollback-only! t) - (throw e))))))) + (handler request))) (def app-routes (routes diff --git a/src/clj/auto_ap/routes/companies.clj b/src/clj/auto_ap/routes/companies.clj index 8dcd94af..7779285f 100644 --- a/src/clj/auto_ap/routes/companies.clj +++ b/src/clj/auto_ap/routes/companies.clj @@ -1,5 +1,5 @@ (ns auto-ap.routes.companies - (:require [auto-ap.db.companies :as companies] + (:require [auto-ap.datomic.clients :as clients] [auto-ap.graphql.utils :refer [can-see-company? assert-can-see-company]] [auto-ap.routes.utils :refer [wrap-secure wrap-spec]] [auto-ap.entities.companies :as entity] @@ -10,11 +10,7 @@ (defroutes routes (wrap-routes (context "/companies" [] - (GET "/" r - {:status 200 - :body (pr-str (filter #(can-see-company? (:identity r) (:id %)) (companies/get-all))) - :headers {"Content-Type" "application/edn"}}) - (wrap-spec + #_(wrap-spec (PUT "/:id" {{:keys [address email locations new-bank-accounts]} :edn-params :keys [edn-params] {:keys [id ]} :route-params :as r} (assert-can-see-company (:identity r) id) (let [id (Integer/parseInt id) @@ -22,12 +18,12 @@ updated-company (merge company {:address address :email email :locations locations})] - (companies/upsert id updated-company) - (doseq [bank-account new-bank-accounts] + #_(companies/upsert id updated-company) + #_(doseq [bank-account new-bank-accounts] (companies/add-bank-account id bank-account)) {:status 200 - :body (pr-str (companies/get-by-id id)) + :body (pr-str (clients/get-by-id id)) :headers {"Content-Type" "application/edn"}})) ::entity/company)) wrap-secure)) diff --git a/src/clj/auto_ap/routes/events.clj b/src/clj/auto_ap/routes/events.clj index 69376127..c53dde0e 100644 --- a/src/clj/auto_ap/routes/events.clj +++ b/src/clj/auto_ap/routes/events.clj @@ -1,8 +1,5 @@ (ns auto-ap.routes.events - (:require - [auto-ap.db.reminders :as reminders] - [auto-ap.db.vendors :as vendors] - [auto-ap.routes.utils :refer [wrap-secure]] + (:require [auto-ap.routes.utils :refer [wrap-secure]] [auto-ap.yodlee.import :as yodlee-import] [config.core :refer [env]] [clj-http.client :as http] diff --git a/src/clj/auto_ap/routes/exports.clj b/src/clj/auto_ap/routes/exports.clj index 7abd65e5..738d00a4 100644 --- a/src/clj/auto_ap/routes/exports.clj +++ b/src/clj/auto_ap/routes/exports.clj @@ -1,21 +1,14 @@ (ns auto-ap.routes.exports (:require - [auto-ap.db.invoices :as invoices] - [auto-ap.db.checks :as checks] - [auto-ap.db.transactions :as transactions] - [auto-ap.db.companies :as companies] [auto-ap.datomic.clients :as d-clients] [auto-ap.datomic.vendors :as d-vendors] [auto-ap.datomic.transactions :as d-transactions] - [auto-ap.db.vendors :as vendors] - [auto-ap.db.utils :refer [query]] [auto-ap.utils :refer [by]] [auto-ap.parse :as parse] [auto-ap.graphql :as graphql] [auto-ap.graphql.utils :refer [<-graphql ->graphql assert-admin]] [auto-ap.routes.utils :refer [wrap-secure]] [clj-time.coerce :refer [to-date]] - [auto-ap.db.invoices-expense-accounts :as expense-accounts] [ring.middleware.json :refer [wrap-json-response]] [compojure.core :refer [GET POST context defroutes wrap-routes]] [clojure.string :as str] diff --git a/src/clj/auto_ap/routes/graphql.clj b/src/clj/auto_ap/routes/graphql.clj index be8323e2..c3e4e271 100644 --- a/src/clj/auto_ap/routes/graphql.clj +++ b/src/clj/auto_ap/routes/graphql.clj @@ -1,7 +1,5 @@ (ns auto-ap.routes.graphql - (:require [auto-ap.db.companies :as companies] - [auto-ap.routes.utils :refer [wrap-secure wrap-spec]] - [auto-ap.entities.companies :as entity] + (:require [auto-ap.routes.utils :refer [wrap-secure wrap-spec]] [auto-ap.graphql :as ql] [buddy.auth :refer [throw-unauthorized]] [clojure.edn :as edn] diff --git a/src/clj/auto_ap/routes/reminders.clj b/src/clj/auto_ap/routes/reminders.clj index 28256913..5cf49321 100644 --- a/src/clj/auto_ap/routes/reminders.clj +++ b/src/clj/auto_ap/routes/reminders.clj @@ -1,7 +1,5 @@ (ns auto-ap.routes.reminders (:require - [auto-ap.db.reminders :as reminders] - [auto-ap.db.vendors :as vendors] [auto-ap.routes.utils :refer [wrap-secure]] [auto-ap.graphql.utils :refer [assert-admin]] [config.core :refer [env]] @@ -15,14 +13,14 @@ wrap-routes]]) (:import (org.joda.time DateTime))) -(defn next-sunday [] +#_(defn next-sunday [] (let [sunday (->> (p/periodic-seq (time/plus (time/today) (time/days 1)) (time/days 1)) (filter pred/sunday?) first)] (time/from-time-zone (time/date-time (time/year sunday) (time/month sunday) (time/day sunday)) (time/time-zone-for-id "America/Los_Angeles")))) -(defn schedule-reminders [] +#_(defn schedule-reminders [] (let [vendors (vendors/find-with-reminders) future-reminders (reminders/find-future (map :id vendors)) has-reminder-scheduled? (set (map :vendor-id future-reminders)) @@ -37,14 +35,14 @@ :email primary-email :scheduled (next-sunday)))))) -(defn find-ready-reminders [] +#_(defn find-ready-reminders [] (let [vendors (vendors/get-all) ready-reminders (reminders/get-ready)] ready-reminders)) -(defn replace-joda [x] +#_(defn replace-joda [x] (into {} (map (fn [[k v]] [k (if (instance? DateTime v) (c/to-date v) @@ -54,7 +52,7 @@ (defroutes routes (context "/reminders" [] - (POST "/send" {:keys [query-params headers body] :as x} + #_(POST "/send" {:keys [query-params headers body] :as x} (let [notification-type (get headers "x-amz-sns-message-type")] (println "Received notification " notification-type) (if (= "SubscriptionConfirmation" notification-type) @@ -72,7 +70,7 @@ {:status 200 :body "{}" :headers {"Content-Type" "application/edn"}}) - (wrap-routes + #_(wrap-routes (PUT "/:id" {:keys [ edn-params] {:keys [id] } :route-params identity :identity} (assert-admin identity) (let [id (if (int? id) diff --git a/src/clj/auto_ap/routes/vendors.clj b/src/clj/auto_ap/routes/vendors.clj index df59405a..63f1b3d8 100644 --- a/src/clj/auto_ap/routes/vendors.clj +++ b/src/clj/auto_ap/routes/vendors.clj @@ -1,5 +1,5 @@ (ns auto-ap.routes.vendors - (:require [auto-ap.db.vendors :as vendors] + (:require [auto-ap.db.vendors :as vendors] [auto-ap.entities.vendors :as entity] [auto-ap.graphql.utils :refer [assert-admin]] [auto-ap.routes.utils :refer [wrap-secure wrap-spec]] diff --git a/src/clj/auto_ap/routes/yodlee.clj b/src/clj/auto_ap/routes/yodlee.clj index 56d34e88..3e2621ef 100644 --- a/src/clj/auto_ap/routes/yodlee.clj +++ b/src/clj/auto_ap/routes/yodlee.clj @@ -7,7 +7,6 @@ [auto-ap.graphql.utils :refer [->graphql assert-admin]] [auto-ap.routes.utils :refer [wrap-secure]] [clj-time.coerce :refer [to-date]] - [auto-ap.db.invoices-expense-accounts :as expense-accounts] [ring.middleware.json :refer [wrap-json-response]] [compojure.core :refer [GET POST context defroutes wrap-routes]] [clojure.string :as str]