(cloud) Made search work consistently
This commit is contained in:
@@ -14,132 +14,143 @@
|
||||
[datomic.api :as dc]))
|
||||
|
||||
(defn raw-graphql-ids [db args]
|
||||
(let [query (cond-> {:query {:find []
|
||||
:in ['$ ]
|
||||
:where []}
|
||||
:args [db]}
|
||||
(let [query
|
||||
(if (:exact-match-id args)
|
||||
(cond-> {:query {:find '[?e]
|
||||
:in '[$ ?e]
|
||||
:where '[[?e :journal-entry/client ?c]]}
|
||||
:args [db
|
||||
(:exact-match-id args)]}
|
||||
(limited-clients (:id args))
|
||||
(merge-query {:query {:in ['[?xx ...]]
|
||||
:where ['[?e :journal-entry/client ?xx]]}
|
||||
:args [(set (map :db/id (limited-clients (:id args))))]}))
|
||||
(cond-> {:query {:find []
|
||||
:in ['$ ]
|
||||
:where []}
|
||||
:args [db]}
|
||||
|
||||
(:client-id args)
|
||||
(merge-query {:query {:in ['?client-id]
|
||||
:where ['[?e :journal-entry/client ?client-id]]}
|
||||
:args [(:client-id args)]})
|
||||
(:client-id args)
|
||||
(merge-query {:query {:in ['?client-id]
|
||||
:where ['[?e :journal-entry/client ?client-id]]}
|
||||
:args [(:client-id args)]})
|
||||
|
||||
(:only-external args)
|
||||
(merge-query {:query {:where ['(not [?e :journal-entry/original-entity ])]}})
|
||||
(:only-external args)
|
||||
(merge-query {:query {:where ['(not [?e :journal-entry/original-entity ])]}})
|
||||
|
||||
(seq (:external-id-like args))
|
||||
(merge-query {:query {:in ['?external-id-like]
|
||||
:where ['[?e :journal-entry/external-id ?external-id]
|
||||
'[(.contains ^String ?external-id ?external-id-like)]]}
|
||||
:args [(:external-id-like args)]})
|
||||
(seq (:external-id-like args))
|
||||
(merge-query {:query {:in ['?external-id-like]
|
||||
:where ['[?e :journal-entry/external-id ?external-id]
|
||||
'[(.contains ^String ?external-id ?external-id-like)]]}
|
||||
:args [(:external-id-like args)]})
|
||||
|
||||
(seq (:source args))
|
||||
(merge-query {:query {:in ['?source]
|
||||
:where ['[?e :journal-entry/source ?source]]}
|
||||
:args [(:source args)]})
|
||||
(seq (:source args))
|
||||
(merge-query {:query {:in ['?source]
|
||||
:where ['[?e :journal-entry/source ?source]]}
|
||||
:args [(:source args)]})
|
||||
|
||||
(:vendor-id args)
|
||||
(merge-query {:query {:in ['?vendor-id]
|
||||
:where ['[?e :journal-entry/vendor ?vendor-id]]}
|
||||
:args [(:vendor-id args)]})
|
||||
(:vendor-id args)
|
||||
(merge-query {:query {:in ['?vendor-id]
|
||||
:where ['[?e :journal-entry/vendor ?vendor-id]]}
|
||||
:args [(:vendor-id args)]})
|
||||
|
||||
(:client-code args)
|
||||
(merge-query {:query {:in ['?client-code]
|
||||
:where ['[?e :journal-entry/client ?client-id]
|
||||
'[?client-id :client/code ?client-code]]}
|
||||
:args [(:client-code args)]})
|
||||
(:client-code args)
|
||||
(merge-query {:query {:in ['?client-code]
|
||||
:where ['[?e :journal-entry/client ?client-id]
|
||||
'[?client-id :client/code ?client-code]]}
|
||||
:args [(:client-code args)]})
|
||||
|
||||
(:start (:date-range args))
|
||||
(merge-query {:query {:in ['?start-date]
|
||||
:where ['[?e :journal-entry/date ?date]
|
||||
'[(>= ?date ?start-date)]]}
|
||||
:args [(c/to-date (:start (:date-range args)))]})
|
||||
(:start (:date-range args))
|
||||
(merge-query {:query {:in ['?start-date]
|
||||
:where ['[?e :journal-entry/date ?date]
|
||||
'[(>= ?date ?start-date)]]}
|
||||
:args [(c/to-date (:start (:date-range args)))]})
|
||||
|
||||
(:end (:date-range args))
|
||||
(merge-query {:query {:in ['?end-date]
|
||||
:where ['[?e :journal-entry/date ?date]
|
||||
'[(<= ?date ?end-date)]]}
|
||||
:args [(c/to-date (:end (:date-range args)))]})
|
||||
(:end (:date-range args))
|
||||
(merge-query {:query {:in ['?end-date]
|
||||
:where ['[?e :journal-entry/date ?date]
|
||||
'[(<= ?date ?end-date)]]}
|
||||
:args [(c/to-date (:end (:date-range args)))]})
|
||||
|
||||
(or (seq (:numeric-code args))
|
||||
(:bank-account-id args)
|
||||
(not-empty (:location args)))
|
||||
(merge-query {:query {:where ['[?e :journal-entry/line-items ?li]]}})
|
||||
(or (seq (:numeric-code args))
|
||||
(:bank-account-id args)
|
||||
(not-empty (:location args)))
|
||||
(merge-query {:query {:where ['[?e :journal-entry/line-items ?li]]}})
|
||||
|
||||
(seq (:numeric-code args))
|
||||
(merge-query {:query {:in ['[[?from-numeric-code ?to-numeric-code]]]
|
||||
:where ['[?li :journal-entry-line/account ?a]
|
||||
'(or-join [?a ?c]
|
||||
[?a :account/numeric-code ?c]
|
||||
[?a :bank-account/numeric-code ?c])
|
||||
'[(>= ?c ?from-numeric-code)]
|
||||
'[(<= ?c ?to-numeric-code)]]}
|
||||
:args [(vec (for [{:keys [from to]} (:numeric-code args)]
|
||||
[(or from 0) (or to 99999)]))]})
|
||||
(seq (:numeric-code args))
|
||||
(merge-query {:query {:in ['[[?from-numeric-code ?to-numeric-code]]]
|
||||
:where ['[?li :journal-entry-line/account ?a]
|
||||
'(or-join [?a ?c]
|
||||
[?a :account/numeric-code ?c]
|
||||
[?a :bank-account/numeric-code ?c])
|
||||
'[(>= ?c ?from-numeric-code)]
|
||||
'[(<= ?c ?to-numeric-code)]]}
|
||||
:args [(vec (for [{:keys [from to]} (:numeric-code args)]
|
||||
[(or from 0) (or to 99999)]))]})
|
||||
|
||||
|
||||
(:amount-gte args)
|
||||
(merge-query {:query {:in ['?amount-gte]
|
||||
:where ['[?e :journal-entry/amount ?a]
|
||||
'[(>= ?a ?amount-gte)]]}
|
||||
:args [(:amount-gte args)]})
|
||||
(:amount-gte args)
|
||||
(merge-query {:query {:in ['?amount-gte]
|
||||
:where ['[?e :journal-entry/amount ?a]
|
||||
'[(>= ?a ?amount-gte)]]}
|
||||
:args [(:amount-gte args)]})
|
||||
|
||||
(:amount-lte args)
|
||||
(merge-query {:query {:in ['?amount-lte]
|
||||
:where ['[?e :journal-entry/amount ?a]
|
||||
'[(<= ?a ?amount-lte)]]}
|
||||
:args [(:amount-lte args)]})
|
||||
(:amount-lte args)
|
||||
(merge-query {:query {:in ['?amount-lte]
|
||||
:where ['[?e :journal-entry/amount ?a]
|
||||
'[(<= ?a ?amount-lte)]]}
|
||||
:args [(:amount-lte args)]})
|
||||
|
||||
(:bank-account-id args)
|
||||
(merge-query {:query {:in ['?a]
|
||||
:where ['[?li :journal-entry-line/account ?a]]}
|
||||
:args [(:bank-account-id args)]})
|
||||
(:bank-account-id args)
|
||||
(merge-query {:query {:in ['?a]
|
||||
:where ['[?li :journal-entry-line/account ?a]]}
|
||||
:args [(:bank-account-id args)]})
|
||||
|
||||
(:account-id args)
|
||||
(merge-query {:query {:in ['?a2]
|
||||
:where ['[?e :journal-entry/line-items ?li2]
|
||||
'[?li2 :journal-entry-line/account ?a2]]}
|
||||
:args [(:account-id args)]})
|
||||
(:account-id args)
|
||||
(merge-query {:query {:in ['?a2]
|
||||
:where ['[?e :journal-entry/line-items ?li2]
|
||||
'[?li2 :journal-entry-line/account ?a2]]}
|
||||
:args [(:account-id args)]})
|
||||
|
||||
(not-empty (:location args))
|
||||
(merge-query {:query {:in ['?location]
|
||||
:where ['[?li :journal-entry-line/location ?location]]}
|
||||
:args [(:location args)]})
|
||||
(not-empty (:location args))
|
||||
(merge-query {:query {:in ['?location]
|
||||
:where ['[?li :journal-entry-line/location ?location]]}
|
||||
:args [(:location args)]})
|
||||
|
||||
(not-empty (:locations args))
|
||||
(merge-query {:query {:in ['[?location ...]]
|
||||
:where ['[?li :journal-entry-line/location ?location]]}
|
||||
:args [(:locations args)]})
|
||||
(not-empty (:locations args))
|
||||
(merge-query {:query {:in ['[?location ...]]
|
||||
:where ['[?li :journal-entry-line/location ?location]]}
|
||||
:args [(:locations args)]})
|
||||
|
||||
(limited-clients (:id args))
|
||||
(merge-query {:query {:in ['[?xx ...]]
|
||||
:where ['[?e :journal-entry/client ?xx]]}
|
||||
:args [(set (map :db/id (limited-clients (:id args))))]})
|
||||
(:sort args) (add-sorter-fields {"client" ['[?e :journal-entry/client ?c]
|
||||
'[?c :client/name ?sort-client]]
|
||||
"date" ['[?e :journal-entry/date ?sort-date]]
|
||||
"vendor" ['[?e :journal-entry/vendor ?v]
|
||||
'[?v :vendor/name ?sort-vendor]]
|
||||
"amount" ['[?e :journal-entry/amount ?sort-amount]]
|
||||
"external-id" ['[?e :journal-entry/external-id ?sort-external-id]]
|
||||
"source" ['[?e :journal-entry/source ?sort-source]]}
|
||||
args)
|
||||
(limited-clients (:id args))
|
||||
(merge-query {:query {:in ['[?xx ...]]
|
||||
:where ['[?e :journal-entry/client ?xx]]}
|
||||
:args [(set (map :db/id (limited-clients (:id args))))]})
|
||||
(:sort args) (add-sorter-fields {"client" ['[?e :journal-entry/client ?c]
|
||||
'[?c :client/name ?sort-client]]
|
||||
"date" ['[?e :journal-entry/date ?sort-date]]
|
||||
"vendor" ['[?e :journal-entry/vendor ?v]
|
||||
'[?v :vendor/name ?sort-vendor]]
|
||||
"amount" ['[?e :journal-entry/amount ?sort-amount]]
|
||||
"external-id" ['[?e :journal-entry/external-id ?sort-external-id]]
|
||||
"source" ['[?e :journal-entry/source ?sort-source]]}
|
||||
args)
|
||||
|
||||
true
|
||||
(merge-query {:query {:find ['?sort-default '?e] :where ['[?e :journal-entry/date ?sort-default]]}}))]
|
||||
true
|
||||
(merge-query {:query {:find ['?sort-default '?e] :where ['[?e :journal-entry/date ?sort-default]]}})))]
|
||||
(->> (query2 query)
|
||||
(apply-sort-3 (update args :sort conj {:sort-key "default-2" :asc true}))
|
||||
(apply-sort-3 (update args :sort conj {:sort-key "default-2" :asc true}))
|
||||
(apply-pagination args))))
|
||||
|
||||
(defn graphql-results [ids db _]
|
||||
(let [results (->> (pull-many db '[* {:journal-entry/client [:client/name :client/code :db/id]
|
||||
:journal-entry/vendor [:vendor/name :db/id]
|
||||
:journal-entry/line-items [* {:journal-entry-line/account [*
|
||||
{:account/type [*]}
|
||||
{:account/client-overrides [:account-client-override/name
|
||||
{:account-client-override/client [:db/id]}]}
|
||||
{:bank-account/type [*]}]}]}]
|
||||
ids)
|
||||
(let [results (->> (pull-many db '[* {:journal-entry/client [:client/name :client/code :db/id]
|
||||
:journal-entry/vendor [:vendor/name :db/id]
|
||||
:journal-entry/line-items [* {:journal-entry-line/account [*
|
||||
{:account/type [*]}
|
||||
{:account/client-overrides [:account-client-override/name
|
||||
{:account-client-override/client [:db/id]}]}
|
||||
{:bank-account/type [*]}]}]}]
|
||||
ids)
|
||||
(map #(update % :journal-entry/date c/from-date))
|
||||
(map (fn [je]
|
||||
(update je :journal-entry/line-items
|
||||
@@ -149,11 +160,11 @@
|
||||
jels)))))
|
||||
(filter (fn [je]
|
||||
(every?
|
||||
(fn [jel]
|
||||
(let [include-in-reports (-> jel :journal-entry-line/account :bank-account/include-in-reports)]
|
||||
(or (nil? include-in-reports)
|
||||
(true? include-in-reports))))
|
||||
(:journal-entry/line-items je))))
|
||||
(fn [jel]
|
||||
(let [include-in-reports (-> jel :journal-entry-line/account :bank-account/include-in-reports)]
|
||||
(or (nil? include-in-reports)
|
||||
(true? include-in-reports))))
|
||||
(:journal-entry/line-items je))))
|
||||
(group-by :db/id))]
|
||||
(->> ids
|
||||
(map results)
|
||||
|
||||
@@ -811,6 +811,7 @@
|
||||
{:fields {:client_id {:type :id}
|
||||
:vendor_id {:type :id}
|
||||
:account_id {:type :id}
|
||||
:exact_match_id {:type :id}
|
||||
:amount_lte {:type :money}
|
||||
:amount_gte {:type :money}
|
||||
:bank_account_id {:type :id}
|
||||
|
||||
@@ -147,14 +147,18 @@
|
||||
(let [session (:session request {})
|
||||
end-time (coerce/to-date-time (::idle-timeout session))]
|
||||
(if (and end-time (time/before? end-time (time/now)))
|
||||
{:session nil
|
||||
:status 302
|
||||
:headers {"Location" "/login"}}
|
||||
(if (get (:headers request) "hx-request")
|
||||
{:session nil
|
||||
:status 200
|
||||
:headers {"hx-redirect" "/login"}}
|
||||
{:session nil
|
||||
:status 302
|
||||
:headers {"Location" "/login"}})
|
||||
(when-let [response (handler request)]
|
||||
(let [session (:session response session)]
|
||||
(if (nil? session)
|
||||
response
|
||||
(let [end-time (time/plus (time/now) (time/days 2))]
|
||||
(let [end-time (time/plus (time/now) (time/days 14))]
|
||||
(assoc response :session (assoc session ::idle-timeout (coerce/to-date end-time)))))))))))
|
||||
|
||||
#_{:clj-kondo/ignore [:clojure-lsp/unused-public-var]}
|
||||
|
||||
@@ -7,8 +7,15 @@
|
||||
|
||||
(defn wrap-secure [handler]
|
||||
(fn [request]
|
||||
(if (authenticated? request)
|
||||
(cond (authenticated? request)
|
||||
(handler request)
|
||||
|
||||
|
||||
(get (:headers request) "hx-request")
|
||||
{:status 401
|
||||
:headers {"hx-redirect" "/login"}}
|
||||
|
||||
:else
|
||||
{:status 302
|
||||
:headers {"Location" "/login" }})))
|
||||
|
||||
@@ -25,5 +32,6 @@
|
||||
(fn [request]
|
||||
(let [response (handler request)]
|
||||
(if (= 401 (get response :status))
|
||||
(assoc-in response [:headers "hx-redirect"] "/login/")
|
||||
(-> response
|
||||
(assoc-in [:headers "hx-redirect"] "/login/"))
|
||||
response))))
|
||||
|
||||
@@ -1,21 +1,136 @@
|
||||
(ns auto-ap.solr
|
||||
(:require [clojure.data.json :as json]
|
||||
[clj-http.client :as client]
|
||||
[config.core :refer [env]]))
|
||||
(:require
|
||||
[auto-ap.datomic :refer [conn]]
|
||||
[clj-http.client :as client]
|
||||
[clojure.data.json :as json]
|
||||
[config.core :refer [env]]
|
||||
[datomic.api :as dc]
|
||||
[clj-time.coerce :as c]
|
||||
[auto-ap.time :as atime]
|
||||
[clojure.string :as str]))
|
||||
|
||||
(def solr-uri (:solr-uri env))
|
||||
|
||||
(defn fmt-amount [a]
|
||||
(with-precision 2
|
||||
(some-> a
|
||||
bigdec
|
||||
(.setScale 2 java.math.RoundingMode/HALF_UP)
|
||||
(double))))
|
||||
|
||||
(defmulti datomic->solr (fn [d]
|
||||
(let [entity (dc/pull (dc/db conn) '[:transaction/date :invoice/date :payment/date :journal-entry/date] d)]
|
||||
|
||||
(cond (:transaction/date entity)
|
||||
"transaction"
|
||||
|
||||
(:invoice/date entity)
|
||||
"invoice"
|
||||
|
||||
(:payment/date entity)
|
||||
"payment"
|
||||
|
||||
(:journal-entry/date entity)
|
||||
"journal-entry"
|
||||
|
||||
:else
|
||||
(throw (ex-info "Trying to index unknown entity"
|
||||
{:id d}))))))
|
||||
|
||||
(defmethod datomic->solr "transaction" [d]
|
||||
(let [i (dc/pull (dc/db conn) '[:db/id :transaction/description-original
|
||||
:transaction/amount
|
||||
{:transaction/client [:client/code :db/id]
|
||||
:transaction/vendor [:vendor/name :db/id]}
|
||||
:transaction/date]
|
||||
d)]
|
||||
{"id" (-> i :db/id)
|
||||
"client_id" (-> i :transaction/client :db/id)
|
||||
"client_code" (-> i :transaction/client :client/code)
|
||||
"date" (some-> i :transaction/date c/to-date-time (atime/unparse atime/iso-date) (str "T00:00:00Z"))
|
||||
"amount" (-> i :transaction/amount fmt-amount)
|
||||
"description" (-> i :transaction/description-original)
|
||||
"vendor_name" (-> i :transaction/vendor :vendor/name)
|
||||
"vendor_id" (-> i :transaction/vendor :db/id)
|
||||
"type" "transaction"}))
|
||||
|
||||
(defmethod datomic->solr "journal-entry" [d]
|
||||
(let [i (dc/pull (dc/db conn) '[:db/id
|
||||
:journal-entry/amount
|
||||
:journal-entry/source
|
||||
{:journal-entry/client [:client/code :db/id]
|
||||
:journal-entry/vendor [:vendor/name :db/id]
|
||||
:journal-entry/line-items [{:journal-entry-line/account [:account/name :account/numeric-code]}]}
|
||||
:journal-entry/date]
|
||||
d)]
|
||||
{"id" (-> i :db/id)
|
||||
"client_id" (-> i :journal-entry/client :db/id)
|
||||
"client_code" (-> i :journal-entry/client :client/code)
|
||||
"date" (some-> i :journal-entry/date c/to-date-time (atime/unparse atime/iso-date) (str "T00:00:00Z"))
|
||||
"amount" (-> i :journal-entry/amount fmt-amount)
|
||||
"description" (str
|
||||
(when (:journal-entry/source i)
|
||||
(str (:journal-entry/source i) ": "))
|
||||
(str/join ", " (set (map
|
||||
(fn [li]
|
||||
(format "%s (%s)" (:account/name (:journal-entry-line/account li))
|
||||
(:account/numeric-code (:journal-entry-line/account li))))
|
||||
(:journal-entry/line-items i)))))
|
||||
"vendor_name" (-> i :journal-entry/vendor :vendor/name)
|
||||
"vendor_id" (-> i :journal-entry/vendor :db/id)
|
||||
"type" "journal-entry"}))
|
||||
|
||||
(defmethod datomic->solr "invoice" [d]
|
||||
(let [i (dc/pull (dc/db conn) '[:db/id :invoice/invoice-number
|
||||
:invoice/total
|
||||
{:invoice/client [:client/code :db/id]
|
||||
:invoice/vendor [:vendor/name :db/id]}
|
||||
:invoice/date]
|
||||
d)]
|
||||
{"id" (-> i :db/id)
|
||||
"client_id" (-> i :invoice/client :db/id)
|
||||
"client_code" (-> i :invoice/client :client/code)
|
||||
"date" (some-> i :invoice/date c/to-date-time (atime/unparse atime/iso-date) (str "T00:00:00Z"))
|
||||
"amount" (-> i :invoice/total fmt-amount)
|
||||
"number" (-> i :invoice/invoice-number)
|
||||
"vendor_name" (-> i :invoice/vendor :vendor/name)
|
||||
"vendor_id" (-> i :invoice/vendor :db/id)
|
||||
"type" "invoice"}))
|
||||
|
||||
(defmethod datomic->solr "payment" [d]
|
||||
(let [i (dc/pull (dc/db conn) '[:db/id :payment/check-number
|
||||
:payment/amount
|
||||
{:payment/client [:client/code :db/id]
|
||||
:payment/vendor [:vendor/name :db/id]}
|
||||
:payment/date]
|
||||
d)]
|
||||
{"id" (-> i :db/id)
|
||||
"client_id" (-> i :payment/client :db/id)
|
||||
"client_code" (-> i :payment/client :client/code)
|
||||
"date" (some-> i :payment/date c/to-date-time (atime/unparse atime/iso-date) (str "T00:00:00Z"))
|
||||
"amount" (-> i :payment/amount fmt-amount)
|
||||
"description" (-> i :payment/check-number)
|
||||
"vendor_name" (-> i :payment/vendor :vendor/name)
|
||||
"vendor_id" (-> i :payment/vendor :db/id)
|
||||
"type" "payment"}))
|
||||
|
||||
|
||||
|
||||
(defn index-documents [xs]
|
||||
(client/post
|
||||
(str solr-uri "/solr/invoices/update?commitWithin=15000")
|
||||
{:headers {"Content-Type" "application/json"}
|
||||
:socket-timeout 30000
|
||||
:connection-timeout 30000
|
||||
:method "POST"
|
||||
:body (json/write-str xs)}))
|
||||
:body (json/write-str (map datomic->solr xs))}))
|
||||
|
||||
(defn query [q]
|
||||
(-> (client/post (str solr-uri "/solr/invoices/query")
|
||||
{:body (json/write-str {"query" q
|
||||
"fields" "id, date, amount, type, description, number, client_code, client_id, vendor_name"})
|
||||
:socket-timeout 30000
|
||||
:connection-timeout 30000
|
||||
:headers {"Content-Type" "application/json"}
|
||||
:as :json}
|
||||
)
|
||||
|
||||
@@ -43,6 +43,10 @@
|
||||
(= "transaction" m)
|
||||
"type:transaction"
|
||||
|
||||
(= "journal-entry" m)
|
||||
"type:journal-entry"
|
||||
|
||||
|
||||
:else
|
||||
(str "_text_:\"" (try-parse-number (try-cleanse-date m)) ""\"))))))))
|
||||
|
||||
@@ -69,7 +73,13 @@
|
||||
[:div.card-header-icon.icon-accounting-invoice-mail]
|
||||
|
||||
(= "payment" (:type doc))
|
||||
[:div.card-header-icon.icon-check-payment-sign])
|
||||
[:div.card-header-icon.icon-check-payment-sign]
|
||||
|
||||
(= "journal-entry" (:type doc))
|
||||
[:div.card-header-icon.icon-receipt]
|
||||
|
||||
:else
|
||||
nil)
|
||||
[:div.card-header-title (clojure.string/capitalize (:type doc))
|
||||
" "
|
||||
" "
|
||||
@@ -86,6 +96,10 @@
|
||||
(:type doc))
|
||||
"transactions"
|
||||
|
||||
(= "journal-entry"
|
||||
(:type doc))
|
||||
"ledger"
|
||||
|
||||
:else
|
||||
"payments") "/?exact-match-id=" (:id doc))
|
||||
:target "_blank"}]
|
||||
@@ -121,6 +135,7 @@
|
||||
:hx-indicator "#search"
|
||||
:value (:q (:params request))
|
||||
:autofocus true}]]
|
||||
[:i "Try dates, numbers, vendors. To filter to specific entity type, use 'invoice', 'transaction', 'journal-entry', 'payment'."]
|
||||
[:style
|
||||
".htmx-request #search-results {display: none} .htmx-request .htmx-indicator { display: block !important; }"]
|
||||
[:div#search-results
|
||||
|
||||
@@ -560,89 +560,51 @@
|
||||
:separator \tab))))
|
||||
|
||||
|
||||
(defn fmt-amount [a]
|
||||
(with-precision 2
|
||||
(some-> a
|
||||
bigdec
|
||||
(.setScale 2 java.math.RoundingMode/HALF_UP)
|
||||
(double))))
|
||||
|
||||
(defn index-solr
|
||||
[]
|
||||
(doseq [batch (->> (dc/qseq {:query '[:find (pull ?i [:db/id :invoice/invoice-number
|
||||
:invoice/total
|
||||
{:invoice/client [:client/code :db/id]
|
||||
:invoice/vendor [:vendor/name :db/id]}
|
||||
:invoice/date])
|
||||
(doseq [batch (->> (dc/qseq {:query '[:find ?i
|
||||
:in $
|
||||
:where [?i :invoice/invoice-number]
|
||||
(not [?i :invoice/status :invoice-status/voided])]
|
||||
:args [
|
||||
(dc/db conn)]})
|
||||
(map (fn [[i]]
|
||||
{"id" (-> i :db/id)
|
||||
"client_id" (-> i :invoice/client :db/id)
|
||||
"client_code" (-> i :invoice/client :client/code)
|
||||
"date" (some-> i :invoice/date c/to-date-time (atime/unparse atime/iso-date) (str "T00:00:00Z"))
|
||||
"amount" (-> i :invoice/total fmt-amount)
|
||||
"number" (-> i :invoice/invoice-number)
|
||||
"vendor_name" (-> i :invoice/vendor :vendor/name)
|
||||
"vendor_id" (-> i :invoice/vendor :db/id)
|
||||
"type" "invoice"
|
||||
}))
|
||||
(map first)
|
||||
(partition-all 1000))]
|
||||
(print ".")
|
||||
(flush)
|
||||
(solr/index-documents batch))
|
||||
|
||||
(doseq [batch (->> (dc/qseq {:query '[:find (pull ?i [:db/id :payment/check-number
|
||||
:payment/amount
|
||||
{:payment/client [:client/code :db/id]
|
||||
:payment/vendor [:vendor/name :db/id]}
|
||||
:payment/date])
|
||||
(doseq [batch (->> (dc/qseq {:query '[:find ?i
|
||||
:in $
|
||||
:where [?i :payment/date]
|
||||
(not [?i :payment/status :payment-status/voided])]
|
||||
:args [(dc/db conn)]})
|
||||
(map (fn [[i]]
|
||||
{"id" (-> i :db/id)
|
||||
"client_id" (-> i :payment/client :db/id)
|
||||
"client_code" (-> i :payment/client :client/code)
|
||||
"date" (some-> i :payment/date c/to-date-time (atime/unparse atime/iso-date) (str "T00:00:00Z"))
|
||||
"amount" (-> i :payment/amount fmt-amount)
|
||||
"description" (-> i :payment/check-number)
|
||||
"vendor_name" (-> i :payment/vendor :vendor/name)
|
||||
"vendor_id" (-> i :payment/vendor :db/id)
|
||||
"type" "payment"}))
|
||||
(map first)
|
||||
(partition-all 1000))]
|
||||
(print ".")
|
||||
(flush)
|
||||
(solr/index-documents batch))
|
||||
|
||||
(doseq [batch (->> (dc/qseq {:query '[:find (pull ?i [:db/id :transaction/description-original
|
||||
:transaction/amount
|
||||
{:transaction/client [:client/code :db/id]
|
||||
:transaction/vendor [:vendor/name :db/id]}
|
||||
:transaction/date])
|
||||
(doseq [batch (->> (dc/qseq {:query '[:find ?i
|
||||
:in $
|
||||
:where [?i :transaction/description-original]
|
||||
(not [?i :transaction/approval-status :transaction-approval-status/suppressed])]
|
||||
:args [(dc/db conn)]})
|
||||
(map (fn [[i]]
|
||||
{"id" (-> i :db/id)
|
||||
"client_id" (-> i :transaction/client :db/id)
|
||||
"client_code" (-> i :transaction/client :client/code)
|
||||
"date" (some-> i :transaction/date c/to-date-time (atime/unparse atime/iso-date) (str "T00:00:00Z"))
|
||||
"amount" (-> i :transaction/amount fmt-amount)
|
||||
"description" (-> i :transaction/description-original)
|
||||
"vendor_name" (-> i :transaction/vendor :vendor/name)
|
||||
"vendor_id" (-> i :transaction/vendor :db/id)
|
||||
"type" "transaction"}))
|
||||
(map first)
|
||||
(partition-all 1000))]
|
||||
(print ".")
|
||||
(flush)
|
||||
(solr/index-documents batch)
|
||||
))
|
||||
(solr/index-documents batch))
|
||||
(doseq [batch (->> (dc/qseq {:query '[:find ?i
|
||||
:in $
|
||||
:where [?i :journal-entry/date]]
|
||||
:args [(dc/db conn)]})
|
||||
(map first)
|
||||
(partition-all 1000))]
|
||||
(print ".")
|
||||
(flush)
|
||||
(solr/index-documents batch)))
|
||||
|
||||
(defn setup-sales-orders []
|
||||
(doseq [n (->> (dc/qseq {:query '[:find ?s ?c :where [?s :sales-order/client ?c]] :args [(dc/db auto-ap.datomic/conn)]})
|
||||
|
||||
@@ -66,7 +66,7 @@
|
||||
:max max
|
||||
:step "0.01"
|
||||
:style (or style
|
||||
{:width "8em"})}]
|
||||
{:width "7em"})}]
|
||||
[:span.icon.is-left
|
||||
[:i.fa.fa-usd]]]))
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
:on-change (fn [v]
|
||||
(re-frame/dispatch (conj on-change-event v)))}
|
||||
|
||||
[:div.columns
|
||||
[:div.columns {:style {:width "80%"}}
|
||||
[:div.column
|
||||
[:div.control
|
||||
[form-builder/raw-field-v2 {:field :amount-gte}
|
||||
@@ -17,5 +17,6 @@
|
||||
[:div.column
|
||||
[:div.control
|
||||
[form-builder/raw-field-v2 {:field :amount-lte}
|
||||
[com/money-input {:placeholder "<="}]]]]]]
|
||||
[com/money-input {:placeholder "<="}]]]]
|
||||
[:div.column]]]
|
||||
)
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
(defn data-params->query-params [params]
|
||||
{:start (:start params 0)
|
||||
:sort (:sort params)
|
||||
:exact-match-id (:exact-match-id params)
|
||||
:per-page (:per-page params)
|
||||
:client-id (:id @(re-frame/subscribe [::subs/client]))
|
||||
:vendor-id (:id (:vendor params))
|
||||
|
||||
@@ -62,10 +62,12 @@
|
||||
[:span {:class "name"} "External Ledger Import"]]])]
|
||||
(when (#{ :ledger :external-ledger} ap)
|
||||
[:div
|
||||
[:p.menu-label "Bank Account"]
|
||||
[bank-account-filter {:value @(re-frame/subscribe [::data-page/filter data-page :bank-account])
|
||||
:bank-accounts @(re-frame/subscribe [::subs/bank-accounts])
|
||||
:on-change-event [::data-page/filter-changed data-page :bank-account]}]
|
||||
(when client
|
||||
[:<>
|
||||
[:p.menu-label "Bank Account"]
|
||||
[bank-account-filter {:value @(re-frame/subscribe [::data-page/filter data-page :bank-account])
|
||||
:bank-accounts @(re-frame/subscribe [::subs/bank-accounts])
|
||||
:on-change-event [::data-page/filter-changed data-page :bank-account]}]])
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -62,12 +62,14 @@
|
||||
|
||||
[:span {:class "name"} "Insights"]]]
|
||||
]]
|
||||
[:p.menu-label "Bank Account"]
|
||||
[:div
|
||||
[bank-account-filter
|
||||
{:on-change-event [::data-page/filter-changed data-page :bank-account]
|
||||
:value @(re-frame/subscribe [::data-page/filter data-page :bank-account])
|
||||
:bank-accounts @(re-frame/subscribe [::subs/bank-accounts])}]]
|
||||
(when client
|
||||
[:<>
|
||||
[:p.menu-label "Bank Account"]
|
||||
[:div
|
||||
[bank-account-filter
|
||||
{:on-change-event [::data-page/filter-changed data-page :bank-account]
|
||||
:value @(re-frame/subscribe [::data-page/filter data-page :bank-account])
|
||||
:bank-accounts @(re-frame/subscribe [::subs/bank-accounts])}]]])
|
||||
|
||||
|
||||
[:p.menu-label "Financial Account"]
|
||||
|
||||
Reference in New Issue
Block a user