diff --git a/dados.sql b/dados.sql
index 3097ea8d..0cc4d52a 100644
--- a/dados.sql
+++ b/dados.sql
@@ -3,6 +3,27 @@
-- Área por estado: https://pt.wikipedia.org/wiki/Lista_de_unidades_federativas_do_Brasil_por_área
-- População por estado (prévio censo 2022): https://pt.wikipedia.org/wiki/Lista_de_unidades_federativas_do_Brasil_por_população
+drop table if exists transacao;
+
+create table transacao(
+ id serial not null primary key,
+ cliente varchar(120) not null,
+ valor decimal(10, 2) not null,
+ moeda varchar(3) not null,
+ tipo char not null
+);
+
+
+drop table if exists aluno;
+
+create table aluno (
+ matricula serial not null primary key,
+ nome varchar(120) not null,
+ nota1 decimal(10, 2),
+ nota2 decimal(10, 2),
+ nota3 decimal(10, 2)
+);
+
drop table if exists item_venda;
drop table if exists venda;
diff --git a/gerar-dados/package.json b/gerar-dados/package.json
index c2d51d5c..c9ff1fb3 100644
--- a/gerar-dados/package.json
+++ b/gerar-dados/package.json
@@ -4,7 +4,7 @@
"description": "Gerador de dados aleatórios usando https://fakerjs.dev",
"main": "index.js",
"scripts": {
- "start": "node index.js"
+ "start": "node index.js > random.sql && echo 'Veja o resultado no arquivo random.sql'"
},
"keywords": [],
"author": "Manoel Campos da Silva Filho",
diff --git a/pom.xml b/pom.xml
index 25e313c4..5f407233 100644
--- a/pom.xml
+++ b/pom.xml
@@ -13,7 +13,7 @@
UTF-8
- 11
+ 17
${java.version}
${java.version}
${java.version}
@@ -31,32 +31,20 @@
-
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ 2.15.2
+
org.postgresql
postgresql
- 42.6.0
+ 42.7.4
-
-
-
-
-
- org.junit.jupiter
- junit-jupiter-api
- ${junit}
- test
-
-
- org.junit.jupiter
- junit-jupiter-engine
- ${junit}
- test
-
org.junit.jupiter
- junit-jupiter-params
+ junit-jupiter
${junit}
test
@@ -110,4 +98,4 @@
-
\ No newline at end of file
+
diff --git a/src/main/java/com/example/App.java b/src/main/java/com/example/App.java
index 9407ea49..fdb02caa 100644
--- a/src/main/java/com/example/App.java
+++ b/src/main/java/com/example/App.java
@@ -35,13 +35,13 @@ private void listarDadosTabela(Connection conn, String tabela) {
int cols = metadata.getColumnCount();
for (int i = 1; i <= cols; i++) {
- System.out.printf("%-25s | ", metadata.getColumnName(i));
+ System.out.printf("%-30s | ", metadata.getColumnName(i));
}
System.out.println();
while(result.next()){
for (int i = 1; i <= cols; i++) {
- System.out.printf("%-25s | ", result.getString(i));
+ System.out.printf("%-30s | ", result.getString(i));
}
System.out.println();
}
@@ -60,7 +60,7 @@ private void localizarEstado(Connection conn, String uf) {
statement.setString(1, uf);
var result = statement.executeQuery();
if(result.next()){
- System.out.printf("Id: %d Nome: %s UF: %s\n", result.getInt("id"), result.getString("nome"), result.getString("uf"));
+ System.out.printf("Id: %2d Nome: %-30s UF: %s\n", result.getInt("id"), result.getString("nome"), result.getString("uf"));
}
System.out.println();
} catch(SQLException e){
@@ -76,7 +76,7 @@ private void listarEstados(Connection conn) {
var statement = conn.createStatement();
var result = statement.executeQuery("select * from estado");
while(result.next()){
- System.out.printf("Id: %d Nome: %s UF: %s\n", result.getInt("id"), result.getString("nome"), result.getString("uf"));
+ System.out.printf("Id: %2d Nome: %-30s UF: %s\n", result.getInt("id"), result.getString("nome"), result.getString("uf"));
}
System.out.println();
} catch (SQLException e) {
diff --git a/src/main/java/com/example/AppArrays.java b/src/main/java/com/example/AppArrays.java
new file mode 100644
index 00000000..79a8f35f
--- /dev/null
+++ b/src/main/java/com/example/AppArrays.java
@@ -0,0 +1,29 @@
+package com.example;
+
+import java.util.Arrays;
+
+public class AppArrays {
+ public static void main(String[] args) {
+ int vetor3[] = new int[5];
+ for (int i = 0; i < vetor3.length; i++) {
+ vetor3[i] = 100 * (i+1);
+ }
+ System.out.println(Arrays.toString(vetor3));
+ System.out.println();
+
+ double matriz[][] = new double[3][4];
+ for (int i = 0; i < matriz.length; i++) {
+ for (int j = 0; j < matriz[i].length; j++) {
+ matriz[i][j] = (i * matriz[i].length + j+1) * 10;
+ }
+ }
+
+ for (int i = 0; i < matriz.length; i++) {
+ for (int j = 0; j < matriz[i].length; j++) {
+ System.out.printf("%5.1f ", matriz[i][j]);
+ }
+ System.err.println();
+ }
+
+ }
+}
diff --git a/src/main/java/com/example/AppBd.java b/src/main/java/com/example/AppBd.java
new file mode 100644
index 00000000..68dc0548
--- /dev/null
+++ b/src/main/java/com/example/AppBd.java
@@ -0,0 +1,58 @@
+package com.example;
+
+import java.sql.SQLException;
+
+import com.example.dao.ConnectionManager;
+import com.example.dao.DAO;
+import com.example.dao.EstadoDAO;
+import com.example.dao.ProdutoDAO;
+import com.example.model.Marca;
+import com.example.model.Produto;
+
+public class AppBd {
+ public static void main(String[] args) {
+ new AppBd();
+ }
+
+ public AppBd(){
+ /*
+ // Este código não é mais necessário pois, atualmente, o driver é carregado de forma automática
+ // (caso ele seja encontrado).
+ try {
+ carregarDriverJDBC();
+ } catch (ClassNotFoundException e) {
+ System.err.println("Não foi possível carregar a biblioteca para acesso ao banco de dados: " + e.getMessage());
+ return;
+ }
+ */
+
+ try(var conn = ConnectionManager.getConnection()){
+ var estadoDAO = new EstadoDAO(conn);
+ var listaEstados = estadoDAO.listar();
+ for (var estado : listaEstados) {
+ System.out.println(estado);
+ }
+
+ estadoDAO.localizar("PR");
+
+ var marca = new Marca();
+ marca.setId(2L);
+
+ var produto = new Produto();
+ produto.setId(206L);
+ produto.setMarca(marca);
+ produto.setValor(90);
+ produto.setNome("Produto Novo");
+
+ var produtoDAO = new ProdutoDAO(conn);
+ produtoDAO.alterar(produto);
+ produtoDAO.excluir(207L);
+
+ //var dao = new DAO(conn);
+ //dao.listar("produto");
+ } catch (SQLException e) {
+ System.err.println("Não foi possível conectar ao banco de dados: " + e.getMessage());
+ }
+ }
+
+}
diff --git a/src/main/java/com/example/AppListas.java b/src/main/java/com/example/AppListas.java
new file mode 100644
index 00000000..e38bb79c
--- /dev/null
+++ b/src/main/java/com/example/AppListas.java
@@ -0,0 +1,42 @@
+package com.example;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import com.example.model.Cliente;
+
+public class AppListas {
+ public static void main(String[] args) {
+ List listaClientes = new LinkedList<>();
+ var cliente1 = new Cliente();
+ cliente1.setNome("Manoel");
+ cliente1.setCidade("Palmas");
+
+ var cliente2 = new Cliente();
+ cliente2.setNome("Breno");
+ cliente2.setCidade("Araguaina");
+
+ listaClientes.add(cliente1);
+ listaClientes.add(cliente1);
+ listaClientes.add(cliente1);
+ listaClientes.add(cliente2);
+ listaClientes.add(cliente2);
+ listaClientes.add(cliente1);
+ listaClientes.add(cliente1);
+ listaClientes.add(cliente1);
+ listaClientes.add(cliente2);
+ listaClientes.add(cliente2);
+ listaClientes.add(cliente2);
+
+ listaClientes.remove(0);
+ listaClientes.remove(0);
+ listaClientes.remove(0);
+ listaClientes.remove(cliente1);
+ int i = listaClientes.size() - 1;
+ listaClientes.remove(i);
+
+ for (var cliente : listaClientes) {
+ System.err.println(cliente);
+ }
+ }
+}
diff --git a/src/main/java/com/example/MathUtil.java b/src/main/java/com/example/MathUtil.java
new file mode 100644
index 00000000..6b108f0f
--- /dev/null
+++ b/src/main/java/com/example/MathUtil.java
@@ -0,0 +1,37 @@
+package com.example;
+
+public class MathUtil {
+ public static int mdc(int a, int b){
+ //P7
+ a = Math.abs(a);
+ b = Math.abs(b);
+
+ int maior = Math.max(a, b);
+ b = Math.min(a, b);
+ a = maior;
+
+ //P1
+ if(b > 0 && a % b == 0)
+ return b;
+
+ if(b == 0)
+ return Math.abs(a);
+
+ return mdc(a-b, b);
+ }
+
+ public static int mdc(int ...valores){
+ if(valores == null)
+ throw new NullPointerException("É necessário passar um valor diferente de nulo");
+
+ if(valores.length == 0)
+ throw new IllegalArgumentException("É necessário ao menos um valor para calcular o MDC.");
+
+ int a = valores[0];
+ for (int b : valores) {
+ a = mdc(a, b);
+ }
+
+ return a;
+ }
+}
diff --git a/src/main/java/com/example/dao/ConnectionManager.java b/src/main/java/com/example/dao/ConnectionManager.java
new file mode 100644
index 00000000..bbcbc541
--- /dev/null
+++ b/src/main/java/com/example/dao/ConnectionManager.java
@@ -0,0 +1,15 @@
+package com.example.dao;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+
+public class ConnectionManager {
+ private static final String PASSWORD = "";
+ private static final String USERNAME = "gitpod";
+ private static final String JDBC_URL = "jdbc:postgresql://localhost/postgres";
+
+ public static Connection getConnection() throws SQLException {
+ return DriverManager.getConnection(JDBC_URL, USERNAME, PASSWORD);
+ }
+}
diff --git a/src/main/java/com/example/dao/DAO.java b/src/main/java/com/example/dao/DAO.java
new file mode 100644
index 00000000..f042900c
--- /dev/null
+++ b/src/main/java/com/example/dao/DAO.java
@@ -0,0 +1,39 @@
+package com.example.dao;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+
+public class DAO {
+ protected Connection conn;
+
+ public DAO(Connection conn) {
+ this.conn = conn;
+ }
+
+ public void listar(String tabela) {
+ var sql = "select * from " + tabela;
+ //System.out.println(sql);
+ try {
+ var statement = conn.createStatement();
+ var result = statement.executeQuery(sql);
+
+ var metadata = result.getMetaData();
+ int cols = metadata.getColumnCount();
+
+ for (int i = 1; i <= cols; i++) {
+ System.out.printf("%-25s | ", metadata.getColumnName(i));
+ }
+ System.out.println();
+
+ while(result.next()){
+ for (int i = 1; i <= cols; i++) {
+ System.out.printf("%-25s | ", result.getString(i));
+ }
+ System.out.println();
+ }
+ } catch (SQLException e) {
+ System.err.println("Erro na execução da consulta: " + e.getMessage());
+ }
+
+ }
+}
diff --git a/src/main/java/com/example/dao/EstadoDAO.java b/src/main/java/com/example/dao/EstadoDAO.java
new file mode 100644
index 00000000..693164bf
--- /dev/null
+++ b/src/main/java/com/example/dao/EstadoDAO.java
@@ -0,0 +1,48 @@
+package com.example.dao;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.LinkedList;
+import java.util.List;
+
+import com.example.model.Estado;
+
+public class EstadoDAO extends DAO {
+ public EstadoDAO(Connection conn) {
+ super(conn);
+ }
+
+ public List listar() throws SQLException {
+ var lista = new LinkedList();
+ var statement = conn.createStatement();
+ var result = statement.executeQuery("select * from estado");
+ while(result.next()){
+ var estado = new Estado();
+ estado.setId(result.getLong("id"));
+ estado.setNome(result.getString("nome"));
+ estado.setUf(result.getString("uf"));
+ lista.add(estado);
+ }
+
+ return lista;
+ }
+
+ public void localizar(String uf) {
+ try{
+ //var sql = "select * from estado where uf = '" + uf + "'"; //suscetível a SQL Injection
+ var sql = "select * from estado where uf = ?";
+ var statement = conn.prepareStatement(sql);
+ //System.out.println(sql);
+ statement.setString(1, uf);
+ var result = statement.executeQuery();
+ if(result.next()){
+ System.out.printf("Id: %d Nome: %s UF: %s\n", result.getInt("id"), result.getString("nome"), result.getString("uf"));
+ }
+ System.out.println();
+ } catch(SQLException e){
+ System.err.println("Erro ao executar consulta SQL: " + e.getMessage());
+ }
+
+ }
+
+}
diff --git a/src/main/java/com/example/dao/ProdutoDAO.java b/src/main/java/com/example/dao/ProdutoDAO.java
new file mode 100644
index 00000000..6e563e8b
--- /dev/null
+++ b/src/main/java/com/example/dao/ProdutoDAO.java
@@ -0,0 +1,51 @@
+package com.example.dao;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+
+import com.example.model.Produto;
+
+public class ProdutoDAO extends DAO {
+
+ public ProdutoDAO(Connection conn) {
+ super(conn);
+ }
+
+ public void excluir(long id) {
+ var sql = "delete from produto where id = ?";
+ try {
+ var statement = conn.prepareStatement(sql);
+ statement.setLong(1, id);
+ if(statement.executeUpdate() == 1)
+ System.out.println("Produto excluído com sucesso");
+ else System.out.println("Produto não foi localizado");
+ } catch (SQLException e) {
+ System.err.println("Erro ao excluir o produto: " + e.getMessage());
+ }
+ }
+
+ public void inserir(Produto produto) {
+ var sql = "insert into produto (nome, marca_id, valor) values (?, ?, ?)";
+ try (var statement = conn.prepareStatement(sql)) {
+ statement.setString(1, produto.getNome());
+ statement.setLong(2, produto.getMarca().getId());
+ statement.setDouble(3, produto.getValor());
+ statement.executeUpdate();
+ } catch (SQLException e) {
+ System.err.println("Erro na execução da consulta: " + e.getMessage());
+ }
+ }
+
+ public void alterar(Produto produto) {
+ var sql = "update produto set nome = ?, marca_id = ?, valor = ? where id = ?";
+ try (var statement = conn.prepareStatement(sql)) {
+ statement.setString(1, produto.getNome());
+ statement.setLong(2, produto.getMarca().getId());
+ statement.setDouble(3, produto.getValor());
+ statement.setLong(4, produto.getId());
+ statement.executeUpdate();
+ } catch (SQLException e) {
+ System.err.println("Erro na alteração do produto: " + e.getMessage());
+ }
+ }
+}
diff --git a/src/main/java/com/example/educacao/Principal.java b/src/main/java/com/example/educacao/Principal.java
new file mode 100644
index 00000000..7d0f799f
--- /dev/null
+++ b/src/main/java/com/example/educacao/Principal.java
@@ -0,0 +1,29 @@
+package com.example.educacao;
+
+import java.sql.SQLException;
+
+import com.example.dao.ConnectionManager;
+import com.example.educacao.dao.AlunoDAO;
+import com.example.educacao.model.Aluno;
+
+public class Principal {
+ public static void main(String[] args) {
+ try(var conn = ConnectionManager.getConnection()){
+ var alunoDAO = new AlunoDAO(conn);
+ var aluno = new Aluno();
+ aluno.setMatricula(1);
+
+ //aluno.setNome("Breno");
+ //alunoDAO.inserir(aluno);
+ //System.out.println("Aluno inserido com sucesso");
+
+ System.out.println("matricula " + aluno.getMatricula());
+ double nota = 10;
+ alunoDAO.inserirNota(2, nota, aluno.getMatricula());
+ } catch(SQLException e){
+ System.err.println("Nao foi possivel conectar ao BD");
+ } catch(RuntimeException e){
+ System.err.println(e.getMessage());
+ }
+ }
+}
diff --git a/src/main/java/com/example/educacao/dao/AlunoDAO.java b/src/main/java/com/example/educacao/dao/AlunoDAO.java
new file mode 100644
index 00000000..82c1e1ee
--- /dev/null
+++ b/src/main/java/com/example/educacao/dao/AlunoDAO.java
@@ -0,0 +1,45 @@
+package com.example.educacao.dao;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+import com.example.dao.DAO;
+import com.example.educacao.model.Aluno;
+
+public class AlunoDAO extends DAO{
+ public AlunoDAO(Connection conn) {
+ super(conn);
+ }
+
+ public void inserir(Aluno aluno) {
+ try {
+ var sql = "insert into aluno (nome) values (?)";
+ var statement = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
+ statement.setString(1, aluno.getNome());
+ statement.executeUpdate();
+ var result = statement.getGeneratedKeys();
+ if(result.next()){
+ aluno.setMatricula(result.getInt(1));
+ }
+ } catch (SQLException e) {
+ throw new RuntimeException("Nao foi possivel inserir o aluno", e);
+ }
+ }
+
+ public void inserirNota(int idDisciplina, double nota, int matricula){
+ if(idDisciplina <= 0 || idDisciplina > 3)
+ throw new IllegalArgumentException("O id da disciplina deve estar entre 1 e 3");
+
+ try{
+ var sql = "update aluno set nota" + idDisciplina + " = ? where matricula = ?";
+ System.out.println(sql);
+ var statement = conn.prepareStatement(sql);
+ statement.setDouble(1, nota);
+ statement.setInt(2, matricula);
+ statement.execute();
+ }catch(SQLException e){
+ throw new RuntimeException("Nao foi possivel registrar a nota", e);
+ }
+ }
+}
diff --git a/src/main/java/com/example/educacao/model/Aluno.java b/src/main/java/com/example/educacao/model/Aluno.java
new file mode 100644
index 00000000..f5e373cf
--- /dev/null
+++ b/src/main/java/com/example/educacao/model/Aluno.java
@@ -0,0 +1,65 @@
+package com.example.educacao.model;
+
+public class Aluno {
+ private Integer matricula;
+ private String nome;
+
+ /**
+ * Nota da disciplina 1.
+ */
+ private double nota1;
+
+ /**
+ * Nota da disciplina 2.
+ */
+ private double nota2;
+
+ /**
+ * Nota da disciplina 3.
+ */
+ private double nota3;
+
+ public Integer getMatricula() {
+ return matricula;
+ }
+
+ public void setMatricula(Integer matricula) {
+ this.matricula = matricula;
+ }
+
+ public String getNome() {
+ return nome;
+ }
+ public void setNome(String nome) {
+ this.nome = nome;
+ }
+ public double getNota1() {
+ return nota1;
+ }
+ public void setNota1(double nota1) {
+ if(nota1 < 0)
+ throw new IllegalArgumentException("A nota nao pode ser negativa");
+ if(nota1 > 10)
+ throw new IllegalArgumentException("A nota nao pode ser maior que 10");
+
+ this.nota1 = nota1;
+ }
+ public double getNota2() {
+ return nota2;
+ }
+ public void setNota2(double nota2) {
+ this.nota2 = nota2;
+ }
+ public double getNota3() {
+ return nota3;
+ }
+ public void setNota3(double nota3) {
+ this.nota3 = nota3;
+ }
+
+ public double calculaMedia(){
+ return (nota1 + nota2 + nota3) / 3;
+ }
+
+
+}
diff --git a/src/main/java/com/example/financeiro/Principal.java b/src/main/java/com/example/financeiro/Principal.java
new file mode 100644
index 00000000..dee9142a
--- /dev/null
+++ b/src/main/java/com/example/financeiro/Principal.java
@@ -0,0 +1,58 @@
+package com.example.financeiro;
+
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.http.HttpClient;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse.BodyHandlers;
+
+import com.example.financeiro.currency.CurrencyAPI;
+import com.example.financeiro.dao.TransacaoDAO;
+import com.example.financeiro.model.Transacao;
+import com.example.financeiro.yahoofinance.YahooFinanceData;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.json.JsonMapper;
+
+public class Principal {
+ private static final String ADDRESS = "https://query1.finance.yahoo.com/v7/finance/spark?symbols=USDBRL=X";
+
+ public static void main(String[] args) {
+ simulatedAPIReqeust();
+ yahooFinanceRequest();
+
+ var dao = new TransacaoDAO();
+ dao.adicionar(new Transacao("Manoel", 100, "USD", 'D'));
+ dao.adicionar(new Transacao("Manoel", 100, "BRL", 'D'));
+ dao.adicionar(new Transacao("Manoel", 10, "BRL", 'T'));
+ dao.adicionar(new Transacao("Manoel", 20, "BRL", 'D'));
+ var ultima = new Transacao("Manoel", 5, "BRL", 'R');
+ dao.adicionar(ultima);
+
+ //Transacao.getLista().forEach(System.out::println);
+ System.out.println("Saldo: " + dao.getSaldo("Manoel"));
+ }
+
+ private static void simulatedAPIReqeust() {
+ System.out.println(CurrencyAPI.getQuote("BRL", "EUR"));
+ }
+
+ private static void yahooFinanceRequest() {
+ var http = HttpClient.newHttpClient();
+ try {
+ var mapper = new JsonMapper()
+ .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+ var req = HttpRequest.newBuilder(new URI(ADDRESS)).GET().build();
+ var resp = http.send(req, BodyHandlers.ofString());
+
+ var yahooFinanceData = mapper.readValue(resp.body(), YahooFinanceData.class);
+ var result = yahooFinanceData.getSpark().getResult()[0];
+ System.out.println(result.getResponse()[0].getMeta().getRegularMarketPrice());
+ } catch (URISyntaxException e) {
+ System.err.println("Endereco da API invalido");
+ } catch (IOException | InterruptedException e) {
+ System.err.println("Ocorreu um erro ao enviar requisicao à API");
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/src/main/java/com/example/financeiro/currency/Currency.java b/src/main/java/com/example/financeiro/currency/Currency.java
new file mode 100644
index 00000000..cd3dd295
--- /dev/null
+++ b/src/main/java/com/example/financeiro/currency/Currency.java
@@ -0,0 +1,36 @@
+package com.example.financeiro.currency;
+
+import java.util.List;
+import java.util.NoSuchElementException;
+
+public class Currency {
+ /**
+ * Sigla da moeda de origem (com 3 letras).
+ */
+ private String from;
+
+ private String to;
+
+ private double quote;
+
+
+ public Currency(String from, String to, double quote) {
+ this.from = from;
+ this.to = to;
+ this.quote = quote;
+ }
+
+ public String getFrom() {
+ return from;
+ }
+
+ public String getTo() {
+ return to;
+ }
+
+ public double getQuote() {
+ return quote;
+ }
+
+
+}
diff --git a/src/main/java/com/example/financeiro/currency/CurrencyAPI.java b/src/main/java/com/example/financeiro/currency/CurrencyAPI.java
new file mode 100644
index 00000000..f23f9682
--- /dev/null
+++ b/src/main/java/com/example/financeiro/currency/CurrencyAPI.java
@@ -0,0 +1,23 @@
+package com.example.financeiro.currency;
+
+import java.util.List;
+import java.util.NoSuchElementException;
+
+public class CurrencyAPI {
+ private static List currencyList =
+ List.of(
+ new Currency("USD", "BRL", 4.96),
+ new Currency("EUR", "BRL", 5.41),
+ new Currency("BRL", "EUR", 0.18)
+ );
+
+ public static double getQuote(String from, String to){
+ for (var currency : currencyList) {
+ if(currency.getFrom().equals(from) && currency.getTo().equals(to)){
+ return currency.getQuote();
+ }
+ }
+
+ throw new NoSuchElementException("Nao foi encontrada uma quotacao para o par de moedas indicado");
+ }
+}
diff --git a/src/main/java/com/example/financeiro/dao/TransacaoDAO.java b/src/main/java/com/example/financeiro/dao/TransacaoDAO.java
new file mode 100644
index 00000000..8b7d3a51
--- /dev/null
+++ b/src/main/java/com/example/financeiro/dao/TransacaoDAO.java
@@ -0,0 +1,68 @@
+package com.example.financeiro.dao;
+
+import com.example.financeiro.model.Transacao;
+import java.util.*;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+
+public class TransacaoDAO {
+ private final List lista = new LinkedList<>();
+
+ public List getLista() {
+ return Collections.unmodifiableList(lista);
+ }
+
+ public Transacao adicionar(Transacao nova) {
+ if(nova.getTipo() != 'R'){
+ lista.add(nova);
+ return nova;
+ }
+
+ int totalRetiradas = 0;
+ for (var t : lista) {
+ var ontem = nova.getDataHora().minusDays(1);
+ if(t.getCliente().equals(nova.getCliente()) && t.getTipo() == 'R' && t.getDataHora().isAfter(ontem) && ++totalRetiradas >= 2){
+ break;
+ }
+ }
+
+ if(totalRetiradas >= 2){
+ var copia = Transacao.newSuspeita(nova);
+ lista.add(copia);
+ return copia;
+ }
+
+ lista.add(nova);
+ return nova;
+ }
+
+ public List filtrar(String cliente){
+ return filtrar(transacao -> transacao.getCliente().equals(cliente));
+ }
+
+ public List filtrar(char tipo){
+ return filtrar(transacao -> transacao.getTipo() == tipo);
+ }
+
+ public List filtrar(String cliente, char tipo){
+ return filtrar(transacao -> transacao.getCliente().equals(cliente) && transacao.getTipo() == tipo);
+ }
+
+ private List filtrar(Predicate predicate){
+ return lista.stream().filter(predicate).collect(Collectors.toCollection(LinkedList::new));
+ }
+
+ public double getSaldo(final String cliente) {
+ final var transacoes = filtrar(cliente);
+
+ double saldo = 0.0;
+ for (final var transacao : transacoes) {
+ final double sinal = transacao.getTipo() == 'D' ? 1 : -1;
+ final double valor = transacao.getValorMoedaLocal();
+ saldo += sinal * valor;
+ }
+
+ return saldo;
+ }
+
+}
diff --git a/src/main/java/com/example/financeiro/model/Transacao.java b/src/main/java/com/example/financeiro/model/Transacao.java
new file mode 100644
index 00000000..b14d7361
--- /dev/null
+++ b/src/main/java/com/example/financeiro/model/Transacao.java
@@ -0,0 +1,76 @@
+package com.example.financeiro.model;
+
+import java.time.LocalDateTime;
+
+import com.example.financeiro.currency.CurrencyAPI;
+
+public class Transacao {
+ private static final String MOEDA_LOCAL = "BRL";
+
+ private Integer id;
+ private String cliente;
+ private double valor;
+ private String moeda;
+ private char tipo;
+ private LocalDateTime dataHora;
+ private boolean suspeita;
+
+ Transacao(String cliente, double valor, String moeda, char tipo, LocalDateTime dataHora) {
+ this.cliente = cliente;
+ this.valor = valor;
+ this.moeda = moeda;
+ this.tipo = tipo;
+ this.dataHora = dataHora;
+ }
+
+ public Transacao(String cliente, double valor, String moeda, char tipo) {
+ this(cliente, valor, moeda, tipo, LocalDateTime.now());
+ }
+
+ public static Transacao newSuspeita(Transacao t) {
+ var copia = new Transacao(t.cliente, t.valor, t.moeda, t.tipo);
+ copia.suspeita = true;
+ return copia;
+ }
+
+ public double getValorMoedaLocal() {
+ final double multiplo = moeda.equals(MOEDA_LOCAL) ? 1 : CurrencyAPI.getQuote(moeda, MOEDA_LOCAL);
+ return multiplo * valor;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public String getCliente() {
+ return cliente;
+ }
+
+ public double getValor() {
+ return valor;
+ }
+
+ public String getMoeda() {
+ return moeda;
+ }
+
+ public char getTipo() {
+ return tipo;
+ }
+
+ public LocalDateTime getDataHora() {
+ return dataHora;
+ }
+
+ public boolean isSuspeita() {
+ return suspeita;
+ }
+
+ @Override
+ public String toString() {
+ return "Transacao [id=" + id + ", cliente=" + cliente + ", valor=" + valor + ", moeda=" + moeda + ", tipo="
+ + tipo + "]";
+ }
+
+}
+
diff --git a/src/main/java/com/example/financeiro/yahoofinance/Meta.java b/src/main/java/com/example/financeiro/yahoofinance/Meta.java
new file mode 100644
index 00000000..d340fed2
--- /dev/null
+++ b/src/main/java/com/example/financeiro/yahoofinance/Meta.java
@@ -0,0 +1,19 @@
+package com.example.financeiro.yahoofinance;
+
+public class Meta {
+ private String currency;
+ private double regularMarketPrice;
+
+ public String getCurrency() {
+ return currency;
+ }
+ public void setCurrency(String currency) {
+ this.currency = currency;
+ }
+ public double getRegularMarketPrice() {
+ return regularMarketPrice;
+ }
+ public void setRegularMarketPrice(double regularMarketPrice) {
+ this.regularMarketPrice = regularMarketPrice;
+ }
+}
diff --git a/src/main/java/com/example/financeiro/yahoofinance/Response.java b/src/main/java/com/example/financeiro/yahoofinance/Response.java
new file mode 100644
index 00000000..43867587
--- /dev/null
+++ b/src/main/java/com/example/financeiro/yahoofinance/Response.java
@@ -0,0 +1,15 @@
+package com.example.financeiro.yahoofinance;
+
+public class Response {
+ private Meta meta;
+
+ public Meta getMeta() {
+ return meta;
+ }
+
+ public void setMeta(Meta meta) {
+ this.meta = meta;
+ }
+
+
+}
diff --git a/src/main/java/com/example/financeiro/yahoofinance/Result.java b/src/main/java/com/example/financeiro/yahoofinance/Result.java
new file mode 100644
index 00000000..63249bb2
--- /dev/null
+++ b/src/main/java/com/example/financeiro/yahoofinance/Result.java
@@ -0,0 +1,15 @@
+package com.example.financeiro.yahoofinance;
+
+public class Result {
+ private Response []response;
+
+ public Response[] getResponse() {
+ return response;
+ }
+
+ public void setResponse(Response[] response) {
+ this.response = response;
+ }
+
+
+}
diff --git a/src/main/java/com/example/financeiro/yahoofinance/Spark.java b/src/main/java/com/example/financeiro/yahoofinance/Spark.java
new file mode 100644
index 00000000..98ee853a
--- /dev/null
+++ b/src/main/java/com/example/financeiro/yahoofinance/Spark.java
@@ -0,0 +1,15 @@
+package com.example.financeiro.yahoofinance;
+
+public class Spark {
+ private Result []result;
+
+ public Result[] getResult() {
+ return result;
+ }
+
+ public void setResult(Result[] result) {
+ this.result = result;
+ }
+
+
+}
diff --git a/src/main/java/com/example/financeiro/yahoofinance/YahooFinanceData.java b/src/main/java/com/example/financeiro/yahoofinance/YahooFinanceData.java
new file mode 100644
index 00000000..423e19be
--- /dev/null
+++ b/src/main/java/com/example/financeiro/yahoofinance/YahooFinanceData.java
@@ -0,0 +1,13 @@
+package com.example.financeiro.yahoofinance;
+
+public class YahooFinanceData {
+ private Spark spark;
+
+ public Spark getSpark() {
+ return spark;
+ }
+
+ public void setSpark(Spark spark) {
+ this.spark = spark;
+ }
+}
diff --git a/src/main/java/com/example/model/Cidadao.java b/src/main/java/com/example/model/Cidadao.java
new file mode 100644
index 00000000..c3c259cd
--- /dev/null
+++ b/src/main/java/com/example/model/Cidadao.java
@@ -0,0 +1,36 @@
+package com.example.model;
+
+import java.time.LocalDate;
+
+public class Cidadao {
+ private String nome;
+ private LocalDate dataNascimento;
+
+ public int idade(){
+ return LocalDate.now().getYear() - dataNascimento.getYear();
+ }
+
+ public String eleitor(){
+ int idade = idade();
+ if(idade < 16)
+ return "Não eleitor";
+
+ if(idade >= 16 && idade < 18 || idade > 70)
+ return "Eleitor facultativo";
+
+ return "Eleitor Obrigatório";
+ }
+
+ public String getNome() {
+ return nome;
+ }
+ public void setNome(String nome) {
+ this.nome = nome;
+ }
+ public LocalDate getDataNascimento() {
+ return dataNascimento;
+ }
+ public void setDataNascimento(LocalDate dataNascimento) {
+ this.dataNascimento = dataNascimento;
+ }
+}
diff --git a/src/main/java/com/example/model/Cliente.java b/src/main/java/com/example/model/Cliente.java
new file mode 100644
index 00000000..5d6494af
--- /dev/null
+++ b/src/main/java/com/example/model/Cliente.java
@@ -0,0 +1,49 @@
+package com.example.model;
+
+import java.time.LocalDate;
+
+public class Cliente {
+ private String nome;
+ private int anoNascimento;
+ private char sexo;
+ private String cidade;
+ private boolean especial;
+
+ public Cliente(){
+ this.especial = Math.random() > 0.5;
+ }
+
+ public boolean isEspecial() {
+ return especial;
+ }
+
+ public String getNome() {
+ return nome;
+ }
+ public void setNome(String nome) {
+ this.nome = nome;
+ }
+ public int getAnoNascimento() {
+ return anoNascimento;
+ }
+ public void setAnoNascimento(int anoNascimento) {
+ this.anoNascimento = anoNascimento;
+ }
+ public char getSexo() {
+ return sexo;
+ }
+ public void setSexo(char sexo) {
+ this.sexo = sexo;
+ }
+ public String getCidade() {
+ return cidade;
+ }
+ public void setCidade(String cidade) {
+ this.cidade = cidade;
+ }
+
+ public int idade(){
+ return LocalDate.now().getYear() - anoNascimento;
+ }
+
+}
diff --git a/src/main/java/com/example/model/Estado.java b/src/main/java/com/example/model/Estado.java
new file mode 100644
index 00000000..e675e101
--- /dev/null
+++ b/src/main/java/com/example/model/Estado.java
@@ -0,0 +1,52 @@
+package com.example.model;
+
+public class Estado {
+ private Long id;
+ private String nome;
+ private String uf;
+ private RegiaoGeografica regiao;
+ private int areaKm2;
+ private int populacao;
+
+ public Long getId() {
+ return id;
+ }
+ public void setId(Long id) {
+ this.id = id;
+ }
+ public String getNome() {
+ return nome;
+ }
+ public void setNome(String nome) {
+ this.nome = nome;
+ }
+ public String getUf() {
+ return uf;
+ }
+ public void setUf(String uf) {
+ this.uf = uf;
+ }
+ public RegiaoGeografica getRegiao() {
+ return regiao;
+ }
+ public void setRegiao(RegiaoGeografica regiao) {
+ this.regiao = regiao;
+ }
+ public int getAreaKm2() {
+ return areaKm2;
+ }
+ public void setAreaKm2(int areaKm2) {
+ this.areaKm2 = areaKm2;
+ }
+ public int getPopulacao() {
+ return populacao;
+ }
+ public void setPopulacao(int populacao) {
+ this.populacao = populacao;
+ }
+
+ public String toString(){
+ return "Estado: " + nome + " Id: " + id + " UF: " + uf;
+ }
+
+}
diff --git a/src/main/java/com/example/model/Marca.java b/src/main/java/com/example/model/Marca.java
new file mode 100644
index 00000000..7b45e319
--- /dev/null
+++ b/src/main/java/com/example/model/Marca.java
@@ -0,0 +1,20 @@
+package com.example.model;
+
+public class Marca {
+ private Long id;
+ private String nome;
+
+ public Long getId() {
+ return id;
+ }
+ public void setId(Long id) {
+ this.id = id;
+ }
+ public String getNome() {
+ return nome;
+ }
+ public void setNome(String nome) {
+ this.nome = nome;
+ }
+
+}
diff --git a/src/main/java/com/example/model/Produto.java b/src/main/java/com/example/model/Produto.java
new file mode 100644
index 00000000..f502607f
--- /dev/null
+++ b/src/main/java/com/example/model/Produto.java
@@ -0,0 +1,35 @@
+package com.example.model;
+
+public class Produto {
+ private Long id;
+ private String nome;
+ private Marca marca;
+ private double valor;
+
+ public Long getId() {
+ return id;
+ }
+ public void setId(Long id) {
+ this.id = id;
+ }
+ public String getNome() {
+ return nome;
+ }
+ public void setNome(String nome) {
+ this.nome = nome;
+ }
+ public Marca getMarca() {
+ return marca;
+ }
+ public void setMarca(Marca marca) {
+ this.marca = marca;
+ }
+ public double getValor() {
+ return valor;
+ }
+ public void setValor(double valor) {
+ this.valor = valor;
+ }
+
+
+}
diff --git a/src/main/java/com/example/model/RegiaoGeografica.java b/src/main/java/com/example/model/RegiaoGeografica.java
new file mode 100644
index 00000000..8b0a9584
--- /dev/null
+++ b/src/main/java/com/example/model/RegiaoGeografica.java
@@ -0,0 +1,21 @@
+package com.example.model;
+
+public class RegiaoGeografica {
+ private Long id;
+ private String nome;
+
+ public Long getId() {
+ return id;
+ }
+ public void setId(Long id) {
+ this.id = id;
+ }
+ public String getNome() {
+ return nome;
+ }
+ public void setNome(String nome) {
+ this.nome = nome;
+ }
+
+
+}
diff --git a/src/test/java/com/example/ClienteTest.java b/src/test/java/com/example/ClienteTest.java
new file mode 100644
index 00000000..3f7e766d
--- /dev/null
+++ b/src/test/java/com/example/ClienteTest.java
@@ -0,0 +1,16 @@
+package com.example;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.junit.jupiter.api.Test;
+
+import com.example.model.Cliente;
+
+public class ClienteTest {
+ @Test
+ void testGetIdade() {
+ var cliente = new Cliente();
+ cliente.setAnoNascimento(1980);
+ assertEquals( 43, cliente.idade());
+ }
+}
diff --git a/src/test/java/com/example/MathUtilTest.java b/src/test/java/com/example/MathUtilTest.java
new file mode 100644
index 00000000..ccaf48b6
--- /dev/null
+++ b/src/test/java/com/example/MathUtilTest.java
@@ -0,0 +1,180 @@
+package com.example;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+import org.junit.jupiter.api.Test;
+import static com.example.MathUtil.mdc;
+
+public class MathUtilTest {
+ @Test
+ void testMdcP1BImpar() {
+ int a = 6, b = 3;
+ int esperado = 3;
+ int obtido = mdc(a, b);
+
+ assertEquals(esperado, obtido);
+ }
+
+ @Test
+ void testMdcP1BPar() {
+ int a = 6, b = 2;
+ int esperado = 2;
+ int obtido = mdc(a, b);
+
+ assertEquals(esperado, obtido);
+ }
+
+ @Test
+ void testMdcP3Negativo() {
+ int a = -6, b = 0;
+ int esperado = 6;
+ int obtido = mdc(a, b);
+
+ assertEquals(esperado, obtido);
+ }
+
+ @Test
+ void testMdcP3Positivo() {
+ int a = 6, b = 0;
+ int esperado = 6;
+ int obtido = mdc(a, b);
+
+ assertEquals(esperado, obtido);
+ }
+
+ @Test
+ void testMdcP5Crescente() {
+ int a = 2, b = 6;
+ int esperado = mdc(b, a);
+ int obtido = mdc(a, b);
+
+ assertEquals(esperado, obtido);
+ }
+
+ @Test
+ void testMdcP5Descrescente() {
+ int a = 6, b = 2;
+ int esperado = mdc(b, a);
+ int obtido = mdc(a, b);
+
+ assertEquals(esperado, obtido);
+ }
+
+ @Test
+ void testMdcP7() {
+ int a = 6, b = 2;
+ int esperado = mdc(-a, b);
+ int obtido = mdc(-a, -b);
+
+ assertEquals(esperado, obtido);
+ }
+
+ @Test
+ void testMdcP8Par() {
+ int a = 6;
+ int esperado = 6;
+ int obtido = mdc(a, a);
+
+ assertEquals(esperado, obtido);
+ }
+
+ @Test
+ void testMdcP8Negativo() {
+ int a = -6;
+ int esperado = 6;
+ int obtido = mdc(a, a);
+
+ assertEquals(esperado, obtido);
+ }
+
+ @Test
+ void testMdcP12DoisPrimos() {
+ int p = 7, a = p;
+ int esperado = p;
+ int obtido = mdc(p, a);
+
+ assertEquals(esperado, obtido);
+ }
+
+ @Test
+ void testMdcP12UmPrimo() {
+ int p = 7, a = 2;
+ int esperado = 1;
+ int obtido = mdc(p, a);
+
+ assertEquals(esperado, obtido);
+ }
+
+ @Test
+ void testMdcP12PrimoEUm() {
+ int p = 7, a = 1;
+ int esperado = 1;
+ int obtido = mdc(p, a);
+
+ assertEquals(esperado, obtido);
+ }
+
+ @Test
+ void testMdcCasoGeral30e12() {
+ int a = 30, b = 12;
+ int esperado = 6;
+ int obtido = mdc(a, b);
+
+ assertEquals(esperado, obtido);
+ }
+
+ @Test
+ void testMdcCasoGeral12e9() {
+ int a = 12, b = 9;
+ int esperado = 3;
+ int obtido = mdc(a, b);
+
+ assertEquals(esperado, obtido);
+ }
+
+ @Test
+ void testMdcP4() {
+ int m = 2, a = 6, b = 3;
+ /*
+ mdc(2*6, 2*3) = 2 * mdc(6, 3)
+ 6 = 6
+ */
+
+ int esperado = 6;
+ int obtido = m * mdc(a, b);
+
+ assertEquals(mdc(m*a, m*b), obtido);
+ assertEquals(esperado, obtido);
+ }
+
+ @Test
+ void testMdcP9() {
+ int a = 6, b = 3, c = 2;
+ int esperado = 3;
+ int obtido = mdc(a, b);
+
+ assertTrue(mdc(a, mdc(b, c)) == mdc(mdc(a, b), c) && mdc(mdc(a, b), c) == mdc(a, b, c));
+ }
+
+ @Test
+ void testMdc3Valores() {
+ int a = 12, b = 6, c = 4;
+ int esperado = 2;
+ int obtido = mdc(a, b, c);
+
+ assertEquals(esperado, obtido);
+ }
+
+ @Test
+ void testMdc3NenhumValor() {
+ var exception = assertThrows(IllegalArgumentException.class, MathUtil::mdc);
+ }
+
+ @Test
+ void testMdcNull() {
+ var exception = assertThrows(NullPointerException.class, () -> mdc(null));
+ var msgEsperado = "É necessário passar um valor diferente de nulo";
+ assertEquals(msgEsperado, exception.getMessage());
+ }
+
+}
diff --git a/src/test/java/com/example/educacao/model/AlunoTest.java b/src/test/java/com/example/educacao/model/AlunoTest.java
new file mode 100644
index 00000000..360155f3
--- /dev/null
+++ b/src/test/java/com/example/educacao/model/AlunoTest.java
@@ -0,0 +1,28 @@
+package com.example.educacao.model;
+
+import org.junit.jupiter.api.Test;
+import static org.junit.jupiter.api.Assertions.*;
+
+public class AlunoTest {
+ @Test
+ void calculaMediaComErroDePrecisao(){
+ var aluno = new Aluno();
+ aluno.setNota1(10);
+ aluno.setNota2(8);
+ aluno.setNota3(8);
+ double esperado = 8.66;
+ double obtido = aluno.calculaMedia();
+ assertEquals(esperado, obtido, 0.01);
+ }
+
+ @Test
+ void calculaMediaValoresIguais(){
+ var aluno = new Aluno();
+ aluno.setNota1(10);
+ aluno.setNota2(10);
+ aluno.setNota3(10);
+ double esperado = 10;
+ double obtido = aluno.calculaMedia();
+ assertEquals(esperado, obtido, 0.01);
+ }
+}
diff --git a/src/test/java/com/example/financeiro/model/TransacaoTest.java b/src/test/java/com/example/financeiro/model/TransacaoTest.java
new file mode 100644
index 00000000..778697b9
--- /dev/null
+++ b/src/test/java/com/example/financeiro/model/TransacaoTest.java
@@ -0,0 +1,56 @@
+package com.example.financeiro.model;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+import java.time.LocalDateTime;
+
+import org.junit.jupiter.api.Test;
+
+import com.example.financeiro.dao.TransacaoDAO;
+
+public class TransacaoTest {
+ private TransacaoDAO dao = new TransacaoDAO();
+
+ @Test
+ void adicionarTransacoesRetiradaNaoSuspeitas() {
+ dao.adicionar(new Transacao("Manoel", 100, "BRL", 'R'));
+ var ultima = dao.adicionar(new Transacao("Manoel", 50, "BRL", 'R'));
+ assertFalse(ultima.isSuspeita());
+ }
+
+ @Test
+ void adicionarTransacoesUmaRetiradaNaoSuspeita() {
+ var ultima = dao.adicionar(new Transacao("Manoel", 70, "BRL", 'R'));
+ assertFalse(ultima.isSuspeita());
+ }
+
+ @Test
+ void adicionarTransacoesTransferenciaNaoSuspeitas() {
+ dao.adicionar(new Transacao("Manoel", 100, "BRL", 'T'));
+ dao.adicionar(new Transacao("Manoel", 200, "BRL", 'T'));
+ var ultima = dao.adicionar(new Transacao("Manoel", 50, "BRL", 'T'));
+
+ assertFalse(ultima.isSuspeita());
+ }
+
+ @Test
+ void adicionarTransacoesRetiradasSuspeitas() {
+ dao.adicionar(new Transacao("Manoel", 100, "BRL", 'R'));
+ dao.adicionar(new Transacao("Manoel", 200, "BRL", 'R'));
+ var ultima = dao.adicionar(new Transacao("Manoel", 50, "BRL", 'R'));
+
+ assertTrue(ultima.isSuspeita());
+ }
+
+ @Test
+ void adicionarTransacoesRetiradasDiasDiferentes() {
+ var anteontem = LocalDateTime.now().minusDays(2);
+ var primeira = new Transacao("Manoel", 100, "BRL", 'R', anteontem);
+ dao.adicionar(primeira);
+
+ dao.adicionar(new Transacao("Manoel", 200, "BRL", 'R'));
+ var ultima = dao.adicionar(new Transacao("Manoel", 50, "BRL", 'R'));
+
+ assertFalse(ultima.isSuspeita());
+ }
+}