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