basic partition by company.

This commit is contained in:
Bryce Covert
2017-12-12 12:40:07 -08:00
parent 198c1a39a3
commit 5b8d25bf8f
6 changed files with 112 additions and 51 deletions

View File

@@ -17,8 +17,12 @@
(defn reject []
(j/delete! conn :invoices ["imported = false"]))
(defn get-unpaid []
(map db->clj (j/query conn "SELECT * FROM invoices WHERE imported=true")))
(defn get-unpaid [company]
(if company
(map db->clj (j/query conn ["SELECT * FROM invoices WHERE imported=true AND company = ?" company]))
(map db->clj (j/query conn "SELECT * FROM invoices WHERE imported=true"))))
(defn get-pending []
(map db->clj (j/query conn "SELECT * FROM invoices WHERE imported=false or imported is null")))
(defn get-pending [company]
(if company
(map db->clj (j/query conn ["SELECT * FROM invoices WHERE (imported=false or imported is null) AND company = ?" company]))
(map db->clj (j/query conn"SELECT * FROM invoices WHERE imported=false or imported is null"))))

View File

@@ -8,6 +8,7 @@
[ring.middleware.multipart-params :as mp]
[ring.util.response :as response]
[ring.middleware.defaults :refer [wrap-defaults site-defaults]]
[ring.middleware.params :refer [wrap-params]]
[ring.middleware.reload :refer [wrap-reload]]
[ring.middleware.json :refer [wrap-json-response]]
[ring.middleware.edn :refer [wrap-edn-params]]
@@ -30,14 +31,14 @@
:body (pr-str (invoices/get-all))
:headers {"Content-Type" "application/edn"}})
(GET "/api/invoices/unpaid" []
(GET "/api/invoices/unpaid" {:keys [query-params]}
{:status 200
:body (pr-str (invoices/get-unpaid))
:body (pr-str (invoices/get-unpaid (query-params "company")))
:headers {"Content-Type" "application/edn"}})
(GET "/api/invoices/pending" []
(GET "/api/invoices/pending" {:keys [query-params]}
{:status 200
:body (pr-str (invoices/get-pending))
:body (pr-str (invoices/get-pending (query-params "company")))
:headers {"Content-Type" "application/edn"}})
(POST "/api/invoices" {:keys [edn-params]}
@@ -45,15 +46,15 @@
{:status 200
:body (pr-str (invoices/get-all))
:headers {"Content-Type" "application/edn"}})
(POST "/api/invoices/approve" []
(POST "/api/invoices/approve" {:keys [query-params]}
(invoices/approve)
{:status 200
:body (pr-str (invoices/get-pending))
:body (pr-str (invoices/get-pending (query-params "company")))
:headers {"Content-Type" "application/edn"}})
(POST "/api/invoices/reject" []
(POST "/api/invoices/reject" {:keys [query-params]}
(invoices/reject)
{:status 200
:body (pr-str (invoices/get-pending))
:body (pr-str (invoices/get-pending (query-params "company")))
:headers {"Content-Type" "application/edn"}})
(POST "/pdf-upload"
{{ files "file"} :params :as params}
@@ -72,11 +73,11 @@
existing-invoices)))
)))
{:status 200
:body (pr-str (invoices/get-pending))
:body (pr-str (invoices/get-pending ((:query-params params ) "company")))
:headers {"Content-Type" "application/edn"}}))
(route/resources "/")
(routes (ANY "*" [] (response/resource-response "index.html" {:root "public"})))
(route/not-found "Not Found"))
(def app
(wrap-edn-params (mp/wrap-multipart-params (wrap-reload #'app-routes))))
(wrap-edn-params (mp/wrap-multipart-params (wrap-params (wrap-reload #'app-routes)))))

View File

@@ -2,8 +2,15 @@
(def default-db
{:company {:name "Campbell brewery"}
:companies [{:name "Campbell Brewing Company"
:matches ["campbell brewing company" "campbell brewery company" "campbell brewing"]}
{:name "Brown Chicken Brown Cow"
:matches ["brown chicken brown cow"]}
{:name "Naschmarkt Restaurant"
:matches ["naschmarkt" "naschmarkt restaurant"]}]
:invoices {:pending #{}
:unpaid #{}}
:status {:loading false}
:new-invoice {}
:menu {:active? false}
})

View File

@@ -11,6 +11,16 @@
(assoc db/default-db
:active-page (:handler (bidi/match-route routes/routes (.. js/window -location -pathname))))))
(re-frame/reg-event-db
::toggle-company-menu
(fn [db [_ active-page]]
(update-in db [:menu :active?] #(not %))))
(re-frame/reg-event-db
::swap-company
(fn [db [_ company]]
(assoc db :company company)))
(re-frame/reg-event-db
::set-active-page
(fn [db [_ active-page]]
@@ -25,7 +35,9 @@
::approve-invoices
(fn [cofx [_]]
{:http {:method :post
:uri "/api/invoices/approve"
:uri (str "/api/invoices/approve"
(when-let [company-name (-> cofx :db :company :name)]
(str "?company=" company-name)))
:on-success [::received-invoices :pending]
}}))
@@ -34,7 +46,9 @@
(fn [cofx []]
{:db (assoc-in (:db cofx) [:status :loading] true)
:http {:method :get
:uri "/api/invoices/pending"
:uri (str "/api/invoices/pending"
(when-let [company-name (-> cofx :db :company :name)]
(str "?company=" company-name)))
:on-success [::received-invoices :pending]}}))
(re-frame/reg-event-fx
@@ -42,14 +56,18 @@
(fn [cofx []]
{:db (assoc-in (:db cofx) [:status :loading] true)
:http {:method :get
:uri "/api/invoices/unpaid"
:uri (str "/api/invoices/unpaid"
(when-let [company-name (-> cofx :db :company :name)]
(str "?company=" company-name)))
:on-success [::received-invoices :unpaid]}}))
(re-frame/reg-event-fx
::reject-invoices
(fn [cofx [_]]
{:http {:method :post
:uri "/api/invoices/reject"
:uri (str "/api/invoices/reject"
(when-let [company-name (-> cofx :db :company :name)]
(str "?company=" company-name)))
:on-success [::received-invoices :pending]
}}))
(re-frame/reg-event-db

View File

@@ -2,9 +2,19 @@
(:require [re-frame.core :as re-frame]))
(re-frame/reg-sub
::name
::company
(fn [db]
(:name (:company db))))
(:company db)))
(re-frame/reg-sub
::companies
(fn [db]
(:companies db)))
(re-frame/reg-sub
::menu
(fn [db]
(:menu db)))
(re-frame/reg-sub
::active-page

View File

@@ -15,24 +15,27 @@
(when (= active-page candidate) " active"))
(def dropzone
(with-meta
(fn []
[:form.dz {:action "/pdf-upload"}
[:div.tile.notification
[:div.has-text-centered {:style {:padding "80px 0px" :width "100%"}}
[:span
[:span {:class "icon"}
[:i {:class "fa fa-cloud-download"}]]
"Drop any invoices you want to process here"]]]])
{:component-did-mount (fn [this]
(js/Dropzone. (reagent/dom-node this)
(clj->js {:init (fn []
(.on (js-this) "success" (fn [_ files]
(re-frame/dispatch [::events/received-invoices :pending (edn/read-string files)]))))
:paramName "file"
:url "/pdf-upload"
:previewsContainer "#dz-hidden"
:previewTemplate "<div class='dz-hidden-preview'></div>"})))}))
(let [company (re-frame/subscribe [::subs/company])]
(with-meta
(fn []
[:form.dz {:action "/pdf-upload"}
[:div.tile.notification
[:div.has-text-centered {:style {:padding "80px 0px" :width "100%"}}
[:span
[:span {:class "icon"}
[:i {:class "fa fa-cloud-download"}]]
"Drop any invoices you want to process here"]]]])
{:component-did-mount (fn [this]
(js/Dropzone. (reagent/dom-node this)
(clj->js {:init (fn []
(.on (js-this) "success" (fn [_ files]
(re-frame/dispatch [::events/received-invoices :pending (edn/read-string files)]))))
:paramName "file"
:url (str "/pdf-upload"
(when-let [company-name (-> @company :name)]
(str "?company=" company-name)))
:previewsContainer "#dz-hidden"
:previewTemplate "<div class='dz-hidden-preview'></div>"})))})))
(defmulti active-page identity)
@@ -163,11 +166,11 @@
[:label.label "Customer"]
[:div.control
[:input.input {:type "text"
:placeholder "Campbell's Brewery"
:value (:customer-identifier @form-data)
:placeholder "Brown Chicken Brown Cow"
:value (:company @form-data)
:on-change (fn [e]
(re-frame/dispatch [::events/change-form-state
[:new-invoice :customer-identifier]
[:new-invoice :company]
(.. e -target -value)]))}]]]
[:div.field
[:label.label "Invoice #"]
@@ -201,7 +204,7 @@
(.. e -target -value)]))}]]]
[:div.control
[:submit.button.is-large.is-primary {
:disabled (if (and (:total @form-data) (:date @form-data) (:customer-identifier @form-data) (:invoice-number @form-data)
:disabled (if (and (:total @form-data) (:date @form-data) (:company @form-data) (:invoice-number @form-data)
(:vendor @form-data))
""
"disabled")
@@ -215,22 +218,40 @@
"Save"]]]]]))
(defn main-panel []
(let [name (re-frame/subscribe [::subs/name])
ap (re-frame/subscribe [::subs/active-page])]
(let [company (re-frame/subscribe [::subs/company])
ap (re-frame/subscribe [::subs/active-page])
companies (re-frame/subscribe [::subs/companies])
menu (re-frame/subscribe [::subs/menu])]
[:div
[:nav {:class "navbar has-shadow"}
[:div {:class "container"}
[:div {:class "navbar-brand"}
[:a {:class "navbar-item", :href "../"}
[:h1 (str "Auto-ap - " @name)]]
[:div {:class "navbar-burger burger", :data-target "navMenu"}
[:span]
[:span]
[:span]]]
[:h1 (str "Auto-ap")]]]
[:div {:id "navMenu", :class "navbar-menu "
:on-click (fn [] (re-frame/dispatch [::events/toggle-company-menu]))}
[:div.navbar-start
[:div { :class (str "navbar-item has-dropdown " (when (:active? @menu) "is-active"))}
[:a {:class "navbar-link login"} "Company: " (if @company (:name @company)
"All")]
[:div {:class "navbar-dropdown"}
[:a {:class "navbar-item"
:on-click (fn [] (re-frame/dispatch [::events/swap-company nil]))
} "All"]
[:hr {:class "navbar-divider"}]
(for [{:keys [name] :as company} @companies]
^{:key name }
[:a {:class "navbar-item"
:on-click (fn [] (re-frame/dispatch [::events/swap-company company]))
} name])]]]]
[:div {:class "navbar-burger burger", :data-target "navMenu"}
[:span]
[:span]
[:span]]
[:div {:id "navMenu", :class "navbar-menu"}
[:div {:class "navbar-end"}
[:div {:class "navbar-item has-dropdown is-active"}
[:a {:class "navbar-link login"} ]
[:a {:class "navbar-link login"} "Login"]
[:div {:class "navbar-dropdown", :style {:display "none"}}
[:a {:class "navbar-item"} ]
[:a {:class "navbar-item"} ]
@@ -274,7 +295,7 @@
[:a {:class "button is-danger is-block is-bold" :href (bidi/path-for routes/routes :new-invoice)}
[:span {:class "compose"} "New Invoice"]]]]]
[:div {:class "column messages hero is-fullheight", :id "message-feed"}
[active-page @ap]]]
^{:key (str "active-page-" (:name @company))} [active-page @ap]]]
[:footer {:class "footer"}
[:div {:class "container"}
[:div {:class "content has-text-centered"}