project now can sync companies

This commit is contained in:
Bryce Covert
2018-08-10 18:37:00 -07:00
parent f0512085ab
commit 2b47081c2f
2 changed files with 211 additions and 99 deletions

View File

@@ -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"]

View File

@@ -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)))