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