huge number of changes to start making all usages of expense accounts dynamic.

This commit is contained in:
Bryce Covert
2019-04-12 15:39:32 -07:00
parent e64820d71a
commit b6e73f0bfb
21 changed files with 103 additions and 181 deletions

View File

@@ -45,11 +45,11 @@
[:id :name :code :email :locations [:bank-accounts [:id :code :number :bank-name :bank-code :check-number :name :routing :type :sort-order :visible :yodlee-account-id] ]
[:address [:street1 :street2 :city :state :zip]]]]
[:vendor
[:id :name :default-expense-account [:primary-contact [:name :phone :email :id]] [:secondary-contact [:id :name :phone :email]] :print-as :invoice-reminder-schedule :code]]
[:accounts [:numeric-code :name :type :account_set :id]]]}
[:id :name [:default-account [:name :id :location]] [:primary-contact [:name :phone :email :id]] [:secondary-contact [:id :name :phone :email]] :print-as :invoice-reminder-schedule :code]]
[:accounts [:numeric-code :location :name :type :account_set :id]]]}
:on-success [::received-initial]}}))))
(def vendor-query
[:id :name :default-expense-account
[:id :name [:default-account [:name :id :location]]
[:primary-contact [:name :phone :email :id]]
[:secondary-contact [:id :name :phone :email]]
:print-as :invoice-reminder-schedule :code
@@ -67,8 +67,8 @@
:query-obj {:venia/queries [[:client
[:id :name :code [:address [:street1 :street2 :city :state :zip]] [:bank-accounts [:id :code :number :bank-name :bank-code :check-number :name :routing :type :sort-order :visible :yodlee-account-id] ]]]
[:vendor
[:id :name :default-expense-account [:primary-contact [:name :phone :email :id]] [:secondary-contact [:id :name :phone :email]] :print-as :invoice-reminder-schedule :code]]
[:accounts [:numeric-code :name :type :account_set :id]]]}
[:id :name [:default-account [:name :id :location]] [:primary-contact [:name :phone :email :id]] [:secondary-contact [:id :name :phone :email]] :print-as :invoice-reminder-schedule :code]]
[:accounts [:numeric-code :name :location :type :account_set :id]]]}
:on-success [::received-initial]}
:db (assoc db :user (assoc user :token token))}))

View File

