diff --git a/datomic-init/postgres-db.sql b/datomic-init/postgres-db.sql new file mode 100755 index 00000000..d449c8de --- /dev/null +++ b/datomic-init/postgres-db.sql @@ -0,0 +1,12 @@ +-- Database: datomic + +-- DROP DATABASE datomic; + +CREATE DATABASE datomic + WITH OWNER = postgres + TEMPLATE template0 + ENCODING = 'UTF8' + TABLESPACE = pg_default + LC_COLLATE = 'en_US.UTF-8' + LC_CTYPE = 'en_US.UTF-8' + CONNECTION LIMIT = -1; diff --git a/datomic-init/postgres-table.sql b/datomic-init/postgres-table.sql new file mode 100755 index 00000000..fd1e7fe5 --- /dev/null +++ b/datomic-init/postgres-table.sql @@ -0,0 +1,19 @@ +-- Table: datomic_kvs + +-- DROP TABLE datomic_kvs; + +CREATE TABLE datomic_kvs +( + id text NOT NULL, + rev integer, + map text, + val bytea, + CONSTRAINT pk_id PRIMARY KEY (id ) +) +WITH ( + OIDS=FALSE +); +ALTER TABLE datomic_kvs + OWNER TO postgres; +GRANT ALL ON TABLE datomic_kvs TO postgres; +GRANT ALL ON TABLE datomic_kvs TO public; diff --git a/datomic-init/postgres-user.sql b/datomic-init/postgres-user.sql new file mode 100755 index 00000000..fdee4c2e --- /dev/null +++ b/datomic-init/postgres-user.sql @@ -0,0 +1,5 @@ + +-- DROP ROLE :datomic + +CREATE ROLE datomic LOGIN PASSWORD 'datomic'; + diff --git a/project.clj b/project.clj index 8cd647f2..ed88e828 100644 --- a/project.clj +++ b/project.clj @@ -3,10 +3,12 @@ :url "http://example.com/FIXME" :min-lein-version "2.0.0" :repositories {"my.datomic.com" {:url "https://my.datomic.com/repo" - :creds :gpg}} + :username "datomic@brycecovertoperations.com" + :password "0ba303bb-01be-471c-bc91-1dfd3172a96a"}} :dependencies [[org.clojure/clojure "1.9.0"] [org.clojure/clojurescript "1.10.238"] [postgresql/postgresql "9.3-1102.jdbc41"] + [com.datomic/datomic-pro "0.9.5703" :exclusions [com.google.guava/guava]] [compojure "1.6.0"] [kibu/pushy "0.3.8"] [bidi "2.1.2"] @@ -76,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 new file mode 100644 index 00000000..9a56f4e0 --- /dev/null +++ b/src/clj/auto_ap/datomic.clj @@ -0,0 +1,129 @@ +(ns autoap.datomic + (:require [datomic.api :as d] + [auto-ap.db.vendors :as v] + [clojure.string :as str])) + +(def uri "datomic:sql://invoices?jdbc:postgresql://database:5432/datomic?user=datomic&password=datomic") + +(defn create-database [] + (d/create-database uri)) + +(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/ident :vendor/address + :db/valueType :db.type/ref + :db/cardinality :db.cardinality/one + :db/isComponent true + :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"}] + (d/transact (d/connect uri)))) + +(defn load-entities [] + (d/transact (d/connect uri) + [{:db/ident :test + :testing/number "1"} + {:db/ident :test-2 + :testing/number "2"}] + )) +(defn query-entities [] + (d/q '[:find (pull ?e [:vendor/name]) + :where [?e :vendor/name]] + (d/db (d/connect uri)))) + +(defn load-vendors [] + (d/transact + (d/connect uri) + (let [all-vendors (v/get-all)] + (doto (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 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) + ))) + + + + +(defn do [] + (create-database uri) + @(create-schema ) + @(load-entities) + @(load-vendors) + (count (query-entities))) +