diff --git a/project.clj b/project.clj index ed88e828..418621b5 100644 --- a/project.clj +++ b/project.clj @@ -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"] diff --git a/src/clj/auto_ap/datomic.clj b/src/clj/auto_ap/datomic.clj index f6cef2d7..26c26fab 100644 --- a/src/clj/auto_ap/datomic.clj +++ b/src/clj/auto_ap/datomic.clj @@ -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)))