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__org_clojure_clojure_1_10_1.xml b/.idea/libraries/Leiningen__org_clojure_clojure_1_11_1.xml similarity index 67% rename from .idea/libraries/Leiningen__org_clojure_clojure_1_10_1.xml rename to .idea/libraries/Leiningen__org_clojure_clojure_1_11_1.xml index 832974a..f6656ac 100644 --- a/.idea/libraries/Leiningen__org_clojure_clojure_1_10_1.xml +++ b/.idea/libraries/Leiningen__org_clojure_clojure_1_11_1.xml @@ -1,7 +1,7 @@ - + - + diff --git a/.idea/libraries/Leiningen__org_clojure_core_specs_alpha_0_2_44.xml b/.idea/libraries/Leiningen__org_clojure_core_specs_alpha_0_2_62.xml similarity index 62% rename from .idea/libraries/Leiningen__org_clojure_core_specs_alpha_0_2_44.xml rename to .idea/libraries/Leiningen__org_clojure_core_specs_alpha_0_2_62.xml index 0c20df3..af956e6 100644 --- a/.idea/libraries/Leiningen__org_clojure_core_specs_alpha_0_2_44.xml +++ b/.idea/libraries/Leiningen__org_clojure_core_specs_alpha_0_2_62.xml @@ -1,7 +1,7 @@ - + - + diff --git a/.idea/libraries/Leiningen__org_clojure_data_csv_1_0_1.xml b/.idea/libraries/Leiningen__org_clojure_data_csv_1_0_1.xml new file mode 100644 index 0000000..fc1afa0 --- /dev/null +++ b/.idea/libraries/Leiningen__org_clojure_data_csv_1_0_1.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Leiningen__org_clojure_spec_alpha_0_2_176.xml b/.idea/libraries/Leiningen__org_clojure_spec_alpha_0_3_218.xml similarity index 64% rename from .idea/libraries/Leiningen__org_clojure_spec_alpha_0_2_176.xml rename to .idea/libraries/Leiningen__org_clojure_spec_alpha_0_3_218.xml index 31c7656..22abd30 100644 --- a/.idea/libraries/Leiningen__org_clojure_spec_alpha_0_2_176.xml +++ b/.idea/libraries/Leiningen__org_clojure_spec_alpha_0_3_218.xml @@ -1,7 +1,7 @@ - + - + diff --git a/.idea/libraries/Leiningen__prismatic_schema_1_1_12.xml b/.idea/libraries/Leiningen__prismatic_schema_1_1_12.xml new file mode 100644 index 0000000..5d02782 --- /dev/null +++ b/.idea/libraries/Leiningen__prismatic_schema_1_1_12.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 45a2d32..7d294aa 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..8a0211e 100644 --- a/README.md +++ b/README.md @@ -5,4 +5,4 @@ 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 *MARIA ALICE GUIMARÃES CARNEIRO* (*maria.carneiro@nubank.com.br*). \ No newline at end of file diff --git a/project.clj b/project.clj index 490c9ec..f878185 100644 --- a/project.clj +++ b/project.clj @@ -3,5 +3,9 @@ :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.11.1"] + [clojure.java-time "0.3.3"] + [org.clojure/data.csv "1.0.1"] + [prismatic/schema "1.1.12"] + [com.datomic/datomic-pro "1.0.6397"]] :repl-options {:init-ns yes-she-codes.core}) diff --git a/src/yes_she_codes/core.clj b/src/yes_she_codes/core.clj deleted file mode 100644 index 54cbf42..0000000 --- a/src/yes_she_codes/core.clj +++ /dev/null @@ -1,6 +0,0 @@ -(ns yes-she-codes.core) - -(defn foo - "I don't do a whole lot." - [x] - (println x "Hello, World!")) diff --git a/src/yes_she_codes/semana1/cartoes.clj b/src/yes_she_codes/semana1/cartoes.clj new file mode 100644 index 0000000..09e844e --- /dev/null +++ b/src/yes_she_codes/semana1/cartoes.clj @@ -0,0 +1,58 @@ +(ns yes-she-codes.semana1.cartoes + (:require [yes-she-codes.db :as y.db] + [clojure.string :as s] + [yes-she-codes.logic :as y.logic] + [java-time :as t])) + + + + + +(println "\n\n ---------------- testando data java time ---------------- ") +(println (t/format (t/year-month (str "2022-09")))) + + + + + +(println "\n\n ---------------- novo cartao ---------------- ") +(defn novo-cartao + [numero cvv validade limite cliente] + (let [cc-info {:numero (y.logic/str-to-float numero) + :cvv cvv + :validade (t/format (t/year-month (str validade))) + :limite limite + :cliente (y.logic/str-to-float cliente)} + client-info (y.logic/validar-cliente cliente)] + (if (nil? client-info) + "cpf nao encontrado" + cc-info)) + ) +;aqui usamos a funcao str-to-float para transformar strings +;primeiro removemos os espacos ou pontos (. -) entre os numeros +;e depois transformamos a string em tipo long + +(let [numero "1111 2222 3333 4444" + cvv 555 + validade "2022-09" + limite 5.000 + ;cliente "114.918.436-16" + cliente "000.111.222-33" + ] + (println (novo-cartao numero cvv validade limite cliente))) + + + + + +(println "\n\n ---------------- lista cartoes ---------------- ") + +(defn lista-cartoes + [] + (let [cartoes (y.logic/csv-reader "/Users/maria.carneiro/Documents/yes-she-codes-alura/yes-she-codes/src/yes_she_codes/csv/cartoes.csv")] + (println cartoes)) + ) + +(lista-cartoes) + + diff --git a/src/yes_she_codes/semana1/clientes.clj b/src/yes_she_codes/semana1/clientes.clj new file mode 100644 index 0000000..54ec1a6 --- /dev/null +++ b/src/yes_she_codes/semana1/clientes.clj @@ -0,0 +1,42 @@ +(ns yes-she-codes.semana1.clientes + (:require [yes-she-codes.db :as y.db] + ;[clojure.string :as s] + ;[yes-she-codes.logic :as y.logic] + [java-time :as time] + [yes-she-codes.logic :as y.logic] + )) + + + + + +(println "\n\n ---------------- novo cliente ---------------- ") + +(defn novo-cliente + [nome cpf email] + {:nome nome + :cpf cpf + :email email}) + +(let [nome "Gabriel" + cpf "114.918.436-16" + email "gabrielvcbessa@gmail.com"] + (println (novo-cliente nome cpf email))) + + + + + +(println "\n\n ---------------- lista clientes ---------------- ") + +(defn lista-clientes + [] + (let [clientes (y.logic/csv-reader "/Users/maria.carneiro/Documents/yes-she-codes-alura/yes-she-codes/src/yes_she_codes/csv/clientes.csv")] + (println clientes)) + ) + +(lista-clientes) + + + + diff --git a/src/yes_she_codes/semana1/compras.clj b/src/yes_she_codes/semana1/compras.clj new file mode 100644 index 0000000..6aacd83 --- /dev/null +++ b/src/yes_she_codes/semana1/compras.clj @@ -0,0 +1,201 @@ +(ns yes-she-codes.semana1.compras + (:require [yes-she-codes.db :as y.db] + [clojure.string :as s] + [yes-she-codes.logic :as y.logic] + [java-time :as t])) + + + + + +(println "\n\n ---------------- nova compra ---------------- ") + +(defn nova-compra + [data valor estabelecimento categoria cartao] + {:data (t/format (t/local-date (str data))) + :valor (bigdec valor) + :estabelecimento estabelecimento + :categoria categoria + :cartao (y.logic/str-to-float cartao)} + ) + + +(let [data "2022-05-10" + valor 199.99 + estabelecimento "Nucleo Artistico" + categoria "Lazer" + cartao "1111 2222 3333 4444" + ] + (println (nova-compra data valor estabelecimento categoria cartao))) + +;aqui usamos a funcao str-to-float para transformar strings +;primeiro removemos os espacos ou pontos (. -) entre os numeros +;e depois transformamos a string em tipo long + + + + + +(println "\n\n ---------------- lista compras ---------------- ") + +(defn lista-compras + [] + (let [compras (y.logic/csv-reader "/Users/maria.carneiro/Documents/yes-she-codes-alura/yes-she-codes/src/yes_she_codes/csv/compras.csv")] + (println compras)) + ) + +(lista-compras) + + + + + +(println "\n\n ---------------- total gasto ---------------- ") + +(defn total-gasto + [compras] + (->> compras + (map :valor) + (reduce +) + ) + ) + +(let [compras (y.db/todas-compras)] + (println (total-gasto compras))) + + + + + +(println "\n\n ---------------- lista compras/mes ---------------- ") + +(defn compras-por-mes + [mes compras] + (let [parsed-mes (format "%02d" mes)] + (->> compras + (filter #(s/includes? (:data %) (str "-" parsed-mes "-")))))) +; poderiamos usar +; (re-matches #"\d{4}-\d{2}-\d{2}" "2022-04-10") +; (essa expressao acima confirma se essa data tem 4 numeros em ano, 2 numeros em mes e dois numeros em dia + +; para capturar o valor de mes teria que fazer: +; (re-matches #"\d{4}-(\d{2})-\d{2}" "2022-04-10") -> retorno ["2022-04-10""04"] +; acima voce consegue capturar o valor "mes" + +; entao seria apenas pegar a segunda posicao desse vetor usando "second" +; (second (re-matches #"\d{4}-(\d{2})-\d{2}" "2022-04-10")) -> retorno "04" + +(let [compras (y.db/todas-compras) + mes 3] + (->> (compras-por-mes mes compras) + println)) + + + + + +(println "\n\n -------- estabelecimento -------- ") + +(defn compras-por-estabelecimento + [estabelecimento compras] + (->> compras + (filter #(s/includes? (:estabelecimento %) (str estabelecimento))))) + + +(let [compras (y.db/todas-compras) + estabelecimento "Alura"] + (->> (compras-por-estabelecimento estabelecimento compras) + println)) + + + + + +(println "\n\n -------- total gasto/mes em 1 cartao -------- ") + +; filtrar por um cartao +(defn compras-cartao + [compras cartao] + (->> compras (filter #(s/includes? (:cartao %) (str cartao)))) + ) + + +(defn total-gasto-no-mes + [mes compras cartao] + (-> (compras-por-mes mes compras) + (compras-cartao cartao) + (total-gasto)) + ) + +(let [compras (y.db/todas-compras) + mes 3 + cartao "6655 6655 6655 6655"] + (println (total-gasto-no-mes mes compras cartao))) + + + + + +(println "\n\n -------- filtrar compras num intervalo de valores -------- ") + +(defn compras-em-intervalo-de-valor + [compras valMax valMin] + (->> compras + (filter #(and (< (:valor %) valMax) (> (:valor %) valMin))) + (map :valor)) + ) + + +(let [compras (y.db/todas-compras)] + (println (compras-em-intervalo-de-valor compras 150 69))) + + + + + +(println "\n\n -------- agrupar gastos por categoria -------- ") + +(defn preco-total-por-categoria + [compras] + (->> compras + (map :categoria) + (map :valor compras) + (reduce +))) + + +(defn total-por-categoria + [[key compras]] + {:categoria key + :total (preco-total-por-categoria compras) + } + ; se quiser que saia apenas os valores, basta remover o :categoria e :total do retorno + ; assim: + ;{key + ; (total-price-per-user compras) + ; } + ) + +(defn agrupados-por-categoria + [compras] + (->> compras + (group-by :categoria) + ; retorno: {Alimentação [{:data 2022-01-01 ...}], Saúde [{:data 2022-01-02...}], + ; Lazer [{:data 2022-02-01,...}], + ; Automóvel [{:data 2022-02-10, ...}], + ; Educação [{:data 2022-03-01, ...}], + ; Casa [{:data 2022-01-31,...}]} + + (map total-por-categoria) + ) + ) +;({:key Alimentação, :total 285.7} {:key Saúde, :total 640.0} {:key Lazer, :total 555.87} {:key Automóvel, :total 1266.87} {:key Educação, :total 255.0} {:key Casa, :total 750.0}) +;({Alimentação 285.7} {Saúde 640.0} {Lazer 555.87} {Automóvel 1266.87} {Educação 255.0} {Casa 750.0}) + + +(let [compras (y.db/todas-compras)] + (println (agrupados-por-categoria compras))) + + + + + diff --git a/src/yes_she_codes/semana1/core.clj b/src/yes_she_codes/semana1/core.clj new file mode 100644 index 0000000..fbc18db --- /dev/null +++ b/src/yes_she_codes/semana1/core.clj @@ -0,0 +1,2 @@ +(ns yes-she-codes.semana1.core) + diff --git a/src/yes_she_codes/semana1/csv/cartoes.csv b/src/yes_she_codes/semana1/csv/cartoes.csv new file mode 100644 index 0000000..5005205 --- /dev/null +++ b/src/yes_she_codes/semana1/csv/cartoes.csv @@ -0,0 +1,6 @@ +NÚMERO,CVV,VALIDADE,LIMITE,CLIENTE +1234 1234 1234 1234,111,2023-01,1.000,000.111.222-33 +4321 4321 4321 4321,222,2024-02,2.000,333.444.555-66 +1598 1598 1598 1598,333,2021-03,3.000,666.777.888-99 +6655 6655 6655 6655,444,2025-04,4.000,666.777.888-99 +3939 3939 3939 3939,555,2026-05,5.000,999.123.456-78 \ No newline at end of file diff --git a/src/yes_she_codes/semana1/csv/clientes.csv b/src/yes_she_codes/semana1/csv/clientes.csv new file mode 100644 index 0000000..991313c --- /dev/null +++ b/src/yes_she_codes/semana1/csv/clientes.csv @@ -0,0 +1,5 @@ +NOME,CPF,EMAIL +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 \ No newline at end of file diff --git a/src/yes_she_codes/semana1/csv/compras.csv b/src/yes_she_codes/semana1/csv/compras.csv new file mode 100644 index 0000000..8929a12 --- /dev/null +++ b/src/yes_she_codes/semana1/csv/compras.csv @@ -0,0 +1,20 @@ +DATA,VALOR,ESTABELECIMENTO,CATEGORIA,CARTÃO +2022-01-01,129.90,Outback,Alimentação,1234 1234 1234 1234 +2022-01-02,260.00,Dentista,Saúde,1234 1234 1234 1234 +2022-02-01,20.00,Cinema,Lazer,1234 1234 1234 1234 +2022-01-10,150.00,Show,Lazer,4321 4321 4321 4321 +2022-02-10,289.99,Posto de gasolina,Automóvel,4321 4321 4321 4321 +2022-02-20,79.90,iFood,Alimentação,4321 4321 4321 4321 +2022-03-01,85.00,Alura,Educação,4321 4321 4321 4321 +2022-01-30,85.00,Alura,Educação,1598 1598 1598 1598 +2022-01-31,350.00,Tok&Stok,Casa,1598 1598 1598 1598 +2022-02-01,400.00,Leroy Merlin,Casa,1598 1598 1598 1598 +2022-03-01,50.00,Madero,Alimentação,6655 6655 6655 6655 +2022-03-01,70.00,Teatro,Lazer,6655 6655 6655 6655 +2022-03-04,250.00,Hospital,Saúde,6655 6655 6655 6655 +2022-04-10,130.00,Drogaria,Saúde,6655 6655 6655 6655 +2022-03-10,100.00,Show de pagode,Lazer,3939 3939 3939 3939 +2022-03-11,25.90,Dogão,Alimentação,3939 3939 3939 3939 +2022-03-12,215.87,Praia,Lazer,3939 3939 3939 3939 +2022-04-01,976.88,Oficina,Automóvel,3939 3939 3939 3939 +2022-04-10,85.00,Alura,Educação,3939 3939 3939 3939 \ No newline at end of file diff --git a/src/yes_she_codes/semana1/db.clj b/src/yes_she_codes/semana1/db.clj new file mode 100644 index 0000000..a24f076 --- /dev/null +++ b/src/yes_she_codes/semana1/db.clj @@ -0,0 +1,46 @@ +(ns yes-she-codes.semana1.db) + +(def clientes [{:nome "Feiticeira Escarlate" :cpf "000.111.222-33" :email "feiticeira.poderosa@vingadoras.com.br"} + {:nome "Viúva Negra" :cpf "333.444.555-66" :email "viuva.casca.grossa@vingadoras.com.br"} + {:nome "Hermione Granger" :cpf "666.777.888-99" :email "hermione.salvadora@hogwarts.com"} + {:nome "Daenerys Targaryen" :cpf "999.123.456-78" :email "mae.dos.dragoes@got.com"}]) + +(def cartoes [{:numero "1234 1234 1234 1234" :cvv 111 :validade "2023-01" :limite 1.000 :cliente "000.111.222-33"} + {:numero "4321 4321 4321 4321" :cvv 222 :validade "2024-02" :limite 2.000 :cliente "333.444.555-66"} + {:numero "1598 1598 1598 1598" :cvv 333 :validade "2021-03" :limite 3.000 :cliente "666.777.888-99"} + {:numero "3939 3939 3939 3939" :cvv 555 :validade "2026-05" :limite 5.000 :cliente "999.123.456-78"}]) + +(def compras [{:data "2022-01-01" :valor 129.90 :estabelecimento "Outback" :categoria "Alimentação" :cartao "1234 1234 1234 1234" } + {:data "2022-01-02" :valor 260.00 :estabelecimento "Dentista" :categoria "Saúde" :cartao "1234 1234 1234 1234"} + {:data "2022-02-01" :valor 20.00 :estabelecimento "Cinema" :categoria "Lazer" :cartao "1234 1234 1234 1234"} + {:data "2022-01-10" :valor 150.00 :estabelecimento "Show" :categoria "Lazer" :cartao "4321 4321 4321 4321"} + {:data "2022-02-10" :valor 289.99 :estabelecimento "Posto de gasolina" :categoria "Automóvel" :cartao "4321 4321 4321 4321"} + {:data "2022-02-20" :valor 79.90 :estabelecimento "iFood" :categoria "Alimentação" :cartao "4321 4321 4321 4321"} + {:data "2022-03-01" :valor 85.00 :estabelecimento "Alura" :categoria "Educação" :cartao "4321 4321 4321 4321"} + {:data "2022-01-30" :valor 85.00 :estabelecimento "Alura" :categoria "Educação" :cartao "1598 1598 1598 1598"} + {:data "2022-01-31" :valor 350.00 :estabelecimento "Tok&Stok" :categoria "Casa" :cartao "1598 1598 1598 1598"} + {:data "2022-02-01" :valor 400.00 :estabelecimento "Leroy Merlin" :categoria "Casa" :cartao "1598 1598 1598 1598"} + {:data "2022-03-01" :valor 50.00 :estabelecimento "Madero" :categoria "Alimentação" :cartao "6655 6655 6655 6655"} + {:data "2022-03-01" :valor 70.00 :estabelecimento "Teatro" :categoria "Lazer" :cartao "6655 6655 6655 6655"} + {:data "2022-03-04" :valor 250.00 :estabelecimento "Hospital" :categoria "Saúde" :cartao "6655 6655 6655 6655"} + {:data "2022-04-10" :valor 130.00 :estabelecimento "Drogaria" :categoria "Saúde" :cartao "6655 6655 6655 6655"} + {:data "2022-03-10" :valor 100.00 :estabelecimento "Show de pagode" :categoria "Lazer" :cartao "3939 3939 3939 3939"} + {:data "2022-03-11" :valor 25.90 :estabelecimento "Dogão" :categoria "Alimentação" :cartao "3939 3939 3939 3939"} + {:data "2022-03-12" :valor 215.87 :estabelecimento "Praia" :categoria "Lazer" :cartao "3939 3939 3939 3939"} + {:data "2022-04-01" :valor 976.88 :estabelecimento "Oficina" :categoria "Automóvel" :cartao "3939 3939 3939 3939"} + {:data "2022-04-10" :valor 85.00 :estabelecimento "Alura" :categoria "Educação" :cartao "3939 3939 3939 3939"}]) + + +(defn todos-clientes + [] + clientes) + + +(defn todos-cartoes + [] + cartoes) + + +(defn todas-compras + [] + compras) \ No newline at end of file diff --git a/src/yes_she_codes/semana1/logic.clj b/src/yes_she_codes/semana1/logic.clj new file mode 100644 index 0000000..63ef192 --- /dev/null +++ b/src/yes_she_codes/semana1/logic.clj @@ -0,0 +1,102 @@ +(ns yes-she-codes.semana1.logic + (:require [yes-she-codes.db :as y.db] + [clojure.string :as s] + [clojure.data.csv :as csv] + [clojure.java.io :as io] + [java-time :as time]) + (:import (java.text Normalizer Normalizer$Form))) + + +(let [clientes (y.db/todos-clientes) + cartoes (y.db/todos-cartoes) + compras (y.db/todas-compras)] + (println "clientes ---" (sort-by :nome clientes)) + (println "cartoes ---" (sort-by :cliente cartoes)) + (println "compras ---" (reverse (sort-by :cartao compras))) +) + + + + + +(println "\n\n ---------------- str-to-float ---------------- ") +(defn str-to-float + [string] + (if (string? string) + (->> string + (remove #{\ \.\-}) + (s/join) + (Long/valueOf)) + string)) + +;aqui definimos a funcao str-to-float para transformar strings +;primeiro removemos os espacos ou pontos (. -) entre os numeros +;e depois transformamos a string em tipo long + + + +(println "\n\n ---------------- validar cliente ---------------- ") +(defn validar-cliente + [cliente] + (let [clientes (y.db/todos-clientes)] + (some #{cliente} (map :cpf clientes))) + ) + + + + + +(println "\n\n ---------------- csv reader ---------------- ") + +(defn remover-acentos + [str] + (let [normalized (Normalizer/normalize str Normalizer$Form/NFD)] + (s/replace normalized #"\p{InCombiningDiacriticalMarks}+" ""))) + + +(defn csv-data-to-maps + [csv-data] + (mapv zipmap + (->> (first csv-data) + (map s/lower-case) + (map remover-acentos) + (map keyword) + repeat) + (rest csv-data))) + + +(defn csv-reader + [arquivo] + (with-open [reader (io/reader arquivo)] + (let [read-file (csv/read-csv reader) + map (csv-data-to-maps read-file)] + map))) + + +(let [file "/Users/maria.carneiro/Documents/yes-she-codes-alura/yes-she-codes/src/yes_she_codes/csv/cartoes.csv"] + (println "CARTOES" (csv-reader file))) + + +(let [file "/Users/maria.carneiro/Documents/yes-she-codes-alura/yes-she-codes/src/yes_she_codes/csv/clientes.csv"] + (println "CLIENTES" (csv-reader file))) + +(let [file "/Users/maria.carneiro/Documents/yes-she-codes-alura/yes-she-codes/src/yes_she_codes/csv/compras.csv"] + (println "COMPRAS" (csv-reader file))) + + + + + + + + + + + + + + + + + + diff --git a/src/yes_she_codes/semana2/cartoes.clj b/src/yes_she_codes/semana2/cartoes.clj new file mode 100644 index 0000000..09941ce --- /dev/null +++ b/src/yes_she_codes/semana2/cartoes.clj @@ -0,0 +1,140 @@ +(ns yes-she-codes.semana2.cartoes + (:require [yes-she-codes.semana2.logic :as y.s2.logic]) + (:use [clojure pprint])) + + + + + +(println "\n\n ---------- criando um atom ----------") +(def repositorio-de-cartoes (atom [])) + +(println repositorio-de-cartoes) ; #object[clojure.lang.Atom 0x17161f91 {:status :ready, :val []}] +(pprint repositorio-de-cartoes) ; # +(pprint @repositorio-de-cartoes) ; [] -> acessando o valor dentro do atomo + + + +;{:numero "1234 1234 1234 1234" :cvv 111 :validade "2023-01" :limite 1.000 :cliente "000.111.222-33"} + + +(println "\n\n ---------- criando um record ----------") + +(defrecord Cartoes [^Long ID, ^Long numero, ^Long cvv, ^String validade, ^BigDecimal limite, ^String cliente]) + +(pprint (Cartoes. 1 1234123412341234 555 "2023-01" 1.000 "000.111.222-33")) + +; printando cartoes sem o id +(pprint (map->Cartoes {:numero 1234123412341234 :cvv 111 :validade "2023-01" :limite 1.000 :cliente "000.111.222-33"})) + + + + + +(println "\n\n ---------- criando a funcao insere-cartao ----------") + +(defn insere-cartao + [lista-cartoes novo-cartao] + + (let [id (y.s2.logic/proximo-id lista-cartoes) + id-cartao-a-inserir (assoc novo-cartao :ID id)] + (conj lista-cartoes id-cartao-a-inserir)) + ) + +(pprint (insere-cartao {} {:numero 1234123412341234 :cvv 111 :validade "2023-01" :limite 1.000 :cliente "000.111.222-33"})) + + + + + +(println "\n\n ---------- criando a funcao insere-cartao! ----------") + +(defn insere-cartao! + [lista-cartoes novo-cartao] + (swap! lista-cartoes insere-cartao novo-cartao) + ) + +(let [novo-cartao (map->Cartoes {:numero 1234123412341234 :cvv 222 :validade "2025-01" :limite 2.000 :cliente "777.111.222-33"})] + (pprint (insere-cartao! repositorio-de-cartoes novo-cartao))) + +(let [novo-cartao (map->Cartoes {:numero 1234123412341234 :cvv 333 :validade "2027-01" :limite 3.000 :cliente "888.111.222-33"})] + (pprint (insere-cartao! repositorio-de-cartoes novo-cartao))) + + + + + +(println "\n\n ---------- repositorio-de-cartoes ----------") +(pprint @repositorio-de-cartoes) + + + + + +(println "\n\n ---------- criando a funcao lista-cartoes! ----------") + +(defn lista-cartoes! + [repositorio-de-cartoes] + (println @repositorio-de-cartoes)) + +(lista-cartoes! repositorio-de-cartoes) + + + + + +(println "\n\n ---------- pesquisar-cartao-por-id ----------") + +(defn pesquisa-cartao-por-id + [repositorio-de-cartoes id ] + (first (filter #(= id (get % :ID)) repositorio-de-cartoes))) + +(pprint (pesquisa-cartao-por-id @repositorio-de-cartoes 5)) +(pprint (pesquisa-cartao-por-id @repositorio-de-cartoes 1)) + + + + + +(println "\n\n ---------- pesquisar-cartao-por-id! ----------") +(defn pesquisar-cartao-por-id! + [repositorio-de-cartoes id] + (pesquisa-cartao-por-id @repositorio-de-cartoes id)) + +(pprint (pesquisar-cartao-por-id! repositorio-de-cartoes 5)) ; nil +(pprint (pesquisar-cartao-por-id! repositorio-de-cartoes 2)) + + + + + +(println "\n\n ---------- exclui-cartao ----------") + +(defn exclui-cartao + [repositorio-de-cartoes id] + + ; codigo para remover ‘item’ do vetor + (let [cartao-a-excluir (pesquisa-cartao-por-id repositorio-de-cartoes id) + nova-lista (remove #{cartao-a-excluir} repositorio-de-cartoes)] + + ; vec cria novo vector + (vec nova-lista) + )) + +(pprint (exclui-cartao [{:ID 1 :numero 1234123412341234 :cvv 222 :validade "2025-01" :limite 2.000 :cliente "777.111.222-33"} + {:ID 2 :numero 1234123412341234 :cvv 333 :validade "2027-01" :limite 3.000 :cliente "888.111.222-33"}] 1)) + + + + + +(println "\n\n ---------- exclui-cartao! ----------") + +(defn exclui-cartao! + [repositorio-de-cartoes id] + (swap! repositorio-de-cartoes exclui-cartao id) + ) + + +(pprint (exclui-cartao! repositorio-de-cartoes 1)) +;(pprint @repositorio-de-compras) diff --git a/src/yes_she_codes/semana2/clientes.clj b/src/yes_she_codes/semana2/clientes.clj new file mode 100644 index 0000000..e1a3f99 --- /dev/null +++ b/src/yes_she_codes/semana2/clientes.clj @@ -0,0 +1,140 @@ +(ns yes-she-codes.semana2.clientes + (:require [yes-she-codes.semana2.logic :as y.s2.logic]) + (:use [clojure pprint])) + + + + + +(println "\n\n ---------- criando um atom ----------") +(def repositorio-de-clientes (atom [])) + +(println repositorio-de-clientes) ; #object[clojure.lang.Atom 0x17161f91 {:status :ready, :val []}] +(pprint repositorio-de-clientes) ; # +(pprint @repositorio-de-clientes) ; [] -> acessando o valor dentro do atomo + + + +;{:nome "Feiticeira Escarlate" :cpf "000.111.222-33" :email "feiticeira.poderosa@vingadoras.com.br"} + + +(println "\n\n ---------- criando um record ----------") + +(defrecord Clientes [^Long ID, ^String nome, ^Long cpf, ^String email]) + +(pprint (Clientes. 2 "Maria Alice Guimaraes Carneiro" 11531450652 "mguimaraes.carneiro@gmail.comS")) + +; printando Compras sem o id +(pprint (map->Clientes {:nome "Feiticeira Escarlate" :cpf "000.111.222-33" :email "feiticeira.poderosa@vingadoras.com.br"})) + + + + + +(println "\n\n ---------- criando a funcao insere-cliente ----------") + +(defn insere-cliente + [lista-clientes novo-cliente] + + (let [id (y.s2.logic/proximo-id lista-clientes) + id-cliente-a-inserir (assoc novo-cliente :ID id)] + (conj lista-clientes id-cliente-a-inserir)) + ) + +(pprint (insere-cliente {} {:nome "Feiticeira Escarlate" :cpf "000.111.222-33" :email "feiticeira.poderosa@vingadoras.com.br"})) + + + + + +(println "\n\n ---------- criando a funcao insere-cliente! ----------") + +(defn insere-cliente! + [lista-clientes novo-cliente] + (swap! lista-clientes insere-cliente novo-cliente) + ) + +(let [novo-cliente (map->Clientes {:nome "Capitao America" :cpf "770.111.222-33" :email "capitao.america@vingadores.com.br"})] + (pprint (insere-cliente! repositorio-de-clientes novo-cliente))) + +(let [novo-cliente (map->Clientes {:nome "Homem de Ferro" :cpf "888.111.222-33" :email "capitao.america@vingadores.com.br"})] + (pprint (insere-cliente! repositorio-de-clientes novo-cliente))) + + + + + +(println "\n\n ---------- repositorio-de-cliente ----------") +(pprint @repositorio-de-clientes) + + + + + +(println "\n\n ---------- criando a funcao lista-clientes! ----------") + +(defn lista-clientes! + [repositorio-de-clientes] + (println @repositorio-de-clientes)) + +(lista-compras! repositorio-de-clientes) + + + + + +(println "\n\n ---------- pesquisar-cliente-por-id ----------") + +(defn pesquisa-cliente-por-id + [repositorio-de-clientes id ] + (first (filter #(= id (get % :ID)) repositorio-de-clientes))) + +(pprint (pesquisa-cliente-por-id @repositorio-de-clientes 5)) +(pprint (pesquisa-cliente-por-id @repositorio-de-clientes 1)) + + + + + +(println "\n\n ---------- pesquisar-compra-por-id! ----------") +(defn pesquisa-cliente-por-id! + [repositorio-de-clientes id] + (pesquisa-cliente-por-id @repositorio-de-clientes id)) + +(pprint (pesquisa-cliente-por-id! repositorio-de-clientes 5)) ; nil +(pprint (pesquisa-cliente-por-id! repositorio-de-clientes 2)) + + + + + +(println "\n\n ---------- exclui-cliente ----------") + +(defn exclui-cliente + [repositorio-de-clientes id] + + ; codigo para remover ‘item’ do vetor + (let [cliente-a-excluir (pesquisa-cliente-por-id repositorio-de-clientes id) + nova-lista (remove #{cliente-a-excluir} repositorio-de-clientes)] + + ; vec cria novo vector + (vec nova-lista) + )) + +(pprint (exclui-cliente [{:ID 1 :nome "Capitao America" :cpf "770.111.222-33" :email "capitao.america@vingadores.com.br"} + {:ID 2 :nome "Homem de Ferro" :cpf "888.111.222-33" :email "capitao.america@vingadores.com.br"}] 1)) + + + + + +(println "\n\n ---------- exclui-cliente! ----------") + +(defn exclui-cliente! + [repositorio-de-clientes id] + (swap! repositorio-de-clientes exclui-cliente id) + ) + + +(pprint (exclui-cliente! repositorio-de-clientes 1)) +;(pprint @repositorio-de-compras) diff --git a/src/yes_she_codes/semana2/compras.clj b/src/yes_she_codes/semana2/compras.clj new file mode 100644 index 0000000..9bc9b27 --- /dev/null +++ b/src/yes_she_codes/semana2/compras.clj @@ -0,0 +1,139 @@ +(ns yes-she-codes.semana2.compras + (:require [yes-she-codes.semana2.logic :as y.s2.logic]) + (:use [clojure pprint])) + + + + + +(println "\n\n ---------- criando um atom ----------") +(def repositorio-de-compras (atom [])) + +(println repositorio-de-compras) ; #object[clojure.lang.Atom 0x17161f91 {:status :ready, :val []}] +(pprint repositorio-de-compras) ; # +(pprint @repositorio-de-compras) ; [] -> acessando o valor dentro do atomo + + + + + +(println "\n\n ---------- criando um record ----------") + +(defrecord Compras [^Long ID, ^String Data, ^BigDecimal Valor, ^String Estabelecimento, ^String Categoria, ^Long Cartao]) + +(pprint (Compras. 2 "18/05/2022" 10 "Araujo" "Saude" 1111222233334444)) + +; printando Compras sem o id +(pprint (map->Compras {:Data "18/05/2022" :Valor 10 :Estabelecimento "Araujo" :Categoria "Saude" :Cartao 1111222233334444})) + + + + + +(println "\n\n ---------- criando a funcao insere-compra ----------") + +(defn insere-compra + [lista-compras nova-compra] + + (let [id (y.s2.logic/proximo-id lista-compras) + id-compra-a-inserir (assoc nova-compra :ID id)] + (conj lista-compras id-compra-a-inserir)) + ) + +(pprint (insere-compra {} {:Data "18/05/2022" :Valor 10 :Estabelecimento "Araujo" :Categoria "Saude" :Cartao 1111222233334444})) + + + + + +(println "\n\n ---------- criando a funcao insere-compra! ----------") + +(defn insere-compra! + [lista-compras nova-compra] + (swap! lista-compras insere-compra nova-compra) + ) + +(let [nova-compra (map->Compras {:Data "18/05/2022" :Valor 10 :Estabelecimento "Araujo" :Categoria "Saude" :Cartao 1111222233334444})] + (pprint (insere-compra! repositorio-de-compras nova-compra))) + +(let [nova-compra (map->Compras {:Data "19/05/2022" :Valor 20 :Estabelecimento "Nucleo Artistico" :Categoria "Lazer" :Cartao 4444333322221111})] + (pprint (insere-compra! repositorio-de-compras nova-compra))) + + + + + +(println "\n\n ---------- repositorio-de-compras ----------") +(pprint @repositorio-de-compras) + + + + + +(println "\n\n ---------- criando a funcao lista-compras! ----------") + +(defn lista-compras! + [repositorio-de-compras] + (println @repositorio-de-compras)) + +(lista-compras! repositorio-de-compras) + + + + + +(println "\n\n ---------- pesquisar-compra-por-id ----------") + +(defn pesquisa-compra-por-id + [repositorio-de-compras id ] + (first (filter #(= id (get % :ID)) repositorio-de-compras))) + +(pprint (pesquisa-compra-por-id @repositorio-de-compras 5)) +(pprint (pesquisa-compra-por-id @repositorio-de-compras 1)) + + + + + +(println "\n\n ---------- pesquisar-compra-por-id! ----------") +(defn pesquisa-compra-por-id! + [repositorio-de-compras id] + (pesquisa-compra-por-id @repositorio-de-compras id)) + +(pprint (pesquisa-compra-por-id! repositorio-de-compras 5)) +(pprint (pesquisa-compra-por-id! repositorio-de-compras 2)) + + + + + +(println "\n\n ---------- exclui-compra ----------") + +(defn exclui-compra + [repositorio-de-compras id] + + ; codigo para remover ‘item’ do vetor + (let [compra-a-excluir (pesquisa-compra-por-id repositorio-de-compras id) + nova-lista (remove #{compra-a-excluir} repositorio-de-compras)] + + ; vec cria novo vector + (vec nova-lista) + )) + +(pprint (exclui-compra [{:ID 1 :Data "18/05/2022" :Valor 10 :Estabelecimento "Araujo" :Categoria "Saude" :Cartao 1111222233334444} + {:ID 2 :Data "19/05/2022" :Valor 10 :Estabelecimento "Nucleo Artistico" :Categoria "Lazer" :Cartao 1111222233334444}] 1)) + + + + + +(println "\n\n ---------- exclui-compra! ----------") + +(defn exclui-compra! + [repositorio-de-compras id] + (swap! repositorio-de-compras exclui-compra id) + ) + + +(pprint (exclui-compra! repositorio-de-compras 1)) +;(pprint @repositorio-de-compras) diff --git a/src/yes_she_codes/semana2/core.clj b/src/yes_she_codes/semana2/core.clj new file mode 100644 index 0000000..7d3583c --- /dev/null +++ b/src/yes_she_codes/semana2/core.clj @@ -0,0 +1 @@ +(ns yes-she-codes.semana2.core) \ No newline at end of file diff --git a/src/yes_she_codes/semana2/db.clj b/src/yes_she_codes/semana2/db.clj new file mode 100644 index 0000000..b8823af --- /dev/null +++ b/src/yes_she_codes/semana2/db.clj @@ -0,0 +1,46 @@ +(ns yes-she-codes.semana2.db) + +(def clientes [{:nome "Feiticeira Escarlate" :cpf "000.111.222-33" :email "feiticeira.poderosa@vingadoras.com.br"} + {:nome "Viúva Negra" :cpf "333.444.555-66" :email "viuva.casca.grossa@vingadoras.com.br"} + {:nome "Hermione Granger" :cpf "666.777.888-99" :email "hermione.salvadora@hogwarts.com"} + {:nome "Daenerys Targaryen" :cpf "999.123.456-78" :email "mae.dos.dragoes@got.com"}]) + +(def cartoes [{:numero "1234 1234 1234 1234" :cvv 111 :validade "2023-01" :limite 1.000 :cliente "000.111.222-33"} + {:numero "4321 4321 4321 4321" :cvv 222 :validade "2024-02" :limite 2.000 :cliente "333.444.555-66"} + {:numero "1598 1598 1598 1598" :cvv 333 :validade "2021-03" :limite 3.000 :cliente "666.777.888-99"} + {:numero "3939 3939 3939 3939" :cvv 555 :validade "2026-05" :limite 5.000 :cliente "999.123.456-78"}]) + +(def compras [{:id 0 :data "2022-01-01" :valor 129.90 :estabelecimento "Outback" :categoria "Alimentação" :cartao "1234 1234 1234 1234" } + {:id 1 :data "2022-01-02" :valor 260.00 :estabelecimento "Dentista" :categoria "Saúde" :cartao "1234 1234 1234 1234"} + {:id 2 :data "2022-02-01" :valor 20.00 :estabelecimento "Cinema" :categoria "Lazer" :cartao "1234 1234 1234 1234"} + {:id 3 :data "2022-01-10" :valor 150.00 :estabelecimento "Show" :categoria "Lazer" :cartao "4321 4321 4321 4321"} + {:id 4 :data "2022-02-10" :valor 289.99 :estabelecimento "Posto de gasolina" :categoria "Automóvel" :cartao "4321 4321 4321 4321"} + {:id 5 :data "2022-02-20" :valor 79.90 :estabelecimento "iFood" :categoria "Alimentação" :cartao "4321 4321 4321 4321"} + {:id 6 :data "2022-03-01" :valor 85.00 :estabelecimento "Alura" :categoria "Educação" :cartao "4321 4321 4321 4321"} + {:id 7 :data "2022-01-30" :valor 85.00 :estabelecimento "Alura" :categoria "Educação" :cartao "1598 1598 1598 1598"} + {:id 8 :data "2022-01-31" :valor 350.00 :estabelecimento "Tok&Stok" :categoria "Casa" :cartao "1598 1598 1598 1598"} + {:id 9 :data "2022-02-01" :valor 400.00 :estabelecimento "Leroy Merlin" :categoria "Casa" :cartao "1598 1598 1598 1598"} + {:id 10 :data "2022-03-01" :valor 50.00 :estabelecimento "Madero" :categoria "Alimentação" :cartao "6655 6655 6655 6655"} + {:id 11 :data "2022-03-01" :valor 70.00 :estabelecimento "Teatro" :categoria "Lazer" :cartao "6655 6655 6655 6655"} + {:id 12 :data "2022-03-04" :valor 250.00 :estabelecimento "Hospital" :categoria "Saúde" :cartao "6655 6655 6655 6655"} + {:id 13 :data "2022-04-10" :valor 130.00 :estabelecimento "Drogaria" :categoria "Saúde" :cartao "6655 6655 6655 6655"} + {:id 14 :data "2022-03-10" :valor 100.00 :estabelecimento "Show de pagode" :categoria "Lazer" :cartao "3939 3939 3939 3939"} + {:id 15 :data "2022-03-11" :valor 25.90 :estabelecimento "Dogão" :categoria "Alimentação" :cartao "3939 3939 3939 3939"} + {:id 16 :data "2022-03-12" :valor 215.87 :estabelecimento "Praia" :categoria "Lazer" :cartao "3939 3939 3939 3939"} + {:id 17 :data "2022-04-01" :valor 976.88 :estabelecimento "Oficina" :categoria "Automóvel" :cartao "3939 3939 3939 3939"} + {:id 18 :data "2022-04-10" :valor 85.00 :estabelecimento "Alura" :categoria "Educação" :cartao "3939 3939 3939 3939"}]) + + +(defn todos-clientes + [] + clientes) + + +(defn todos-cartoes + [] + cartoes) + + +(defn todas-compras + [] + compras) \ No newline at end of file diff --git a/src/yes_she_codes/semana2/logic.clj b/src/yes_she_codes/semana2/logic.clj new file mode 100644 index 0000000..30352f3 --- /dev/null +++ b/src/yes_she_codes/semana2/logic.clj @@ -0,0 +1,10 @@ +(ns yes-she-codes.semana2.logic + (:use [clojure pprint])) + +(defn proximo-id [entidades] + (if-not (empty? entidades) + (+ 1 (apply max (map :ID entidades))) + 1)) + +;(pprint (proximo-id [{:ID 1 :Data "18/05/2022" :Valor 10 :Estabelecimento "Araujo" :Categoria "Saude" :Cartao 1111222233334444} +; {:ID 2 :Data "19/05/2022" :Valor 10 :Estabelecimento "Nucleo Artistico" :Categoria "Lazer" :Cartao 1111222233334444}])) \ No newline at end of file diff --git a/src/yes_she_codes/semana3/cartoes.clj b/src/yes_she_codes/semana3/cartoes.clj new file mode 100644 index 0000000..8f1cff2 --- /dev/null +++ b/src/yes_she_codes/semana3/cartoes.clj @@ -0,0 +1,42 @@ +(ns yes-she-codes.semana3.cartoes + (:require [schema.core :as s] + [yes-she-codes.semana3.logic :as y.3.logic]) + (:use [clojure pprint]) + ) + + + +(s/set-fn-validation! true) + + + +; ---------- CARD SCHEMA ---------- +(def CartaoSchema + "Schema de um cartao" + {:numero y.3.logic/IntBetween0And, ; inteiro entre 0 e 1 0000 0000 0000 0000 OK + :cvv y.3.logic/IntBetween0And999, ; inteiro entre 0 e 999 OK + :validade y.3.logic/DateFormatString, ; se estiver usando String, deve ter o formato "yyyy-mm" OK + :limite y.3.logic/BigDecimalBiggerEqual0, ; BigDecimal maior ou igual a zero OK + :cliente y.3.logic/CpfFormatStr ; String com o formato 000.000.000-00. + }) + + + +; ---------- NEW CARD FUNCTION ---------- +(s/defn novo-cartao :- CartaoSchema ; funcao retorna um novo cartao + [numero :- y.3.logic/IntBetween0And + cvv :- y.3.logic/IntBetween0And999 + validade :- y.3.logic/DateFormatString + limite :- y.3.logic/BigDecimalBiggerEqual0 + cliente :- y.3.logic/CpfFormatStr + ] + {:numero numero, :cvv cvv, :validade validade, :limite limite, :cliente cliente} + ) + + + +(pprint (novo-cartao 1000000000000000, 999, "2019-02", 1.0, "115.314.506-52")) +;(pprint (novo-cartao 1000000000000000, 1000, "x", "x", "x")) ; da erro por causa do cvv +;(pprint (novo-cartao 1000000000000000, 999, "2019-02-03", "x", "x")) ; da erro por causa da data +;(pprint (novo-cartao 1000000000000000, 999, "2019-02", -1.0, "x")) ; da erro por causa do limite +;(pprint (novo-cartao 1000000000000000, 999, "2019-02", 1.0, "11531450652")); da erro por causa do cpf diff --git a/src/yes_she_codes/semana3/clientes.clj b/src/yes_she_codes/semana3/clientes.clj new file mode 100644 index 0000000..f343457 --- /dev/null +++ b/src/yes_she_codes/semana3/clientes.clj @@ -0,0 +1,37 @@ +(ns yes-she-codes.semana3.clientes + (:require [schema.core :as s] + [yes-she-codes.semana3.logic :as y.3.logic]) + (:use [clojure pprint]) + ) + + + +(s/set-fn-validation! true) + + + +; ---------- CLIENT SCHEMA ---------- +(def ClienteSchema ; o schema é um mapa com as validacoes de nome, cpf e email + "Schema de um cliente" + {:nome y.3.logic/MinDoisCaracteresStr, ; pelo menos 2 caracteres OK + :cpf y.3.logic/CpfFormatStr, ; string com o formato 000.000.000-00 OK + :email y.3.logic/EmailFormatStr ; email válido OK + }) + + + +; ---------- NEW CLIENT FUNCTION ---------- +(s/defn novo-cliente :- ClienteSchema ; funcao retorna um novo cliente + [nome :- y.3.logic/MinDoisCaracteresStr + cpf :- y.3.logic/CpfFormatStr + email :- y.3.logic/EmailFormatStr] + {:nome nome, :cpf cpf, :email email} + ) + + + +(pprint (novo-cliente "Li", "115.314.506-52", "mguimaraes@gmail.com.br")) +;(pprint (novo-cliente "L", "115.314.506-52", "mguimaraes@gmail.com")) ; nome da erro +;(pprint (novo-cliente "Li", "11531450652", "mguimaraes@gmail.com")) ; cpf da erro +;(pprint (novo-cliente "Li", "115.314.506-52", "mguimaraes@gmail")) ; email da erro + diff --git a/src/yes_she_codes/semana3/compras.clj b/src/yes_she_codes/semana3/compras.clj new file mode 100644 index 0000000..5612326 --- /dev/null +++ b/src/yes_she_codes/semana3/compras.clj @@ -0,0 +1,44 @@ +(ns yes-she-codes.semana3.compras + (:require [schema.core :as s] + [yes-she-codes.semana3.logic :as y.3.logic]) + (:use [clojure pprint]) + ) + + + +(s/set-fn-validation! true) + + + +; ---------- COMPRA SCHEMA ---------- +(def CompraSchema + "Schema de uma compra" + {:data y.3.logic/DateDayFormatString, ; Se você estiver usando a data como String, então ela deve ter o formato yyyy-mm-dd; + :valor y.3.logic/BigDecimalBiggerEqual0, ; deve ser um BigDecimal positivo + :estabelecimento y.3.logic/MinDoisCaracteresStr, ; Deve ter pelo menos 2 caracteres + :categoria y.3.logic/MatchCategory, ; Deve ser uma das opções: Alimentação, Automóvel, Casa, Educação, Lazer ou Saúde. + :cartao y.3.logic/IntBetween0And, ; inteiro entre 0 e 1 0000 0000 0000 0000. + } + ) + + + +; ---------- NEW COMPRA FUNCTION ---------- +(s/defn nova-compra :- CompraSchema ; funcao retorna uma nova compra + [data :- y.3.logic/DateDayFormatString + valor :- y.3.logic/BigDecimalBiggerEqual0 + estabelecimento :- y.3.logic/MinDoisCaracteresStr + categoria :- y.3.logic/MatchCategory + cartao :- y.3.logic/IntBetween0And + ] + {:data data, :valor valor, :estabelecimento estabelecimento, :categoria categoria, :cartao cartao} + ) + + + +(pprint (nova-compra "2012-02-01", 3.0, "Araujo", "Alimentação", 1000)) +;(pprint (nova-compra "2012-02-03", "x", "x", "x", "x")) ; da erro por causa da data +;(pprint (nova-compra "2012-02", -3.0, "x", "x", "x")) ; da erro por causa do valor +;(pprint (nova-compra "2012-02", 3.0, "A", "x", "x")) ; da erro por causa do estabelecimento com menos de 2 caracteres +;(pprint (nova-compra "2012-02", 3.0, "Araujo", "x", 1000)) ; da erro por causa da categoria +;(pprint (nova-compra "2012-02", 3.0, "Araujo", "x", 10000000000000000)) ; da erro por causa do cartao \ No newline at end of file diff --git a/src/yes_she_codes/semana3/core.clj b/src/yes_she_codes/semana3/core.clj new file mode 100644 index 0000000..26a0a4c --- /dev/null +++ b/src/yes_she_codes/semana3/core.clj @@ -0,0 +1 @@ +(ns yes-she-codes.semana3.core) \ No newline at end of file diff --git a/src/yes_she_codes/semana3/logic.clj b/src/yes_she_codes/semana3/logic.clj new file mode 100644 index 0000000..220c3b3 --- /dev/null +++ b/src/yes_she_codes/semana3/logic.clj @@ -0,0 +1,95 @@ +(ns yes-she-codes.semana3.logic + (:require [schema.core :as s]) + (:use [clojure pprint]) + ) + + + +; ---------- MIN 2 CARACTERES ---------- +(defn min-2-caracteres? + [x] + (>= (count x) 2)) + +(def MinDoisCaracteresStr (s/constrained s/Str min-2-caracteres? 'MinDoisCaracteres?)) + + + +; ---------- CPF STRING FORMAT ---------- +(defn cpf-format? + [x] + (re-matches #"[0-9]{3}\.[0-9]{3}\.[0-9]{3}\-[0-9]{2}" x)) + +(def CpfFormatStr (s/constrained s/Str cpf-format? 'CpfFormatStr)) +;(pprint (cpf-format? "115.314.506-52")) +;(pprint (cpf-format? "11531450652")) + + + +; ---------- EMAIL STRING FORMAT ---------- +(defn email-format? + [x] + (re-matches #"^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+).*" x)) + +(def EmailFormatStr (s/constrained s/Str email-format? 'EmailFormatStr)) + + + +; ---------- INT BETWEEN 0 AND 1 0000 0000 0000 0000 ---------- +(defn int-between-0-and-? + [x] + (and (> x 0) (< x 10000000000000000))) + +(def IntBetween0And (s/constrained s/Int int-between-0-and-? 'IntBetween0And)) +;(pprint (int-between-0-and-? 1000000000000000)) + + + +; ---------- INT BETWEEN 0 AND 999 ---------- +(defn int-between-0-and-999? + [x] + (and (> x 0) (<= x 999))) + +(def IntBetween0And999 (s/constrained s/Int int-between-0-and-999? 'IntBetween0And999)) +;(pprint (int-between-0-and-999? 998)) + + + +; ---------- DATE FORMAT STRING ---------- +(defn date-format-string? + [x] + (re-matches #"\d{4}-\d{2}" x)) + +(def DateFormatString (s/constrained s/Str date-format-string? 'DateFormatString)) +;(pprint (date-format-string? "2012-02")) + + + +; ---------- DATE FORMAT STRING ---------- +(defn date-day-format-string? + [x] + (re-matches #"\d{4}-\d{2}-\d{2}" x)) + +(def DateDayFormatString (s/constrained s/Str date-day-format-string? 'DateDayFormatString?)) +;(pprint (date-day-format-string? "2012-02-01")) + + + +; ---------- BIGDECIMAL >= 0 ---------- +(defn big-decimal-bigger-or-equal-0? + [x] + (>= x 0)) + +(def BigDecimalBiggerEqual0 (s/pred big-decimal-bigger-or-equal-0? 'DateFormatString)) +;(pprint (big-decimal-bigger-or-equal-0? 1.0)) + + + +; ---------- CATEGORIA --------- +;Alimentação, Automóvel, Casa, Educação, Lazer ou Saúde +(defn match-category? + [x] + (clojure.string/includes? "Alimentação, Automóvel, Casa, Educação, Lazer, Saúde" x) + ) + +(def MatchCategory (s/pred match-category? 'MatchCategory)) +;(pprint (match-category? "lala")) diff --git a/src/yes_she_codes/semana4/core.clj b/src/yes_she_codes/semana4/core.clj new file mode 100644 index 0000000..87e446d --- /dev/null +++ b/src/yes_she_codes/semana4/core.clj @@ -0,0 +1,32 @@ +(ns yes-she-codes.semana4.core + (:use clojure.pprint) + (:require [datomic.api :as d] + [yes-she-codes.semana4.db :as db] + [yes-she-codes.semana4.model :as model])) + + +; criando conexao com o banco +(def conn (db/cria-conexao)) +(pprint conn) + + +; mas antes de transacionarmos a compra, temos que transacionar o schema +(db/cria-schema conn) + +(db/salva-compra! conn (model/nova-compra "02-06-2022" 150.2M "Nucleo Artistico" "Lazer" 1111222233334444)) + +(db/carrega-compras-no-banco! conn) + +;(db/apaga-banco) + +; nova snashot do banco +(def db-snapshot (d/db conn)) + +(pprint (db/lista-compras! db-snapshot)) + + + + + + + diff --git a/src/yes_she_codes/semana4/db.clj b/src/yes_she_codes/semana4/db.clj new file mode 100644 index 0000000..e423177 --- /dev/null +++ b/src/yes_she_codes/semana4/db.clj @@ -0,0 +1,83 @@ +(ns yes-she-codes.semana4.db + (:use clojure.pprint) + (:require [datomic.api :as d] + [yes-she-codes.semana4.logic :as logic] + [yes-she-codes.semana4.model :as model])) + + +(def db-uri "datomic:dev://localhost:4334/she-codes") + +(defn cria-conexao + [] + (d/create-database db-uri) ; criando o banco -> retorna true + (d/connect db-uri) ; conectando no banco + ) +;(pprint cria-conexao) + + +; defininco o schema + (def schema-datomic + [{:db/ident :compra/data + :db/doc "A data de uma compra" + :db/valueType :db.type/string + :db/cardinality :db.cardinality/one ; cardinality esta definindo que so podemos ter UMA :data + } + { + :db/ident :compra/valor + :db/doc "O valor de uma compra" + :db/valueType :db.type/bigdec + :db/cardinality :db.cardinality/one ; cardinality esta definindo que so podemos ter UM :valor + } + {:db/ident :compra/estabelecimento + :db/doc "O estabelecimento em que a compra foi feita" + :db/valueType :db.type/string + :db/cardinality :db.cardinality/one ; cardinality esta definindo que so podemos ter UM :estabelecimento + } + {:db/ident :compra/categoria + :db/doc "A categoria da compra" + :db/valueType :db.type/string + :db/cardinality :db.cardinality/one ; cardinality esta definindo que so podemos ter UMA :categoria + } + {:db/ident :compra/cartao + :db/doc "O cartao com que a compra foi feita" + :db/valueType :db.type/long + :db/cardinality :db.cardinality/one ; cardinality esta definindo que so podemos ter UM :cartao + } + ] + ) + + +(defn cria-schema + [conn] + (d/transact conn schema-datomic)) + + +(defn salva-compra! + [conn compra] + @(d/transact conn [compra])) + + +(defn carrega-compras-no-banco! + [conn] + (let [lista-compras (logic/processa-csv "src/yes_she_codes/semana1/csv/compras.csv" (fn [[data valor estabelecimento categoria cartao]] + (model/nova-compra data valor estabelecimento categoria cartao)))] + (doseq [compra lista-compras] (salva-compra! conn compra)) + )) + +(defn lista-compras! + [conn] + (d/q '[:find ?entidade + :where [?entidade :compra/cartao]] conn)) + + +(defn apaga-banco + [] + (d/delete-database db-uri) ; deletando db -> retorna true + ) + + +;(defn lista-compras-por-cartao! +; [conn cartao] +; ; operacoes +; ) + diff --git a/src/yes_she_codes/semana4/logic.clj b/src/yes_she_codes/semana4/logic.clj new file mode 100644 index 0000000..592baef --- /dev/null +++ b/src/yes_she_codes/semana4/logic.clj @@ -0,0 +1,13 @@ +(ns yes-she-codes.semana4.logic + (:require [clojure.string :as str])) + + +;(println "\n\n ---------------- csv reader ---------------- ") + +(defn processa-csv [arquivo mapeamento] + (->> (slurp arquivo) + str/split-lines + rest + (map #(str/split % #",")) + (mapv mapeamento) + )) \ No newline at end of file diff --git a/src/yes_she_codes/semana4/model.clj b/src/yes_she_codes/semana4/model.clj new file mode 100644 index 0000000..c7b8680 --- /dev/null +++ b/src/yes_she_codes/semana4/model.clj @@ -0,0 +1,14 @@ +(ns yes-she-codes.semana4.model + (:use clojure.pprint)) + +(defn str->long [valor] + (Long/parseLong (clojure.string/replace valor #" " ""))) + +(defn nova-compra [data valor estabelecimento categoria cartao] + {:compra/data data + :compra/valor (bigdec valor) + :compra/estabelecimento estabelecimento + :compra/categoria categoria + :compra/cartao (str->long cartao)}) + + diff --git a/test/yes_she_codes/semana3/cartoes_test.clj b/test/yes_she_codes/semana3/cartoes_test.clj new file mode 100644 index 0000000..d54633e --- /dev/null +++ b/test/yes_she_codes/semana3/cartoes_test.clj @@ -0,0 +1,77 @@ +(ns yes-she-codes.semana3.cartoes_test + (:require [clojure.test :refer :all] + [schema.core :as s] + [yes-she-codes.semana3.cartoes :refer :all]) + (:import (clojure.lang ExceptionInfo)) + ) + + + + (deftest cartao-schema-test + (testing "Testa criar cartao com valores especificos" + (let [cartao-test {:numero 4321432143214321 + :cvv 222 + :validade "2024-02" + :limite 2.000 + :cliente "333.444.555-66"}] + (is (= (s/validate CartaoSchema cartao-test) + cartao-test)) + )) + + + + + (testing "Cartao com numero negativo" + (let [cartao-test-invalido {:numero -4321432143214321 + :cvv 222 + :validade "2024-02" + :limite 2.000 + :cliente "333.444.555-66"}] + (is (thrown? ExceptionInfo + (s/validate CartaoSchema cartao-test-invalido) + cartao-test-invalido)) + )) + + + + + (testing "Cartao com cvv maior que 999" + (let [cartao-test-invalido {:numero 4321432143214321 + :cvv 1000 + :validade "2024-02" + :limite 2.000 + :cliente "333.444.555-66"}] + (is (thrown? ExceptionInfo + (s/validate CartaoSchema cartao-test-invalido) + cartao-test-invalido)) + )) + + + + + (testing "Cartao com limite negativo" + (let [cartao-test-invalido {:numero 4321432143214321 + :cvv 999 + :validade "2024-02" + :limite -2.000 + :cliente "333.444.555-66"}] + (is (thrown? ExceptionInfo + (s/validate CartaoSchema cartao-test-invalido) + cartao-test-invalido)) + )) + + + + + (testing "Cartao com cpf no formato invalido" + (let [cartao-test-invalido {:numero 4321432143214321 + :cvv 999 + :validade "2024-02" + :limite 2.000 + :cliente "33344455566"}] + (is (thrown? ExceptionInfo + (s/validate CartaoSchema cartao-test-invalido) + cartao-test-invalido)) + )) + + ) \ No newline at end of file diff --git a/test/yes_she_codes/semana3/clientes_test.clj b/test/yes_she_codes/semana3/clientes_test.clj new file mode 100644 index 0000000..11a26e2 --- /dev/null +++ b/test/yes_she_codes/semana3/clientes_test.clj @@ -0,0 +1,64 @@ +(ns yes-she-codes.semana3.clientes_test + (:require [clojure.test :refer :all] + [schema.core :as s] + [yes-she-codes.semana3.clientes :refer :all]) + (:import (clojure.lang ExceptionInfo))) + + +(deftest cliente-schema-test + + + + + + (testing "Testa criar cliente com valores especificos" + (let [cliente-test {:nome "Viúva Negra", + :cpf "333.444.555-66", + :email"viuva.casca.grossa@vingadoras.com.br"}] + (is (= (s/validate ClienteSchema cliente-test) + cliente-test)) + )) + + + + + (testing "Testando cliente com nome nil" + (let [cliente-test-invalido {:nome nil, + :cpf "333.444.555-66", + :email"viuva.casca.grossa@vingadoras.com.br"}] + (is (thrown? ExceptionInfo + (s/validate ClienteSchema cliente-test-invalido) + cliente-test-invalido)) + )) + + + + + (testing "Testando cliente com cpf com formato invalido" + (let [cliente-test-invalido {:nome "Viúva Negra", + :cpf "33344455566", + :email"viuva.casca.grossa@vingadoras.com.br"}] + (is (thrown? ExceptionInfo + (s/validate ClienteSchema cliente-test-invalido) + cliente-test-invalido)) + )) + + + + + (testing "Testando cliente com email invalido" + (let [cliente-test-invalido {:nome "Viúva Negra", + :cpf "333.444.555-66", + :email"viuva.casca.grossavingadoras.com.br"}] + (is (thrown? ExceptionInfo + (s/validate ClienteSchema cliente-test-invalido) + cliente-test-invalido)) + )) + + + ) + + + + + diff --git a/test/yes_she_codes/semana3/compras_test.clj b/test/yes_she_codes/semana3/compras_test.clj new file mode 100644 index 0000000..bcd558d --- /dev/null +++ b/test/yes_she_codes/semana3/compras_test.clj @@ -0,0 +1,93 @@ +(ns yes-she-codes.semana3.compras_test + (:require [clojure.test :refer :all] + [schema.core :as s] + [yes-she-codes.semana3.compras :refer :all]) + (:import (clojure.lang ExceptionInfo))) + + + +(deftest compra-schema-test + (testing "Testa criar compra com valores especificos" + (let [compra-test {:data "2022-05-01", + :valor 100M, + :estabelecimento "Amazon", + :categoria "Casa", + :cartao 1000}] + (is (= (s/validate CompraSchema compra-test) + compra-test)) + )) + + + + + (testing "Testando compra com data invalida" + (let [compra-test-invalido {:data "2022-05", + :valor 100M, + :estabelecimento "Amazon", + :categoria "Casa", + :cartao 1000}] + (is (thrown? ExceptionInfo + (s/validate CompraSchema compra-test-invalido) + compra-test-invalido)) + )) + + + + + (testing "Testando compra com valor negativo" + (let [compra-test-invalido {:data "2022-05-02", + :valor -100M, + :estabelecimento "Amazon", + :categoria "Casa", + :cartao 1000}] + (is (thrown? ExceptionInfo + (s/validate CompraSchema compra-test-invalido) + compra-test-invalido)) + )) + + + + (testing "Testando compra com estabelecimento com string vazia" + (let [compra-test-invalido {:data "2022-05-02", + :valor 100M, + :estabelecimento "", + :categoria "Casa", + :cartao 1000}] + (is (thrown? ExceptionInfo + (s/validate CompraSchema compra-test-invalido) + compra-test-invalido)) + )) + + + + (testing "Testando compra com categoria invalida (inexistente)" + (let [compra-test-invalido {:data "2022-05-02", + :valor 100M, + :estabelecimento "Amazon", + :categoria "Nucleo", + :cartao 1000}] + (is (thrown? ExceptionInfo + (s/validate CompraSchema compra-test-invalido) + compra-test-invalido)) + )) + + + + + (testing "Testando compra com cartao invalido" + (let [compra-test-invalido {:data "2022-05-02", + :valor 100M, + :estabelecimento "Amazon", + :categoria "Casa", + :cartao 0}] + (is (thrown? ExceptionInfo + (s/validate CompraSchema compra-test-invalido) + compra-test-invalido)) + )) + + + ) + + + + diff --git a/test/yes_she_codes/core_test.clj b/test/yes_she_codes/semana3/core_test.clj similarity index 100% rename from test/yes_she_codes/core_test.clj rename to test/yes_she_codes/semana3/core_test.clj diff --git a/yes-she-codes.iml b/yes-she-codes.iml index 254bfec..bc80a7f 100644 --- a/yes-she-codes.iml +++ b/yes-she-codes.iml @@ -1,5 +1,9 @@ + + @@ -13,10 +17,14 @@ + + - - - + + + + + \ No newline at end of file