you can now create cash payments.
This commit is contained in:
@@ -50,10 +50,9 @@
|
||||
(map db->clj)
|
||||
(map data->fields)))
|
||||
|
||||
(def all-keys #{:company-id :vendor-id :id :status :date :s3-uuid :s3-key :s3-url :check-number :memo :amount :paid-to :bank-account-id})
|
||||
(def all-keys #{:company-id :vendor-id :id :status :date :s3-uuid :s3-key :s3-url :check-number :memo :amount :paid-to :bank-account-id :type})
|
||||
|
||||
(defn add-sort-by [q sort-by asc]
|
||||
(println sort-by)
|
||||
(let [sort-by-key (keyword sort-by)]
|
||||
(cond (nil? sort-by)
|
||||
(helpers/merge-order-by q [:date])
|
||||
|
||||
@@ -41,6 +41,7 @@
|
||||
|
||||
:bank_account
|
||||
{:fields {:id {:type 'Int}
|
||||
:type {:type 'String}
|
||||
:number {:type 'String}
|
||||
:check_number {:type 'Int}
|
||||
:name {:type 'String}
|
||||
@@ -84,6 +85,7 @@
|
||||
|
||||
|
||||
:check {:fields {:id {:type 'Int}
|
||||
:type {:type 'String}
|
||||
:amount {:type 'String}
|
||||
:vendor {:type :vendor
|
||||
:resolve :get-vendor-for-check}
|
||||
|
||||
@@ -175,10 +175,15 @@
|
||||
:content-type "application/pdf"})
|
||||
(str "http://" (:data-bucket env) ".s3-website-us-east-1.amazonaws.com/merged-checks/" uuid ".pdf")))
|
||||
|
||||
(defn check-for-invoices [invoices vendor-id vendors company bank-account-id index invoice-amounts]
|
||||
|
||||
|
||||
(defmulti check-for-invoices (fn [invoices vendor-id vendors company bank-account index invoice-amounts]
|
||||
(:type bank-account)))
|
||||
|
||||
(defmethod check-for-invoices "check" [invoices vendor-id vendors company bank-account index invoice-amounts]
|
||||
(let [uuid (str (UUID/randomUUID))
|
||||
vendor (vendors vendor-id)
|
||||
bank-account (first (filter #(= (:id %) bank-account-id) (:bank-accounts company)))
|
||||
|
||||
|
||||
memo (str "Invoice #'s: "
|
||||
(str/join ", "
|
||||
@@ -189,7 +194,8 @@
|
||||
:s3-key (str "checks/" uuid ".pdf")
|
||||
:s3-url (str "http://" (:data-bucket env) ".s3-website-us-east-1.amazonaws.com/checks/" uuid ".pdf")
|
||||
:check-number (+ index (:check-number bank-account))
|
||||
:bank-account-id bank-account-id
|
||||
:type "check"
|
||||
:bank-account-id (:id bank-account)
|
||||
:amount (reduce + 0 (map (comp invoice-amounts :id) invoices))
|
||||
:memo memo
|
||||
:vendor-id (:id vendor)
|
||||
@@ -208,8 +214,20 @@
|
||||
:acct (:bank-code bank-account)
|
||||
:routing (:routing bank-account)
|
||||
:acct-number (:number bank-account)}}}
|
||||
|
||||
:invoices (map :id invoices)}))
|
||||
|
||||
(defmethod check-for-invoices "cash" [invoices vendor-id vendors company bank-account index invoice-amounts]
|
||||
(let [vendor (vendors vendor-id)]
|
||||
{:type "cash"
|
||||
:bank-account-id (:id bank-account)
|
||||
:amount (reduce + 0 (map (comp invoice-amounts :id) invoices))
|
||||
:status "cleared"
|
||||
:memo "Cash"
|
||||
:vendor-id (:id vendor)
|
||||
:company-id (:id company)
|
||||
:date (time/now)
|
||||
:invoices (map :id invoices)}))
|
||||
|
||||
(defn print-checks [invoice-payments company-id bank-account-id]
|
||||
(let [invoices (invoices/get-multi (map :invoice-id invoice-payments))
|
||||
@@ -217,8 +235,9 @@
|
||||
vendors (by :id (vendors/get-all))
|
||||
invoice-amounts (by :invoice-id :amount invoice-payments)
|
||||
invoices-grouped-by-vendor (group-by :vendor-id invoices)
|
||||
bank-account (first (filter #(= (:id %) bank-account-id) (:bank-accounts company)))
|
||||
checks (-> (for [[[vendor-id invoices] index] (map vector invoices-grouped-by-vendor (range))]
|
||||
[invoices (checks/insert! (check-for-invoices invoices vendor-id vendors company bank-account-id index invoice-amounts))])
|
||||
[invoices (checks/insert! (check-for-invoices invoices vendor-id vendors company bank-account index invoice-amounts))])
|
||||
doall)
|
||||
invoice-checks (invoices-checks/insert-multi!
|
||||
(mapcat
|
||||
@@ -230,20 +249,25 @@
|
||||
:amount (invoice-amounts (:id i))})
|
||||
invoices))
|
||||
checks))
|
||||
updated-company (update company :bank-accounts
|
||||
(fn [bas]
|
||||
(map (fn [ba]
|
||||
(if (= bank-account-id (:id ba))
|
||||
(update ba :check-number + (count checks))
|
||||
ba))
|
||||
bas)))]
|
||||
updated-company (if (= (:type bank-account) "cash" )
|
||||
company
|
||||
(update company :bank-accounts
|
||||
(fn [bas]
|
||||
(map (fn [ba]
|
||||
(if (= bank-account-id (:id ba))
|
||||
(update ba :check-number + (count checks))
|
||||
ba))
|
||||
bas))))]
|
||||
|
||||
(make-pdfs (map second checks))
|
||||
(companies/upsert company-id updated-company)
|
||||
(when (not= (:type bank-account) "cash")
|
||||
(make-pdfs (map second checks))
|
||||
(companies/upsert company-id updated-company))
|
||||
(doseq [{:keys [invoice-id amount]} invoice-payments]
|
||||
(invoices/apply-payment invoice-id amount))
|
||||
{:invoices (invoices/get-multi (map :id (mapcat first checks)))
|
||||
:pdf-url (merge-pdfs (map (comp :s3-key second) checks))}))
|
||||
:pdf-url (if (= (:type bank-account) "cash")
|
||||
nil
|
||||
(merge-pdfs (map (comp :s3-key second) checks)))}))
|
||||
|
||||
|
||||
(defroutes routes
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
:graphql {:token token
|
||||
:query-obj {:venia/queries [[:company
|
||||
|
||||
[:id :name :locations [:bank-accounts [:id :number :check-number :name] ]]]
|
||||
[:id :name :locations [:bank-accounts [:id :number :check-number :name :type] ]]]
|
||||
[:vendor
|
||||
[:id :name :default-expense-account :primary-contact :primary-email :primary-phone :secondary-contact :secondary-email :secondary-phone :print-as :invoice-reminder-schedule :code]]]}
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
(fn [{:keys [db]} [_ token user]]
|
||||
{:graphql {:token token
|
||||
:query-obj {:venia/queries [[:company
|
||||
[:id :name [:bank-accounts [:id :number :check-number :name]]]]
|
||||
[:id :name [:bank-accounts [:id :number :check-number :name :type]]]]
|
||||
[:vendor
|
||||
[:id :name :default-expense-account]]]}
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
:graphql {:token (-> cofx :db :user)
|
||||
:query-obj {:venia/queries [[:check_page
|
||||
(assoc params :company-id (:id @(re-frame/subscribe [::subs/company])))
|
||||
[[:checks [:id :status :amount :check_number :s3_url :date [:vendor [:name :id]] [:company [:name :id]]]]
|
||||
[[:checks [:id :status :amount :type :check_number :s3_url :date [:vendor [:name :id]] [:company [:name :id]]]]
|
||||
:total
|
||||
:start
|
||||
:end]]]}
|
||||
@@ -107,6 +107,7 @@
|
||||
:sort-by sort-by
|
||||
:asc asc}
|
||||
"Company"])
|
||||
|
||||
[sorted-column {:on-sort opc
|
||||
:style {:width percentage-size :cursor "pointer"}
|
||||
:sort-key "vendor"
|
||||
@@ -146,14 +147,16 @@
|
||||
[:tr
|
||||
[:td {:col-span 5}
|
||||
[:i.fa.fa-spin.fa-spinner]]]
|
||||
(for [{:keys [company s3-url checks check-number date amount id vendor status] :as i} (:checks @check-page)]
|
||||
(for [{:keys [company s3-url checks type check-number date amount id vendor status] :as i} (:checks @check-page)]
|
||||
^{:key id}
|
||||
[:tr {:class (:class i)}
|
||||
|
||||
(when-not selected-company
|
||||
[:td (:name company)])
|
||||
[:td (:name vendor)]
|
||||
[:td check-number]
|
||||
[:td (if (= "cash" type)
|
||||
"Cash"
|
||||
check-number)]
|
||||
[:td (date->str date) ]
|
||||
[:td (gstring/format "$%.2f" amount )]
|
||||
[:td status]
|
||||
|
||||
@@ -230,7 +230,8 @@
|
||||
(fn [{:keys [db]} _]
|
||||
{:dispatch [::events/modal-status ::new-invoice {:visible? true}]
|
||||
:db (assoc-in db [::new-invoice] {:company-id (:id @(re-frame/subscribe [::subs/company]))
|
||||
:date (date->str (c/now) standard)})}))
|
||||
:date (date->str (c/now) standard)
|
||||
:location (first (:locations @(re-frame/subscribe [::subs/company])))})}))
|
||||
|
||||
(re-frame/reg-event-fx
|
||||
::edit-invoice
|
||||
@@ -778,8 +779,11 @@
|
||||
[:div.dropdown-menu {:role "menu"}
|
||||
[:div.dropdown-content
|
||||
(list
|
||||
(for [{:keys [id number name]} (:bank-accounts current-company)]
|
||||
^{:key id} [:a.dropdown-item {:on-click (dispatch-event [::print-checks id])} "Print checks from " name])
|
||||
(for [{:keys [id number name type]} (:bank-accounts current-company)]
|
||||
(do (println type)
|
||||
(if (= "cash" type)
|
||||
^{:key id} [:a.dropdown-item {:on-click (dispatch-event [::print-checks id])} "With cash"]
|
||||
^{:key id} [:a.dropdown-item {:on-click (dispatch-event [::print-checks id])} "Print checks from " name])))
|
||||
^{:key "advanced-divider"} [:hr.dropdown-divider]
|
||||
|
||||
(when (= 1 (count checked))
|
||||
@@ -808,11 +812,18 @@
|
||||
[handwrite-checks-modal]
|
||||
[change-expense-accounts-modal]
|
||||
(when check-results-shown?
|
||||
[modal
|
||||
{:title "Your checks are ready!"
|
||||
:hide-event [::close-check-results]}
|
||||
[:div "Click " [:a {:href pdf-url :target "_new"} "here"] " to print them."]
|
||||
[:div [:em "Remember to turn off all scaling and margins."]]
|
||||
])
|
||||
(if pdf-url
|
||||
[modal
|
||||
{:title "Your checks are ready!"
|
||||
:hide-event [::close-check-results]}
|
||||
[:div "Click " [:a {:href pdf-url :target "_new"} "here"] " to print them."]
|
||||
[:div [:em "Remember to turn off all scaling and margins."]]
|
||||
]
|
||||
[modal
|
||||
{:title "Payment created!"
|
||||
:hide-event [::close-check-results]}
|
||||
[:div [:em "Your payment was created."]]
|
||||
]))
|
||||
|
||||
]))
|
||||
{:component-will-mount #(re-frame/dispatch-sync [::params-change {}]) }))
|
||||
|
||||
Reference in New Issue
Block a user