diff --git a/.DS_Store b/.DS_Store
new file mode 100644
index 0000000..460c5e1
Binary files /dev/null and b/.DS_Store differ
diff --git a/.idea/libraries/Leiningen__clj_tuple_0_2_2.xml b/.idea/libraries/Leiningen__clj_tuple_0_2_2.xml
new file mode 100644
index 0000000..732be9a
--- /dev/null
+++ b/.idea/libraries/Leiningen__clj_tuple_0_2_2.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Leiningen__clojure_java_time_0_3_3.xml b/.idea/libraries/Leiningen__clojure_java_time_0_3_3.xml
new file mode 100644
index 0000000..3d959c5
--- /dev/null
+++ b/.idea/libraries/Leiningen__clojure_java_time_0_3_3.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Leiningen__prismatic_schema_1_2_0.xml b/.idea/libraries/Leiningen__prismatic_schema_1_2_0.xml
new file mode 100644
index 0000000..1daf44d
--- /dev/null
+++ b/.idea/libraries/Leiningen__prismatic_schema_1_2_0.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 45a2d32..f3ffe05 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -2,12 +2,12 @@
-
+
\ No newline at end of file
diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml
deleted file mode 100644
index 797acea..0000000
--- a/.idea/runConfigurations.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..35eb1dd
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/README.md b/README.md
index e26cf5f..34e27dd 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,6 @@
### Uau! É funcional!!!
-Projeto bancário para mergulhar no mundo da **programação funcional** com Clojure + Datomic!
+Projeto bancário para mergulhar no mundo da **Programação funcional** com Clojure + Datomic!
-
-Desenvolvido por *[COLOCAR NOME AQUI]* (*[COLOCAR SEU EMAIL AQUI]*).
\ No newline at end of file
+Desenvolvido por *Ana Carolina Santos Silva* (*ana.ssilva@nubank.com.br*).
\ No newline at end of file
diff --git a/project.clj b/project.clj
index 490c9ec..bd93faf 100644
--- a/project.clj
+++ b/project.clj
@@ -3,5 +3,7 @@
:url "http://example.com/FIXME"
:license {:name "EPL-2.0 OR GPL-2.0-or-later WITH Classpath-exception-2.0"
:url "https://www.eclipse.org/legal/epl-2.0/"}
- :dependencies [[org.clojure/clojure "1.10.1"]]
+ :dependencies [[org.clojure/clojure "1.10.1"]
+ [clojure.java-time "0.3.3"]
+ [prismatic/schema "1.2.0"]]
:repl-options {:init-ns yes-she-codes.core})
diff --git a/src/.DS_Store b/src/.DS_Store
new file mode 100644
index 0000000..adaabc4
Binary files /dev/null and b/src/.DS_Store differ
diff --git a/src/yes_she_codes/.DS_Store b/src/yes_she_codes/.DS_Store
new file mode 100644
index 0000000..e82f355
Binary files /dev/null and b/src/yes_she_codes/.DS_Store differ
diff --git a/src/yes_she_codes/atom.clj b/src/yes_she_codes/atom.clj
new file mode 100644
index 0000000..4c477f4
--- /dev/null
+++ b/src/yes_she_codes/atom.clj
@@ -0,0 +1,49 @@
+(ns yes-she-codes.atom
+ (:use [clojure pprint])
+ (:require [yes-she-codes.db :as y.db]))
+
+(def repositorio-de-compras (atom []))
+
+(defrecord Compras [id,
+ data,
+ valor,
+ estabelecimento,
+ categoria,
+ cartao])
+
+(defn lista-de-compras-atomo []
+ @repositorio-de-compras)
+
+(defn id-uuid []
+ (.toString (java.util.UUID/randomUUID)))
+
+(defn inserir-id-compra [[data, valor, estabelecimento, categoria, cartao]]
+ (Compras. (id-uuid), data, valor, estabelecimento, categoria, cartao))
+
+(defn inserir-id-compra-vetor [repositorio-de-compras antiga-compra]
+ (let [nova-compra
+ (inserir-id-compra antiga-compra)]
+ (conj repositorio-de-compras nova-compra)))
+
+(defn inserir-compras-atom! [antiga-compra]
+ (swap! repositorio-de-compras inserir-id-compra-vetor antiga-compra))
+
+(defn transforma-compras [array]
+ (doseq [x array]
+ (inserir-compras-atom! x)))
+
+(defn lista-compras []
+ (transforma-compras (y.db/busca-registros-de-compras)))
+
+(lista-compras)
+
+(pprint (lista-de-compras-atomo))
+
+(defn pesquisa-compra-por-id! [entidades id]
+ (first (filter #(= id (:id %)) entidades)))
+
+(defn pesquisa-compra-id-atom [id repositorio-de-compras]
+ (pesquisa-compra-por-id! @repositorio-de-compras id))
+
+(pesquisa-compra-por-id! @repositorio-de-compras "1b78b5e0-940e-4dd9-aabb-c588742bcd82")
+(pesquisa-compra-id-atom "1b78b5e0-940e-4dd9-aabb-c588742bcd82" repositorio-de-compras)
diff --git a/src/yes_she_codes/core.clj b/src/yes_she_codes/core.clj
index 54cbf42..58745e9 100644
--- a/src/yes_she_codes/core.clj
+++ b/src/yes_she_codes/core.clj
@@ -1,6 +1,118 @@
-(ns yes-she-codes.core)
+(ns yes-she-codes.core
+ (:require yes-she-codes.dominio.compras :as y.compras)
+ (:require yes-she-codes.atom :as y.atom)
+ (:require yes-she-codes.dominio.clientes :as y.clientes)
+ (:require yes-she-codes.dominio.cartao :as y.cartao))
+
+
+(println "Lista de clientes\n" (y.clientes/lista-clientes))
+(println "Lista de cartoes\n" (y.cartao/lista-cartoes))
+(println "Lista de compras\n" (y.compras/lista-compras))
+(println "Total gasto em compras de todos os cartões\n" (y.compras/total-gasto (y.compras/lista-compras)))
+(println "Total gasto em compras de apenas um cartao\n" (y.cartao/total-gasto-no-cartao 1234123412341234 (y.logic/lista-compras)))
+(println "Busca das compras de um mes\n " (y.compras/compras-no-mes "04" (y.compras/lista-compras)))
+(println "Calcular o total da fatura de um mês\n" (y.compras/total-gasto-no-mes "04" (y.compras/lista-compras)))
+(println "Busca de um estabelecimento\n" (y.compras/comprei-no-estabelecimento? "Alura" (y.compras/lista-compras)))
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+;(defn insere-compra
+; [compra compras]
+; (let [id (inc (count compras))
+; compras-inserir (assoc compra :ID id)]
+; (conj compras compras-inserir)))
+
+;(defn insere-compra!
+; [compras compra]
+; (swap! compras insere-compra compra))
+
+(defn id-uuid []
+ (.toString (java.util.UUID/randomUUID)))
+
+(defrecord Paciente [id nome nascimento])
+
+;(pprint (->Paciente 15, "Guilherme", "19/09/1981"))
+(pprint (Paciente. (id-uuid), "Guilherme", "19/09/1981"))
+
+
+
+
+
+;(defn nova-compra [data, valor, estabelecimento, categoria, cartao]
+; {:data data,
+; :valor valor,
+; :estabelecimento estabelecimento,
+; :categoria categoria,
+; :cartao cartao})
+;
+;(defn transforma-compra []
+; (Compras))
+;
+;(defn transforma-compras [array]
+; (map transforma-compra array))
+;
+;(defn lista-compras []
+; (transforma-compras (y.db/busca-registros-de-compras)))
+;
+;(println "Lista de compras\n" (lista-compras))
+
+
+;(defn insere-compra-atomo
+; [Compras @repositorio-de-compras]
+; (update Compras @repositorio-de-compras pop))
+
+
-(defn foo
- "I don't do a whole lot."
- [x]
- (println x "Hello, World!"))
diff --git a/src/yes_she_codes/db.clj b/src/yes_she_codes/db.clj
new file mode 100644
index 0000000..4375ce0
--- /dev/null
+++ b/src/yes_she_codes/db.clj
@@ -0,0 +1,37 @@
+(ns yes-she-codes.db)
+;banco de dados com todas as informações de clientes, cartões e compras.
+(defn busca-registros-de-clientes []
+ [
+ ["Feiticeira Escarlate", "000.111.222-33", "feiticeira.poderosa@vingadoras.com.br"]
+ ["Viúva Negra", "333.444.555-66", "viuva.casca.grossa@vingadoras.com.br"]
+ ["Hermione Granger", "666.777.888-99", "hermione.salvadora@hogwarts.com"]
+ ["Daenerys Targaryen", "999.123.456-78", "mae.dos.dragoes@got.com"]])
+
+(defn busca-registros-de-cartoes []
+ [[1234123412341234, 111, "2023-01", 1000, "000.111.222-33"]
+ [4321432143214321, 222, "2024-02", 2000, "333.444.555-66"]
+ [1598159815981598, 333, "2021-03", 3000, "666.777.888-99"]
+ [6655665566556655, 444, "2025-04", 4000, "666.777.888-99"]
+ [3939393939393939, 555, "2026-05", 5000, "999.123.456-78"]])
+
+(defn busca-registros-de-compras []
+ [
+ ["2022-01-01", 129.90, "Outback", "Alimentação" 1234123412341234]
+ ["2022-01-02", 260.00, "Dentista", "Saúde" 1234123412341234]
+ ["2022-02-01", 20.00, "Cinema", "Lazer" 1234123412341234]
+ ["2022-01-10", 150.00, "Show", "Lazer" 4321432143214321]
+ ["2022-02-10", 289.99, "Posto de gasolina", "Automóvel" 4321432143214321]
+ ["2022-02-20", 79.90, "iFood", "Alimentação", 4321432143214321]
+ ["2022-03-01", 85.00, "Alura", "Educação", 4321432143214321]
+ ["2022-01-30", 85.00, "Alura", "Educação", 1598159815981598]
+ ["2022-01-31", 350.00, "Tok&Stok", "Casa", 1598159815981598]
+ ["2022-02-01", 400.00, "Leroy Merlin", "Casa", 1598159815981598]
+ ["2022-03-01", 50.00, "Madero", "Alimentação", 6655665566556655]
+ ["2022-03-01", 70.00, "Teatro", "Lazer", 6655665566556655]
+ ["2022-03-04", 250.00, "Hospital", "Saúde", 6655665566556655]
+ ["2022-04-10", 130.00, "Drogaria", "Saúde", 6655665566556655]
+ ["2022-03-10", 100.00, "Show de pagode", "Lazer", 3939393939393939]
+ ["2022-03-11", 25.90, "Dogão", "Alimentação", 3939393939393939]
+ ["2022-03-12", 215.87, "Praia", "Lazer", 3939393939393939]
+ ["2022-04-01", 976.88, "Oficina", "Automóvel", 3939393939393939]
+ ["2022-04-10", 85.00, "Alura", "Educação", 3939393939393939]])
diff --git a/src/yes_she_codes/dominio/cartao.clj b/src/yes_she_codes/dominio/cartao.clj
new file mode 100644
index 0000000..da89de6
--- /dev/null
+++ b/src/yes_she_codes/dominio/cartao.clj
@@ -0,0 +1,41 @@
+(ns yes-she-codes.dominio.cartao
+ (:require [yes-she-codes.db :as y.db])
+ (:require [yes-she-codes.dominio.compras :as y.compras]))
+
+(defn novo-cartao [numero, cvv, validade, limite, cliente]
+ {:numero numero,
+ :cvv cvv,
+ :validade validade,
+ :limite limite,
+ :cliente cliente})
+
+(defn transforma-cartao [[numero, cvv, validade, limite, cliente]]
+ (novo-cartao numero, cvv, validade, limite, cliente))
+
+(defn transforma-cartoes [array]
+ (map transforma-cartao array))
+
+(defn lista-cartoes []
+ (transforma-cartoes (y.db/busca-registros-de-cartoes)))
+
+;fiz essa etapa para encontrar o cartão dentro da lista de compras
+
+(defn achei-o-cartao-na-lista-de-compras? [cartao todas-as-compras]
+ (= cartao (:cartao todas-as-compras)))
+
+(defn comprei-no-cartao? [cartao lista-de-cartoes]
+ (filter #(achei-o-cartao-na-lista-de-compras? cartao %) lista-de-cartoes))
+
+(comprei-no-cartao? 1234123412341234 (y.compras/lista-compras))
+
+;fiz essa etapa para somar valores de um o cartão na lista
+
+(defn compra [x y]
+ (+ x (:valor y)))
+
+(defn total-gasto [lista-de-compras]
+ (reduce compra 0 lista-de-compras))
+
+(def total-gasto-no-cartao (comp total-gasto comprei-no-cartao?))
+
+(println "Valor total das compras de um cartao" (total-gasto-no-cartao 1234123412341234 (y.compras/lista-compras)))
diff --git a/src/yes_she_codes/dominio/clientes.clj b/src/yes_she_codes/dominio/clientes.clj
new file mode 100644
index 0000000..c9416b3
--- /dev/null
+++ b/src/yes_she_codes/dominio/clientes.clj
@@ -0,0 +1,24 @@
+(ns yes-she-codes.dominio.clientes
+ (:require [yes-she-codes.db :as y.db])
+ (:require [clojure.string :as str]))
+
+
+; schema para clientes
+
+(defn novo-cliente [nome, cpf, email]
+ {:nome nome
+ :cpf cpf
+ :email email})
+
+; recebe o array quebrado; e passa os dados para novo-cliente.
+(defn transforma-cliente [[nome, cpf, email]]
+ (novo-cliente nome, cpf, email))
+
+; recebe o array, que é o meu banco de dados com todos os clientes. Quebra o array através do map
+(defn transforma-clientes [array]
+ (map transforma-cliente array))
+
+(defn lista-clientes []
+ (transforma-clientes (y.db/busca-registros-de-clientes)))
+
+
diff --git a/src/yes_she_codes/dominio/compras.clj b/src/yes_she_codes/dominio/compras.clj
new file mode 100644
index 0000000..1166980
--- /dev/null
+++ b/src/yes_she_codes/dominio/compras.clj
@@ -0,0 +1,61 @@
+(ns yes-she-codes.dominio.compras
+ (:require [yes-she-codes.db :as y.db])
+ (:require [clojure.string :as str]))
+
+(defn nova-compra [data, valor, estabelecimento, categoria, cartao]
+ {:data data,
+ :valor valor,
+ :estabelecimento estabelecimento,
+ :categoria categoria,
+ :cartao cartao})
+
+(defn transforma-compra [[data, valor, estabelecimento, categoria, cartao]]
+ (nova-compra data, valor, estabelecimento, categoria, cartao))
+
+(defn transforma-compras [array]
+ (map transforma-compra array))
+
+(defn lista-compras []
+ (transforma-compras (y.db/busca-registros-de-compras)))
+
+(defn compra [x y]
+ (+ x (:valor y)))
+
+(defn total-gasto [lista-de-compras]
+ (reduce compra 0 lista-de-compras))
+
+(println "Valor total das compras de todos os cartões" (total-gasto (lista-compras)))
+
+;fiz essa etapa para encontrar o mes
+
+(defn split-data [data]
+ (str/split data #"-"))
+
+(defn get-mes [data]
+ (get (split-data data) 1))
+
+(defn get-mes-da-compra [compra]
+ (get-mes (:data compra)))
+
+(defn compra-realizada-no-mes? [mes compra]
+ (= mes (get-mes-da-compra compra)))
+
+(defn compras-no-mes [mes lista-de-compras]
+ (filter #(compra-realizada-no-mes? mes %) lista-de-compras))
+
+(println "achei o mes 04?" (compras-no-mes "04" (lista-compras)))
+
+;fiz essa etapa para somar valores de um mes da lista
+
+(def total-gasto-no-mes (comp total-gasto compras-no-mes))
+(println "Valor total das compras de um mes" (total-gasto-no-mes "04" (lista-compras)))
+
+;fiz essa etapa para encontrar o estabelecimento
+
+(defn achei-o-estabelecimento? [local todas-as-compras]
+ (= local (:estabelecimento todas-as-compras)))
+
+(defn comprei-no-estabelecimento? [local lista-de-compras]
+ (filter #(achei-o-estabelecimento? local %) lista-de-compras))
+
+(println "achei o estabelecimento?" (comprei-no-estabelecimento? "Alura" (lista-compras)))
\ No newline at end of file
diff --git a/src/yes_she_codes/schema_cliente.clj b/src/yes_she_codes/schema_cliente.clj
new file mode 100644
index 0000000..5a5a76e
--- /dev/null
+++ b/src/yes_she_codes/schema_cliente.clj
@@ -0,0 +1,44 @@
+(ns yes-she-codes.schema-cliente
+ (:use [clojure pprint])
+ (:require [schema.core :as s]))
+
+; schema de clientes.
+
+(defn nome-maior-que-dois? [x]
+ (> (count x) 2))
+
+(def NomeValido (s/pred nome-maior-que-dois?))
+
+(s/defn validaNome [nome :- s/Str]
+ (s/validate NomeValido nome))
+
+(validaNome "Carol")
+
+;funciona, mas porque não adapta o valor?
+
+(def cpf-valido? (partial re-matches #"[0-9]{3}\.[0-9]{3}\.[0-9]{3}-[0-9]{2}"))
+
+(def CpfValido (s/constrained s/Str cpf-valido?))
+
+(s/defn validaCpf [cpf :- s/Str]
+ (s/validate CpfValido cpf))
+
+(validaCpf "831.428.658-51")
+
+(def email-valido? (partial re-matches #"[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?"))
+
+(def EmailValido (s/constrained s/Str email-valido?))
+
+(s/defn validaEmail [email :- s/Str]
+ (s/validate EmailValido email))
+
+(validaEmail "abc@nubank.com")
+
+
+
+
+
+
+
+
+
diff --git a/test/.DS_Store b/test/.DS_Store
new file mode 100644
index 0000000..e24455e
Binary files /dev/null and b/test/.DS_Store differ
diff --git a/test/yes_she_codes/.DS_Store b/test/yes_she_codes/.DS_Store
new file mode 100644
index 0000000..52c8a12
Binary files /dev/null and b/test/yes_she_codes/.DS_Store differ
diff --git a/test/yes_she_codes/core_test.clj b/test/yes_she_codes/core_test.clj
index d6d282f..050cf8f 100644
--- a/test/yes_she_codes/core_test.clj
+++ b/test/yes_she_codes/core_test.clj
@@ -1,7 +1,4 @@
(ns yes-she-codes.core-test
(:require [clojure.test :refer :all]
- [yes-she-codes.core :refer :all]))
+ [yes-she-codes2.core :refer :all]))
-(deftest a-test
- (testing "FIXME, I fail."
- (is (= 0 1))))
diff --git a/test/yes_she_codes/logic_test.clj b/test/yes_she_codes/logic_test.clj
new file mode 100644
index 0000000..1d8ab8e
--- /dev/null
+++ b/test/yes_she_codes/logic_test.clj
@@ -0,0 +1,29 @@
+(ns yes-she-codes.logic-test
+ (:require [clojure.test :refer :all])
+ (:require [yes-she-codes.schema-cliente :refer :all]))
+
+
+(deftest validaSchemaTest
+
+ (testing "Nome correto"
+ (is (= "Carol" (validaNome "Carol"))))
+
+ (testing "Nome incorreto"
+ (is (thrown? clojure.lang.ExceptionInfo (validaNome "A"))))
+
+
+ (testing "Cpf correto"
+ (is (= "831.428.658-51" (validaCpf "831.428.658-51"))))
+
+ (testing "Formato de cpf incorreto"
+ (is (thrown? clojure.lang.ExceptionInfo (validaCpf "831"))))
+
+ (testing "Email correto"
+ (is (= "abc@nubank.com" (validaEmail "abc@nubank.com"))))
+
+ (testing "Formato de email incorreto"
+ (is (thrown? clojure.lang.ExceptionInfo (validaEmail "abc")))))
+
+
+
+(println (validaSchemaTest))
diff --git a/yes-she-codes.iml b/yes-she-codes.iml
index 254bfec..31e5a12 100644
--- a/yes-she-codes.iml
+++ b/yes-she-codes.iml
@@ -1,5 +1,9 @@
+
+
+
+
@@ -13,10 +17,13 @@
+
+
+
\ No newline at end of file