diff --git a/src/clj/auto_ap/datomic/migrate.clj b/src/clj/auto_ap/datomic/migrate.clj index a17aad01..770fc976 100644 --- a/src/clj/auto_ap/datomic/migrate.clj +++ b/src/clj/auto_ap/datomic/migrate.clj @@ -316,7 +316,21 @@ :auto-ap/add-scheduled-payment {:txes [[{:db/ident :invoice/scheduled-payment :db/doc "When an invoice gets marked as paid" :db/valueType :db.type/instant - :db/cardinality :db.cardinality/one}]]}} + :db/cardinality :db.cardinality/one}]]} + :auto-ap/add-scheduled-payment-dom {:txes [[{:db/ident :vendor/schedule-payment-dom + :db/doc "When an invoice gets marked as paid" + :db/valueType :db.type/ref + :db/cardinality :db.cardinality/many + :db/isComponent true} + {:db/ident :vendor-schedule-payment-dom/client + :db/doc "Which client the override is for" + :db/valueType :db.type/ref + :db/cardinality :db.cardinality/one} + {:db/ident :vendor-schedule-payment-dom/dom + :db/doc "What day of the month" + :db/valueType :db.type/long + :db/cardinality :db.cardinality/one}]]}} + sales/norms-map clients/norms-map ledger/norms-map @@ -331,8 +345,7 @@ (defn -main [& args] (mount/start (mount/only #{#'conn})) (migrate conn) - (mount/stop) - ) + (mount/stop)) (mount/defstate migrate-start diff --git a/src/clj/auto_ap/datomic/vendors.clj b/src/clj/auto_ap/datomic/vendors.clj index 9c21562c..46df18dc 100644 --- a/src/clj/auto_ap/datomic/vendors.clj +++ b/src/clj/auto_ap/datomic/vendors.clj @@ -10,13 +10,15 @@ (if clients (-> vendor (update :vendor/account-overrides (fn [ao] (filter #(clients (:db/id (:vendor-account-override/client %))) ao))) - (update :vendor/terms-overrides (fn [to] (filter #(clients (:db/id (:vendor-terms-override/client %))) to)))) + (update :vendor/terms-overrides (fn [to] (filter #(clients (:db/id (:vendor-terms-override/client %))) to))) + (update :vendor/schedule-payment-dom (fn [to] (filter #(clients (:db/id (:vendor-schedule-payment-dom/client %))) to)))) vendor))) (def default-read '[* {:vendor/account-overrides [* {:vendor-account-override/client [:client/name :db/id] :vendor-account-override/account [:account/name :account/numeric-code :db/id]}] :vendor/terms-overrides [* {:vendor-terms-override/client [:client/name :client/code :db/id]}] + :vendor/schedule-payment-dom [* {:vendor-schedule-payment-dom/client [:client/name :client/code :db/id]}] :vendor/automatically-paid-when-due [:db/id :client/name]}]) (defn get-usages [args] @@ -63,6 +65,7 @@ :vendor/account-overrides [* {:vendor-account-override/client [:client/name :db/id] :vendor-account-override/account [:account/name :account/numeric-code :db/id]}] :vendor/terms-overrides [* {:vendor-terms-override/client [:client/name :db/id]}] + :vendor/schedule-payment-dom [* {:vendor-schedule-payment-dom/client [:client/name :db/id]}] :vendor/automatically-paid-when-due [:db/id :client/name]}]) :in $ ?e :where [?e]] diff --git a/src/clj/auto_ap/graphql.clj b/src/clj/auto_ap/graphql.clj index d997d7e9..4bb3641c 100644 --- a/src/clj/auto_ap/graphql.clj +++ b/src/clj/auto_ap/graphql.clj @@ -136,6 +136,11 @@ :terms {:type 'Int} }} + :schedule_payment_dom + {:fields {:id {:type :id} + :client {:type :client} + :dom {:type 'Int}}} + :vendor_account_override {:fields {:id {:type :id} :client {:type :client} @@ -152,6 +157,7 @@ :hidden {:type 'Boolean} :automatically_paid_when_due {:type '(list :client)} :terms_overrides {:type '(list :terms_override)} + :schedule_payment_dom {:type '(list :schedule_payment_dom)} :account_overrides {:type '(list :vendor_account_override)} :usage {:type '(list :usage)} @@ -689,6 +695,11 @@ :client_id {:type :id} :account_id {:type :id}}} + :add_schedule_payment_dom + {:fields {:id {:type :id} + :client_id {:type :id} + :dom {:type 'Int}}} + :add_vendor {:fields {:id {:type :id} :name {:type 'String} @@ -705,6 +716,7 @@ :default_account_id {:type :id} :account_overrides {:type '(list :add_account_override)} + :schedule_payment_dom {:type '(list :add_schedule_payment_dom)} :invoice_reminder_schedule {:type 'String}}} :edit_expense_account diff --git a/src/clj/auto_ap/graphql/vendors.clj b/src/clj/auto_ap/graphql/vendors.clj index 9c293d7c..cb5f52f1 100644 --- a/src/clj/auto_ap/graphql/vendors.clj +++ b/src/clj/auto_ap/graphql/vendors.clj @@ -8,7 +8,7 @@ [clojure.set :as set])) -(defn upsert-vendor [context {{:keys [id name hidden terms code print_as primary_contact secondary_contact address default_account_id invoice_reminder_schedule terms_overrides account_overrides] :as in} :vendor} value] +(defn upsert-vendor [context {{:keys [id name hidden terms code print_as primary_contact secondary_contact address default_account_id invoice_reminder_schedule schedule_payment_dom terms_overrides account_overrides] :as in} :vendor} value] (when id (assert-admin (:id context))) #_(Thread/sleep 3000) @@ -31,6 +31,13 @@ :account (:account_id ao)} (:id ao) (assoc :db/id (:id ao)))) account_overrides) + schedule-payment-dom (mapv + (fn [ao] + (cond-> + #:vendor-schedule-payment-dom {:client (:client_id ao) + :dom (:dom ao)} + (:id ao) (assoc :db/id (:id ao)))) + schedule_payment_dom) transaction (cond-> [(remove-nils #:vendor {:db/id (if id id @@ -73,6 +80,7 @@ )})] (is-admin? (:id context)) (conj [:reset (if id id "vendor") :vendor/account-overrides account-overrides]) (is-admin? (:id context)) (conj [:reset (if id id "vendor") :vendor/terms-overrides terms-overrides]) + (is-admin? (:id context)) (conj [:reset (if id id "vendor") :vendor/schedule-payment-dom schedule-payment-dom]) (is-admin? (:id context)) (conj [:reset (if id id "vendor") :vendor/automatically-paid-when-due (mapv (fn [apwd] diff --git a/src/cljc/auto_ap/entities/vendors.cljc b/src/cljc/auto_ap/entities/vendors.cljc index a5f9e511..2ab20796 100644 --- a/src/cljc/auto_ap/entities/vendors.cljc +++ b/src/cljc/auto_ap/entities/vendors.cljc @@ -12,6 +12,7 @@ (s/def ::hidden boolean?) (s/def ::print-as (s/nilable string?)) (s/def ::terms (s/nilable int?)) +(s/def ::dom (s/nilable int?)) (s/def ::invoice-reminder-schedule (s/nilable #{"Weekly" "Never" nil})) diff --git a/src/cljs/auto_ap/events.cljs b/src/cljs/auto_ap/events.cljs index 7a566e01..41a594b2 100644 --- a/src/cljs/auto_ap/events.cljs +++ b/src/cljs/auto_ap/events.cljs @@ -20,6 +20,7 @@ [:account-overrides [[:client [:id :name]] :id [:account [:id :numeric-code :name]]]] [:automatically-paid-when-due [:id :name]] [:terms-overrides [[:client [:id :name]] :id :terms]] + [:schedule-payment-dom [[:client [:id :name]] :id :dom]] [:usage [:client-id :count]] [:primary-contact [:name :phone :email :id]] [:secondary-contact [:id :name :phone :email]] diff --git a/src/cljs/auto_ap/views/components/vendor_dialog.cljs b/src/cljs/auto_ap/views/components/vendor_dialog.cljs index 27f625e2..1e453c0d 100644 --- a/src/cljs/auto_ap/views/components/vendor_dialog.cljs +++ b/src/cljs/auto_ap/views/components/vendor_dialog.cljs @@ -30,7 +30,7 @@ [(forms/in-form ::vendor-form)] (fn [{:keys [data] :as form} _] (let [vendors @(re-frame/subscribe [::subs/vendors]) - text (.toLowerCase (:name data)) + text (.toLowerCase (:name data "")) matching-vendor (when (> (count text) 5) (->> vendors (filter #(not= (:id %) (:id data))) @@ -40,7 +40,7 @@ (fn [n] [v (jaro-winkler text n ) n text]) (ngrams v (count text))))) (filter #(> (second %) 0.9)) - #_(map (fn [x] (doto x println))) + (map first) first))] (if matching-vendor @@ -74,7 +74,7 @@ ::vendor-form (fn [data field value] (let [[override-key? i?] field] - (if (and (#{:account-overrides :terms-overrides} override-key?) + (if (and (#{:account-overrides :terms-overrides :schedule-payment-dom} override-key?) (nil? (get-in data [override-key? i? :key]))) [[override-key? i? :key] (random-uuid)] []))))) @@ -89,7 +89,8 @@ (re-frame/reg-event-fx ::save [with-user with-is-admin? (forms/triggers-loading ::vendor-form) (forms/in-form ::vendor-form)] - (fn [{:keys [user is-admin?] {{:keys [name hidden print-as terms invoice-reminder-schedule primary-contact automatically-paid-when-due secondary-contact address default-account terms-overrides account-overrides id] :as data} :data} :db} _] + (fn [{:keys [user is-admin?] {{:keys [name hidden print-as terms invoice-reminder-schedule primary-contact automatically-paid-when-due schedule-payment-dom secondary-contact address default-account terms-overrides account-overrides id] :as data} :data} :db} _] + (println data) (when (s/valid? ::entity/vendor data) { :graphql {:token user @@ -118,6 +119,12 @@ :client-id (:id client) :account-id (:id override)}) account-overrides) + :schedule-payment-dom (mapv + (fn [{:keys [client override id]}] + {:id id + :client-id (:id client) + :dom override}) + schedule-payment-dom) :automatically-paid-when-due (mapv :id automatically-paid-when-due)))} @@ -185,6 +192,35 @@ [:div.column.is-1 [:a.button {:on-click (dispatch-event [::removed-override override-key i])} [:span.icon [:span.icon-remove]]]]]))])])) +(defn client-overrides [{:keys [override-key override-value-key change-event data mandatory?]} template] + (let [clients @(re-frame/subscribe [::subs/clients]) + is-admin? @(re-frame/subscribe [::subs/is-admin?])] + (when is-admin? + [horizontal-field + [:label.label "Overrides"] + (doall + (for [[i override] (map vector (range) (conj (override-key data) {:key (random-uuid)}))] + ^{:key (or + (:id override) + (:key override))} + [:div.columns + [:div.column + [bind-field + [typeahead-entity {:matches clients + :match->text :name + :type "typeahead-entity" + :field [override-key i :client] + :event change-event + :subscription data}]]] + [:div.column + [bind-field + (template + [override-key i :override] + (get-in data [override-key i :client]) + )]] + [:div.column.is-1 + [:a.button {:on-click (dispatch-event [::removed-override override-key i])} [:span.icon [:span.icon-remove]]]]]))]))) + (defn form-content [{:keys [data change-event]}] (let [accounts @(re-frame/subscribe [::subs/accounts]) clients @(re-frame/subscribe [::subs/clients]) @@ -236,10 +272,23 @@ :event change-event :subscription data}])] - [:h2.subtitle "Automatically mark as paid when due"] + [:h2.subtitle "Schedule payment when due"] [client-list {:data data :change-event change-event :override-key :automatically-paid-when-due}] + [:h2.subtitle "Schedule payment on day of month"] + [client-overrides {:data data :change-event change-event + :mandatory? true + :override-key :schedule-payment-dom} + (fn [field client] + [:input.input {:type "number" + :step "1" + :style {:width "5em"} + :field field + :size 3 + :spec ::entity/dom + :event change-event + :subscription data}])] [:h2.subtitle "Expense Accounts"] [default-with-overrides {:data data :change-event change-event @@ -364,6 +413,12 @@ :override (:account ao)}) %)) + (update :schedule-payment-dom #(mapv + (fn [spdom] + {:id (:id spdom) + :client (:client spdom) + :override (:dom spdom)}) + %)) (update :terms-overrides #(mapv (fn [to] {:id (:id to) diff --git a/test/clj/auto_ap/graphql/vendors.clj b/test/clj/auto_ap/graphql/vendors.clj index 40e75b25..028189be 100644 --- a/test/clj/auto_ap/graphql/vendors.clj +++ b/test/clj/auto_ap/graphql/vendors.clj @@ -12,7 +12,7 @@ (with-redefs [auto-ap.datomic/uri "datomic:mem://datomic-transactor:4334/invoice"] (d/create-database uri) (with-redefs [auto-ap.datomic/conn (d/connect uri)] - (m/-main false) + (m/migrate conn) (f) (d/release conn) (d/delete-database uri))))