it's now possible to link across each entity type

This commit is contained in:
Bryce Covert
2021-01-24 09:45:13 -08:00
parent 88b0dcde3b
commit 10785b9c85
13 changed files with 161 additions and 105 deletions

View File

@@ -12,6 +12,10 @@
(update :payment/date c/from-date)
(update :payment/status :db/ident)
(update :payment/type :db/ident)
(update :transaction/_payment (fn [transactions]
(mapv (fn [transaction]
(update transaction :transaction/date c/from-date))
transactions)))
(rename-keys {:invoice-payment/_payment :payment/invoices})))
(def default-read '[*
@@ -21,7 +25,8 @@
{:payment/vendor [:vendor/name {:vendor/default-account
[:account/name :account/numeric-code :db/id]} :db/id {:vendor/primary-contact [*]} {:vendor/address [*]}]}
{:payment/status [:db/ident]}
{:payment/type [:db/ident]}])
{:payment/type [:db/ident]}
{:transaction/_payment [:db/id :transaction/date]}])
(defn raw-graphql-ids [db args]
(let [check-number-like (try (Long/parseLong (:check-number-like args)) (catch Exception e nil))

View File

@@ -27,6 +27,10 @@
:args [db]}
(:exact-match-id args)
(merge-query {:query {:in ['?e]
:where []}
:args [(:exact-match-id args)]})
(limited-clients (:id args))
(merge-query {:query {:in ['[?xx ...]]
@@ -151,6 +155,7 @@
:transaction/forecast-match [:db/id :forecasted-transaction/identifier]
:transaction/vendor [:db/id :vendor/name]
:transaction/matched-rule [:db/id :transaction-rule/note]
:transaction/payment [:db/id :payment/date]
:transaction/accounts [:transaction-account/amount
:db/id
:transaction-account/location
@@ -159,6 +164,7 @@
ids)
(map #(update % :transaction/date c/from-date))
(map #(update % :transaction/post-date c/from-date))
(map #(update-in % [:transaction/payment :payment/date] c/from-date))
(map #(dissoc % :transaction/id))
(group-by :db/id))]
(->> ids

View File

@@ -20,7 +20,9 @@
[clojure.edn :as edn]
[clojure.java.io :as io]
[clojure.string :as str]
[config.core :refer [env]])
[config.core :refer [env]]
[clojure.tools.logging :as log]
[clojure.set :as set])
(:import java.io.ByteArrayOutputStream
java.text.DecimalFormat
java.util.UUID))
@@ -341,7 +343,15 @@
(defn get-payment-page [context args value]
(let [args (assoc args :id (:id context))
[payments checks-count] (d-checks/get-graphql (<-graphql args))]
[{:payments (map ->graphql payments)
[{:payments (->> payments
(map (fn [payment]
(if (seq (:transaction/_payment payment))
(-> payment
(set/rename-keys {:transaction/_payment :transaction})
(update :transaction first))
payment)))
(map ->graphql ))
:total checks-count
:count (count payments)
:start (:start args 0)

View File

@@ -18,7 +18,11 @@
(defn get-invoice-page [context args value]
(let [args (assoc args :id (:id context))
[invoices invoice-count outstanding] (d-invoices/get-graphql (update (<-graphql (assoc args :id (:id context))) :status enum->keyword "invoice-status"))]
[invoices invoice-count outstanding] (-> args
(assoc :id (:id context))
(<-graphql )
(update :status enum->keyword "invoice-status")
(d-invoices/get-graphql ))]
[{:invoices (map ->graphql invoices)
:outstanding outstanding
:total invoice-count

View File

@@ -2,18 +2,22 @@
(:require [auto-ap.views.utils :refer [dispatch-event]]
[reagent.core :as r]))
(defn fa-icon [{:keys [event icon class]}]
[:a.button {:class class
:on-click (dispatch-event event)} (into
[:<>
[:span.icon [:i.fa {:class icon}]]
]
(r/children (r/current-component)))])
(defn fa-icon [{:keys [event icon class on-click] :as params}]
[:a.button (cond-> params
true (dissoc :event :icon)
(and (not on-click)
event)
(assoc :on-click (dispatch-event event)))
(into
[:<>
[:span.icon [:i.fa {:class icon}]]]
(r/children (r/current-component)))])
(defn sl-icon [{:keys [event icon class] :as params}]
[:a.button (-> params
(dissoc :event :icon)
(assoc :on-click (dispatch-event event)))
(defn sl-icon [{:keys [event icon class on-click] :as params}]
[:a.button (cond-> params
true (dissoc :event :icon)
(and (not on-click)
event) (assoc :on-click (dispatch-event event)))
[:span.icon [:span {:class icon :style {:font-weight "400"}}]]])
(defn new-button [{:keys [event name class ]}]

View File

@@ -9,7 +9,7 @@
[auto-ap.views.components.grid :as grid]
[auto-ap.views.pages.invoices.form :as form]
[auto-ap.views.pages.invoices.common :refer [invoice-read]]
[auto-ap.views.utils :refer [date->str dispatch-event nf days-until]]
[auto-ap.views.utils :refer [date->str dispatch-event dispatch-event-with-propagation nf days-until]]
[bidi.bidi :as bidi]
[cemerick.url :as url]
[cljs-time.core :as t]
@@ -126,6 +126,7 @@
[:div.buttons
(when (seq expense-accounts)
[drop-down {:id [::expense-accounts id ]
:is-right? true
:header [buttons/sl-icon {:class "badge"
:event [::events/toggle-menu [::expense-accounts id]]
:data-badge (str (clojure.core/count expense-accounts))
@@ -146,33 +147,32 @@
(when (seq payments)
[:<>
[drop-down {:id [::payments id]
:header [buttons/sl-icon {:class "badge"
:event [::events/toggle-menu [::payments id]]
:is-right? true
:header [buttons/fa-icon {:class "badge"
:on-click (dispatch-event-with-propagation [::events/toggle-menu [::payments id]])
:data-badge (str (clojure.core/count payments))
:icon "icon-accounting-bill"}]}
[:div
(for [payment payments]
^{:key (:id payment)}
[:a.dropdown-item {:href (str (bidi/path-for routes/routes :payments )
"?"
(url/map->query {:exact-match-id (:id (:payment payment))}))
:target "_new"}
[:i.fa.fa-money-check]
[:span.icon {:class [(when (= :cleared (:status (:payment payment)))
"has-text-success")]}
[:i.fa.fa-money]]
(if (:check-number (:payment payment))
(str "Check " (:check-number (:payment payment))
" (" (gstring/format "$%.2f" (:amount payment) ) ")"
(when (= :cleared (:status (:payment payment)))
(str " - " (:post-date (:transaction (:payment payment))))))
(str "Debit (" (gstring/format "$%.2f" (:amount payment) ) ") "
(when (= :cleared (:status (:payment payment)))
(str " - " (:post-date (:transaction (:payment payment)))))
(when (= :cleared (:status (:payment payment)))
(str " - " (:post-date (:transaction (:payment payment))))))) ])]]
:icon "fa-paperclip"}]}
[drop-down-contents
[:div.dropdown-item
[:table.table.grid.compact
[:tbody
(for [invoice-payment payments]
^{:key (:id invoice-payment)}
[:tr
[:td
"Payment"
]
[:td (gstring/format "$%.2f" (:amount invoice-payment) )]
[:td
(when (= :cleared (:status (:payment invoice-payment)))
(str "cleared")
)]
[:td (:post-date (:transaction (:payment invoice-payment)))]
[:td
[buttons/fa-icon {:icon "fa-external-link"
:href (str (bidi/path-for routes/routes :payments )
"?"
(url/map->query {:exact-match-id (:id (:payment invoice-payment))}))}]]])]]]]]
[:span {:style {:margin-right "1em"}}]])
(when (and (get actions :edit)
(not= ":voided" (:status i)))

View File

@@ -47,7 +47,9 @@
[[:payments [:id :status :amount :type :check_number :s3_url
[:bank-account [:name]]
:date [:vendor [:name :id]] [:client [:name :id]]
[:invoices [:invoice-id [:invoice [:invoice-number :id]]]]]]
[:invoices [:invoice-id [:invoice [:invoice-number :id]]
:amount]]
[:transaction [:id :date]]]]
:total
:start
:end]]]}

View File

@@ -1,22 +1,21 @@
(ns auto-ap.views.pages.payments.table
(:require [auto-ap.subs :as subs]
(:require [auto-ap.events :as events]
[auto-ap.routes :as routes]
[cemerick.url :as url]
[bidi.bidi :as bidi]
[auto-ap.views.components.paginator :refer [paginator]]
[auto-ap.views.components.sorter :refer [sorted-column]]
[auto-ap.views.components.sort-by-list :refer [sort-by-list]]
[auto-ap.views.utils :refer [date->str dispatch-event nf]]
[auto-ap.views.components.dropdown :refer [drop-down drop-down-contents]]
[auto-ap.events :as events]
[goog.string :as gstring]
[re-frame.core :as re-frame]
[auto-ap.views.components.grid :as grid]
[auto-ap.views.components.buttons :as buttons]
[auto-ap.status :as status]
[auto-ap.views.pages.data-page :as data-page]))
[auto-ap.subs :as subs]
[auto-ap.views.components.buttons :as buttons]
[auto-ap.views.components.dropdown
:refer
[drop-down drop-down-contents]]
[auto-ap.views.components.grid :as grid]
[auto-ap.views.pages.data-page :as data-page]
[auto-ap.views.utils
:refer
[date->str dispatch-event-with-propagation nf pretty]]
[bidi.bidi :as bidi]
[cemerick.url :as url]
[goog.string :as gstring]
[re-frame.core :as re-frame]))
(re-frame/reg-event-fx
::void-check
@@ -42,7 +41,7 @@
selected-client :selected-client
states :states
}]
(let [{:keys [client s3-url bank-account payments type check-number date amount id vendor status invoices] :as check} check]
(let [{:keys [client s3-url bank-account payments type check-number date amount id vendor status invoices transaction] :as check} check]
[grid/row {:class (:class check) :id id}
(when-not selected-client
[grid/cell {} (:name client)])
@@ -61,24 +60,39 @@
[grid/button-cell {}
[:div.buttons
(when (and (seq invoices) (not= :voided status))
[drop-down {:id [::invoices id]
:header [:button.button.badge {:data-badge (str (clojure.core/count invoices))
:aria-haspopup true?
:tab-index "0"
:on-click (dispatch-event [::events/toggle-menu [::invoices id]])
} "Invoices"]}
[:div {:style {:max-width "250px"
:text-overflow "ellipsis"
:white-space "nowrap"
:overflow "hidden"}}
(for [invoice invoices]
^{:key (:invoice-number (:invoice invoice))}
[:a.dropdown-item {:href (str (bidi/path-for routes/routes :invoices )
"?"
(url/map->query {:exact-match-id (:id (:invoice invoice))}))
:target "_new"}
(str " " (:invoice-number (:invoice invoice)))])]])
[drop-down {:id [::links id]
:is-right? true
:header [buttons/fa-icon {:class "badge"
:on-click (dispatch-event-with-propagation [::events/toggle-menu [::links id]])
:data-badge (str (cond-> (clojure.core/count invoices)
transaction inc))
:icon "fa-paperclip"}]}
[drop-down-contents
[:div.dropdown-item
[:table.table.grid.compact
[:tbody
(for [invoice invoices]
^{:key (:id invoice)}
[:tr
[:td
"Invoice " (:invoice-number (:invoice invoice))
]
[:td (gstring/format "$%.2f" (:amount invoice) )]
[:td
[buttons/fa-icon {:icon "fa-external-link"
:href (str (bidi/path-for routes/routes :invoices )
"?"
(url/map->query {:exact-match-id (:id (:invoice invoice))}))}]]])
(when transaction
[:tr
[:td
"Transaction"]
[:td (date->str (:date transaction) pretty)]
[:td
[buttons/fa-icon {:icon "fa-external-link"
:href (str (bidi/path-for routes/routes :transactions )
"?"
(url/map->query {:exact-match-id (:id transaction)}))}]]])]]]]])
[:span {:style {:margin-left "1em"}}]
(when (or (= :pending status)

View File

@@ -31,6 +31,7 @@
:account-id (:id (:account params))
:bank-account-id (:id (:bank-account params))
:amount-gte (:amount-gte (:amount-range params))
:exact-match-id (some-> (:exact-match-id params) str)
:unresolved (:unresolved params)
:location (:location params)
:amount-lte (:amount-lte (:amount-range params))

View File

@@ -14,6 +14,6 @@
[:forecast-match [:id :identifier]]
:status
:description_original
[:payment [:check_number :s3_url :id]]
[:payment [:check_number :s3_url :id :date]]
[:client [:name :id]]
[:bank-account [:name :yodlee-account-id]]])

View File

@@ -1,15 +1,17 @@
(ns auto-ap.views.pages.transactions.side-bar
(:require [auto-ap.routes :as routes]
[auto-ap.subs :as subs]
[auto-ap.views.utils :refer [active-when dispatch-value-change]]
[auto-ap.views.components.bank-account-filter
:refer
[bank-account-filter]]
[auto-ap.views.components.date-range-filter :refer [date-range-filter]]
[auto-ap.views.components.number-filter :refer [number-filter]]
[auto-ap.views.components.bank-account-filter :refer [bank-account-filter]]
[auto-ap.views.components.switch-field :refer [switch-field]]
[auto-ap.views.components.typeahead :refer [typeahead-entity]]
[auto-ap.views.pages.data-page :as data-page]
[auto-ap.views.utils :refer [active-when dispatch-event dispatch-value-change]]
[bidi.bidi :as bidi]
[re-frame.core :as re-frame]
[auto-ap.views.pages.data-page :as data-page]))
[re-frame.core :as re-frame]))
(defn side-bar [{:keys [data-page]}]
(let [ap @(re-frame/subscribe [::subs/active-page])
@@ -103,6 +105,12 @@
[:div.control [:input.input {:placeholder "CHECK 123 ABC"
:value @(re-frame/subscribe [::data-page/filter data-page :description])
:on-change (dispatch-value-change [::data-page/filter-changed data-page :description])} ]]]]
(when-let [exact-match-id @(re-frame/subscribe [::data-page/filter data-page :exact-match-id])]
[:div
[:p.menu-label "Specific Payment"]
[:span.tag.is-medium exact-match-id " "
[:button.delete.is-small {:on-click
(dispatch-event [::data-page/filter-changed data-page :exact-match-id nil])}]]])
(when (= "admin" (:user/role user))
[:<>

View File

@@ -8,7 +8,7 @@
[auto-ap.views.pages.transactions.form :as edit]
[auto-ap.views.utils
:refer
[action-cell-width date->str dispatch-event nf]]
[action-cell-width date->str dispatch-event dispatch-event-with-propagation nf pretty]]
[goog.string :as gstring]
[re-frame.core :as re-frame]
[auto-ap.views.components.buttons :as buttons]
@@ -114,24 +114,22 @@
:class (status/class-for (get states id))
:icon "fa-pencil"}]
(when payment
[:a.button {:href (str (bidi/path-for routes/routes :payments )
"?"
(url/map->query {:exact-match-id (:id payment)}))}
[:span.icon
[:i.fa.fa-money]]
#_(if (:check-number (:payment payment))
(str "Check " (:check-number (:payment payment))
" (" (gstring/format "$%.2f" (:amount payment) ) ")"
(when (= :cleared (:status (:payment payment)))
(str " - " (:post-date (:transaction (:payment payment))))))
(str "Debit (" (gstring/format "$%.2f" (:amount payment) ) ") "
(when (= :cleared (:status (:payment payment)))
(str " - " (:post-date (:transaction (:payment payment)))))
(when (= :cleared (:status (:payment payment)))
(str " - " (:post-date (:transaction (:payment payment))))))) ]
#_[:a.tag {:href (:s3-url payment) :target "_new"}
[:span.icon [:i.fa.fa-money]]
(str " " (:check-number payment) " (" (gstring/format "$%.2f" amount ) ")")])]]])]]]))
[drop-down {:id [::links id]
:is-right? true
:header [buttons/fa-icon {:class "badge"
:on-click (dispatch-event-with-propagation [::events/toggle-menu [::links id]])
:data-badge (str 1)
:icon "fa-paperclip"}]}
[drop-down-contents
[:div.dropdown-item
[:table.table.grid.compact
[:tbody
[:tr
[:td
"Payment"]
[:td (date->str (:date payment) pretty)]
[:td
[buttons/fa-icon {:icon "fa-external-link"
:href (str (bidi/path-for routes/routes :payments )
"?"
(url/map->query {:exact-match-id (:id payment)}))}]]]]]]]])]]])]]]))

View File

@@ -71,6 +71,10 @@
(.preventDefault e))
(re-frame/dispatch-sync event)))
(defn dispatch-event-with-propagation [event]
(fn [e]
(re-frame/dispatch-sync event)))
(def pretty-long (format/formatter "MM/dd/yyyy HH:mm:ss"))
(def pretty (format/formatter "MM/dd/yyyy"))
(def standard (format/formatter "yyyy-MM-dd"))