diff --git a/scratch-sessions/build_ml.clj b/scratch-sessions/build_ml.clj index e74fdc1e..ad27fbc2 100644 --- a/scratch-sessions/build_ml.clj +++ b/scratch-sessions/build_ml.clj @@ -5,7 +5,7 @@ ;; You can also press C-u C-j to evaluate the expression and pretty-print its result. (ns build-ml - (:require [datomic.client.api :as dc] + (:require [datomic.api :as dc] [clojure.java.io :as io] [clojure.data.csv :as csv] [auto-ap.datomic :refer [conn]])) diff --git a/scratch-sessions/ingest_ml.clj b/scratch-sessions/ingest_ml.clj index 07001b8a..126d228b 100644 --- a/scratch-sessions/ingest_ml.clj +++ b/scratch-sessions/ingest_ml.clj @@ -41,7 +41,7 @@ (drop 1) (map (fn [[a n]] [(Long/parseLong a) (numeric-code->account (Long/parseLong n))]))) - (slurp-csv "/home/notid/dev/transaction-training/input/accounts.csv")) + (slurp-csv "/mnt/data/dev2/ml-test/input/accounts.csv")) vendor-name->vendor (into {} (dc/q '[:find ?vn ?v :in $ :where [?v :vendor/name ?vn]] @@ -51,18 +51,18 @@ (drop 1) (map (fn [[a n]] [(Long/parseLong a) (vendor-name->vendor (Long/parseLong n))]))) - (slurp-csv "/home/notid/dev/transaction-training/input/vendors.csv"))] - inference-vendor->vendor - #_(with-open [reader (io/reader "/home/notid/dev/transaction-training/inference-outcome.csv")] + (slurp-csv "/mnt/data/dev2/ml-test/input/vendors.csv"))] + #_inference-vendor->vendor + (with-open [reader (io/reader "/mnt/data/dev2/ml-test/inference-outcome.csv")] (->> (csv/read-csv reader) (into [] (comp (drop 1) (map (fn [[_ transaction best-vendor best-account account-confidence]] {:db/id (Long/parseLong transaction) - :transaction/recommended-account (Long/parseLong best-account) + :transaction/recommended-account (inference-account->account best-account) :transaction/account-confidence (Double/parseDouble account-confidence) - :transaction/recommended-vendor (Long/parseLong best-vendor)})))))))) + :transaction/recommended-vendor (inference-vendor->vendor best-vendor)})))))))) (defn apply-inference [inference] (doseq [p (->> inference (partition-all 100))] diff --git a/src/clj/auto_ap/ssr/company/company_1099.clj b/src/clj/auto_ap/ssr/company/company_1099.clj index 791f4f56..f254666d 100644 --- a/src/clj/auto_ap/ssr/company/company_1099.clj +++ b/src/clj/auto_ap/ssr/company/company_1099.clj @@ -13,9 +13,6 @@ [datomic.api :as dc] [iol-ion.query :refer [can-see-client?]])) -<<<<<<< HEAD -(defn get-1099-companies [user session] -======= (def vendor-read '[:db/id :vendor/name {:vendor/legal-entity-1099-type [:db/ident]} @@ -48,7 +45,6 @@ vendor-id))) (defn get-1099-companies [user {:keys [client-id] :as args}] ->>>>>>> 425942581295562d2c57843d7b19d9d4de962eda (let [clients (->> (dc/q '[:find ?c :in $ ?user :where [?c :client/code] diff --git a/src/clj/auto_ap/ssr/core.clj b/src/clj/auto_ap/ssr/core.clj index 171b4965..bb947cd0 100644 --- a/src/clj/auto_ap/ssr/core.clj +++ b/src/clj/auto_ap/ssr/core.clj @@ -39,6 +39,7 @@ :transaction-insight-table (wrap-client-redirect-unauthenticated (wrap-admin insights/insight-table)) :transaction-insight-rows (wrap-client-redirect-unauthenticated (wrap-admin insights/transaction-rows)) :transaction-insight-approve (wrap-client-redirect-unauthenticated (wrap-admin insights/approve)) + :transaction-insight-disapprove (wrap-client-redirect-unauthenticated (wrap-admin insights/disapprove)) :transaction-insight-explain (wrap-client-redirect-unauthenticated (wrap-admin insights/explain)) :admin-ezcater-xls (wrap-client-redirect-unauthenticated (wrap-admin ezcater-xls/page)) :search (wrap-client-redirect-unauthenticated (wrap-secure search/dialog-contents))}) diff --git a/src/clj/auto_ap/ssr/transaction/insights.clj b/src/clj/auto_ap/ssr/transaction/insights.clj index 4c716ec1..77ee295b 100644 --- a/src/clj/auto_ap/ssr/transaction/insights.clj +++ b/src/clj/auto_ap/ssr/transaction/insights.clj @@ -1,17 +1,18 @@ (ns auto-ap.ssr.transaction.insights (:require + [auto-ap.client-routes :as client-routes] [auto-ap.datomic :refer [conn visible-clients]] + [auto-ap.rule-matching :refer [spread-cents]] [auto-ap.ssr-routes :as ssr-routes] + [auto-ap.ssr.components :as com] + [auto-ap.ssr.svg :as svg] [auto-ap.ssr.ui :refer [base-page]] [auto-ap.ssr.utils :refer [html-response]] [auto-ap.time :as atime] [bidi.bidi :as bidi] [clj-time.coerce :as coerce] [datomic.api :as dc] - [hiccup2.core :as hiccup] - [auto-ap.ssr.components :as com] - [auto-ap.client-routes :as client-routes] - [auto-ap.ssr.svg :as svg])) + [iol-ion.tx :refer [random-tempid]])) (def pull-expr [:transaction/description-original :db/id @@ -93,9 +94,9 @@ :color :primary-light} svg/thumbs-up) (com/icon-button {:hx-delete (bidi/path-for ssr-routes/only-routes - :transaction-insight-approve + :transaction-insight-disapprove :transaction-id (:db/id r)) - :hx-swap "closest tr" + :hx-target "closest tr" :color :danger-light} svg/thumbs-down) (com/icon-button {:hx-get (bidi/path-for ssr-routes/only-routes @@ -106,13 +107,47 @@ svg/question)])))) (defn approve [{:keys [identity session] {:keys [transaction-id]} :route-params}] - (html-response (transaction-row - (dc/pull (dc/db conn) - pull-expr - (Long/parseLong transaction-id)) - :auto-remove? true - :hide-actions? true - :class "live-added"))) + (let [approval-details (dc/pull (dc/db conn) [{:transaction/recommended-account [:account/location :db/id]} + :transaction/recommended-vendor + :transaction/amount + :db/id + {:transaction/client [:client/locations]} ] + (cond-> transaction-id + string? (Long/parseLong))) + cents-to-distribute (int (Math/round (Math/abs (* (:transaction/amount approval-details) 100)))) + valid-locations (or + (some-> approval-details :transaction/recommended-account :account/location vector) + (->> approval-details + :transaction/client + :client/locations)) + updated-transaction [:upsert-transaction {:db/id (:db/id approval-details) + :transaction/approval-status :transaction-approval-status/approved + :transaction/vendor (:transaction/recommended-vendor approval-details) + :transaction/accounts (->> valid-locations + (map + (fn [cents location] + {:db/id (random-tempid) + :transaction-account/account (-> approval-details :transaction/recommended-account :db/id) + :transaction-account/amount (* 0.01 cents) + :transaction-account/location location}) + (spread-cents cents-to-distribute (count valid-locations))))}]] + @(dc/transact conn [updated-transaction]) + (html-response (transaction-row + (dc/pull (dc/db conn) + pull-expr + (Long/parseLong transaction-id)) + :auto-remove? true + :hide-actions? true + :class "live-added")))) + +(defn disapprove [{:keys [identity session] {:keys [transaction-id]} :route-params}] + (let [transaction-id (cond-> transaction-id string? (Long/parseLong))] + @(dc/transact conn [[:upsert-transaction {:db/id transaction-id :transaction/recommended-account nil :transaction/recommended-vendor nil}]]) + (html-response (transaction-row + (dc/pull (dc/db conn) pull-expr transaction-id) + :auto-remove? true + :hide-actions? true + :class "live-removed")))) (defn explain [{:keys [identity session] {:keys [transaction-id]} :route-params}] (let [r (dc/pull (dc/db conn) diff --git a/src/cljc/auto_ap/ssr_routes.cljc b/src/cljc/auto_ap/ssr_routes.cljc index 070e2ef6..a741d8f9 100644 --- a/src/cljc/auto_ap/ssr_routes.cljc +++ b/src/cljc/auto_ap/ssr_routes.cljc @@ -11,6 +11,7 @@ "transaction" {"/insights" {"" :transaction-insights "/table" :transaction-insight-table ["/approve/" [#"\d+" :transaction-id]] {:post :transaction-insight-approve} + ["/disapprove/" [#"\d+" :transaction-id]] {:delete :transaction-insight-disapprove} ["/rows/" [#"\d+" :after]] {:get :transaction-insight-rows} ["/explain/" [#"\d+" :transaction-id]] {:get :transaction-insight-explain}}} "company" {"" :company