@@ -10,18 +10,14 @@
[bidi.bidi :as bidi]))
(def vendor-query
[:id :name :default-expense-account
[:primary-contact [:name :phone :email :id]]
[:secondary-contact [:id :name :phone :email]]
:print-as :invoice-reminder-schedule :code
[:address [:street1 :street2 :city :state :zip]]])
(re-frame/reg-event-fx
::edit
(fn [{:keys [db]} [_ vendor-id]]
{:db (assoc-in db [:admin :vendor]
(get (:vendors db) vendor-id))
(-> (get (:vendors db) vendor-id)
(assoc :default-account-id (:id (:default-account (get (:vendors db) vendor-id))))))
:dispatch [::events/modal-status :auto-ap.views.pages.admin.vendors/admin-vendor {:visible? true}]}))
(re-frame/reg-event-fx
@@ -35,7 +31,8 @@
::save
(fn [{:keys [db]} _]
(let [edited-vendor (get-in db [:admin :vendor])
fx {:db (assoc-in db [:admin :vendor :saving?] true)}]
fx {:db (assoc-in db [:admin :vendor :saving?] true)}
_ (println "EDITED" edited-vendor)]
(when (s/valid? ::entity/vendor edited-vendor)
(assoc fx :graphql
{:token (-> db :user)
@@ -43,8 +40,9 @@
:operation/name "UpsertVendor"}
:venia/queries [{:query/data [:upsert-vendor
{:vendor edited-vendor}
vendor-query]}]}
{:vendor (-> edited-vendor
(dissoc :default-account))}
events/vendor-query]}]}
:on-success [::save-complete]
:on-error [::save-error]})))))
@@ -90,6 +88,7 @@
(re-frame/reg-event-db
::change
(fn [db [_ path value]]
(println path value)
(assoc-in db (concat [:admin :vendor] path)
value)))
@@ -112,7 +111,7 @@
::mounted
(fn [{:keys [db]} _]
{:graphql {:token (:user db)
:query-obj {:venia/queries [[:vendor vendor-query]]}
:query-obj {:venia/queries [[:vendor events/vendor-query]]}
:on-success [::received-vendors]}}))
(re-frame/reg-event-db

View File

@@ -1,75 +0,0 @@
(ns auto-ap.events.expense-accounts
(:require [re-frame.core :as re-frame]
[reagent.core :as r]
[clojure.string :as str]
[clojure.spec.alpha :as s]
[cljs-time.core :as c]
[goog.string :as gstring]
[auto-ap.entities.clients :as clients]
[auto-ap.entities.invoice :as invoice]
[auto-ap.entities.vendors :as vendor]
[auto-ap.expense-accounts :as expense-accounts]
[auto-ap.entities.invoices-expense-accounts :as invoices-expense-accounts]
[auto-ap.views.utils :refer [dispatch-event bind-field horizontal-field date->str str->date pretty standard]]
[auto-ap.utils :refer [by replace-if]]
[auto-ap.events :as events]))
(re-frame/reg-event-fx
::change-expense-accounts
(fn [{:keys [db]} [_ id]]
{:dispatch [::events/modal-status ::change-expense-accounts {:visible? true}]
:db (assoc-in db [::change-expense-accounts :invoice] (get (by :id (get-in db [::invoice-page :invoices])) id))}))
(re-frame/reg-event-fx
::change-expense-accounts-saving
(fn [{:keys [db]} [_ id]]
(let [{:keys [id expense-accounts]} (get-in db [::change-expense-accounts :invoice])]
{:graphql
{:token (-> db :user)
:query-obj {:venia/operation {:operation/type :mutation
:operation/name "EditExpenseAccounts"}
:venia/queries [{:query/data [:edit-expense-accounts
{:invoice-id id
:expense-accounts (map (fn [ea] {:id (:id ea)
:amount (:amount ea)
:location (:location ea)
:expense-account-id (:expense-account-id ea)})
expense-accounts)}
[:id :total :outstanding-balance :invoice-number :date
[:vendor [:name :id]]
[:expense_accounts [:amount :id :location :expense_account_id
[:expense_account [:id :name [:parent [:id :name]]]]]]
[:client [:name :id :locations]]
[:checks [:amount [:check [:amount :s3_url :check_number ]]]]
]]}]}
:on-success [::expense-accounts-updated]}})))
(re-frame/reg-event-fx
::expense-accounts-updated
(fn [{:keys [db]} [_ data]]
(let [updated (:edit-expense-accounts data)]
{:dispatch [::events/modal-completed ::change-expense-accounts]
:db (-> db
(update-in [::invoice-page :invoices]
(fn [is]
(replace-if #(= (:id %1) (:id %2)) updated is)))
(dissoc ::change-expense-accounts))})))
(re-frame/reg-event-db
::add-expense-account-split
(fn [db _]
(let [{{{:keys [locations]} :client} :invoice} @(re-frame/subscribe [::change-expense-accounts])]
(update-in db [::change-expense-accounts :invoice :expense-accounts]
conj {:amount 0 :expense-account-id nil :location (first locations)}))))
(re-frame/reg-event-db
::remove-expense-account-split
(fn [db [_ index]]
(update-in db [::change-expense-accounts :invoice :expense-accounts]
(fn [expense-accounts]
(vec (concat (take index expense-accounts)
(drop (inc index) expense-accounts)))))))

View File

@@ -20,11 +20,25 @@
(fn [db]
(:accounts db)))
(re-frame/reg-sub
::account
:<- [::accounts]
(fn [as [_ i]]
(first (filter
#(= (:id %) i)
as))))
(re-frame/reg-sub
::accounts-for-client
(fn [db client]
(:accounts db)))
(re-frame/reg-sub
::accounts-for-current-client
(fn [db]
(:accounts db)))
(re-frame/reg-sub
::bank-accounts
:<- [::clients]
@@ -132,9 +146,9 @@
(re-frame/reg-sub
::chooseable-expense-accounts
(fn [db]
(map (fn [[k v]] (assoc v :id k))
chooseable-expense-accounts)))
:<- [::accounts-for-current-client]
(fn [accounts]
accounts))
(re-frame/reg-sub
::page-failure

View File

@@ -25,8 +25,8 @@
(re-frame/reg-sub
::expense-account
:<- [::change-expense-accounts]
(fn [{{:keys [expense-accounts] :or {expense-accounts [] }} :invoice} [_ expense-account-id]]
(first (filter #(= expense-account-id (:id %)) expense-accounts))))
(fn [{{:keys [expense-accounts] :or {expense-accounts [] }} :invoice} [_ invoice-expense-account-id]]
(first (filter #(= invoice-expense-account-id (:id %)) expense-accounts))))
(re-frame/reg-event-fx
::change-expense-accounts
@@ -89,12 +89,12 @@
)
:amount (:new-amount ea)
:location (:location ea)
:expense-account-id (:expense-account-id ea)})
:account-id (:id (:account ea))})
expense-accounts)}
[:id :total :outstanding-balance :invoice-number :date :status
[:vendor [:name :id]]
[:expense_accounts [:amount :id :location :expense_account_id
[:expense_account [:id :name [:parent [:id :name]]]]]]
[:account [:id :name :numeric-code :location]]]]
[:client [:name :id :locations]]
[:payments [:amount :id [:payment [:amount :s3_url :check_number ]]]]]]}]}
:on-success on-success}})))
@@ -104,7 +104,7 @@
(fn [db _]
(let [{{{:keys [locations]} :client} :invoice} @(re-frame/subscribe [::change-expense-accounts])]
(update-in db [::change-expense-accounts :invoice :expense-accounts]
conj {:amount "0.0" :id (str "new-" (random-uuid)) :expense-account-id {} :location (first locations)}))))
conj {:amount "0.0" :id (str "new-" (random-uuid)) :account {} :location (first locations)}))))
(re-frame/reg-event-db
::remove-expense-account-split
@@ -148,21 +148,22 @@
[:th {:style {:width "5em"}}]]]
[:tbody
(doall (for [{:keys [id] :as expense-account} expense-accounts
:let [sub @(re-frame/subscribe [::expense-account (:id expense-account)])]]
:let [sub @(re-frame/subscribe [::expense-account (:id expense-account)])
_ (println "SUBB" sub)]]
^{:key id}
[:tr
[:td.expandable [:div.control
[bind-field
[typeahead {:matches (map (fn [x] [(:id x) (str (:id x) " - " (:name x))]) chooseable-expense-accounts)
[typeahead {:matches (map (fn [x] [(:id x) (str (:numeric-code x) " - " (:name x))]) chooseable-expense-accounts)
:type "typeahead"
:field [:expense-account-id]
:field [:account :id]
:event [::change id]
:spec ::invoices-expense-accounts/expense-account-id
:spec ::invoices-expense-accounts/account-id
:subscription sub}]]]]
(when multi-location?
[:td
(if-let [forced-location (-> expense-account :expense-account-id expense-accounts/expense-accounts :location)]
(if-let [forced-location (:location @(re-frame/subscribe [::subs/account (-> sub :account :id )]))]
[:div.select
[:select {:disabled "disabled" :value forced-location} [:option {:value forced-location} forced-location]]]
[:div.select

View File

@@ -49,8 +49,8 @@
:client-id (:id @(re-frame/subscribe [::subs/client])))
[[:invoices [:id :total :outstanding-balance :invoice-number :date :status
[:vendor [:name :id]]
[:expense_accounts [:amount :id :expense_account_id :location
[:expense_account [:id :name :location [:parent [:id :name]]]]]]
[:expense_accounts [:amount :id :location
[:account [:id :name :numeric-code :location ]]]]
[:client [:name :id :locations]]
[:payments [:amount :id [:payment [:id :status :amount :s3_url :check_number
[:transaction [:post_date]]]]]]]]
@@ -182,7 +182,7 @@
[:div
(for [e expense-accounts]
^{:key (:id e)}
[:span.dropdown-item (:name (:expense-account e)) " " (gstring/format "$%.2f" (:amount e) ) ])
[:span.dropdown-item (:name (:account e)) " " (gstring/format "$%.2f" (:amount e) ) ])
[:hr.dropdown-divider]

View File

@@ -12,8 +12,8 @@
[auto-ap.subs :as subs]))
(defn vendor-dialog [{:keys [vendor save-event change-event id] {:keys [name]} :vendor}]
(println (s/explain ::entity/vendor vendor) )
(let [clients-by-id @(re-frame/subscribe [::subs/clients-by-id])]
(let [clients-by-id @(re-frame/subscribe [::subs/clients-by-id])
chooseable-expense-accounts @(re-frame/subscribe [::subs/chooseable-expense-accounts]) ]
[action-modal {:id id
:title [:span (if (:id vendor)
(str "Edit " (or name "<vendor>"))
@@ -51,23 +51,12 @@
[horizontal-field
[:label.label "Default"]
[bind-field
[typeahead {:matches (map (fn [[k v]] [k (:name v)]) chooseable-expense-accounts)
[typeahead {:matches (map (fn [x] [(:id x) (str (:numeric-code x) " - " (:name x))]) chooseable-expense-accounts)
:type "typeahead"
:field [:default-expense-account]
:spec ::entity/default-expense-account
:field [:default-account-id]
:event change-event
:subscription vendor}]]]
#_[horizontal-field
[:label.label "Code"]
[:div.control
[bind-field
[:input.input.is-expanded {:type "text"
:field :code
:spec ::entity/code
:event change-event
:subscription vendor}]]
[:p.help "The vendor code is used for invoice parsing. Only one vendor at a time can use a code"]]]
[:h2.subtitle "Address"]
[address-field {:field [:address]
@@ -163,11 +152,4 @@
:event change-event
:subscription vendor}]]
" Never"]]]
(when (:saving? vendor) [:div.is-overlay {:style {"backgroundColor" "rgba(150,150,150, 0.5)"}}])]))

View File

@@ -54,17 +54,13 @@
(take 5))
top-5 (vec (take 5 expense-account-stats))
rest (drop 5 expense-account-stats)
other {:expense-account-id 0 :expense-account-name "Other" :total (reduce + 0 (map :total rest))}]
other {:account {:id 0 :name "Other"} :total (reduce + 0 (map :total rest))}]
(cond-> db
(seq top-5)
(assoc ::top-expense-categories (conj top-5 other))
(seq invoice-stats)
(assoc ::invoice-stats invoice-stats)
)
)))
(assoc ::invoice-stats invoice-stats)))))
(re-frame/reg-sub
::invoice-stats
@@ -84,7 +80,7 @@
:graphql {:token (-> db :user)
:query-obj {:venia/queries [[:expense_account_stats
{:client-id (:id @(re-frame/subscribe [::subs/client]))}
[:expense-account-id :total :expense-account-name]]
[[:account [:id :name]] :total]]
[:invoice_stats
{:client-id (:id @(re-frame/subscribe [::subs/client]))}
[:name :paid :unpaid]]]}
@@ -98,7 +94,7 @@
[:h1.title.is-4 "Top expense categories"]
(let [expense-categories @(re-frame/subscribe [::top-expense-categories])]
(make-pie-chart {:width 800 :height 500 :data (clj->js
(map (fn [x] {:name (:expense-account-name x) :value (:total x)}) expense-categories))}))
(map (fn [x] {:name (:name (:account x)) :value (:total x)}) expense-categories))}))
[:h1.title.is-4 "Upcoming Bills"]
(make-bar-chart {:width 800 :height 500 :data (clj->js
@(re-frame/subscribe [::invoice-stats]))})]}]))

