diff --git a/resources/public/css/main.css b/resources/public/css/main.css index dd368350..2a49d742 100644 --- a/resources/public/css/main.css +++ b/resources/public/css/main.css @@ -464,4 +464,14 @@ table.balance-sheet th.total { @media print { /* All your print styles go here */ #header, #footer, #nav, .menu, .aside ,.nav, .navbar{ display: none !important; } + + .report-controls { + display: none !important; + + } + + #message-feed { + overflow: inherit !important; + + } } diff --git a/src/cljs/auto_ap/events.cljs b/src/cljs/auto_ap/events.cljs index 66151a7b..8c282a67 100644 --- a/src/cljs/auto_ap/events.cljs +++ b/src/cljs/auto_ap/events.cljs @@ -24,17 +24,20 @@ {:redirect "/login" :db (assoc db/default-db :active-page :login + :last-client-id (.getItem js/localStorage "last-client-id") :user token)} (and token (= "none" (or (get (jwt->data token) "role") (get (jwt->data token) "user/role")) )) {:redirect "/needs-activation" :db (assoc db/default-db :active-page :needs-activation + :last-client-id (.getItem js/localStorage "last-client-id") :user token)} :else {:db (assoc db/default-db :active-page handler + :last-client-id (.getItem js/localStorage "last-client-id") :query-params (->> (:query (url (.-location js/window))) (map (fn [[k v]] [(keyword k) v])) (into {})) @@ -81,11 +84,16 @@ (assoc :clients (by :id clients) ) (assoc :vendors (by :id vendors) ) (assoc :accounts accounts ) - (assoc :client (when (= 1 (count clients)) (->> clients first :id )))))) + (assoc :client (or (when (= 1 (count clients)) (->> clients first :id )) + (->> clients + (map :id) + (filter #(= % (:last-client-id db))) + first)))))) (re-frame/reg-event-db ::swap-client (fn [db [_ client]] + (.setItem js/localStorage "last-client-id" (:id client)) (assoc db :client (:id client)))) (re-frame/reg-event-db diff --git a/src/cljs/auto_ap/views/pages/ledger/balance_sheet.cljs b/src/cljs/auto_ap/views/pages/ledger/balance_sheet.cljs index 56e058d4..79bbb917 100644 --- a/src/cljs/auto_ap/views/pages/ledger/balance_sheet.cljs +++ b/src/cljs/auto_ap/views/pages/ledger/balance_sheet.cljs @@ -57,14 +57,17 @@ ["1300 Inventory" 1300 1399] ["1400 Prepaid Expenses" 1400 1499] ["1500 Property and Equipment" 1500 1599] - ["1600 Intangible Assets" 1600 1699]] - :liability [["2100 Accounts Payable" 2100 2399] + ["1600 Intangible Assets" 1600 1699] + ["1700 Other Assets" 1700 1999]] + :liability [["2000 Accounts Payable" 2000 2399] ["2400 Accrued Expenses" 2400 2499] ["2500 Other Liabilities" 2500 2599] ["2600 Split Accounts" 2600 2699] ["2700 Current Portion of Long-Term Debt" 2700 2799] ["2800 Notes Payable" 2800 3000] - ]}) + ] + :equity [["3000 Owner's Equity" 3000 3999]] + :revenue [["Retained Earnings" 4000 9999]]}) (re-frame/reg-event-db ::received @@ -82,6 +85,7 @@ ::params-change (fn [cofx [_ params]] {:db (-> (:db cofx) + (assoc-in [::error] nil) (assoc-in [::loading] true) (assoc-in [::params] params)) :graphql {:token (-> cofx :db :user) @@ -145,6 +149,24 @@ [:th.has-text-right (->$ (- (reduce + 0 (map :amount @(re-frame/subscribe [::accounts type]))) (reduce + 0 (map :amount (vals @(re-frame/subscribe [::comparable-accounts-by-id type]))))))]])) + +(defn retained-earnings [] + + (list + + #_(grouping {:accounts @(re-frame/subscribe [::accounts type]) + :comparable-accounts @(re-frame/subscribe [::comparable-accounts-by-id type]) + }) + [:tr [:th.has-text-centered "Retained Earnings"] + [:th.has-text-right (->$ (- (reduce + 0 (map :amount @(re-frame/subscribe [::accounts :revenue]))) + (reduce + 0 (map :amount @(re-frame/subscribe [::accounts :expense])))))] + [:th.has-text-right (->$ (- (reduce + 0 (map :amount (vals @(re-frame/subscribe [::comparable-accounts-by-id :revenue])))) + (reduce + 0 (map :amount (vals @(re-frame/subscribe [::comparable-accounts-by-id :expense]))))))] + [:th.has-text-right (->$ (- (- (reduce + 0 (map :amount @(re-frame/subscribe [::accounts :revenue]))) + (reduce + 0 (map :amount @(re-frame/subscribe [::accounts :expense])))) + (- (reduce + 0 (map :amount (vals @(re-frame/subscribe [::comparable-accounts-by-id :revenue])))) + (reduce + 0 (map :amount (vals @(re-frame/subscribe [::comparable-accounts-by-id :expense])))))))]])) + (def balance-sheet-content (with-meta (fn [] @@ -153,20 +175,21 @@ params @(re-frame/subscribe [::params])] [:div.is-inline [:h1.title "Balance Sheet"] - [:p.help "Date"] - [bind-field - [date-picker {:class-name "input" - :class "input" - :format-week-number (fn [] "") - :previous-month-button-label "" - :placeholder "mm/dd/yyyy" - :next-month-button-label "" - :next-month-label "" - :type "date" - :field [:date] - :event [::date-picked] - :popper-props (clj->js {:placement "right"}) - :subscription params}]] + [:div.report-controls + [:p.help "Date"] + [bind-field + [date-picker {:class-name "input" + :class "input" + :format-week-number (fn [] "") + :previous-month-button-label "" + :placeholder "mm/dd/yyyy" + :next-month-button-label "" + :next-month-label "" + :type "date" + :field [:date] + :event [::date-picked] + :popper-props (clj->js {:placement "right"}) + :subscription params}]]] (if @(re-frame/subscribe [::loading]) [:div [:i.icon.fa.fa-spin.fa-spinner]] [:table.table.compact.balance-sheet @@ -179,7 +202,8 @@ (list (overall-grouping :asset "Assets") (overall-grouping :liability "Liabilities" ) - (overall-grouping :equity "Owner's Equity" ))]) + (overall-grouping :equity "Owner's Equity" ) + (retained-earnings))]) ])) diff --git a/src/cljs/auto_ap/views/pages/ledger/profit_and_loss.cljs b/src/cljs/auto_ap/views/pages/ledger/profit_and_loss.cljs index 005a56d9..8c2cf738 100644 --- a/src/cljs/auto_ap/views/pages/ledger/profit_and_loss.cljs +++ b/src/cljs/auto_ap/views/pages/ledger/profit_and_loss.cljs @@ -76,7 +76,6 @@ :balance-sheet-accounts (map #(update % :amount js/parseFloat)) (filter (fn [{:keys [account-type location numeric-code]}] - (and (or (nil? only-location) (= only-location location)) (< (get-in ranges [type 0]) numeric-code (get-in ranges [type 1]))))) @@ -149,6 +148,7 @@ (fn [cofx [_ params]] (let [c @(re-frame/subscribe [::subs/client])] (cond-> {:db (-> (:db cofx) + (assoc-in [::error] nil) (assoc-in [::loading] true) (assoc-in [::params] params))} c (assoc :graphql (when @(re-frame/subscribe [::subs/client]) @@ -267,8 +267,7 @@ ["9700 Taxes" 9700 9799] ["9800 Other Expenses" 9800 9899] ;; ["9900 Tax Only Expenses" 9900 9999] Excluded from Profit and loss - ] - }) + ]}) @@ -379,92 +378,114 @@ [:div [:h1.title "Profit and Loss"] - [:h2.title.is-4 "Range"] - [:div + [:div.report-controls + [:h2.title.is-4 "Range"] + [:div + [:div.field.is-grouped + [:p.control + [:a.button + {:class (when (= (:selected params) "Last week") "is-active") + :on-click (dispatch-event + (let [last-sunday (loop [current (local-now)] + (if (= 7 (t/day-of-week current)) + current + (recur (t/minus current (t/period :days 1)))))] + [::range-selected + (date->str (t/minus last-sunday (t/period :days 6)) standard) + (date->str last-sunday standard) + "Last week"]))} + "Last week"]] + [:p.control + [:a.button + {:class (when (= (:selected params) "Week to date") "is-active") + :on-click (dispatch-event [::range-selected + (date->str (loop [current (local-now)] + (if (= 1 (t/day-of-week current)) + current + (recur (t/minus current (t/period :days 1))))) + standard) + (date->str (local-now) standard) + "Week to date"])} + "Week to date"]] + [:p.control + [:a.button + {:class (when (= (:selected params) "Last Month") "is-active") + :on-click (dispatch-event [::range-selected + (date->str (t/minus (t/local-date (t/year (local-now)) + (t/month (local-now)) + 1) + (t/period :months 1)) + standard) + (date->str (t/minus (t/local-date (t/year (local-now)) + (t/month (local-now)) + 1) + (t/period :days 1)) standard) + "Last Month"])} + "Last Month"]] + [:p.control + [:a.button + {:class (when (= (:selected params) "Month to date") "is-active") + :on-click (dispatch-event [::range-selected + (date->str (t/local-date (t/year (local-now)) + (t/month (local-now)) + 1) + standard) + (date->str (local-now) standard) + "Month to date"])} + "Month to date"]] + [:p.control + [:a.button + {:class (when (= (:selected params) "Year to date") "is-active") + :on-click (dispatch-event [::range-selected + (date->str (t/local-date (t/year (local-now)) + 1 + 1) + standard) + (date->str (local-now) standard) + "Year to date"])} + "Year to date"]] + [:p.control + [:a.button + {:class (when (= (:selected params) "Full year") "is-active") + :on-click (dispatch-event [::range-selected + (date->str (t/plus (t/minus (local-now) (t/period :years 1)) + (t/period :days 1)) + standard) + (date->str (local-now) standard) + "Full year"])} + "Full year"]]]] [:div.field.is-grouped - [:p.control - [:a.button - {:class (when (= (:selected params) "Last week") "is-active") - :on-click (dispatch-event [::range-selected - (date->str (t/minus (local-now) (t/period :days 7)) standard) - (date->str (local-now) standard) - "Last week"])} - "Last week"]] - [:p.control - [:a.button - {:class (when (= (:selected params) "Week to date") "is-active") - :on-click (dispatch-event [::range-selected - (date->str (loop [current (local-now)] - (if (= 7 (t/day-of-week current)) - current - (recur (t/minus current (t/period :days 1))))) - standard) - (date->str (local-now) standard) - "Week to date"])} - "Week to date"]] - [:p.control - [:a.button - {:class (when (= (:selected params) "Month to date") "is-active") - :on-click (dispatch-event [::range-selected - (date->str (t/local-date (t/year (local-now)) - (t/month (local-now)) - 1) - standard) - (date->str (local-now) standard) - "Month to date"])} - "Month to date"]] - [:p.control - [:a.button - {:class (when (= (:selected params) "Year to date") "is-active") - :on-click (dispatch-event [::range-selected - (date->str (t/local-date (t/year (local-now)) - 1 - 1) - standard) - (date->str (local-now) standard) - "Year to date"])} - "Year to date"]] - [:p.control - [:a.button - {:class (when (= (:selected params) "Full year") "is-active") - :on-click (dispatch-event [::range-selected - (date->str (t/minus (local-now) (t/period :years 1)) - standard) - (date->str (local-now) standard) - "Full year"])} - "Full year"]]]] - [:div.field.is-grouped - [:p.control - [:p.help "From"] - [bind-field - [date-picker {:class-name "input" - :class "input" - :format-week-number (fn [] "") - :previous-month-button-label "" - :placeholder "mm/dd/yyyy" - :next-month-button-label "" - :next-month-label "" - :type "date" - :field [:from-date] - :event [::date-picked] - :popper-props (clj->js {:placement "right"}) - :subscription params}]]] + [:p.control + [:p.help "From"] + [bind-field + [date-picker {:class-name "input" + :class "input" + :format-week-number (fn [] "") + :previous-month-button-label "" + :placeholder "mm/dd/yyyy" + :next-month-button-label "" + :next-month-label "" + :type "date" + :field [:from-date] + :event [::date-picked] + :popper-props (clj->js {:placement "right"}) + :subscription params}]]] - [:p.control - [:p.help "To"] - [bind-field - [date-picker {:class-name "input" - :class "input" - :format-week-number (fn [] "") - :previous-month-button-label "" - :placeholder "mm/dd/yyyy" - :next-month-button-label "" - :next-month-label "" - :type "date" - :field [:to-date] - :event [::date-picked] - :popper-props (clj->js {:placement "right"}) - :subscription params}]]]] + [:p.control + [:p.help "To"] + [bind-field + [date-picker {:class-name "input" + :class "input" + :format-week-number (fn [] "") + :previous-month-button-label "" + :placeholder "mm/dd/yyyy" + :next-month-button-label "" + :next-month-label "" + :type "date" + :field [:to-date] + :event [::date-picked] + :popper-props (clj->js {:placement "right"}) + :subscription params}]]]]] (cond error [:div.notification.is-warning error]