project now can sync companies
This commit is contained in:
@@ -78,7 +78,7 @@
|
||||
:plugins [[lein-figwheel "0.5.13"]
|
||||
[lein-pdo "0.1.1"]
|
||||
[cider/cider-nrepl "0.16.0"]]
|
||||
:jvm-opts ["-Dconfig=config/dev.edn" "--add-modules" "java.xml.bind"]}
|
||||
:jvm-opts ["-Dconfig=config/dev.edn" #_#_"--add-modules" "java.xml.bind"]}
|
||||
:uberjar {:prep-tasks [["cljsbuild" "once" "min"] "compile"]}
|
||||
:provided {:dependencies [[org.clojure/clojurescript "1.10.238"]
|
||||
[reagent "0.7.0"]
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
(ns autoap.datomic
|
||||
(:require [datomic.api :as d]
|
||||
[auto-ap.db.vendors :as v]
|
||||
[auto-ap.db.companies :as c]
|
||||
[clojure.string :as str]))
|
||||
|
||||
(def uri "datomic:sql://invoices?jdbc:postgresql://database:5432/datomic?user=datomic&password=datomic")
|
||||
@@ -8,74 +9,155 @@
|
||||
(defn create-database []
|
||||
(d/create-database uri))
|
||||
|
||||
(defn drop-database []
|
||||
(d/delete-database uri))
|
||||
|
||||
(defn remove-nils [m]
|
||||
|
||||
(let [result (reduce-kv
|
||||
(fn [m k v]
|
||||
(if v
|
||||
(assoc m k v)
|
||||
m
|
||||
))
|
||||
{}
|
||||
m)]
|
||||
(if (seq result)
|
||||
result
|
||||
nil)))
|
||||
|
||||
(def vendor-schema
|
||||
[{:db/ident :vendor/original-id
|
||||
:db/valueType :db.type/long
|
||||
:db/cardinality :db.cardinality/one
|
||||
:db/unique :db.unique/identity
|
||||
:db/doc "Original id from the old system"}
|
||||
{:db/ident :vendor/name
|
||||
:db/valueType :db.type/string
|
||||
:db/cardinality :db.cardinality/one
|
||||
:db/doc "A vendor's human-friendly name"}
|
||||
{:db/ident :vendor/code
|
||||
:db/valueType :db.type/string
|
||||
:db/unique :db.unique/identity
|
||||
:db/cardinality :db.cardinality/one
|
||||
:db/doc "A vendor's computer-friendly name"}
|
||||
{:db/ident :vendor/print-as
|
||||
:db/valueType :db.type/string
|
||||
:db/cardinality :db.cardinality/one
|
||||
:db/doc "Set if you want to override how this vendor's name is printed on checks"}
|
||||
{:db/ident :vendor/email
|
||||
:db/valueType :db.type/string
|
||||
:db/cardinality :db.cardinality/one
|
||||
:db/doc "A vendor's email address"}
|
||||
|
||||
{:db/ident :vendor/phone
|
||||
:db/valueType :db.type/string
|
||||
:db/cardinality :db.cardinality/one
|
||||
:db/doc "A vendor's phone number"}
|
||||
{:db/ident :vendor/invoice-reminder-schedule
|
||||
:db/valueType :db.type/keyword
|
||||
:db/cardinality :db.cardinality/one
|
||||
:db/doc "How often to email this vendor about invoices"}
|
||||
{:db/ident :vendor/default-expense-account
|
||||
:db/valueType :db.type/long
|
||||
:db/cardinality :db.cardinality/one
|
||||
:db/doc "The vendor's default expense account"}
|
||||
{:db/ident :vendor/primary-contact
|
||||
:db/valueType :db.type/ref
|
||||
:db/cardinality :db.cardinality/one
|
||||
:db/isComponent true
|
||||
:db/doc "The vendor's primary contact"}
|
||||
{:db/ident :vendor/secondary-contact
|
||||
:db/valueType :db.type/ref
|
||||
:db/isComponent true
|
||||
:db/cardinality :db.cardinality/one
|
||||
:db/doc "The vendor's secondary contact"}
|
||||
{:db/id #db/id[:db.part/db]
|
||||
:db/ident :vendor/address
|
||||
:db/valueType :db.type/ref
|
||||
:db/cardinality :db.cardinality/one
|
||||
:db/isComponent true
|
||||
:db.install/_attribute :db.part/db
|
||||
:db/doc "The vendor's address"}
|
||||
])
|
||||
|
||||
(def client-schema
|
||||
[{:db/ident :client/original-id
|
||||
:db/valueType :db.type/long
|
||||
:db/cardinality :db.cardinality/one
|
||||
:db/unique :db.unique/identity
|
||||
:db/doc "Original id from the old system"}
|
||||
{:db/ident :client/name
|
||||
:db/valueType :db.type/string
|
||||
:db/cardinality :db.cardinality/one
|
||||
:db/doc "A client's human-friendly name"}
|
||||
{:db/ident :client/code
|
||||
:db/valueType :db.type/string
|
||||
:db/unique :db.unique/identity
|
||||
:db/cardinality :db.cardinality/one
|
||||
:db/doc "A client's computer-friendly name"}
|
||||
{:db/ident :client/signature-file
|
||||
:db/valueType :db.type/string
|
||||
:db/unique :db.unique/identity
|
||||
:db/cardinality :db.cardinality/one
|
||||
:db/doc "A check signature image"}
|
||||
|
||||
{:db/ident :client/locations
|
||||
:db/valueType :db.type/string
|
||||
:db/cardinality :db.cardinality/many
|
||||
:db/doc "A client's locations"}
|
||||
{:db/ident :client/address
|
||||
:db/valueType :db.type/ref
|
||||
:db/cardinality :db.cardinality/one
|
||||
:db/isComponent true
|
||||
:db/doc "Address of the client"}
|
||||
{:db/ident :client/bank-accounts
|
||||
:db/valueType :db.type/ref
|
||||
:db/cardinality :db.cardinality/many
|
||||
:db/doc "Bank accounts for the client"}])
|
||||
|
||||
(def address-schema
|
||||
[
|
||||
{:db/ident :address/street1
|
||||
:db/valueType :db.type/string
|
||||
:db/cardinality :db.cardinality/one
|
||||
:db/doc "123 main st"}
|
||||
{:db/ident :address/street2
|
||||
:db/valueType :db.type/string
|
||||
:db/cardinality :db.cardinality/one
|
||||
:db/doc "Apt A"}
|
||||
{:db/ident :address/city
|
||||
:db/valueType :db.type/string
|
||||
:db/cardinality :db.cardinality/one
|
||||
:db/doc "Campbell"}
|
||||
{:db/ident :address/state
|
||||
:db/valueType :db.type/string
|
||||
:db/cardinality :db.cardinality/one
|
||||
:db/doc "CA"}
|
||||
{:db/ident :address/zip
|
||||
:db/valueType :db.type/string
|
||||
:db/cardinality :db.cardinality/one
|
||||
:db/doc "95014"}])
|
||||
|
||||
(def contact-schema
|
||||
[
|
||||
{:db/ident :contact/name
|
||||
:db/valueType :db.type/string
|
||||
:db/cardinality :db.cardinality/one
|
||||
:db/doc "John Smith"}
|
||||
{:db/ident :contact/phone
|
||||
:db/valueType :db.type/string
|
||||
:db/cardinality :db.cardinality/one
|
||||
:db/doc "4255773578"}
|
||||
{:db/ident :contact/email
|
||||
:db/valueType :db.type/string
|
||||
:db/cardinality :db.cardinality/one
|
||||
:db/doc "hello@example.com"}])
|
||||
|
||||
(defn create-schema []
|
||||
(->>
|
||||
[
|
||||
;; vendors
|
||||
{:db/ident :vendor/name
|
||||
:db/valueType :db.type/string
|
||||
:db/cardinality :db.cardinality/one
|
||||
:db/doc "A vendor's human-friendly name"}
|
||||
{:db/ident :vendor/print-as
|
||||
:db/valueType :db.type/string
|
||||
:db/cardinality :db.cardinality/one
|
||||
:db/doc "Set if you want to override how this vendor's name is printed on checks"}
|
||||
{:db/ident :vendor/email
|
||||
:db/valueType :db.type/string
|
||||
:db/cardinality :db.cardinality/one
|
||||
:db/doc "A vendor's email address"}
|
||||
{:db/ident :vendor/phone
|
||||
:db/valueType :db.type/string
|
||||
:db/cardinality :db.cardinality/one
|
||||
:db/doc "A vendor's phone number"}
|
||||
{:db/ident :vendor/invoice-reminder-schedule
|
||||
:db/valueType :db.type/keyword
|
||||
:db/cardinality :db.cardinality/one
|
||||
:db/doc "How often to email this vendor about invoices"}
|
||||
{:db/ident :vendor/primary-contact
|
||||
:db/valueType :db.type/ref
|
||||
:db/cardinality :db.cardinality/one
|
||||
:db/doc "The vendor's primary contact"}
|
||||
{:db/ident :vendor/secondary-contact
|
||||
:db/valueType :db.type/ref
|
||||
:db/cardinality :db.cardinality/one
|
||||
:db/doc "The vendor's secondary contact"}
|
||||
{:db/id #db/id[:db.part/db]
|
||||
:db/ident :vendor/address
|
||||
:db/valueType :db.type/ref
|
||||
:db/cardinality :db.cardinality/one
|
||||
:db/isComponent true
|
||||
:db.install/_attribute :db.part/db
|
||||
:db/doc "The vendor's address"}
|
||||
|
||||
{:db/ident :address/street1
|
||||
:db/valueType :db.type/ref
|
||||
:db/cardinality :db.cardinality/one
|
||||
:db/doc "123 main st"}
|
||||
{:db/ident :address/street2
|
||||
:db/valueType :db.type/ref
|
||||
:db/cardinality :db.cardinality/one
|
||||
:db/doc "Apt A"}
|
||||
{:db/ident :address/city
|
||||
:db/valueType :db.type/ref
|
||||
:db/cardinality :db.cardinality/one
|
||||
:db/doc "Campbell"}
|
||||
{:db/ident :address/state
|
||||
:db/valueType :db.type/ref
|
||||
:db/cardinality :db.cardinality/one
|
||||
:db/doc "CA"}
|
||||
{:db/ident :address/zip
|
||||
:db/valueType :db.type/ref
|
||||
:db/cardinality :db.cardinality/one
|
||||
:db/doc "95014"}
|
||||
|
||||
|
||||
|
||||
|
||||
{:db/ident :testing/number
|
||||
:db/valueType :db.type/string
|
||||
:db/cardinality :db.cardinality/one
|
||||
:db/doc "A useless entity"}]
|
||||
(concat address-schema contact-schema vendor-schema client-schema)
|
||||
|
||||
(d/transact (d/connect uri))))
|
||||
|
||||
(defn load-entities []
|
||||
@@ -87,44 +169,74 @@
|
||||
))
|
||||
(defn query-entities []
|
||||
(d/q '[:find (pull ?e [:vendor/name])
|
||||
:where [?e :vendor/name]]
|
||||
:where [?e :vendor/name]]
|
||||
(d/db (d/connect uri))))
|
||||
|
||||
(defn load-vendors []
|
||||
(defn load-vendors [vendors]
|
||||
(d/transact
|
||||
(d/connect uri)
|
||||
(let [all-vendors (v/get-all)]
|
||||
(doto (take 5 (map
|
||||
(fn [{:keys [primary-phone address email primary-contact secondary-email secondary-contact primary-email name default-expense-account id code secondary-phone invoice-reminder-schedule print-as]}]
|
||||
|
||||
(cond-> #:vendor {:db/ident (keyword (str "vendor-" id))
|
||||
:name name}
|
||||
email (assoc :vendor/email email)
|
||||
invoice-reminder-schedule (assoc :vendor/invoice-reminder-schedule invoice-reminder-schedule)
|
||||
(and address
|
||||
(:street1 address)
|
||||
(:street2 address)
|
||||
(:city address)
|
||||
(:state address)
|
||||
(:zip address))
|
||||
(assoc :vendor/address #:address {
|
||||
:street1 (:street1 address)
|
||||
:street2 (:street2 address)
|
||||
:city (:city address)
|
||||
:state (:state address)
|
||||
:zip (:zip address)})))
|
||||
|
||||
|
||||
all-vendors))
|
||||
clojure.pprint/pprint)
|
||||
)))
|
||||
(->> vendors
|
||||
(map
|
||||
(fn [{:keys [primary-phone address email primary-contact secondary-email secondary-contact primary-email name default-expense-account id code secondary-phone invoice-reminder-schedule print-as]}]
|
||||
(let [vendor-id (d/tempid :db.part/user)
|
||||
address-id (d/tempid :db.part/user)]
|
||||
(remove-nils #:vendor {:original-id id
|
||||
:name name
|
||||
:code (if (seq code) code nil)
|
||||
:email email
|
||||
:default-expense-account default-expense-account
|
||||
:invoice-reminder-schedule invoice-reminder-schedule
|
||||
:address (remove-nils #:address {:street1 (:street1 address)
|
||||
:street2 (:street2 address)
|
||||
:city (:city address)
|
||||
:state (:state address)
|
||||
:zip (:zip address)})
|
||||
:primary-contact (remove-nils #:contact {:name primary-contact
|
||||
:phone primary-phone
|
||||
:email primary-email})
|
||||
:secondary-contact (remove-nils #:contact {:name secondary-contact
|
||||
:phone secondary-phone
|
||||
:email secondary-email})})))))))
|
||||
|
||||
(defn load-clients [clients]
|
||||
(->> clients
|
||||
(map
|
||||
(fn [{:keys [name address id code locations email bank-accounts signature-file]}]
|
||||
(doto (remove-nils #:client {:original-id id
|
||||
:name (str name "-test")
|
||||
:code nil
|
||||
:email email
|
||||
:signature-file signature-file
|
||||
:locations locations
|
||||
:address (remove-nils #:address {:street1 (:street1 address)
|
||||
:street2 (:street2 address)
|
||||
:city (:city address)
|
||||
:state (:state address)
|
||||
:zip (:zip address)})
|
||||
})
|
||||
println)))
|
||||
(d/transact (d/connect uri))))
|
||||
|
||||
|
||||
|
||||
(defn query-vendors []
|
||||
(d/q '[:find (pull ?e [:db/id :vendor/invoice-reminder-schedule ])
|
||||
:where [?e :vendor/address]]
|
||||
(d/db (d/connect uri))))
|
||||
(defn query-clients []
|
||||
(d/q '[:find (pull ?e [*]) (min ?tx-time) (max ?tx-time2)
|
||||
:where [?e :client/original-id]
|
||||
[?e _ _ ?tx]
|
||||
[?tx :db/txInstant ?tx-time]
|
||||
[?tx :db/txInstant ?tx-time2]]
|
||||
(d/db (d/connect uri))))
|
||||
|
||||
|
||||
(defn do []
|
||||
(create-database uri)
|
||||
@(create-schema )
|
||||
@(load-entities)
|
||||
@(load-vendors))
|
||||
|
||||
(create-database )
|
||||
@(create-schema )
|
||||
(let [all-vendors (v/get-all)]
|
||||
@(load-vendors all-vendors))
|
||||
(let [all-clients (c/get-all)]
|
||||
@(load-clients all-clients))
|
||||
(count (query-clients)))
|
||||
|
||||
Reference in New Issue
Block a user