diff --git a/src/clj/auto_ap/datomic/checks.clj b/src/clj/auto_ap/datomic/checks.clj index 14884282..6575c2d8 100644 --- a/src/clj/auto_ap/datomic/checks.clj +++ b/src/clj/auto_ap/datomic/checks.clj @@ -77,6 +77,18 @@ :where ['[?e :payment/bank-account ?bank-account-id]]} :args [(:bank-account-id args)]}) + (:amount-gte args) + (merge-query {:query {:in ['?amount-gte] + :where ['[?e :payment/amount ?a] + '[(>= ?a ?amount-gte)]]} + :args [(:amount-gte args)]}) + + (:amount-lte args) + (merge-query {:query {:in ['?amount-lte] + :where ['[?e :payment/amount ?a] + '[(<= ?a ?amount-lte)]]} + :args [(:amount-lte args)]}) + (:amount args) (merge-query {:query {:in ['?amount] :where ['[?e :payment/amount ?transaction-amount] diff --git a/src/clj/auto_ap/datomic/invoices.clj b/src/clj/auto_ap/datomic/invoices.clj index c2c30902..66145da9 100644 --- a/src/clj/auto_ap/datomic/invoices.clj +++ b/src/clj/auto_ap/datomic/invoices.clj @@ -84,7 +84,19 @@ (merge-query {:query {:in ['?vendor-id] :where ['[?e :invoice/vendor ?vendor-id]]} :args [ (:vendor-id args)]}) - + + (:amount-gte args) + (merge-query {:query {:in ['?amount-gte] + :where ['[?e :invoice/total ?total-filter] + '[(>= ?total-filter ?amount-gte)]]} + :args [(:amount-gte args)]}) + + (:amount-lte args) + (merge-query {:query {:in ['?amount-lte] + :where ['[?e :invoice/total ?total-filter] + '[(<= ?total-filter ?amount-lte)]]} + :args [(:amount-lte args)]}) + (seq (:invoice-number-like args)) (merge-query {:query {:in ['?invoice-number-like] :where ['[?e :invoice/invoice-number ?invoice-number] diff --git a/src/clj/auto_ap/graphql.clj b/src/clj/auto_ap/graphql.clj index 299772df..fcd271f3 100644 --- a/src/clj/auto_ap/graphql.clj +++ b/src/clj/auto_ap/graphql.clj @@ -398,6 +398,8 @@ :status {:type :invoice_status} :client_id {:type :id} :vendor_id {:type :id} + :amount_lte {:type :money} + :amount_gte {:type :money} :invoice_number_like {:type 'String} :start {:type 'Int} :sort {:type '(list :sort_item)}} @@ -464,6 +466,8 @@ :args {:client_id {:type :id} :vendor_id {:type :id} :date_range {:type :date_range} + :amount_lte {:type :money} + :amount_gte {:type :money} :check_number_like {:type 'String} :start {:type 'Int} :sort {:type '(list :sort_item)}} diff --git a/src/clj/auto_ap/graphql/checks.clj b/src/clj/auto_ap/graphql/checks.clj index 3acf464c..3e88b4f8 100644 --- a/src/clj/auto_ap/graphql/checks.clj +++ b/src/clj/auto_ap/graphql/checks.clj @@ -366,7 +366,7 @@ (defn void-check [context {id :payment_id} value] (let [check (d-checks/get-by-id id)] (assert (or (= :payment-status/pending (:payment/status check)) - (#{:payment-type/cash} (:payment/type check)))) + (#{:payment-type/cash :payment-type/debit} (:payment/type check)))) (assert-can-see-client (:id context) (:db/id (:payment/client check))) (let [removing-payments (mapcat (fn [x] (let [invoice (:invoice-payment/invoice x) diff --git a/src/cljs/auto_ap/views/components/invoices/side_bar.cljs b/src/cljs/auto_ap/views/components/invoices/side_bar.cljs index df6396ed..4d3334ec 100644 --- a/src/cljs/auto_ap/views/components/invoices/side_bar.cljs +++ b/src/cljs/auto_ap/views/components/invoices/side_bar.cljs @@ -8,6 +8,7 @@ [bidi.bidi :as bidi] [auto-ap.routes :as routes] [auto-ap.views.components.date-range-filter :refer [date-range-filter]] + [auto-ap.views.components.number-filter :refer [number-filter]] [auto-ap.views.components.typeahead :refer [typeahead-entity]] [auto-ap.views.utils :refer [active-when dispatch-event bind-field horizontal-field date->str str->date pretty standard query-params]] [auto-ap.subs :as subs] @@ -29,12 +30,18 @@ :date-range :due-range :invoice-number-like + :amount-gte + :amount-lte :status})) url-filters {:vendor (when-let [vendor-id (:vendor-id url-filters)] {:id (str vendor-id) :name (get-in vendors-by-id [(str vendor-id) :name] "Loading...")}) :date-range (:date-range url-filters) :due-range (:due-range url-filters) + :amount-range {:raw {:amount-gte (:amount-gte url-filters) + :amount-lte (:amount-lte url-filters)} + :settled {:amount-gte (:amount-gte url-filters) + :amount-lte (:amount-lte url-filters)}} :invoice-number-like {:raw (:invoice-number-like url-filters) :settled (:invoice-number-like url-filters)}}] (merge url-filters specific-filters )))) @@ -53,6 +60,8 @@ {:vendor-id (:id (:vendor filters)) :date-range (:date-range filters) :due-range (:due-range filters) + :amount-gte (:amount-gte (:settled (:amount-range filters))) + :amount-lte (:amount-lte (:settled (:amount-range filters))) :invoice-number-like (:settled (:invoice-number-like filters)) :status (condp = ap :invoices nil @@ -77,6 +86,12 @@ {:db (assoc db :settled invoice-number-like) :dispatch [::filter-changed :invoice-number-like [:settled] invoice-number-like]})) +(re-frame/reg-event-fx + ::amount-range-settled + [(re-frame/path [::filters :amount-range])] + (fn [{:keys [db]} [_ which value]] + {:db (assoc-in db [:settled which] value) + :dispatch [::filter-changed :amount-range [:settled] (assoc (:settled db) which value)]})) (re-frame/reg-event-fx ::invoice-number-like-changed @@ -87,6 +102,16 @@ :key ::invoice-number-like} :db (assoc db :raw invoice-number-like)})) +(re-frame/reg-event-fx + ::amount-range-changed + [(re-frame/path [::filters :amount-range])] + (fn [{:keys [db]} [_ [which] value]] + {:dispatch-debounce + {:event [::amount-range-settled which value] + :time 500 + :key ::amount-range} + :db (assoc-in db [:raw which] value)})) + (defn invoice-number-filter [] [:div.field [:div.control [:input.input {:placeholder "AP-123" @@ -153,6 +178,12 @@ {:on-change-event [::filter-changed :due-range] :value @(re-frame/subscribe [::filter :due-range])}]] + [:p.menu-label "Amount"] + [:div + [number-filter + {:on-change-event [::amount-range-changed] + :value (:raw @(re-frame/subscribe [::filter :amount-range]))}]] + [:p.menu-label "Invoice #"] [:div [invoice-number-filter]]])])) diff --git a/src/cljs/auto_ap/views/pages/payments.cljs b/src/cljs/auto_ap/views/pages/payments.cljs index 44fd8ba4..c8b9d9ec 100644 --- a/src/cljs/auto_ap/views/pages/payments.cljs +++ b/src/cljs/auto_ap/views/pages/payments.cljs @@ -66,7 +66,9 @@ :start :end]]]} :on-success [::received] - :on-error [::events/page-failed]}}))) + :on-error [::events/page-failed]} + :set-uri-params (dissoc params + :client-id)}))) (re-frame/reg-event-fx ::void-check diff --git a/src/cljs/auto_ap/views/pages/payments/side_bar.cljs b/src/cljs/auto_ap/views/pages/payments/side_bar.cljs index a2674af5..fee613d2 100644 --- a/src/cljs/auto_ap/views/pages/payments/side_bar.cljs +++ b/src/cljs/auto_ap/views/pages/payments/side_bar.cljs @@ -4,16 +4,42 @@ [auto-ap.views.utils :refer [active-when]] [auto-ap.views.components.vendor-filter :refer [vendor-filter]] [auto-ap.views.components.date-range-filter :refer [date-range-filter]] + [auto-ap.views.components.number-filter :refer [number-filter]] [auto-ap.views.components.bank-account-filter :refer [bank-account-filter]] [auto-ap.views.components.typeahead :refer [typeahead-entity]] [bidi.bidi :as bidi] [re-frame.core :as re-frame])) (re-frame/reg-sub - ::filters + ::specific-filters (fn [db ] (::filters db {}))) +(re-frame/reg-sub + ::filters + :<- [::specific-filters] + :<- [::subs/vendors-by-id] + :<- [::subs/query-params] + (fn [[specific-filters vendors-by-id query-params] ] + (let [url-filters (-> query-params + (select-keys #{:vendor-id + :amount-gte + :amount-lte + :date-range + :check-number-like})) + url-filters {:vendor (when-let [vendor-id (:vendor-id url-filters)] + {:id (str vendor-id) + :name (get-in vendors-by-id [(str vendor-id) :name] "Loading...")}) + :date-range (:date-range url-filters) + :amount-range {:raw {:amount-gte (:amount-gte url-filters) + :amount-lte (:amount-lte url-filters)} + :settled {:amount-gte (:amount-gte url-filters) + :amount-lte (:amount-lte url-filters)}} + :check-number-like {:raw (:check-number-like url-filters) + :settled (:check-number-like url-filters)}}] + (println "URL filters" url-filters) + (merge url-filters specific-filters )))) + (re-frame/reg-sub ::filter :<- [::filters] @@ -26,6 +52,8 @@ (fn [filters] {:vendor-id (:id (:vendor filters)) :date-range (:date-range filters) + :amount-gte (:amount-gte (:settled (:amount-range filters))) + :amount-lte (:amount-lte (:settled (:amount-range filters))) :check-number-like (:settled (:check-number-like filters))})) @@ -45,6 +73,12 @@ {:db (assoc db :settled description) :dispatch [::filter-changed :check-number-like [:settled] description]})) +(re-frame/reg-event-fx + ::amount-range-settled + [(re-frame/path [::filters :amount-range])] + (fn [{:keys [db]} [_ which value]] + {:db (assoc-in db [:settled which] value) + :dispatch [::filter-changed :amount-range [:settled] (assoc (:settled db) which value)]})) (re-frame/reg-event-fx ::check-number-like-changed @@ -56,6 +90,16 @@ :key ::check-number-like} :db (assoc db :raw description)})) +(re-frame/reg-event-fx + ::amount-range-changed + [(re-frame/path [::filters :amount-range])] + (fn [{:keys [db]} [_ [which] value]] + {:dispatch-debounce + {:event [::amount-range-settled which value] + :time 500 + :key ::amount-range} + :db (assoc-in db [:raw which] value)})) + (defn check-number-filter [] [:div.field [:div.control [:input.input {:placeholder "10001" @@ -82,5 +126,12 @@ {:on-change-event [::filter-changed :date-range] :value @(re-frame/subscribe [::filter :date-range])}]] + [:p.menu-label "Amount"] + [:div + (println (:raw @(re-frame/subscribe [::filter :amount-range]))) + [number-filter + {:on-change-event [::amount-range-changed] + :value (:raw @(re-frame/subscribe [::filter :amount-range]))}]] + [:p.menu-label "Check #"] [:div [check-number-filter]]]])) diff --git a/src/cljs/auto_ap/views/pages/payments/table.cljs b/src/cljs/auto_ap/views/pages/payments/table.cljs index 040144d4..9010b171 100644 --- a/src/cljs/auto_ap/views/pages/payments/table.cljs +++ b/src/cljs/auto_ap/views/pages/payments/table.cljs @@ -8,10 +8,17 @@ [re-frame.core :as re-frame])) (re-frame/reg-sub - ::table-params + ::specific-table-params (fn [db] (::table-params db))) +(re-frame/reg-sub + ::table-params + :<- [::specific-table-params] + :<- [::subs/query-params] + (fn [[specific-table-params query-params]] + (merge (select-keys query-params #{:start :sort}) specific-table-params))) + (re-frame/reg-event-fx ::params-changed [(re-frame/path [::table-params])] @@ -40,7 +47,7 @@ [:td status] [:td (when (or (= :pending status) - (and (#{":cash" :cash} type) + (and (#{":cash" :cash ":debit" :debit} type) (not= :voided status))) [:button.button.is-warning.is-outlined {:on-click (dispatch-event (conj void-event check))} [:span [:span.icon [:i.fa.fa-minus-circle]]]])]]))