View File

@@ -20,7 +20,7 @@
(on-params-change (merge @params p)))}]
"Showing " (inc start) "-" end "/" total
[:table.table.is-fullwidth
[:table.table.is-fullwidth.compact
[:thead
[:tr
(when-not selected-client

View File

@@ -35,7 +35,6 @@
(fn [{:keys [db]} [_ edit-completed]]
(when @(re-frame/subscribe [::can-submit])
(let [{{:keys [id vendor-id account-id]} :data :as data} @(re-frame/subscribe [::forms/form ::edit-transaction])]
(println "DATA" data)
{:db (forms/loading db ::edit-transaction )
:graphql
{:token (-> db :user)

View File

@@ -32,9 +32,9 @@
[:client [:id :name :locations]]
[:payments [:amount [:payment [:amount :s3_url :check_number ]]]]
[:vendor [:id :name]]
[:expense_accounts [:amount :id :expense_account_id
[:expense_accounts [:amount :id
:location
[:expense_account [:id :name [:parent [:id :name]]]]]]])
[:account [:id :numeric-code :name :location]]]]])
(defn does-amount-exceed-outstanding? [amount outstanding-balance]
(let [amount (js/parseFloat amount)
@@ -819,10 +819,10 @@
[:div
[:h2.subtitle "Expense Accounts"]
(for [[index {:keys [id location expense-account-id] :as expense-account}] (map vector (range) (:expense-accounts data))]
(for [[index {:keys [id location] :as expense-account {account-id :id account-numeric-code :numeric-code account-name :name} :account}] (map vector (range) (:expense-accounts data))]
^{:key id}
[:div.columns
[:div.column expense-account-id " - "(-> expense-account-id expense-accounts/expense-accounts :name)]
[:div.column account-numeric-code " - " account-name]
(when multi-location?
[:div.column location])