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()); + } +}