diff --git a/src/clj/auto_ap/db/invoices.clj b/src/clj/auto_ap/db/invoices.clj index 279180fe..276ca963 100644 --- a/src/clj/auto_ap/db/invoices.clj +++ b/src/clj/auto_ap/db/invoices.clj @@ -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")))) diff --git a/src/clj/auto_ap/handler.clj b/src/clj/auto_ap/handler.clj index c2bc909a..64c68b6e 100644 --- a/src/clj/auto_ap/handler.clj +++ b/src/clj/auto_ap/handler.clj @@ -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))))) diff --git a/src/cljs/auto_ap/db.cljs b/src/cljs/auto_ap/db.cljs index 0f7799af..f210d176 100644 --- a/src/cljs/auto_ap/db.cljs +++ b/src/cljs/auto_ap/db.cljs @@ -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} }) diff --git a/src/cljs/auto_ap/events.cljs b/src/cljs/auto_ap/events.cljs index 80ab4d77..2707f528 100644 --- a/src/cljs/auto_ap/events.cljs +++ b/src/cljs/auto_ap/events.cljs @@ -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 diff --git a/src/cljs/auto_ap/subs.cljs b/src/cljs/auto_ap/subs.cljs index 62249166..d0bd63f1 100644 --- a/src/cljs/auto_ap/subs.cljs +++ b/src/cljs/auto_ap/subs.cljs @@ -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 diff --git a/src/cljs/auto_ap/views.cljs b/src/cljs/auto_ap/views.cljs index 0f2550ff..4d62b9a5 100644 --- a/src/cljs/auto_ap/views.cljs +++ b/src/cljs/auto_ap/views.cljs @@ -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 "
"})))})) + (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 ""})))}))) (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"}