From ba564e456b855a9d4ce303a888bae641f94cd805 Mon Sep 17 00:00:00 2001 From: Wander Carvalho <138515773+Wander-samix@users.noreply.github.com> Date: Mon, 22 Apr 2024 07:21:37 -0300 Subject: [PATCH 01/17] Add files via upload --- comex-main_S6/README.md | 13 ++ comex-main_S6/pom.xml | 45 ++++++ .../main/java/br/com/alura/comex/Main.java | 81 ++++++++++ .../br/com/alura/comex/ProcessadorDeCsv.java | 56 +++++++ .../br/com/alura/comex/cliente/Cliente.java | 40 +++++ .../com/alura/comex/endereco/ConsultaCep.java | 37 +++++ .../br/com/alura/comex/endereco/Endereco.java | 83 ++++++++++ .../alura/comex/pedido/OrdenacaoPedido.java | 37 +++++ .../br/com/alura/comex/pedido/Pedido.java | 147 ++++++++++++++++++ .../alura/comex/produto/ComparaProduto.java | 23 +++ .../br/com/alura/comex/produto/Produto.java | 77 +++++++++ .../comex/testes/ImpressaoDadosProduto.java | 13 ++ .../br/com/alura/comex/testes/TesteCep.java | 15 ++ .../alura/comex/testes/TesteClassePedido.java | 38 +++++ .../com/alura/comex/testes/TesteCliente.java | 106 +++++++++++++ .../com/alura/comex/testes/TesteProduto.java | 37 +++++ comex-main_S6/src/main/resources/pedidos.csv | 17 ++ comex-main_S6/src/test/resources/pedidos.csv | 17 ++ .../target/classes/ComparaProduto.class | Bin 0 -> 2102 bytes .../br/com/alura/comex/ProcessadorDeCsv.class | Bin 0 -> 2819 bytes .../br/com/alura/comex/cliente/Cliente.class | Bin 0 -> 2047 bytes .../alura/comex/endereco/ConsultaCep.class | Bin 0 -> 3310 bytes .../com/alura/comex/endereco/Endereco.class | Bin 0 -> 3144 bytes .../alura/comex/pedido/OrdenacaoPedido.class | Bin 0 -> 3589 bytes .../br/com/alura/comex/pedido/Pedido.class | Bin 0 -> 3016 bytes .../br/com/alura/comex/produto/Produto.class | Bin 0 -> 2999 bytes .../comex/testes/ImpressaoDadosProduto.class | Bin 0 -> 724 bytes .../br/com/alura/comex/testes/TesteCep.class | Bin 0 -> 942 bytes .../comex/testes/TesteClassePedido.class | Bin 0 -> 3170 bytes .../com/alura/comex/testes/TesteCliente.class | Bin 0 -> 3524 bytes .../com/alura/comex/testes/TesteProduto.class | Bin 0 -> 1742 bytes comex-main_S6/target/classes/pedidos.csv | 17 ++ 32 files changed, 899 insertions(+) create mode 100644 comex-main_S6/README.md create mode 100644 comex-main_S6/pom.xml create mode 100644 comex-main_S6/src/main/java/br/com/alura/comex/Main.java create mode 100644 comex-main_S6/src/main/java/br/com/alura/comex/ProcessadorDeCsv.java create mode 100644 comex-main_S6/src/main/java/br/com/alura/comex/cliente/Cliente.java create mode 100644 comex-main_S6/src/main/java/br/com/alura/comex/endereco/ConsultaCep.java create mode 100644 comex-main_S6/src/main/java/br/com/alura/comex/endereco/Endereco.java create mode 100644 comex-main_S6/src/main/java/br/com/alura/comex/pedido/OrdenacaoPedido.java create mode 100644 comex-main_S6/src/main/java/br/com/alura/comex/pedido/Pedido.java create mode 100644 comex-main_S6/src/main/java/br/com/alura/comex/produto/ComparaProduto.java create mode 100644 comex-main_S6/src/main/java/br/com/alura/comex/produto/Produto.java create mode 100644 comex-main_S6/src/main/java/br/com/alura/comex/testes/ImpressaoDadosProduto.java create mode 100644 comex-main_S6/src/main/java/br/com/alura/comex/testes/TesteCep.java create mode 100644 comex-main_S6/src/main/java/br/com/alura/comex/testes/TesteClassePedido.java create mode 100644 comex-main_S6/src/main/java/br/com/alura/comex/testes/TesteCliente.java create mode 100644 comex-main_S6/src/main/java/br/com/alura/comex/testes/TesteProduto.java create mode 100644 comex-main_S6/src/main/resources/pedidos.csv create mode 100644 comex-main_S6/src/test/resources/pedidos.csv create mode 100644 comex-main_S6/target/classes/ComparaProduto.class create mode 100644 comex-main_S6/target/classes/br/com/alura/comex/ProcessadorDeCsv.class create mode 100644 comex-main_S6/target/classes/br/com/alura/comex/cliente/Cliente.class create mode 100644 comex-main_S6/target/classes/br/com/alura/comex/endereco/ConsultaCep.class create mode 100644 comex-main_S6/target/classes/br/com/alura/comex/endereco/Endereco.class create mode 100644 comex-main_S6/target/classes/br/com/alura/comex/pedido/OrdenacaoPedido.class create mode 100644 comex-main_S6/target/classes/br/com/alura/comex/pedido/Pedido.class create mode 100644 comex-main_S6/target/classes/br/com/alura/comex/produto/Produto.class create mode 100644 comex-main_S6/target/classes/br/com/alura/comex/testes/ImpressaoDadosProduto.class create mode 100644 comex-main_S6/target/classes/br/com/alura/comex/testes/TesteCep.class create mode 100644 comex-main_S6/target/classes/br/com/alura/comex/testes/TesteClassePedido.class create mode 100644 comex-main_S6/target/classes/br/com/alura/comex/testes/TesteCliente.class create mode 100644 comex-main_S6/target/classes/br/com/alura/comex/testes/TesteProduto.class create mode 100644 comex-main_S6/target/classes/pedidos.csv diff --git a/comex-main_S6/README.md b/comex-main_S6/README.md new file mode 100644 index 00000000..cb743333 --- /dev/null +++ b/comex-main_S6/README.md @@ -0,0 +1,13 @@ +# Comex + +## Informações gerais dos pedidos em _pedidos.csv_ +- Campos: **CATEGORIA, PRODUTO, PREÇO, QUANTIDADE, DATA, CLIENTE** + + +### RELATÓRIO DE VALORES TOTAIS +- TOTAL DE PEDIDOS REALIZADOS: 16 +- TOTAL DE PRODUTOS VENDIDOS: 35 +- TOTAL DE CATEGORIAS: 5 +- MONTANTE DE VENDAS: R$ 178.374,49 +- PEDIDO MAIS BARATO: R$ 95,17 (Clean Code) +- PEDIDO MAIS CARO: R$ 55.056,00 (iPhone 13 Pro) diff --git a/comex-main_S6/pom.xml b/comex-main_S6/pom.xml new file mode 100644 index 00000000..2206296f --- /dev/null +++ b/comex-main_S6/pom.xml @@ -0,0 +1,45 @@ + + + 4.0.0 + + br.com.alura + comex + 0.0.1-SNAPSHOT + + + 17 + 17 + + + + + ch.qos.logback + logback-classic + 1.2.6 + + + org.junit.jupiter + junit-jupiter + 5.8.2 + test + + + com.fasterxml.jackson.core + jackson-databind + 2.13.1 + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + 2.13.1 + + + com.opencsv + opencsv + 5.7.1 + + + + \ No newline at end of file diff --git a/comex-main_S6/src/main/java/br/com/alura/comex/Main.java b/comex-main_S6/src/main/java/br/com/alura/comex/Main.java new file mode 100644 index 00000000..0cd05711 --- /dev/null +++ b/comex-main_S6/src/main/java/br/com/alura/comex/Main.java @@ -0,0 +1,81 @@ +//package br.com.alura.comex; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.net.URISyntaxException; +import java.text.NumberFormat; +import java.util.Arrays; +import java.util.Locale; + +//public class Main { +// +// private static final Logger logger = LoggerFactory.getLogger(Main.class); +// +// public static void main(String[] args) throws IOException, URISyntaxException { +// Pedido[] pedidos = ProcessadorDeCsv.processaArquivo("pedidos.csv"); +// +// int totalDeProdutosVendidos = 0; +// int totalDePedidosRealizados = 0; +// BigDecimal montanteDeVendas = BigDecimal.ZERO; +// Pedido pedidoMaisBarato = null; +// Pedido pedidoMaisCaro = null; +// +// String[] categoriasProcessadas = new String[10]; +// int totalDeCategorias = 0; +// +// for (int i = 0; i < pedidos.length; i++) { +// Pedido pedidoAtual = pedidos[i]; +// +// if (pedidoAtual == null) { +// break; +// } +// +// if (pedidoMaisBarato == null || pedidoAtual.getPreco().multiply(new BigDecimal(pedidoAtual.getQuantidade())).compareTo(pedidoMaisBarato.getPreco().multiply(new BigDecimal(pedidoMaisBarato.getQuantidade()))) < 0) { +// pedidoMaisBarato = pedidoAtual; +// } +// +// if (pedidoMaisCaro == null || pedidoAtual.getPreco().multiply(new BigDecimal(pedidoAtual.getQuantidade())).compareTo(pedidoMaisCaro.getPreco().multiply(new BigDecimal(pedidoMaisCaro.getQuantidade()))) > 0) { +// pedidoMaisCaro = pedidoAtual; +// } +// +// montanteDeVendas = montanteDeVendas.add(pedidoAtual.getPreco().multiply(new BigDecimal(pedidoAtual.getQuantidade()))); +// totalDeProdutosVendidos += pedidoAtual.getQuantidade(); +// totalDePedidosRealizados++; +// +// boolean jahProcessouCategoria = false; +// for (int j = 0; j < categoriasProcessadas.length; j++) { +// if (pedidoAtual.getCategoria().equalsIgnoreCase(categoriasProcessadas[j])) { +// jahProcessouCategoria = true; +// } +// } +// +// if (!jahProcessouCategoria) { +// totalDeCategorias++; +// +// if (categoriasProcessadas[categoriasProcessadas.length - 1] != null) { +// categoriasProcessadas = Arrays.copyOf(categoriasProcessadas, categoriasProcessadas.length * 2); +// } else { +// for (int k = 0; k < categoriasProcessadas.length; k++) { +// if (categoriasProcessadas[k] == null) { +// categoriasProcessadas[k] = pedidoAtual.getCategoria(); +// break; +// } +// } +// } +// } +// } +// +// logger.info("##### RELATÓRIO DE VALORES TOTAIS #####"); +// logger.info("TOTAL DE PEDIDOS REALIZADOS: {}", totalDePedidosRealizados); +// logger.info("TOTAL DE PRODUTOS VENDIDOS: {}", totalDeProdutosVendidos); +// logger.info("TOTAL DE CATEGORIAS: {}", totalDeCategorias); +// logger.info("MONTANTE DE VENDAS: {}", NumberFormat.getCurrencyInstance(new Locale("pt", "BR")).format(montanteDeVendas.setScale(2, RoundingMode.HALF_DOWN))); +// logger.info("PEDIDO MAIS BARATO: {} ({})", NumberFormat.getCurrencyInstance(new Locale("pt", "BR")).format(pedidoMaisBarato.getPreco().multiply(new BigDecimal(pedidoMaisBarato.getQuantidade())).setScale(2, RoundingMode.HALF_DOWN)), pedidoMaisBarato.getProduto()); +// logger.info("PEDIDO MAIS CARO: {} ({})\n", NumberFormat.getCurrencyInstance(new Locale("pt", "BR")).format(pedidoMaisCaro.getPreco().multiply(new BigDecimal(pedidoMaisCaro.getQuantidade())).setScale(2, RoundingMode.HALF_DOWN)), pedidoMaisCaro.getProduto()); +// logger.info("### FIM DO RELATÓRIO ###"); +// } +//} \ No newline at end of file diff --git a/comex-main_S6/src/main/java/br/com/alura/comex/ProcessadorDeCsv.java b/comex-main_S6/src/main/java/br/com/alura/comex/ProcessadorDeCsv.java new file mode 100644 index 00000000..1a34376f --- /dev/null +++ b/comex-main_S6/src/main/java/br/com/alura/comex/ProcessadorDeCsv.java @@ -0,0 +1,56 @@ +package br.com.alura.comex; + +import br.com.alura.comex.pedido.Pedido; + +import java.io.IOException; +import java.math.BigDecimal; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.Path; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.Arrays; +import java.util.Scanner; + +public class ProcessadorDeCsv { + + public static Pedido[] processaArquivo(String nomeDoArquivo) { + try { + URL recursoCSV = ClassLoader.getSystemResource(nomeDoArquivo); + Path caminhoDoArquivo = caminhoDoArquivo = Path.of(recursoCSV.toURI()); + + Scanner leitorDeLinhas = new Scanner(caminhoDoArquivo); + + leitorDeLinhas.nextLine(); + + Pedido[] pedidos = new Pedido[10]; + + int quantidadeDeRegistros = 0; + while (leitorDeLinhas.hasNextLine()) { + String linha = leitorDeLinhas.nextLine(); + String[] registro = linha.split(","); + + String categoria = registro[0]; + String produto = registro[1]; + BigDecimal preco = new BigDecimal(registro[2]); + int quantidade = Integer.parseInt(registro[3]); + LocalDate data = LocalDate.parse(registro[4], DateTimeFormatter.ofPattern("dd/MM/yyyy")); + String cliente = registro[5]; + + Pedido pedido = new Pedido(categoria, produto, cliente, preco, quantidade, data); + pedidos[quantidadeDeRegistros] = pedido; + + quantidadeDeRegistros++; + if (pedidos[pedidos.length - 1] != null) { + pedidos = Arrays.copyOf(pedidos, pedidos.length * 2); + } + } + + return pedidos; + } catch (URISyntaxException e) { + throw new RuntimeException(String.format("Arquivo {} não localizado!", nomeDoArquivo)); + } catch (IOException e) { + throw new RuntimeException("Erro ao abrir Scanner para processar arquivo!"); + } + } +} \ No newline at end of file diff --git a/comex-main_S6/src/main/java/br/com/alura/comex/cliente/Cliente.java b/comex-main_S6/src/main/java/br/com/alura/comex/cliente/Cliente.java new file mode 100644 index 00000000..310c4d00 --- /dev/null +++ b/comex-main_S6/src/main/java/br/com/alura/comex/cliente/Cliente.java @@ -0,0 +1,40 @@ +package br.com.alura.comex.cliente; + +import br.com.alura.comex.endereco.Endereco; + +public class Cliente { + // Variáveis de instância privadas para encapsular os dados do cliente + private String nome; + private String cpf; + private String email; + private String profissao; + private String telefone; + private Endereco endereco; + + // Construtor para inicializar um objeto Cliente com os valores passados como parâmetros + public Cliente(String nome, String cpf, String email, String profissao, String telefone, Endereco endereco) { + this.nome = nome; + this.cpf = cpf; + this.email = email; + this.profissao = profissao; + this.telefone = telefone; + this.endereco = endereco; + } + + // Métodos getters para acesso aos dados do cliente + public String getNome() { return nome; } + public String getCpf() { return cpf; } + public String getEmail() { return email; } + public String getProfissao() { return profissao; } + public String getTelefone() { return telefone; } + public Endereco getEndereco() { return endereco; } + + // Sobrescrita do método toString para fornecer uma representação em string do objeto Cliente + @Override + public String toString() { + return "Cliente: " + nome + "\nCPF: " + cpf + "\nE-mail: " + email + + "\nProfissão: " + profissao + "\nTelefone: " + telefone + + "\nEndereço: " + endereco.toString(); + } +} + diff --git a/comex-main_S6/src/main/java/br/com/alura/comex/endereco/ConsultaCep.java b/comex-main_S6/src/main/java/br/com/alura/comex/endereco/ConsultaCep.java new file mode 100644 index 00000000..25006f5d --- /dev/null +++ b/comex-main_S6/src/main/java/br/com/alura/comex/endereco/ConsultaCep.java @@ -0,0 +1,37 @@ +package br.com.alura.comex.endereco; + +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.net.http.HttpClient.Version; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class ConsultaCep { + + private static final String BASE_URL = "https://viacep.com.br/ws/"; + + public Endereco consultaCep(String cep) { + try { + HttpClient client = HttpClient.newBuilder() + .version(Version.HTTP_2) + .build(); + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(BASE_URL + cep + "/json/")) + .GET() + .build(); + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + + if (response.statusCode() == 200) { + ObjectMapper mapper = new ObjectMapper(); + return mapper.readValue(response.body(), Endereco.class); + } else { + System.err.println("Erro na consulta do CEP: " + response.statusCode()); + return null; + } + } catch (Exception e) { + System.err.println("Erro ao consultar CEP: " + e.getMessage()); + return null; + } + } +} diff --git a/comex-main_S6/src/main/java/br/com/alura/comex/endereco/Endereco.java b/comex-main_S6/src/main/java/br/com/alura/comex/endereco/Endereco.java new file mode 100644 index 00000000..12997fb2 --- /dev/null +++ b/comex-main_S6/src/main/java/br/com/alura/comex/endereco/Endereco.java @@ -0,0 +1,83 @@ +package br.com.alura.comex.endereco; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) // Ignora campos não mapeados no JSON +public class Endereco { + private String cep; + private String logradouro; + private String complemento; + private String bairro; + private String localidade; + private String uf; + private String ibge; // Campo adicionado + private String gia; // Campo adicionado + private String ddd; // Campo adicionado + private String siafi; // Campo adicionado + private String numero; + + // Construtor vazio necessário para a deserialização quando não são utilizadas anotações nos parâmetros do construtor + public Endereco() { + } + + // Construtor com anotações JsonProperty para mapeamento direto de JSON para os parâmetros do construtor + @JsonCreator + public Endereco(@JsonProperty("cep") String cep, + @JsonProperty("logradouro") String logradouro, + @JsonProperty("complemento") String complemento, + @JsonProperty("bairro") String bairro, + @JsonProperty("localidade") String localidade, + @JsonProperty("uf") String uf) { + this.cep = cep; + this.logradouro = logradouro; + this.complemento = complemento; + this.bairro = bairro; + this.localidade = localidade; + this.uf = uf; + } + + // Getters e setters para cada campo + public String getCep() { return cep; } + public void setCep(String cep) { this.cep = cep; } + + public String getLogradouro() { return logradouro; } + public void setLogradouro(String logradouro) { this.logradouro = logradouro; } + + public String getNumero() { return numero; } + public void setNumero(String numero) { this.numero = numero; } + + public String getComplemento() { return complemento; } + public void setComplemento(String complemento) { this.complemento = complemento; } + + public String getBairro() { return bairro; } + public void setBairro(String bairro) { this.bairro = bairro; } + + public String getLocalidade() { return localidade; } + public void setLocalidade(String localidade) { this.localidade = localidade; } + + public String getUf() { return uf; } + public void setUf(String uf) { this.uf = uf; } + + // Representação do objeto em String para fácil visualização + @Override + public String toString() { + return "Endereco{" + + "cep='" + cep + '\'' + + ", logradouro='" + logradouro + '\'' + + ", numero='" + numero + '\'' + + ", complemento='" + complemento + '\'' + + ", bairro='" + bairro + '\'' + + ", localidade='" + localidade + '\'' + + ", uf='" + uf + '\'' + + '}'; + } + + // Exemplo de configuração do ObjectMapper para ser usado ao deserializar +// public static void configureObjectMapper() { +// ObjectMapper mapper = new ObjectMapper(); +// mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + } + + diff --git a/comex-main_S6/src/main/java/br/com/alura/comex/pedido/OrdenacaoPedido.java b/comex-main_S6/src/main/java/br/com/alura/comex/pedido/OrdenacaoPedido.java new file mode 100644 index 00000000..b8c945e9 --- /dev/null +++ b/comex-main_S6/src/main/java/br/com/alura/comex/pedido/OrdenacaoPedido.java @@ -0,0 +1,37 @@ +package br.com.alura.comex.pedido; + + +import br.com.alura.comex.cliente.Cliente; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +public class OrdenacaoPedido { + public static void main(String... args){ + // Criação de pedidos simulada, substitua isto pelo código de criação dos pedidos + List pedidos = new ArrayList<>(); + pedidos.add(new Pedido(101, new Cliente("João Silva", "123.456.789-00", "joao@gmail.com", "Engenheiro", "9988776655", null), new BigDecimal("1200.00"), 2)); + pedidos.add(new Pedido(102, new Cliente("Maria Fernanda", "987.654.321-00", "maria@gmail.com", "Advogada", "9966554433", null), new BigDecimal("300.00"), 1)); + pedidos.add(new Pedido(103, new Cliente("Carlos Eduardo", "321.654.987-00", "carlos@gmail.com", "Médico", "9944221100", null), new BigDecimal("450.00"), 3)); + pedidos.add(new Pedido(104, new Cliente("Ana Paula", "321.654.987-00", "ana@gmail.com", "Designer", "9944221100", null), new BigDecimal("850.00"), 1)); + pedidos.add(new Pedido(105, new Cliente("Paulo Henrique", "321.654.987-00", "paulo@gmail.com", "Fotógrafo", "9944221100", null), new BigDecimal("1250.00"), 2)); + + // Ordenando por maior valor total + Collections.sort(pedidos, Comparator.comparing(Pedido::getValorTotal).reversed()); + System.out.println("\nPedidos ordenados por maior valor total:"); + for (Pedido pedido : pedidos) { + System.out.println("Pedido ID: " + pedido.getId() + ", Valor Total: " + pedido.getValorTotal()); + } + + // Ordenando por menor valor total + Collections.sort(pedidos, Comparator.comparing(Pedido::getValorTotal)); + System.out.println("\nPedidos ordenados por menor valor total:"); + for (Pedido pedido : pedidos) { + System.out.println("Pedido ID: " + pedido.getId() + ", Valor Total: " + pedido.getValorTotal()); + } + } +} + diff --git a/comex-main_S6/src/main/java/br/com/alura/comex/pedido/Pedido.java b/comex-main_S6/src/main/java/br/com/alura/comex/pedido/Pedido.java new file mode 100644 index 00000000..92348657 --- /dev/null +++ b/comex-main_S6/src/main/java/br/com/alura/comex/pedido/Pedido.java @@ -0,0 +1,147 @@ +package br.com.alura.comex.pedido; + +//import java.math.BigDecimal; +//import java.time.LocalDate; +// +//public class Pedido { +// +// private String categoria; +// private String produto; +// private String cliente; +// +// private BigDecimal preco; +// private int quantidade; +// +// private LocalDate data; +// +// public Pedido(String categoria, String produto, String cliente, BigDecimal preco, int quantidade, LocalDate data) { +// this.categoria = categoria; +// this.produto = produto; +// this.cliente = cliente; +// this.preco = preco; +// this.quantidade = quantidade; +// this.data = data; +// } +// +// public String getCategoria() { +// return categoria; +// } +// +// public String getProduto() { +// return produto; +// } +// +// public String getCliente() { +// return cliente; +// } +// +// public BigDecimal getPreco() { +// return preco; +// } +// +// public int getQuantidade() { +// return quantidade; +// } +// +// public LocalDate getData() { +// return data; +// } +// +// @Override +// public String toString() { +// return "Pedido{" + +// "categoria='" + categoria + '\'' + +// ", produto='" + produto + '\'' + +// ", cliente='" + cliente + '\'' + +// ", preco=" + preco + +// ", quantidade=" + quantidade + +// ", data=" + data + +// '}'; +// } +// +//} + +import br.com.alura.comex.cliente.Cliente; + +import java.math.BigDecimal; +import java.time.LocalDate; + +public class Pedido { + // Atributos privados + private int id; + private Cliente cliente; + private BigDecimal preco; + private int quantidade; + + // Construtor + public Pedido(int id, Cliente cliente, BigDecimal preco, int quantidade) { + this.id = id; + this.cliente = cliente; + this.preco = preco; + this.quantidade = quantidade; + } + + public Pedido(String categoria, String produto, String cliente, BigDecimal preco, int quantidade, LocalDate data) { + } + + // Getters e Setters + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public Cliente getCliente() { + return cliente; + } + + public void setCliente(Cliente cliente) { + this.cliente = cliente; + } + + public BigDecimal getPreco() { + return preco; + } + + public void setPreco(BigDecimal preco) { + this.preco = preco; + } + + public int getQuantidade() { + return quantidade; + } + + public void setQuantidade(int quantidade) { + this.quantidade = quantidade; + } + + // Método para calcular o valor total do pedido + public BigDecimal getValorTotal() { + return preco.multiply(new BigDecimal(quantidade)); + } + + // Método para comparar se este pedido é mais barato que outro + public boolean isMaisBaratoQue(Pedido outroPedido) { + return this.getValorTotal().compareTo(outroPedido.getValorTotal()) < 0; + } + + // Método para comparar se este pedido é mais caro que outro + public boolean isMaisCaroQue(Pedido outroPedido) { + return this.getValorTotal().compareTo(outroPedido.getValorTotal()) > 0; + } + + // Método toString para exibir informações do pedido incluindo valor total + @Override + public String toString() { + return "Pedido{" + + "id=" + id + + ", cliente=" + cliente.getNome() + + ", preço=" + preco + + ", quantidade=" + quantidade + + ", valor total=" + getValorTotal() + + '}'; + } +} + diff --git a/comex-main_S6/src/main/java/br/com/alura/comex/produto/ComparaProduto.java b/comex-main_S6/src/main/java/br/com/alura/comex/produto/ComparaProduto.java new file mode 100644 index 00000000..30bd30e8 --- /dev/null +++ b/comex-main_S6/src/main/java/br/com/alura/comex/produto/ComparaProduto.java @@ -0,0 +1,23 @@ +import br.com.alura.comex.cliente.Cliente; +import br.com.alura.comex.pedido.Pedido; + +import java.math.BigDecimal; + +// Classe TestePedido +public class ComparaProduto { + public static void main(String[] args) { + Cliente cliente = new Cliente("João Silva", "123.456.789-00", "joao.silva@gmail.com", "Engenheiro", "51 99876-5432", null); + Pedido pedido1 = new Pedido(101, cliente, new BigDecimal("150.00"), 2); + Pedido pedido2 = new Pedido(102, cliente, new BigDecimal("200.00"), 1); + + System.out.println(pedido1); + System.out.println(pedido2); + + // Usando operador ternário para converter boolean para "Sim" ou "Não" + String maisCaro = pedido1.isMaisCaroQue(pedido2) ? "Sim" : "Não"; + String maisBarato = pedido1.isMaisBaratoQue(pedido2) ? "Sim" : "Não"; + + System.out.println("Pedido 1 é mais caro que Pedido 2? " + maisCaro); + System.out.println("Pedido 1 é mais barato que Pedido 2? " + maisBarato); + } +} diff --git a/comex-main_S6/src/main/java/br/com/alura/comex/produto/Produto.java b/comex-main_S6/src/main/java/br/com/alura/comex/produto/Produto.java new file mode 100644 index 00000000..4ce2ac65 --- /dev/null +++ b/comex-main_S6/src/main/java/br/com/alura/comex/produto/Produto.java @@ -0,0 +1,77 @@ +package br.com.alura.comex.produto; + +import java.util.Objects; + +public class Produto { + private final String nome; + private final String descricao; + private final double precoUnitario; + private final int quantidade; + + // Construtor que valida a obrigatoriedade do nome + public Produto(String nome, String descricao, double precoUnitario, int quantidade) { + if (nome == null || nome.trim().isEmpty()) { + throw new IllegalArgumentException("O nome do produto é obrigatório e não pode ser vazio."); + } + this.nome = nome; + this.descricao = descricao; + this.precoUnitario = precoUnitario; + this.quantidade = quantidade; + } + + // Getters + public String getNome() { + return nome; + } + + public String getDescricao() { + return descricao; + } + + public double getPrecoUnitario() { + return precoUnitario; + } + + public int getQuantidade() { + return quantidade; + } + + // Método toString + @Override + public String toString() { + return "Produto{" + + "nome='" + nome + '\'' + + ", descricao='" + descricao + '\'' + + ", preço unitário=" + precoUnitario + + ", quantidade=" + quantidade + + '}'; + } + + // Método equals + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null || getClass() != obj.getClass()) return false; + Produto produto = (Produto) obj; + return Double.compare(produto.precoUnitario, precoUnitario) == 0 && + quantidade == produto.quantidade && + nome.equals(produto.nome) && + descricao.equals(produto.descricao); + } + + // Método hashCode + @Override + public int hashCode() { + return Objects.hash(nome, descricao, precoUnitario, quantidade); + } + + // Método para imprimir os detalhes do produto + public void imprimirDetalhes() { + System.out.println(">> Dados do produto"); + System.out.println(":: Nome: " + nome); + System.out.println(":: Descrição: " + descricao); + // Adicionalmente, você pode imprimir preço e quantidade se necessário + System.out.println(":: Preço Unitário: " + precoUnitario); + System.out.println(":: Quantidade: " + quantidade); + } +} diff --git a/comex-main_S6/src/main/java/br/com/alura/comex/testes/ImpressaoDadosProduto.java b/comex-main_S6/src/main/java/br/com/alura/comex/testes/ImpressaoDadosProduto.java new file mode 100644 index 00000000..70843817 --- /dev/null +++ b/comex-main_S6/src/main/java/br/com/alura/comex/testes/ImpressaoDadosProduto.java @@ -0,0 +1,13 @@ +package br.com.alura.comex.testes; + +import br.com.alura.comex.produto.Produto; + +public class ImpressaoDadosProduto { + public static void main(String[] args) { + // Criação e inicialização do produto + Produto produto = new Produto("Livro", "Conjunto de folhas impressas.", 19.99, 100); + + // Invocação do método de impressão dos detalhes do produto + produto.imprimirDetalhes(); + } +} diff --git a/comex-main_S6/src/main/java/br/com/alura/comex/testes/TesteCep.java b/comex-main_S6/src/main/java/br/com/alura/comex/testes/TesteCep.java new file mode 100644 index 00000000..afd95932 --- /dev/null +++ b/comex-main_S6/src/main/java/br/com/alura/comex/testes/TesteCep.java @@ -0,0 +1,15 @@ +package br.com.alura.comex.testes; + +import br.com.alura.comex.endereco.ConsultaCep; +import br.com.alura.comex.endereco.Endereco; + +public class TesteCep { + public static void main(String[] args) { + ConsultaCep service = new ConsultaCep(); + Endereco endereco = service.consultaCep("12237600"); + if (endereco != null) { + System.out.println(endereco); + } + } +} + diff --git a/comex-main_S6/src/main/java/br/com/alura/comex/testes/TesteClassePedido.java b/comex-main_S6/src/main/java/br/com/alura/comex/testes/TesteClassePedido.java new file mode 100644 index 00000000..63ab051d --- /dev/null +++ b/comex-main_S6/src/main/java/br/com/alura/comex/testes/TesteClassePedido.java @@ -0,0 +1,38 @@ +package br.com.alura.comex.testes; + +import br.com.alura.comex.cliente.Cliente; +import br.com.alura.comex.pedido.Pedido; +import br.com.alura.comex.produto.Produto; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +public class TesteClassePedido { + public static void main(String[] args) { + // Criando clientes + Cliente cliente1 = new Cliente("João Silva", "123.456.789-00", "joao.silva@gmail.com", "Engenheiro", "51 99876-5432", null); + Cliente cliente2 = new Cliente("Maria Oliveira", "987.654.321-00", "maria.oliveira@gmail.com", "Médica", "21 98765-4321", null); + + // Criando produtos (simplificado, apenas o nome para exemplificar) + Produto produto1 = new Produto("Notebook", "Notebook Dell", 3500.00, 10); + Produto produto2 = new Produto("Smartphone", "iPhone 13", 5000.00, 5); + Produto produto3 = new Produto("Impressora", "Impressora HP", 800.00, 15); + + // Criando pedidos + List pedidos = new ArrayList<>(); + pedidos.add(new Pedido(101, cliente1, new BigDecimal("3500.00"), 1)); + pedidos.add(new Pedido(102, cliente1, new BigDecimal("7000.00"), 2)); // 2 notebooks + pedidos.add(new Pedido(103, cliente2, new BigDecimal("5000.00"), 1)); + pedidos.add(new Pedido(104, cliente2, new BigDecimal("1600.00"), 2)); // 2 impressoras + pedidos.add(new Pedido(105, cliente1, new BigDecimal("800.00"), 1)); + + // Exibindo informações dos pedidos + for (Pedido pedido : pedidos) { + System.out.println("Produto: " + pedido.getCliente().getNome() + ", Cliente: " + pedido.getCliente().getNome() + + ", Preço: " + pedido.getPreco() + ", Valor Total: " + pedido.getValorTotal()); + } + } +} + + diff --git a/comex-main_S6/src/main/java/br/com/alura/comex/testes/TesteCliente.java b/comex-main_S6/src/main/java/br/com/alura/comex/testes/TesteCliente.java new file mode 100644 index 00000000..5d943e78 --- /dev/null +++ b/comex-main_S6/src/main/java/br/com/alura/comex/testes/TesteCliente.java @@ -0,0 +1,106 @@ +package br.com.alura.comex.testes; + +import br.com.alura.comex.cliente.Cliente; +import br.com.alura.comex.endereco.Endereco; +import br.com.alura.comex.endereco.ConsultaCep; +import java.util.Scanner; + +public class TesteCliente { + + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + ConsultaCep cepService = new ConsultaCep(); // Supondo que essa classe esteja corretamente implementada + + System.out.println("Digite 'sair' a qualquer momento para terminar o programa."); + + // Solicita o CEP do usuário + System.out.println("Por favor, insira o CEP para consulta:"); + String cep = scanner.nextLine(); + if ("sair".equalsIgnoreCase(cep)) { + System.out.println("Programa encerrado."); + scanner.close(); + return; + } + + // Consulta o CEP usando o serviço ViaCep + Endereco endereco = cepService.consultaCep(cep); + if (endereco == null) { + System.out.println("Não foi possível encontrar o endereço para o CEP fornecido."); + scanner.close(); + return; + } + + System.out.println("Endereço encontrado:"); + System.out.println("Logradouro: " + endereco.getLogradouro()); + + // Solicitar número do endereço + System.out.println("Por favor, insira o número do endereço:"); + String numero = scanner.nextLine(); + if ("sair".equalsIgnoreCase(numero)) { + System.out.println("Programa encerrado."); + scanner.close(); + return; + } + endereco.setNumero(numero); + + // Solicitar complemento do endereço + System.out.println("Por favor, insira o complemento do endereço (se houver):"); + String complemento = scanner.nextLine(); + if ("sair".equalsIgnoreCase(complemento)) { + System.out.println("Programa encerrado."); + scanner.close(); + return; + } + endereco.setComplemento(complemento); + + // Solicitação dos dados do Cliente + System.out.println("Por favor, insira o nome do cliente:"); + String nomeCliente = scanner.nextLine(); + if ("sair".equalsIgnoreCase(nomeCliente)) { + System.out.println("Programa encerrado."); + scanner.close(); + return; + } + + System.out.println("Por favor, insira o CPF do cliente:"); + String cpf = scanner.nextLine(); + if ("sair".equalsIgnoreCase(cpf)) { + System.out.println("Programa encerrado."); + scanner.close(); + return; + } + + System.out.println("Por favor, insira o email do cliente:"); + String email = scanner.nextLine(); + if ("sair".equalsIgnoreCase(email)) { + System.out.println("Programa encerrado."); + scanner.close(); + return; + } + + System.out.println("Por favor, insira a profissão do cliente:"); + String profissao = scanner.nextLine(); + if ("sair".equalsIgnoreCase(profissao)) { + System.out.println("Programa encerrado."); + scanner.close(); + return; + } + + System.out.println("Por favor, insira o telefone do cliente:"); + String telefone = scanner.nextLine(); + if ("sair".equalsIgnoreCase(telefone)) { + System.out.println("Programa encerrado."); + scanner.close(); + return; + } + + // Criação de um objeto Cliente usando o objeto Endereco criado e os dados coletados + Cliente cliente = new Cliente(nomeCliente, cpf, email, profissao, telefone, endereco); + + // Impressão das informações do Cliente e do Endereço completo no console + System.out.println("Informações completas do Cliente e Endereço:"); + System.out.println(cliente); + + scanner.close(); + } +} diff --git a/comex-main_S6/src/main/java/br/com/alura/comex/testes/TesteProduto.java b/comex-main_S6/src/main/java/br/com/alura/comex/testes/TesteProduto.java new file mode 100644 index 00000000..8c49115a --- /dev/null +++ b/comex-main_S6/src/main/java/br/com/alura/comex/testes/TesteProduto.java @@ -0,0 +1,37 @@ +package br.com.alura.comex.testes; + +import br.com.alura.comex.produto.Produto; +import java.util.Scanner; + +public class TesteProduto { + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + + System.out.println("Por favor, insira o nome do produto:"); + String nome = scanner.nextLine().trim(); + + // Verificar se o nome é válido (não vazio e não nulo) + while (nome.isEmpty()) { + System.out.println("O nome do produto é obrigatório e não pode ser vazio. Por favor, insira o nome do produto:"); + nome = scanner.nextLine().trim(); + } + + System.out.println("Por favor, insira a descrição do produto:"); + String descricao = scanner.nextLine().trim(); + + System.out.println("Por favor, insira o preço unitário do produto:"); + double precoUnitario = scanner.nextDouble(); + + System.out.println("Por favor, insira a quantidade do produto:"); + int quantidade = scanner.nextInt(); + + // Criação do objeto Produto com dados fornecidos pelo usuário + Produto produto = new Produto(nome, descricao, precoUnitario, quantidade); + + // Impressão das informações do produto + System.out.println("Informações do Produto:"); + System.out.println(produto); + + scanner.close(); // Fechar o scanner após o uso + } +} diff --git a/comex-main_S6/src/main/resources/pedidos.csv b/comex-main_S6/src/main/resources/pedidos.csv new file mode 100644 index 00000000..21e55498 --- /dev/null +++ b/comex-main_S6/src/main/resources/pedidos.csv @@ -0,0 +1,17 @@ +CATEGORIA,PRODUTO,PRECO,QUANTIDADE,DATA,CLIENTE +INFORMÁTICA,Notebook Samsung,3523.00,1,01/01/2022,ANA +MÓVEIS,Sofá 3 lugares,2500.00,1,05/01/2022,ANA +LIVROS,Clean Architecture,102.90,2,08/01/2022,ANA +MÓVEIS,Mesa de jantar 6 lugares,3678.98,1,06/01/2022,ELI +CELULARES,iPhone 13 Pro,9176.00,6,13/01/2022,ANA +INFORMÁTICA,"Monitor Dell 27""",1889.00,3,04/01/2022,DANI +LIVROS,Implementing Domain-Driven Design,144.07,3,10/01/2022,GABI +AUTOMOTIVA,Jogo de pneus,1276.79,1,15/01/2022,BIA +LIVROS,Clean Code,95.17,1,09/01/2022,BIA +CELULARES,Galaxy S22 Ultra,8549.10,5,14/01/2022,DANI +INFORMÁTICA,Macbook Pro 16,31752.00,1,03/01/2022,CAIO +LIVROS,Refactoring Improving the Design of Existing Code,173.90,1,12/01/2022,DANI +MÓVEIS,Cama queen size,3100.00,2,07/01/2022,DANI +AUTOMOTIVA,Central multimidia,711.18,1,16/01/2022,CAIO +LIVROS,Building Microservices,300.28,2,11/01/2022,CAIO +INFORMÁTICA,Galaxy Tab S8,5939.10,4,02/01/2022,BIA \ No newline at end of file diff --git a/comex-main_S6/src/test/resources/pedidos.csv b/comex-main_S6/src/test/resources/pedidos.csv new file mode 100644 index 00000000..21e55498 --- /dev/null +++ b/comex-main_S6/src/test/resources/pedidos.csv @@ -0,0 +1,17 @@ +CATEGORIA,PRODUTO,PRECO,QUANTIDADE,DATA,CLIENTE +INFORMÁTICA,Notebook Samsung,3523.00,1,01/01/2022,ANA +MÓVEIS,Sofá 3 lugares,2500.00,1,05/01/2022,ANA +LIVROS,Clean Architecture,102.90,2,08/01/2022,ANA +MÓVEIS,Mesa de jantar 6 lugares,3678.98,1,06/01/2022,ELI +CELULARES,iPhone 13 Pro,9176.00,6,13/01/2022,ANA +INFORMÁTICA,"Monitor Dell 27""",1889.00,3,04/01/2022,DANI +LIVROS,Implementing Domain-Driven Design,144.07,3,10/01/2022,GABI +AUTOMOTIVA,Jogo de pneus,1276.79,1,15/01/2022,BIA +LIVROS,Clean Code,95.17,1,09/01/2022,BIA +CELULARES,Galaxy S22 Ultra,8549.10,5,14/01/2022,DANI +INFORMÁTICA,Macbook Pro 16,31752.00,1,03/01/2022,CAIO +LIVROS,Refactoring Improving the Design of Existing Code,173.90,1,12/01/2022,DANI +MÓVEIS,Cama queen size,3100.00,2,07/01/2022,DANI +AUTOMOTIVA,Central multimidia,711.18,1,16/01/2022,CAIO +LIVROS,Building Microservices,300.28,2,11/01/2022,CAIO +INFORMÁTICA,Galaxy Tab S8,5939.10,4,02/01/2022,BIA \ No newline at end of file diff --git a/comex-main_S6/target/classes/ComparaProduto.class b/comex-main_S6/target/classes/ComparaProduto.class new file mode 100644 index 0000000000000000000000000000000000000000..ab4dd7c6d869917410caf14a7721b184457c8dc3 GIT binary patch literal 2102 zcmb_d-BS}+6#rdF*d>GyH-J*DjTSXQ$R^?2pePY4HXt@MirUtj5Fgun>tR<&8C$=#;0a7_v74i&ON{1Ip^+Q?~eWia2tCebfH^8 zAdDb-7>0KFKG#idRrE*2T~YEFdX@~!@a`~l$KnMAD#O*HqnGTO&dr9y2wGRhGo$Y?N(%t2rqclaM9JHSSgQ6{B)rl#CiTRa_*lQ?toL zG8w`Jd@QkDW*F&!EnWy=6j7;hg<(0ip6hV$sf@G;IdyAhJzh}pDczh-%A0#}4c8Ui z2qT7gTRG$pTu;=f3hV|I#fVR@LAZ!*k2n{+mI>h|CKXJDk$}z+Y2s|xVNmMQ!n967 z^UIBhl+aRPq%ln?H{1r9j@ja2XtrGX17+#fDuE#CUWw_oc4`+)^QgBz|zpQ~_ zNkNv%K5N(Nbla9=mm8ime_36io)6EMUy02&MtAYz#T*GTf%@>H7J0g zT)UeL`JsLx9!F!(&ju1N&^dQ1WEtsjOnGP(2*Y?MQcstUOkA^sQ}h6IGHB1jf9h!l zmBMW1Py#&DsMP54+)oFkJn!++-UhEX(JOe;UWLu(CX>9~a7tp$kgP@8iAl&S$ZEy5 zJ=b%1eM5LvyX+43;6(^u;cEro$aKFXF^BSHK!CdA4)F@bk&sw-kM+ z54cq}g*%?J?Y&0*!;emz;r2mYbWlH;see1-1Z6E3S#Fwn!xI@5MQRHFX^EzyZ-0wQ zDx)Rpm*}?*5pA8Mm!nKYnc>D6)nc;?PAfBn*DXspS(Cf2a1~VOnloH=qCkPcaQVZk z^xF7*;R;sh`y+o{)GhP{qVYcMbeb8>!HGk#-etm7d` z$e2w)B~9R`V<}Vey;!^MspKLURuYBQE5(Y@P z`3J@)-(Z5KDVio}Nd5vpKW9XwA?5Bta@Hx)m1vJz!jPEgmAL+G{81MKv=sZWe2pZVHCZUYsB_3gmNV`pE zk7?CS_LKMmc?8JIMQqb5h%d?N5(4k=RDq&kl>YY=6#m8ljdDeHPf4c>J9tL(0Ii;r Sf8HER5F`uH{uQd&#n?ZMhASNa literal 0 HcmV?d00001 diff --git a/comex-main_S6/target/classes/br/com/alura/comex/ProcessadorDeCsv.class b/comex-main_S6/target/classes/br/com/alura/comex/ProcessadorDeCsv.class new file mode 100644 index 0000000000000000000000000000000000000000..3c6c667eaf126658a36e2c2b2fbf430a095627b3 GIT binary patch literal 2819 zcma)8YjYD-7=BKh^rY#wKxu*HA}JJUp=BZ56D~pv8chKkC>FeJH`{h0*-bZ_+Jblk z?=w2%H=Xg5&iDmK(HYv20iAKi5x??toDrYhq-|P)lFRNn?>XnaJnwVfbN>40mwNyX zh@ep-s-OvqK>Nb< zzMNhxrX4+Nx&kZ4OfNHC^vwLAS#(OSVG3;ON-xaLc&=rSCA-Ta+w`<^gXv@xEm$V8 zT)_&o3Mj$+%Ai2lbIuK>=wsKSWvOHn+R!esO2KNZ5oj$hvm9;I%9+|3-5VFEb4CR^ zD=w5(rsmC8Pfbd!WdMPWl4s?#jG^1M=|-Vqy^qocfz@+*7A^GAQL#}$3>^Xy+nn;! zmd(i9<{S=it%NSISs*szYKD{7^jyi+{gyeU70j%ab+j|V%h$L?!PD3(&@`?WPt7Z3 zHZDZaEg*WL*p42FUIja#Ey`ip7NIK^au##BwN?%;KAIPaU35FZAW!(Tq=?AOvp5cXle!~q2dk(fg=h&*L`=9o{9NI`dtCcBT(k&57uKs1}x1_rcg zexf*nqY}?3IELe-Qs9|q~&o|QOj576X+5!h^d0GzpKedpN z{Wu|UQo*x$PGIGN;k0AuIo~YN4Z;z~R9opA*WHXcQ8I1AOg@RJ3aJBs=9SZdO?ckN z`vn2BT7QK`kLK=ik|l{urmCD;u;-I_0H-8QD>#D}=hzhNgk!F&PZwDc45u)Cn)|7{ ztC~CIf{{#h*APl%1U6qx{~zDE`_2ih3t+D7(#*8&=~E}B471=_jxBLsU~MoVAk|>W z_92@ek6@Szj=2*hYto5by%w{7|Hg^s{A^iQ^sLk2@0N=SUdAhoq)Z=ygEgS75k@6P z)%!S#A?%iTeU2O~38~Xn-i!$Jo^V|!rt>%AT5haTP-0|_9xJ$xVHS(J8`H}!cSvLj zRSlrdRHkMfx8Lk5P6~wjoGkgb%r7&iO8F7fJ*$u8C}|B6I;6Xn->(Qm-nhl=ZK;)n zrMi>UI_FviOM(40Kw`3MxVor@QCB!;+2gwJ*Fxed1ZFjG%`vO!xeg($#(aK4qrq)9 z<}ermNw2ack8{HX*EINERo1zb-mD)JC7s;J@K;|J*Cakw8#&8li6Sk^ z{JRxmuur#}oV!x*1Rc>=~^ zvDb)8xJ(Hb*PY+7=EcWheQl*TyCTDSY z7JUgtm63R&`3^P>s}Z$PZC0c0O{y}3RH8)#F+twA$9K8y5k z7)*q|dw5k1{g}Rkq2bn-LU&O&T)!_5n3=X!B!*f z48f&^D6I{^Ly1?yJdR=#Z!nETp8iwpH`9J6rg4Q=yD+}TRlLcBw%}V_!&{7d4ZgzL zc!%+J;xoL93_^_TQ@lrgVfxpO>$t%c_i5)k-Vf;U03T2@@FD*@5Prx74HDZWS|r*e dREa?{>Tlerd+0NeL;mCJIZ00i{qcGE@xKj>@`V5Z literal 0 HcmV?d00001 diff --git a/comex-main_S6/target/classes/br/com/alura/comex/cliente/Cliente.class b/comex-main_S6/target/classes/br/com/alura/comex/cliente/Cliente.class new file mode 100644 index 0000000000000000000000000000000000000000..0057368509c094446af8132f56c10ce860291bb8 GIT binary patch literal 2047 zcmcIlOHb5L6#g#r=r9%-0nriVCE!rS`hGAz86leBBZ1(;)umjZQhFzCF}gGHPq=rX zOHCY2T)1)Pk20RqmViTJ*qG+_JbJ!!&pqed(_g>8{{V0cb7gcOXCQB)fTBR53%bh5p(?Hq8A(#SVD}n9kEn9lqfn-j-vK`M=ex&S1 zLIv_Z=>>Whc6~2Kf$Oi=*;}`X9(I*;nrkc{Hqpy+L2XIbV@0^-ee zauk97+SL97_EM6^O-x`?;OLgzR1NJrGJ57l8^nc?^rKMVO>IB&|7kM96nOhTLpVq- z>r>0rDGj|!ozk=5`s(ra)`|+2~By0w%FfciKzf5Q$4^UnSB`qX^Wf&<8q^KzUJb2acL|`3z=yAUha z%!nvAp3XCwo93)Dm*)KEd(F~L%43`OX8!!ZA1HYbeP0C)Pllli4crr$*q58EBO7Q4 z4E@`bMqH8~y80y=hd`0uG~bBp;NcWg8cH#xQ4~`eJ~5?vL$m~%SU64Z8c81sXAqsV zzCl=LS}?4$Ep%DaEmW*(zJ)%kT4-Uwsuo+QevbW2(R+;ifOgEIf=(PpH;uwRdaCHh zFb%;848S6b2Z?u_!C8`MpEz0(a~v<9VUouvaxup-=VOkeF2o$iU8H!YY1brbn<)Dz zSYKd#BBlcz6dQp;;Em11Al+EtTqd}y9eg|!Y-fTi?cl*o@cB$|Upx3jCip@oc%U78 zG823emnaKd=Di84wu6T*THx@c8s_0bxjRsD*S-*F1qb=)17^A!E} nCNM&ub}KTPRwReZ6jukX;3`pW%4@W4;SNb<;_hM=_fh==`)t9( literal 0 HcmV?d00001 diff --git a/comex-main_S6/target/classes/br/com/alura/comex/endereco/ConsultaCep.class b/comex-main_S6/target/classes/br/com/alura/comex/endereco/ConsultaCep.class new file mode 100644 index 0000000000000000000000000000000000000000..4a22050ff1ad2a3cb77e90a77a87401bf23316ba GIT binary patch literal 3310 zcmb7HX^iVEdBxDFn$fA1f>efRFtDa zplVW|*0q#wj%%mmlQQ87R2(u)!#yHU+R{22MhKM(!YbB471-pHo6^-LTsNcja)_l2 zY4Tdwl$X1*Mk*<7f##Oh{*_3Z1FC2x9>6*URVu1cBM@2f!l<+z!!oH_@5spD#r*=? zR^}cMN7tYhbqY49*oaN5abHqena<1UY58yd_hF!?LW7FU*dkCK_plMzvI;WMFdFfo zf{2H9lR*8whz!X~S?Lh&9Yy&B$4d~`(COP%G-HRr#J$>2&C>cbF_AWlUtNxwVQGU*C6{VTJsquqz_VT| zUL-|JU(x*15m%5M@yN)OQ^p?!I_-s9&I_0MCG< zz}kGt@%<126Q$k@YNu1vrVX8Xw$qdCly}+D7#g`aTi0)x@>Dh*m-dJrPf_8Tek-A; zMs?fp*1=|(J7JJvYyW+!8x>fSDAc~Q7@Vte%f}g6Riyp!7HI4LAKBntOa#woLy>IG zJ*}it?0nhZT!btrc%%#2LH_fdDM}b5y?`K&L7XlR6LKk~Cj>SuM|n1rM|$5XoDb#B ze3pUVkC5ZqVV6~bB_MECc-YF?3E5+K?yM>ZqINIlxz%M^uH)KzWXr5M%;ld zEMgllkDUwH>us|EUBDv(r}nnZ(6DJfi6^WtfIEn z>=J7@t|u_H)Ub~I*#qTv?1BaK5gKh<#C+h{gw%C<)7{!<$6 zU|L|JCQnq}GE35ZYq&?GIj%HaN8s1_%b-7|XW{Z;0#Tz_QN(J+kn}B=%K|aSkcS3M z<*hPJ4Hpbky=v5o%HEU3DtSf=7IAYRZG-K=8Fh~gx@4wsm1oQeSRa**g#&@~n}+Ec zHFaP(2H}2YnwBeFgC0m=rNF6oC>>YX?`l>3Se8y4%hcuhBK-x~d0R=>vI+k5#b7(q zmNiA2FGSU^7InwA>dJP{C~WMM(w``fSCpIQM87c~`fPD0m>&S|_&c8136X{Pk@{u5DNB?CX9B-+oFIxOY}pA&K2jvBl%h)G^oR z#N5(UyDR#(-@Sajqc!>tzbCdfw%*aV8;2}^5zw|xQ`z~dbR6X*uq!ZoiMudL64)2G z{r^j;3Vixjy5rtO~;x@Wz+E{((Mzb>7u|Cop1*On8pz9Vhl4#V-}wwL*F^? zKROFjmKKa9tR_=0A6^BS$@yTm;X+dTQZ z7rosnf5kZ$@qi0~N1-5+-5{1jL9B*@NOpr*=>dZClW+cID2T~!5cfhsJPrpj*$v`; z4-lN(3}P)5#7H-Y2caNx;UGr3K|JgMg42*eJP8Fc)(zrOD2VlN5M$jSR(pWp3SbaV zLqVjvK|Brx@l`m8R5ysV9w4~*7{u41Aky6+o`iyU77n7Li}=;C-U9^JJ%iXd2T`DI z!qqsPr4pr)q%lcjgvJ<+6pi$IYCz~lxY2=dI;g-X@)RqAZ@k{ZJ>)r!%^&bBwrHZC TjBOgP@jY3Cq`ko&4v_v2YQ|kJ literal 0 HcmV?d00001 diff --git a/comex-main_S6/target/classes/br/com/alura/comex/pedido/OrdenacaoPedido.class b/comex-main_S6/target/classes/br/com/alura/comex/pedido/OrdenacaoPedido.class new file mode 100644 index 0000000000000000000000000000000000000000..1df4eddd46f7a20712a1123232cd5182f8d6f8d6 GIT binary patch literal 3589 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 BccB0P literal 0 HcmV?d00001 diff --git a/comex-main_S6/target/classes/br/com/alura/comex/produto/Produto.class b/comex-main_S6/target/classes/br/com/alura/comex/produto/Produto.class new file mode 100644 index 0000000000000000000000000000000000000000..ae1a36927893f45942710a3b165be9af06628ab4 GIT binary patch literal 2999 zcmai0`BM{T7=AvIu#heaK@hFdMFmMfQmt1(tV%#p5N!}edo9TdE6Hx$Y^X&$k;x0-1J(?04*YKJW9s%b$NQ{Q_VRpM+6^fP$ck z5NZV)ujmVUJfmB)@rju$M#>eaJ!D#@dsraQ9i0lJ4)qGcDjtJcA)a&{)0!0sa?J{C z=#Gx9*z#WvNbPkh)}v8CG4sROoO|7~dr?6|VB3nqXeMLK>Y1a?Y$0n{?(nsgk#kMk zs>23>gA2B|du@Etsd{X}W(AL{*n+K$XvT@B>}*`m6dYadjBD|t%lH}JH8YmM2t?M} zlh&S4p-EHqX(OL<%#?1++ifbgV~0RP&M{Khs2sZKZVgyy?zymv?-)2no9|lVQ9H;mYX_ccJb?B04IIe^ABK=qINPW|pDp ziYoYw8;D+%#t*5aCt0T~5PW0evXo7f$L#xIAV+Xi!7(X5B+yjGADdyExxj8lQX8}vKb6LJ5YzSg!b@ZEup9Fd>NU;NMcgKITcfqsLftRmCA%ACrxFn z2m~%jPD~4QRjGVAV#O|uu;njA5WsU%@A);rmc)X1QA)fdB`OdsN(e-&cq~JzC`YbM z5z8Sqqrmzx(=tvMvNMJ=se43;jM*tYGsOmw=i+71oika09b^CBfdg!#q^qaq$MsxM zTOoN*dtIq=mw429tPziADqD_YEkO%>aki}6cuP*yxwfB!Eal9V$|f)Jz^jEfg(xri z;^*0DW?7=F=_CwS&&(N2CY-bjPRbZDWqYW_`OzoK%fOD=wwreyJvVN+b9Oqvz82TQ zxQ-hNZptdWLNHdiZCVTVyb{y;;|B9uim+(yGgG)+gE@1y0{SkFDQ z#d`0dJr=!(j#x|R9y-6LRsbnJw{Z*uDt$N5>pJ>xWIRpi;;9GC*o_THQ(`au(i03^ z<|=nGQsM1ntTO&R@*_sOawp>rVV3(A)ciwZAqATh)bTGsEt$w1-TH~dxk^)^*iUHt zj++`Uwp#D9&GRosDNyt;U{+ObU#+~Qs`3@g)0~7bPFIgScYM3bvsP6(gKSB8CG5_- ztCV+CRkliDA7L`mbF0jmzjppQ`0HFk6j+@{tjt<#2?TyTi=q6^0!rX7#CpC)D0r7_ zSQlHwE;3@*R|o~}_WXuTv$?00|Iv?PfJ$>hMf JLwt-){{oubv1b4P literal 0 HcmV?d00001 diff --git a/comex-main_S6/target/classes/br/com/alura/comex/testes/ImpressaoDadosProduto.class b/comex-main_S6/target/classes/br/com/alura/comex/testes/ImpressaoDadosProduto.class new file mode 100644 index 0000000000000000000000000000000000000000..451ad1942029ad526998eb17bc9fefac7b9143f1 GIT binary patch literal 724 zcmb7CZA%+L5Pmjq7tgCrqQ=%%8(%&o7F@)S)*=`L;b=>hfcR;XTayiUw_)#2`hWZd zeo<(lKcIi0zowX)X_{8WSOEv%UpsR2h%D%cbx(bhB z?O4a-EKYSRkgY2njzrQ@(Zt9k5y@`lX#daT=C^z3!a>basWWui{v(;Q)TnrP@D%Bu zc6v5y(ZkZT0h?7t%5-Ha!jViIG#U5|#;Hu`^3$A!?utMsIemuGu?{4|OJBwEQx^55 zIT!tqkcO`ZBJ2sHteu0Ubfgl7J^z_?4yaHhRLsz9Up{TF(<8qyLrT3k!_DC2V`tc& zRre#?C{TcQYK$}E`3eDZjr%<1yO;iu6?#b<7hDZ<@9F W5Q%lXBVV0rwTPr8vq^RVTmJwR1+nD- literal 0 HcmV?d00001 diff --git a/comex-main_S6/target/classes/br/com/alura/comex/testes/TesteCep.class b/comex-main_S6/target/classes/br/com/alura/comex/testes/TesteCep.class new file mode 100644 index 0000000000000000000000000000000000000000..b16fcff6e13902102cc73824ad42648fd47f76d8 GIT binary patch literal 942 zcmaJ=T~8B16g|@xX1m>5>`GPe0}-Kx${;41xav!zPX$d%ni!v^%cL&uN3$P9{a5+` zi6%b!;D6G1r=F!LT-ng&PGz`dKXXm---7xUXX6MxqmiN#>`rqedn;iUukS z#)IwchmRj^5gkX>!X?xgD(-12!;@zBl)IP4UO04G-HVuBoKQMtTt=P4wr~aW=X&UU zOi~q4=}|_V%ug7+NW3Qalt`2e91~Y@jpMq71uQby<0{VQFz}H+;fDlrw$6!0j@IQS z!*WiwsiF!Jv8N45!cgi&`--8~^+L6q1p^iD$$?LvdN*>V-mD(YQ&D`_y2LbpIV?FnduJyXvK<1*=X)-P9w)9o(S1te*myzRk4WqMabi$j+=E zgMA){Z_}#7dR?N`nj{d!GVRK^ixu+d!=Lo;L3Z&Q_?u&tyBl@$2-Z&f2h1;+YagMZ zA&bzE4PpfhddsN6gpCT_sp^{%r literal 0 HcmV?d00001 diff --git a/comex-main_S6/target/classes/br/com/alura/comex/testes/TesteClassePedido.class b/comex-main_S6/target/classes/br/com/alura/comex/testes/TesteClassePedido.class new file mode 100644 index 0000000000000000000000000000000000000000..6a63f974b0dc970e60560ad6932a21d5ca1dcf62 GIT binary patch literal 3170 zcmb_f>r)d~6#rcw*(HRB3!U#fr1DYkP1b?zAnj{ENphu%|fN`);_eg z@0a%7+SXb>wVjbsW;&g5`lVmnul*bR+UbYdb9Y057#%+}lk7d`+;h%7@4NZ!pKCt@ z*p16xTzp%kVLjhMSs$Ev;?A_Kwbm#zq;X43*O+ zH-l-x(;ZK8O%IYn8RZP#14djm5~^mIG8BfA*08^`v!lJOp|z#C$qNaU!s@jQr|Jin z?H;u)&4@?-H%bm?RU@WaYSauJ$N-VRxQun=;1IVo?mw(+b7VF-T}?DHIoQ_P5^Qb? zJ5Fz8Sf3PpK{La*((!v3q@nAVVp^2M?5D|rycDwnuu>8nX=S$+7uCKAxoBVfB%T5`;5a%`Rrh*a1uFdYkFv( zW%2nzEp2NqtvM#4lIs)z=v@hr4rC= z)#A2kF;vwD+@5fPJCLDAiZOvn3CDeS5DzgZ%f>CS&?yO?9#&5ZQ|kkhLgEo09tCG8 zFdTB_lI|6gBT|GYViHszP9VN&w2aQDZ8b^S%vsX8)-_8L#j6=M^{>j45s?7RhiS}E z0mW52Gguhv=&ZZQhL{gY9}JjeKgkc%n4;2HWoTwph@&3!!9tn>Myw;Ex2Z{&c(YR~ z_-B2X6Z|E_KhAa28Z&LKD^$rReVE4+4C|77M(r_;D7TMlc7mX^%?+DmVmT`AcH=7h zY?m*an#rsa{r{YL3QtRT#)oG`mAielI>r>3l!&-)NO+!MM~ziBzo)?0jk|xGh<{yK>pTIv9IMU&*M=qccN1<>W}h zSuxSgSu3jcX(EwTw`4sih6CBQ-!$#CZSmBQYA4KCy3B*my!aenNcd7z|5p@4XO1`p zsTp(Tj2d$5(rt)79;KNy&v0&KD`Xg5rTyH9>1w)mknXS9)Sa*MRf1y_m>ldYlfE=v zR}@u7MGx2YQJR?%8DBGmGq-7%pY8N#29N{Ogt&gubU>&1{Z982&fps`4ApXbB`x71 z!?s&Ok;_8~ml!tRnUxCO4F|U1IeKvupFA+Sr9AX}fv^y*jMl>K3t&Gu+o$L$wt-^2 zNKc>3fS2$xVMTZar-?$sc{Pv;2Wwx1G@%qJ#Y%}%rmSHLs2FreRmys0gR)84EJ#C( z@J}dPmD)xvvw-e`1@v4+UmlKT_D;BagS1zey%*o<$PMR`OSpR@x#Tog=aDSAs~BVGlB%Vv zIL2@u?E-q3;TLpu$vDR*Tp12Bof!t-+fF<)NLj{1)CuKAm<0?+{c#Xa0$I2`Z$M|G;~A zpNioFk{4y*Qa&WgIil1e?_zvHr`d{fjTTcK0 literal 0 HcmV?d00001 diff --git a/comex-main_S6/target/classes/br/com/alura/comex/testes/TesteCliente.class b/comex-main_S6/target/classes/br/com/alura/comex/testes/TesteCliente.class new file mode 100644 index 0000000000000000000000000000000000000000..76cef0c9c9643188e54e3c701b039f585db79c71 GIT binary patch literal 3524 zcmbVPTWlQF8U9YZ_Ux`FA$Bfgxr8AJ@oq@6gaU2s#FT8D;?y>VHBOyS=<)chJ@M?E z&CIMxN+}d*f!+Yoszs>k1FBFeRVq|f zo^$)ofB*mU`>&s0{}X_dcqfl7=(3Qp(TyH~?HA>eEc-H;FF!GRQMs`|&j~N^;$eZV zVrkk!R-ms1YQ~;luDUV^RG32^y%ua6Td{2emFkr!R&{|bULde*taa1V<CORES}`LttPwEW5g1mVPsoW~MHeRWPSQs#(g*_kPX!3c+3lwz|LYRvE6#gSri2_ zMyWgw;eHE;Z5+YTjV@{l!7XK!jz;GL9jc0qNHbN~^I1GVJtx}+a8%%`FqCterm*m! zjW3x<>UMn{DdUNUZ9IZ63-oq0poeJjG&_vl%E2RTPY-2rTwr)&4YBC}8q{sm2vKHnTwJ9>hie)}3Pnn@jnsuk5=U7B;GxdoifJ_wSIHD9ab*l-6;?0^Ar^@q(UG{{N<*c<*GESu&^ME)NZ+rrL*V1{ zLt197(hoX9z#cVSP{o%~q#_GHVe#6eW}5UC-V)e*YbZk?Q5E;XWw&O2wt(J755J15 zGDpF&`_MIrk6Onye$6qE#XP@u0>A=1u5!4DMegu&*V{yF1;lS}z?%6OxogbV8|a_8 zhMnUdV^@D+8F!lTUXJ%KWB)||z>#H?-otjYTTXV5eRP;91hw12R>f1uEvLbZ@F+g~#@&UUap#P+0PxjkmEPjs*ru~rJ!fS&At zvIJ#s0;+aEIf8OG0X^LTLsW*1#|;5GX<-VE#wOMLT@2+4HpJ&Bj~fd z$+2KB<6HE=G2`Jb(8Hp~*b=?`wXp-+a3}h(pB-0`t7F)SL4M#W{x4bJz#XM)G+a#ETff>%93EN_dyO;?Hmx?=!SMzyr8SYJb3kxWU%$&v*!b zVMF%`ss9aw_!L9P9~&cLI~$ljjEVxzihJ0HlrSca zVO%_n3GoP?6vONbPNOO&FeRq(v^bAxaRD>JVn}}Z{pl+=0;umP(5>uuqUO|Y6wi^)&F`CHWMR5d6-0Q|w zrt$Nf^-!ZvahWrVI{Y42ILlJ%AK}}a4lfbdl?}W5%@8F IinmetFRqWul>h($ literal 0 HcmV?d00001 diff --git a/comex-main_S6/target/classes/br/com/alura/comex/testes/TesteProduto.class b/comex-main_S6/target/classes/br/com/alura/comex/testes/TesteProduto.class new file mode 100644 index 0000000000000000000000000000000000000000..61dd7271c3b927404192507593cddd7b41e22364 GIT binary patch literal 1742 zcma)6U3U{j7=9*Av)kLFiT)62fB`%{Na9Y3ICJ6c$3?<<+bK4TI|bA%^jE*DaZ%x?#k`35-%8 zGNQN+!Pb4@9f0XL$uPYxed`h5k^ZbDyg>Nel9nf{u2q&+&6njUl=B8Aa7x3Zi8pYX zVdNmRHZ%sUrm!n2_Euy~ZYXl$ZDlh>75iHzESzD`J$E7SkHe znK-Yuw^1F#F(e7Lsvc%cF~@MBb0@dTZs7Q$v8RyRSk!Te;Zo-T#k1SklU79H zY5bzXYCEN9yKLfJyvJZD+7@M0st|Fcu|*wM8D=^mx%GX-y-<`n<#hz?0~6OUPlPG3 zoJaB?q@0H93{xfFc4XD&mB{Dn&)v0K8nD-6Ef~n+hEm{%44E$P-1(M^xlB>VM+_4= z?~(MYoQQeu1}dx;W>a6cmADp$m80?yzLHA?j*K#zqK zji1oUrkT;)JF^e=Tho1)M&(vxo<=j?fEBFLst;>eCkq{B3seO<*?xKfZSxuW_US2~ zVR(3~j`0h1yjjQ8%4{8P|BNwZCeusv-hY29)5Sy6s#@Fe`kiY@wYn0o-oKi9f$Zk& z#qs25Y99;pnsVMGC(RRD9k&R1Nd?~n75p-WXw=cKS}u)~IEE=4#|#E>g)9ryg_kf! z37tfNn&<^38s15ECQ$J7x`w`R492=8m+=KQktDQf+$Y==VUFTUJS3E_=)8% Date: Mon, 29 Apr 2024 08:42:42 -0300 Subject: [PATCH 02/17] Entrega Semana 7 - Wander Carvalho --- Entrega Semana 7 - Wander Carvalho | 1 + 1 file changed, 1 insertion(+) create mode 100644 Entrega Semana 7 - Wander Carvalho diff --git a/Entrega Semana 7 - Wander Carvalho b/Entrega Semana 7 - Wander Carvalho new file mode 100644 index 00000000..6f16acbb --- /dev/null +++ b/Entrega Semana 7 - Wander Carvalho @@ -0,0 +1 @@ +teste From 205ee7d4dbcdd3b41f3d4706a6cf9e9fd57ba7e4 Mon Sep 17 00:00:00 2001 From: Wander Carvalho <138515773+Wander-samix@users.noreply.github.com> Date: Mon, 29 Apr 2024 08:48:18 -0300 Subject: [PATCH 03/17] Add files via upload --- comex/DAO/CadastraCliente.java | 114 ++++++++++++++++++++ comex/DAO/CategoriaDao.java | 42 ++++++++ comex/DAO/ClienteAlteraBd.java | 47 ++++++++ comex/DAO/ClienteDao.java | 81 ++++++++++++++ comex/DAO/EnderecoDao.java | 70 ++++++++++++ comex/DAO/PedidoDao.java | 42 ++++++++ comex/DAO/ProdutoDao.java | 49 +++++++++ comex/Main.java | 81 ++++++++++++++ comex/ProcessadorDeCsv.java | 56 ++++++++++ comex/model/Categoria.java | 51 +++++++++ comex/model/Cliente.java | 87 +++++++++++++++ comex/model/Endereco.java | 113 +++++++++++++++++++ comex/model/ItemPedido.java | 104 ++++++++++++++++++ comex/model/JsonCreator.java | 4 + comex/model/Pedido.java | 137 ++++++++++++++++++++++++ comex/model/Produto.java | 134 +++++++++++++++++++++++ comex/model/TipoDesconto.java | 5 + comex/testes/ComparaProduto.java | 25 +++++ comex/testes/ConsultaCep.java | 39 +++++++ comex/testes/ImpressaoDadosProduto.java | 13 +++ comex/testes/OrdenacaoPedido.java | 38 +++++++ comex/testes/TesteCep.java | 14 +++ comex/testes/TesteClassePedido.java | 42 ++++++++ comex/testes/TesteProduto.java | 43 ++++++++ 24 files changed, 1431 insertions(+) create mode 100644 comex/DAO/CadastraCliente.java create mode 100644 comex/DAO/CategoriaDao.java create mode 100644 comex/DAO/ClienteAlteraBd.java create mode 100644 comex/DAO/ClienteDao.java create mode 100644 comex/DAO/EnderecoDao.java create mode 100644 comex/DAO/PedidoDao.java create mode 100644 comex/DAO/ProdutoDao.java create mode 100644 comex/Main.java create mode 100644 comex/ProcessadorDeCsv.java create mode 100644 comex/model/Categoria.java create mode 100644 comex/model/Cliente.java create mode 100644 comex/model/Endereco.java create mode 100644 comex/model/ItemPedido.java create mode 100644 comex/model/JsonCreator.java create mode 100644 comex/model/Pedido.java create mode 100644 comex/model/Produto.java create mode 100644 comex/model/TipoDesconto.java create mode 100644 comex/testes/ComparaProduto.java create mode 100644 comex/testes/ConsultaCep.java create mode 100644 comex/testes/ImpressaoDadosProduto.java create mode 100644 comex/testes/OrdenacaoPedido.java create mode 100644 comex/testes/TesteCep.java create mode 100644 comex/testes/TesteClassePedido.java create mode 100644 comex/testes/TesteProduto.java diff --git a/comex/DAO/CadastraCliente.java b/comex/DAO/CadastraCliente.java new file mode 100644 index 00000000..d6bf0f26 --- /dev/null +++ b/comex/DAO/CadastraCliente.java @@ -0,0 +1,114 @@ +package br.com.alura.comex.DAO; + +import br.com.alura.comex.model.Cliente; +import br.com.alura.comex.model.Endereco; +import br.com.alura.comex.testes.ConsultaCep; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; +import java.util.Scanner; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.LoggerContext; + +public class CadastraCliente { + + private static Scanner scanner; + private static final Logger logger = LoggerFactory.getLogger(CadastraCliente.class); + + public static void main(String[] args) { + EntityManagerFactory factory = Persistence.createEntityManagerFactory("oracle"); + EntityManager entityManager = factory.createEntityManager(); + scanner = new Scanner(System.in); + + try { + setLoggingLevel(Level.ERROR); // Reduz o nível de log antes da interação com o usuário + + System.out.println("Digite 'sair' a qualquer momento para terminar o programa."); + String cep = getRequiredInput("Por favor, insira o CEP para consulta:"); + Endereco endereco = new ConsultaCep().consultaCep(cep); + + if (endereco == null) { + logger.error("Não foi possível encontrar o endereço para o CEP fornecido."); + return; + } + + Cliente cliente = getClienteData(endereco); + if (cliente != null) { + logger.info("Informações do cliente antes da persistência: {}", cliente); + logger.info("Informações do endereço antes da persistência: {}", endereco); + + EntityManager em = factory.createEntityManager(); + entityManager.getTransaction().begin(); // Inicia a transação + cliente.salvar(em); // Persiste o cliente e seu endereço + entityManager.getTransaction().commit(); // Faz o commit da transação + entityManager.close(); // Fecha o EntityManager após o uso + + logger.info("Cliente cadastrado com sucesso: {}", cliente); + } else { + logger.error("Falha ao criar dados do cliente. Cliente retornou nulo."); + } + } finally { + scanner.close(); + factory.close(); + setLoggingLevel(Level.DEBUG); // Restaura o nível de log após a interação + } + } + + private static Cliente getClienteData(Endereco endereco) { + String nomeCliente = getRequiredInput("Por favor, insira o nome do cliente:"); + if (nomeCliente.isEmpty()) { + logger.error("O nome do cliente é obrigatório e não foi fornecido."); + return null; // Retorna nulo para evitar tentativa de persistência com nome nulo. + } + String cpf = getRequiredInput("Por favor, insira o CPF do cliente:"); + String email = getEmailInput(); + String profissao = getRequiredInput("Por favor, insira a profissão do cliente:"); + String telefone = getRequiredInput("Por favor, insira o telefone do cliente:"); + endereco.setNumero(getRequiredInput("Por favor, insira o número do imóvel:")); + endereco.setComplemento(getInput("Por favor, insira o complemento do imóvel (opcional):")); + + return new Cliente(nomeCliente, cpf, email, profissao, telefone, endereco); + } + + private static String getRequiredInput(String prompt) { + System.out.println(prompt); + String input = scanner.nextLine(); + if ("sair".equalsIgnoreCase(input)) { + System.out.println("Programa encerrado."); + System.exit(0); + } + if (input.trim().isEmpty()) { + System.out.println("Este campo é obrigatório. Por favor, forneça um valor."); + return getRequiredInput(prompt); + } + return input; + } + + private static String getInput(String prompt) { + System.out.println(prompt); + return scanner.nextLine(); + } + + private static String getEmailInput() { + String email = getRequiredInput("Por favor, insira o email do cliente:"); + if (!isValidEmail(email)) { + System.out.println("Email inválido. Por favor, insira um email válido."); + return getEmailInput(); + } + return email; + } + + private static boolean isValidEmail(String email) { + return email.matches("^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(\\[?)(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}(\\]?)$"); + } + + private static void setLoggingLevel(Level newLevel) { + LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); + ch.qos.logback.classic.Logger rootLogger = loggerContext.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME); + rootLogger.setLevel(newLevel); + } +} diff --git a/comex/DAO/CategoriaDao.java b/comex/DAO/CategoriaDao.java new file mode 100644 index 00000000..21bf1b00 --- /dev/null +++ b/comex/DAO/CategoriaDao.java @@ -0,0 +1,42 @@ +package br.com.alura.comex.dao; + +import br.com.alura.comex.model.Categoria; +import javax.persistence.EntityManager; +import javax.persistence.EntityTransaction; +import java.util.List; + +public class CategoriaDao { + private final EntityManager em; + + public CategoriaDao(EntityManager em) { + this.em = em; + } + + // Busca uma categoria por ID + public Categoria buscarPorId(Long id) { + Categoria categoria = em.find(Categoria.class, id); + System.out.println("Buscar por ID - Categoria encontrada: " + categoria); + return categoria; + } + + // Cadastra uma nova categoria + public void cadastra(Categoria categoria) { + EntityTransaction et = em.getTransaction(); + try { + et.begin(); + em.persist(categoria); + et.commit(); + System.out.println("Cadastrando Categoria: " + categoria); + } catch (Exception e) { + et.rollback(); + System.out.println("Erro ao cadastrar categoria: " + e.getMessage()); + } + } + + // Lista todas as categorias + public List listaTodas() { + List categorias = em.createQuery("SELECT c FROM Categoria c", Categoria.class).getResultList(); + System.out.println("Listando todas as Categorias: " + categorias); + return categorias; + } +} diff --git a/comex/DAO/ClienteAlteraBd.java b/comex/DAO/ClienteAlteraBd.java new file mode 100644 index 00000000..68d4b5de --- /dev/null +++ b/comex/DAO/ClienteAlteraBd.java @@ -0,0 +1,47 @@ +package br.com.alura.comex.DAO; + +import br.com.alura.comex.model.Cliente; +import br.com.alura.comex.model.Endereco; + +import javax.persistence.EntityManager; +import javax.persistence.EntityTransaction; + +public class ClienteAlteraBd { + + private final EntityManager entityManager; + + public ClienteAlteraBd(EntityManager entityManager) { + this.entityManager = entityManager; + } + + public void atualizar(Cliente cliente) { + EntityTransaction transaction = entityManager.getTransaction(); + + try { + if (!transaction.isActive()) { + transaction.begin(); + } + + // Verifica se o endereço do cliente já está persistido + if (cliente.getEndereco().getId() == null) { + // Se o endereço não está persistido, salva-o primeiro + Endereco endereco = cliente.getEndereco(); + entityManager.persist(endereco); + } + + entityManager.merge(cliente); + transaction.commit(); + } catch (Exception e) { + if (transaction.isActive()) { + transaction.rollback(); + } + throw new RuntimeException("Erro ao atualizar o cliente", e); + } + } + + public void salvar(Cliente cliente) { + } + + public void excluir(Cliente cliente) { + } +} \ No newline at end of file diff --git a/comex/DAO/ClienteDao.java b/comex/DAO/ClienteDao.java new file mode 100644 index 00000000..a5e97cc0 --- /dev/null +++ b/comex/DAO/ClienteDao.java @@ -0,0 +1,81 @@ +package br.com.alura.comex.DAO; + +import br.com.alura.comex.model.Cliente; +import javax.persistence.EntityManager; +import javax.persistence.EntityTransaction; +import java.util.List; + +public class ClienteDao { + private final EntityManager em; + + public ClienteDao(EntityManager em) { + this.em = em; + } + + // Busca um cliente por seu ID no banco de dados + public Cliente buscaPorId(Long id) { + Cliente cliente = em.find(Cliente.class, id); + System.out.println("Busca por ID - Cliente encontrado: " + cliente); + return cliente; + } + + // Cadastra um novo cliente no banco de dados + public void cadastra(Cliente cliente) { + EntityTransaction et = em.getTransaction(); + try { + et.begin(); + em.persist(cliente); + et.commit(); + System.out.println("Cadastrando Cliente: " + cliente); + } catch (Exception e) { + et.rollback(); + System.out.println("Erro ao cadastrar cliente: " + e.getMessage()); + } + } + + // Atualiza os dados de um cliente existente no banco de dados + public void atualiza(Cliente cliente) { + EntityTransaction et = em.getTransaction(); + try { + et.begin(); + em.merge(cliente); + et.commit(); + System.out.println("Atualizando Cliente: " + cliente); + } catch (Exception e) { + et.rollback(); + System.out.println("Erro ao atualizar cliente: " + e.getMessage()); + } + } + + // Remove um cliente do banco de dados + public void remove(Cliente cliente) { + EntityTransaction et = em.getTransaction(); + try { + et.begin(); + em.remove(em.contains(cliente) ? cliente : em.merge(cliente)); + et.commit(); + System.out.println("Removendo Cliente: " + cliente); + } catch (Exception e) { + et.rollback(); + System.out.println("Erro ao remover cliente: " + e.getMessage()); + } + } + + // Lista todos os clientes cadastrados no banco de dados + public List listaTodos() { + List clientes = em.createQuery("SELECT c FROM Cliente c", Cliente.class).getResultList(); + System.out.println("Listando todos os Clientes: " + clientes); + return clientes; + } + + // Lista clientes por nome, usando uma busca parcial + public List listaPorNome(String nome) { + List clientes = em.createQuery("SELECT c FROM Cliente c WHERE c.nome LIKE :nome", Cliente.class) + .setParameter("nome", "%" + nome + "%") + .getResultList(); + System.out.println("Listando Clientes por nome (" + nome + "): " + clientes); + return clientes; + } +} + + diff --git a/comex/DAO/EnderecoDao.java b/comex/DAO/EnderecoDao.java new file mode 100644 index 00000000..e668b9f4 --- /dev/null +++ b/comex/DAO/EnderecoDao.java @@ -0,0 +1,70 @@ +package br.com.alura.comex.DAO; + +import br.com.alura.comex.model.Endereco; + +import javax.persistence.EntityManager; +import javax.persistence.EntityTransaction; + +public class EnderecoDao { + + private final EntityManager entityManager; + + public EnderecoDao(EntityManager entityManager) { + this.entityManager = entityManager; + } + + public void salvar(Endereco endereco) { + EntityTransaction transaction = entityManager.getTransaction(); + + try { + if (!transaction.isActive()) { + transaction.begin(); + } + + entityManager.persist(endereco); + entityManager.flush(); // Sincroniza as alterações com o banco de dados + transaction.commit(); + } catch (Exception e) { + if (transaction.isActive()) { + transaction.rollback(); + } + throw new RuntimeException("Erro ao salvar o endereço", e); + } + } + + public void atualizar(Endereco endereco) { + EntityTransaction transaction = entityManager.getTransaction(); + + try { + if (!transaction.isActive()) { + transaction.begin(); + } + + entityManager.merge(endereco); + transaction.commit(); + } catch (Exception e) { + if (transaction.isActive()) { + transaction.rollback(); + } + throw new RuntimeException("Erro ao atualizar o endereço", e); + } + } + + public void excluir(Endereco endereco) { + EntityTransaction transaction = entityManager.getTransaction(); + + try { + if (!transaction.isActive()) { + transaction.begin(); + } + + entityManager.remove(endereco); + transaction.commit(); + } catch (Exception e) { + if (transaction.isActive()) { + transaction.rollback(); + } + throw new RuntimeException("Erro ao excluir o endereço", e); + } + } +} diff --git a/comex/DAO/PedidoDao.java b/comex/DAO/PedidoDao.java new file mode 100644 index 00000000..b0fe4e0d --- /dev/null +++ b/comex/DAO/PedidoDao.java @@ -0,0 +1,42 @@ +package br.com.alura.comex.DAO; + +import br.com.alura.comex.model.Pedido; +import javax.persistence.EntityManager; +import javax.persistence.EntityTransaction; +import java.util.List; + +public class PedidoDao { + private final EntityManager em; + + public PedidoDao(EntityManager em) { + this.em = em; + } + + // Busca um pedido por ID + public Pedido buscaPorId(Long id) { + Pedido pedido = em.find(Pedido.class, id); + System.out.println("Busca por ID - Pedido encontrado: " + pedido); + return pedido; + } + + // Cadastra um novo pedido + public void cadastra(Pedido pedido) { + EntityTransaction et = em.getTransaction(); + try { + et.begin(); + em.persist(pedido); + et.commit(); + System.out.println("Cadastrando Pedido: " + pedido); + } catch (Exception e) { + et.rollback(); + System.out.println("Erro ao cadastrar pedido: " + e.getMessage()); + } + } + + // Lista todos os pedidos + public List listaTodos() { + List pedidos = em.createQuery("SELECT p FROM Pedido p", Pedido.class).getResultList(); + System.out.println("Listando todos os Pedidos: " + pedidos); + return pedidos; + } +} diff --git a/comex/DAO/ProdutoDao.java b/comex/DAO/ProdutoDao.java new file mode 100644 index 00000000..69e93312 --- /dev/null +++ b/comex/DAO/ProdutoDao.java @@ -0,0 +1,49 @@ +package br.com.alura.comex.DAO; + +import br.com.alura.comex.model.Produto; +import javax.persistence.EntityManager; +import javax.persistence.EntityTransaction; +import java.util.List; + +public class ProdutoDao { + private final EntityManager em; + + public ProdutoDao(EntityManager em) { + this.em = em; + } + + // Busca um produto por ID + public Produto buscaPorId(Long id) { + Produto produto = em.find(Produto.class, id); + System.out.println("Busca por ID - Produto encontrado: " + produto); + return produto; + } + + // Cadastra um novo produto + public void cadastra(Produto produto) { + EntityTransaction et = em.getTransaction(); + try { + et.begin(); + em.persist(produto); + et.commit(); + System.out.println("Cadastrando Produto: " + produto); + } catch (Exception e) { + et.rollback(); + System.out.println("Erro ao cadastrar produto: " + e.getMessage()); + } + } + + // Lista todos os produtos + public List listaTodos() { + List produtos = em.createQuery("SELECT p FROM Produto p", Produto.class).getResultList(); + System.out.println("Listando todos os Produtos: " + produtos); + return produtos; + } + + // Lista produtos que estão indisponíveis (quantidade = 0) + public List listaIndisponiveis() { + List produtosIndisponiveis = em.createQuery("SELECT p FROM Produto p WHERE p.quantidade = 0", Produto.class).getResultList(); + System.out.println("Listando produtos indisponíveis: " + produtosIndisponiveis); + return produtosIndisponiveis; + } +} diff --git a/comex/Main.java b/comex/Main.java new file mode 100644 index 00000000..0cd05711 --- /dev/null +++ b/comex/Main.java @@ -0,0 +1,81 @@ +//package br.com.alura.comex; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.net.URISyntaxException; +import java.text.NumberFormat; +import java.util.Arrays; +import java.util.Locale; + +//public class Main { +// +// private static final Logger logger = LoggerFactory.getLogger(Main.class); +// +// public static void main(String[] args) throws IOException, URISyntaxException { +// Pedido[] pedidos = ProcessadorDeCsv.processaArquivo("pedidos.csv"); +// +// int totalDeProdutosVendidos = 0; +// int totalDePedidosRealizados = 0; +// BigDecimal montanteDeVendas = BigDecimal.ZERO; +// Pedido pedidoMaisBarato = null; +// Pedido pedidoMaisCaro = null; +// +// String[] categoriasProcessadas = new String[10]; +// int totalDeCategorias = 0; +// +// for (int i = 0; i < pedidos.length; i++) { +// Pedido pedidoAtual = pedidos[i]; +// +// if (pedidoAtual == null) { +// break; +// } +// +// if (pedidoMaisBarato == null || pedidoAtual.getPreco().multiply(new BigDecimal(pedidoAtual.getQuantidade())).compareTo(pedidoMaisBarato.getPreco().multiply(new BigDecimal(pedidoMaisBarato.getQuantidade()))) < 0) { +// pedidoMaisBarato = pedidoAtual; +// } +// +// if (pedidoMaisCaro == null || pedidoAtual.getPreco().multiply(new BigDecimal(pedidoAtual.getQuantidade())).compareTo(pedidoMaisCaro.getPreco().multiply(new BigDecimal(pedidoMaisCaro.getQuantidade()))) > 0) { +// pedidoMaisCaro = pedidoAtual; +// } +// +// montanteDeVendas = montanteDeVendas.add(pedidoAtual.getPreco().multiply(new BigDecimal(pedidoAtual.getQuantidade()))); +// totalDeProdutosVendidos += pedidoAtual.getQuantidade(); +// totalDePedidosRealizados++; +// +// boolean jahProcessouCategoria = false; +// for (int j = 0; j < categoriasProcessadas.length; j++) { +// if (pedidoAtual.getCategoria().equalsIgnoreCase(categoriasProcessadas[j])) { +// jahProcessouCategoria = true; +// } +// } +// +// if (!jahProcessouCategoria) { +// totalDeCategorias++; +// +// if (categoriasProcessadas[categoriasProcessadas.length - 1] != null) { +// categoriasProcessadas = Arrays.copyOf(categoriasProcessadas, categoriasProcessadas.length * 2); +// } else { +// for (int k = 0; k < categoriasProcessadas.length; k++) { +// if (categoriasProcessadas[k] == null) { +// categoriasProcessadas[k] = pedidoAtual.getCategoria(); +// break; +// } +// } +// } +// } +// } +// +// logger.info("##### RELATÓRIO DE VALORES TOTAIS #####"); +// logger.info("TOTAL DE PEDIDOS REALIZADOS: {}", totalDePedidosRealizados); +// logger.info("TOTAL DE PRODUTOS VENDIDOS: {}", totalDeProdutosVendidos); +// logger.info("TOTAL DE CATEGORIAS: {}", totalDeCategorias); +// logger.info("MONTANTE DE VENDAS: {}", NumberFormat.getCurrencyInstance(new Locale("pt", "BR")).format(montanteDeVendas.setScale(2, RoundingMode.HALF_DOWN))); +// logger.info("PEDIDO MAIS BARATO: {} ({})", NumberFormat.getCurrencyInstance(new Locale("pt", "BR")).format(pedidoMaisBarato.getPreco().multiply(new BigDecimal(pedidoMaisBarato.getQuantidade())).setScale(2, RoundingMode.HALF_DOWN)), pedidoMaisBarato.getProduto()); +// logger.info("PEDIDO MAIS CARO: {} ({})\n", NumberFormat.getCurrencyInstance(new Locale("pt", "BR")).format(pedidoMaisCaro.getPreco().multiply(new BigDecimal(pedidoMaisCaro.getQuantidade())).setScale(2, RoundingMode.HALF_DOWN)), pedidoMaisCaro.getProduto()); +// logger.info("### FIM DO RELATÓRIO ###"); +// } +//} \ No newline at end of file diff --git a/comex/ProcessadorDeCsv.java b/comex/ProcessadorDeCsv.java new file mode 100644 index 00000000..6b2496e9 --- /dev/null +++ b/comex/ProcessadorDeCsv.java @@ -0,0 +1,56 @@ +package br.com.alura.comex; + +import br.com.alura.comex.model.Pedido; + +import java.io.IOException; +import java.math.BigDecimal; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.Path; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.Arrays; +import java.util.Scanner; + +public class ProcessadorDeCsv { + + public static Pedido[] processaArquivo(String nomeDoArquivo) { + try { + URL recursoCSV = ClassLoader.getSystemResource(nomeDoArquivo); + Path caminhoDoArquivo = caminhoDoArquivo = Path.of(recursoCSV.toURI()); + + Scanner leitorDeLinhas = new Scanner(caminhoDoArquivo); + + leitorDeLinhas.nextLine(); + + Pedido[] pedidos = new Pedido[10]; + + int quantidadeDeRegistros = 0; + while (leitorDeLinhas.hasNextLine()) { + String linha = leitorDeLinhas.nextLine(); + String[] registro = linha.split(","); + + String categoria = registro[0]; + String produto = registro[1]; + BigDecimal preco = new BigDecimal(registro[2]); + int quantidade = Integer.parseInt(registro[3]); + LocalDate data = LocalDate.parse(registro[4], DateTimeFormatter.ofPattern("dd/MM/yyyy")); + String cliente = registro[5]; + + Pedido pedido = new Pedido(categoria, produto, cliente, preco, quantidade, data); + pedidos[quantidadeDeRegistros] = pedido; + + quantidadeDeRegistros++; + if (pedidos[pedidos.length - 1] != null) { + pedidos = Arrays.copyOf(pedidos, pedidos.length * 2); + } + } + + return pedidos; + } catch (URISyntaxException e) { + throw new RuntimeException(String.format("Arquivo {} não localizado!", nomeDoArquivo)); + } catch (IOException e) { + throw new RuntimeException("Erro ao abrir Scanner para processar arquivo!"); + } + } +} \ No newline at end of file diff --git a/comex/model/Categoria.java b/comex/model/Categoria.java new file mode 100644 index 00000000..a07046e8 --- /dev/null +++ b/comex/model/Categoria.java @@ -0,0 +1,51 @@ +package br.com.alura.comex.model; + +import javax.persistence.*; + +@Entity +@Table(name = "categoria") +public class Categoria { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private String nome; + + @Enumerated(EnumType.STRING) + @Column(nullable = false, columnDefinition = "VARCHAR(10) default 'ATIVA'") + private Status status = Status.ATIVA; + + // Getters and Setters + 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 Status getStatus() { + return status; + } + + public void setStatus(Status status) { + this.status = status; + } + + // Enum for status + public enum Status { + ATIVA, INATIVA + } + } + + diff --git a/comex/model/Cliente.java b/comex/model/Cliente.java new file mode 100644 index 00000000..220342a0 --- /dev/null +++ b/comex/model/Cliente.java @@ -0,0 +1,87 @@ +package br.com.alura.comex.model; + +import javax.persistence.*; + +@Entity +@Table(name = "cliente") +public class Cliente { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "nome", length = 120, nullable = false) + private String nome; + + @Column(name = "cpf", length = 13, unique = true, nullable = false) + private String cpf; + + @Column(name = "email", length = 50) + private String email; + + @Column(name = "profissao", length = 20, nullable = false) + private String profissao; + + @Column(name = "telefone", length = 20, nullable = false) + private String telefone; + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "endereco_id", nullable = false) + private Endereco endereco; + + public Cliente() {} + + public Cliente(String nome, String cpf, String email, String profissao, String telefone, Endereco endereco) { + this.nome = nome; + this.cpf = cpf; + this.email = email; + this.profissao = profissao; + this.telefone = telefone; + this.endereco = endereco; + } + + public Cliente(EntityManager entityManager) { + } + + // Getters and setters + 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 getCpf() { return cpf; } + public void setCpf(String cpf) { this.cpf = cpf; } + + public String getEmail() { return email; } + public void setEmail(String email) { this.email = email; } + + public String getProfissao() { return profissao; } + public void setProfissao(String profissao) { this.profissao = profissao; } + + public String getTelefone() { return telefone; } + public void setTelefone(String telefone) { this.telefone = telefone; } + + public Endereco getEndereco() { return endereco; } + public void setEndereco(Endereco endereco) { this.endereco = endereco; } + + @Override + public String toString() { + return "Cliente{" + + "id=" + id + + ", nome='" + nome + '\'' + + ", cpf='" + cpf + '\'' + + ", email='" + email + '\'' + + ", profissao='" + profissao + '\'' + + ", telefone='" + telefone + '\'' + + ", endereco=" + endereco + + '}'; + } + + + public void salvar(Cliente clientenovo) { + } + + public void salvar(EntityManager entityManager) { + } +} diff --git a/comex/model/Endereco.java b/comex/model/Endereco.java new file mode 100644 index 00000000..f4c0b277 --- /dev/null +++ b/comex/model/Endereco.java @@ -0,0 +1,113 @@ +package br.com.alura.comex.model; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import br.com.alura.comex.DAO.EnderecoDao; +import com.fasterxml.jackson.annotation.JsonProperty; + +import javax.persistence.*; + +@Entity +@Table(name = "endereco") +@JsonIgnoreProperties(ignoreUnknown = true) // Ignora propriedades desconhecidas durante a desserialização +public class Endereco { + +@Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "cep", length = 120, nullable = false) + private String cep; + + @Column(name = "logradouro", length = 120, nullable = true) + private String logradouro; + + @Column(name = "complemento", length = 120, nullable = true) + private String complemento; + + @Column(name = "bairro", length = 120, nullable = true) + private String bairro; + + @Column(name = "localidade", length = 120, nullable = true) + private String localidade; + + @Column(name = "uf", length = 2, nullable = true) + private String uf; + + @Column(name = "numero", length = 20, nullable = true) + private String numero; + + public Endereco() { + // Construtor padrão necessário para JPA + } + + @JsonCreator + public Endereco(@JsonProperty("cep") String cep, + @JsonProperty("logradouro") String logradouro, + @JsonProperty("complemento") String complemento, + @JsonProperty("bairro") String bairro, + @JsonProperty("localidade") String localidade, + @JsonProperty("uf") String uf, + @JsonProperty("numero") String numero) { + this.cep = cep; + this.logradouro = logradouro; + this.complemento = complemento; + this.bairro = bairro; + this.localidade = localidade; + this.uf = uf; + this.numero = numero; + } + + // Getters e setters + + public Long getId() { return id; } + public void setId(Long id) { this.id = id; } + + public String getCep() { return cep; } + public void setCep(String cep) { this.cep = cep; } + + public String getLogradouro() { return logradouro; } + public void setLogradouro(String logradouro) { this.logradouro = logradouro; } + + public String getComplemento() { return complemento; } + public void setComplemento(String complemento) { this.complemento = complemento; } + + public String getBairro() { return bairro; } + public void setBairro(String bairro) { this.bairro = bairro; } + + public String getLocalidade() { return localidade; } + public void setLocalidade(String localidade) { this.localidade = localidade; } + + public String getUf() { return uf; } + public void setUf(String uf) { this.uf = uf; } + + public String getNumero() { return numero; } + public void setNumero(String numero) { this.numero = numero; } + + @Override + public String toString() { + return "Endereco{" + + "id=" + id + + ", cep='" + cep + '\'' + + ", logradouro='" + logradouro + '\'' + + ", complemento='" + complemento + '\'' + + ", bairro='" + bairro + '\'' + + ", localidade='" + localidade + '\'' + + ", uf='" + uf + '\'' + + ", numero='" + numero + '\'' + + '}'; + } + + public void salvar(EnderecoDao enderecoDao) { + enderecoDao.salvar(this); + } + + public void atualizar(EnderecoDao enderecoDao) { + enderecoDao.atualizar(this); + } + + public void excluir(EnderecoDao enderecoDao) { + enderecoDao.excluir(this); + } +} + + diff --git a/comex/model/ItemPedido.java b/comex/model/ItemPedido.java new file mode 100644 index 00000000..b831cf1c --- /dev/null +++ b/comex/model/ItemPedido.java @@ -0,0 +1,104 @@ +package br.com.alura.comex.model; + +import java.math.BigDecimal; +import javax.persistence.*; + +@Entity +@Table(name = "item_pedido") +public class ItemPedido { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false, precision = 10, scale = 2) + private BigDecimal precoUnitario; + + @Column(nullable = false) + private int quantidade; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "produto_id", nullable = false) + private Produto produto; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "pedido_id", nullable = false) + private Pedido pedido; + + @Column(nullable = false, precision = 10, scale = 2) + private BigDecimal desconto; + + @Enumerated(EnumType.STRING) + @Column(nullable = false) + private TipoDesconto tipoDesconto; + + // Construtores, Getters e Setters + + public ItemPedido() {} + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public TipoDesconto getTipoDesconto() { + return tipoDesconto; + } + + public void setTipoDesconto(TipoDesconto tipoDesconto) { + this.tipoDesconto = tipoDesconto; + } + + public BigDecimal getDesconto() { + return desconto; + } + + public void setDesconto(BigDecimal desconto) { + this.desconto = desconto; + } + + public Pedido getPedido() { + return pedido; + } + + public void setPedido(Pedido pedido) { + this.pedido = pedido; + } + + public Produto getProduto() { + return produto; + } + + public void setProduto(Produto produto) { + this.produto = produto; + } + + public int getQuantidade() { + return quantidade; + } + + public void setQuantidade(int quantidade) { + this.quantidade = quantidade; + } + + public BigDecimal getPrecoUnitario() { + return precoUnitario; + } + + public void setPrecoUnitario(BigDecimal precoUnitario) { + this.precoUnitario = precoUnitario; + } + + public ItemPedido(BigDecimal precoUnitario, int quantidade, Produto produto, Pedido pedido, BigDecimal desconto, TipoDesconto tipoDesconto) { + this.precoUnitario = precoUnitario; + this.quantidade = quantidade; + this.produto = produto; + this.pedido = pedido; + this.desconto = desconto; + this.tipoDesconto = tipoDesconto; + } + + } + diff --git a/comex/model/JsonCreator.java b/comex/model/JsonCreator.java new file mode 100644 index 00000000..7efcf2da --- /dev/null +++ b/comex/model/JsonCreator.java @@ -0,0 +1,4 @@ +package br.com.alura.comex.model; + +public @interface JsonCreator { +} diff --git a/comex/model/Pedido.java b/comex/model/Pedido.java new file mode 100644 index 00000000..890ab934 --- /dev/null +++ b/comex/model/Pedido.java @@ -0,0 +1,137 @@ +package br.com.alura.comex.model; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.List; +import javax.persistence.*; + +@Entity +@Table(name = "pedidos") +public class Pedido { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; // Tipo alterado para Long, que é mais comum para IDs + + @ManyToOne + @JoinColumn(name = "cliente_id", nullable = false) + private Cliente cliente; + + @OneToMany(mappedBy = "pedido", cascade = CascadeType.ALL, fetch = FetchType.LAZY) + private List itensPedido; + + @Column(nullable = false, precision = 10, scale = 2) + private BigDecimal preco; + + @Column(nullable = false) + private int quantidade; + + @Column(nullable = false) + private LocalDate data; + + @Enumerated(EnumType.STRING) + @Column(nullable = false) + private TipoDesconto tipoDesconto; + + // Construtores + public Pedido(int id, Cliente cliente, BigDecimal preco, int quantidade, LocalDate data, TipoDesconto tipoDesconto) { + this.id = (long) id; + this.cliente = cliente; + this.preco = preco; + this.quantidade = quantidade; + this.data = data; + this.tipoDesconto = tipoDesconto; + } + + public Pedido(int id, Cliente cliente, BigDecimal preco, int quantidade, int id1) { + this.id = (long) id1; + } + + public Pedido(String categoria, String produto, String cliente, BigDecimal preco, int quantidade, LocalDate data, int id) { + this.id = (long) id; + } + + public Pedido(String categoria, String produto, String cliente, BigDecimal preco, int quantidade, LocalDate data) { + } + + public Pedido(int i, Cliente cliente, BigDecimal bigDecimal, int i1) { + } + + // Getters e Setters + public int getId() { + return Math.toIntExact(id); + } + + public void setId(int id) { + this.id = (long) id; + } + + public Cliente getCliente() { + return cliente; + } + + public void setCliente(Cliente cliente) { + this.cliente = cliente; + } + + public BigDecimal getPreco() { + return preco; + } + + public void setPreco(BigDecimal preco) { + this.preco = preco; + } + + public int getQuantidade() { + return quantidade; + } + + public void setQuantidade(int quantidade) { + this.quantidade = quantidade; + } + + public LocalDate getData() { + return data; + } + + public void setData(LocalDate data) { + this.data = data; + } + + public TipoDesconto getTipoDesconto() { + return tipoDesconto; + } + + public void setTipoDesconto(TipoDesconto tipoDesconto) { + this.tipoDesconto = tipoDesconto; + } + + // Método para calcular o valor total do pedido com desconto aplicado + public BigDecimal getValorTotal() { + BigDecimal total = preco.multiply(BigDecimal.valueOf(quantidade)); + if (tipoDesconto == TipoDesconto.FIDELIDADE) { + return total.multiply(BigDecimal.valueOf(0.90)); // Aplica 10% de desconto + } + return total; + } + + @Override + public String toString() { + return "Pedido{" + + "id=" + id + + ", cliente=" + (cliente != null ? cliente.getNome() : "N/D") + + ", preço=" + preco + + ", quantidade=" + quantidade + + ", data=" + data + + ", tipoDesconto=" + tipoDesconto + + ", valor total=" + getValorTotal() + + '}'; + } + + public boolean isMaisCaroQue(Pedido pedido2) { + return false; + } + + public boolean isMaisBaratoQue(Pedido pedido2) { + return false; + } +} diff --git a/comex/model/Produto.java b/comex/model/Produto.java new file mode 100644 index 00000000..bc18c8a5 --- /dev/null +++ b/comex/model/Produto.java @@ -0,0 +1,134 @@ +package br.com.alura.comex.model; + +import javax.persistence.*; +import java.math.BigDecimal; +import java.util.Objects; + +@Entity +@Table(name = "produto") +public class Produto { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "nome", length = 220, nullable = false) + private String nome; + + @Column(name = "descricao", length = 220, nullable = false) + private String descricao; + + @Column(name = "preco_unitario", nullable = false) + private BigDecimal precoUnitario; + + @Column(name = "quantidade", nullable = false) + private int quantidade; + + @ManyToOne + @JoinColumn(name = "categoria_id", referencedColumnName = "id", nullable = false, foreignKey = @ForeignKey(name = "fk_categoria_produto")) + private Categoria categoria; + + // Construtor vazio para JPA + public Produto(String livro, String s, double v, int i) {} + + // Construtor principal + public Produto(String nome, String descricao, BigDecimal precoUnitario, int quantidade, Categoria categoria) { + setNome(nome); + this.descricao = descricao; + this.precoUnitario = precoUnitario; + this.quantidade = quantidade; + this.categoria = categoria; + } + + public Produto(String nome, String descricao, BigDecimal precoUnitario, int quantidade, int categoria) { + } + + // Getters + public Long getId() { + return id; + } + + public String getNome() { + return nome; + } + + public String getDescricao() { + return descricao; + } + + public BigDecimal getPrecoUnitario() { + return precoUnitario; + } + + public int getQuantidade() { + return quantidade; + } + + public Categoria getCategoria() { + return categoria; + } + + // Setters + public void setId(Long id) { + this.id = id; + } + + public void setNome(String nome) { + if (nome == null || nome.trim().isEmpty()) { + throw new IllegalArgumentException("O nome do produto é obrigatório e não pode ser vazio."); + } + this.nome = nome; + } + + public void setDescricao(String descricao) { + this.descricao = descricao; + } + + public void setPrecoUnitario(BigDecimal precoUnitario) { + this.precoUnitario = precoUnitario; + } + + public void setQuantidade(int quantidade) { + this.quantidade = quantidade; + } + + public void setCategoria(Categoria categoria) { + this.categoria = categoria; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Produto produto = (Produto) o; + return quantidade == produto.quantidade && + Objects.equals(id, produto.id) && + Objects.equals(nome, produto.nome) && + Objects.equals(descricao, produto.descricao) && + Objects.equals(precoUnitario, produto.precoUnitario) && + Objects.equals(categoria, produto.categoria); + } + + @Override + public int hashCode() { + return Objects.hash(id, nome, descricao, precoUnitario, quantidade, categoria); + } + + @Override + public String toString() { + return "Produto{" + + "id=" + id + + ", nome='" + nome + '\'' + + ", descricao='" + descricao + '\'' + + ", precoUnitario=" + precoUnitario + + ", quantidade=" + quantidade + + ", categoria=" + categoria + + '}'; + } + + public void imprimirDetalhes() { + System.out.println(this.toString()); + } +} + + diff --git a/comex/model/TipoDesconto.java b/comex/model/TipoDesconto.java new file mode 100644 index 00000000..8f36ba8f --- /dev/null +++ b/comex/model/TipoDesconto.java @@ -0,0 +1,5 @@ +package br.com.alura.comex.model; + +public enum TipoDesconto { + FIDELIDADE, QUANTIDADE, PROMOCAO, NENHUM; +} \ No newline at end of file diff --git a/comex/testes/ComparaProduto.java b/comex/testes/ComparaProduto.java new file mode 100644 index 00000000..72c24291 --- /dev/null +++ b/comex/testes/ComparaProduto.java @@ -0,0 +1,25 @@ +package br.com.alura.comex.testes; + +import br.com.alura.comex.model.Cliente; +import br.com.alura.comex.model.Pedido; + +import java.math.BigDecimal; + +// Classe TestePedido +public class ComparaProduto { + public static void main(String[] args) { + Cliente cliente = new Cliente("João Silva", "123.456.789-00", "joao.silva@gmail.com", "Engenheiro", "51 99876-5432", null); + Pedido pedido1 = new Pedido(101, cliente, new BigDecimal("150.00"), 2); + Pedido pedido2 = new Pedido(102, cliente, new BigDecimal("200.00"), 1); + + System.out.println(pedido1); + System.out.println(pedido2); + + // Usando operador ternário para converter boolean para "Sim" ou "Não" + String maisCaro = pedido1.isMaisCaroQue(pedido2) ? "Sim" : "Não"; + String maisBarato = pedido1.isMaisBaratoQue(pedido2) ? "Sim" : "Não"; + + System.out.println("Pedido 1 é mais caro que Pedido 2? " + maisCaro); + System.out.println("Pedido 1 é mais barato que Pedido 2? " + maisBarato); + } +} diff --git a/comex/testes/ConsultaCep.java b/comex/testes/ConsultaCep.java new file mode 100644 index 00000000..063cb281 --- /dev/null +++ b/comex/testes/ConsultaCep.java @@ -0,0 +1,39 @@ +package br.com.alura.comex.testes; + +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.net.http.HttpClient.Version; + +import br.com.alura.comex.model.Endereco; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class ConsultaCep { + + private static final String BASE_URL = "https://viacep.com.br/ws/"; + + public Endereco consultaCep(String cep) { + try { + HttpClient client = HttpClient.newBuilder() + .version(Version.HTTP_2) + .build(); + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(BASE_URL + cep + "/json/")) + .GET() + .build(); + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + + if (response.statusCode() == 200) { + ObjectMapper mapper = new ObjectMapper(); + return mapper.readValue(response.body(), Endereco.class); + } else { + System.err.println("Erro na consulta do CEP: " + response.statusCode()); + return null; + } + } catch (Exception e) { + System.err.println("Erro ao consultar CEP: " + e.getMessage()); + return null; + } + } +} diff --git a/comex/testes/ImpressaoDadosProduto.java b/comex/testes/ImpressaoDadosProduto.java new file mode 100644 index 00000000..b1112180 --- /dev/null +++ b/comex/testes/ImpressaoDadosProduto.java @@ -0,0 +1,13 @@ +package br.com.alura.comex.testes; + +import br.com.alura.comex.model.Produto; + +public class ImpressaoDadosProduto { + public static void main(String[] args) { + // Criação e inicialização do produto + Produto produto = new Produto("Livro", "Conjunto de folhas impressas.", 19.99, 100); + + // Invocação do método de impressão dos detalhes do produto + produto.imprimirDetalhes(); + } +} diff --git a/comex/testes/OrdenacaoPedido.java b/comex/testes/OrdenacaoPedido.java new file mode 100644 index 00000000..b9634fc1 --- /dev/null +++ b/comex/testes/OrdenacaoPedido.java @@ -0,0 +1,38 @@ +package br.com.alura.comex.testes; + + +import br.com.alura.comex.model.Cliente; +import br.com.alura.comex.model.Pedido; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +public class OrdenacaoPedido { + public static void main(String... args){ + // Criação de pedidos simulada, substitua isto pelo código de criação dos pedidos + List pedidos = new ArrayList<>(); + pedidos.add(new Pedido(101, new Cliente("João Silva", "123.456.789-00", "joao@gmail.com", "Engenheiro", "9988776655", null), new BigDecimal("1200.00"), 2)); + pedidos.add(new Pedido(102, new Cliente("Maria Fernanda", "987.654.321-00", "maria@gmail.com", "Advogada", "9966554433", null), new BigDecimal("300.00"), 1)); + pedidos.add(new Pedido(103, new Cliente("Carlos Eduardo", "321.654.987-00", "carlos@gmail.com", "Médico", "9944221100", null), new BigDecimal("450.00"), 3)); + pedidos.add(new Pedido(104, new Cliente("Ana Paula", "321.654.987-00", "ana@gmail.com", "Designer", "9944221100", null), new BigDecimal("850.00"), 1)); + pedidos.add(new Pedido(105, new Cliente("Paulo Henrique", "321.654.987-00", "paulo@gmail.com", "Fotógrafo", "9944221100", null), new BigDecimal("1250.00"), 2)); + + // Ordenando por maior valor total + Collections.sort(pedidos, Comparator.comparing(Pedido::getValorTotal).reversed()); + System.out.println("\nPedidos ordenados por maior valor total:"); + for (Pedido pedido : pedidos) { + System.out.println("Pedido ID: " + pedido.getId() + ", Valor Total: " + pedido.getValorTotal()); + } + + // Ordenando por menor valor total + Collections.sort(pedidos, Comparator.comparing(Pedido::getValorTotal)); + System.out.println("\nPedidos ordenados por menor valor total:"); + for (Pedido pedido : pedidos) { + System.out.println("Pedido ID: " + pedido.getId() + ", Valor Total: " + pedido.getValorTotal()); + } + } +} + diff --git a/comex/testes/TesteCep.java b/comex/testes/TesteCep.java new file mode 100644 index 00000000..88bcb5c9 --- /dev/null +++ b/comex/testes/TesteCep.java @@ -0,0 +1,14 @@ +package br.com.alura.comex.testes; + +import br.com.alura.comex.model.Endereco; + +public class TesteCep { + public static void main(String[] args) { + ConsultaCep service = new ConsultaCep(); + Endereco endereco = service.consultaCep("12237600"); + if (endereco != null) { + System.out.println(endereco); + } + } +} + diff --git a/comex/testes/TesteClassePedido.java b/comex/testes/TesteClassePedido.java new file mode 100644 index 00000000..367af116 --- /dev/null +++ b/comex/testes/TesteClassePedido.java @@ -0,0 +1,42 @@ +package br.com.alura.comex.testes; + +import br.com.alura.comex.model.Cliente; +import br.com.alura.comex.model.Pedido; +import br.com.alura.comex.model.Produto; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +public class TesteClassePedido { + public static void main(String[] args) { + // Criando clientes + Cliente cliente1 = new Cliente("João Silva", "123.456.789-00", "joao.silva@gmail.com", "Engenheiro", "51 99876-5432", null); + Cliente cliente2 = new Cliente("Maria Oliveira", "987.654.321-00", "maria.oliveira@gmail.com", "Médica", "21 98765-4321", null); + + // Criando produtos + Produto produto1 = new Produto("Notebook", "Notebook Dell", 3500.00, 10); + Produto produto2 = new Produto("Smartphone", "iPhone 13", 5000.00, 5); + Produto produto3 = new Produto("Impressora", "Impressora HP", 800.00, 15); + + // Criando pedidos + List pedidos = new ArrayList<>(); + pedidos.add(new Pedido(101, cliente1, new BigDecimal("3500.00"), 1)); + pedidos.add(new Pedido(102, cliente1, new BigDecimal("7000.00"), 2)); // 2 notebooks + pedidos.add(new Pedido(103, cliente2, new BigDecimal("5000.00"), 1)); + pedidos.add(new Pedido(104, cliente2, new BigDecimal("1600.00"), 2)); // 2 impressoras + pedidos.add(new Pedido(105, cliente1, new BigDecimal("800.00"), 1)); + + // Exibindo informações dos pedidos de forma segura + pedidos.forEach(pedido -> { + if (pedido.getCliente() != null) { + System.out.println("Pedido ID: " + pedido.getId() + ", Cliente: " + pedido.getCliente().getNome() + + ", Preço: " + pedido.getPreco() + ", Quantidade: " + pedido.getQuantidade() + + ", Valor Total: " + pedido.getValorTotal()); + } else { + System.out.println("Pedido ID: " + pedido.getId() + " tem um cliente nulo!"); + } + }); + } +} + diff --git a/comex/testes/TesteProduto.java b/comex/testes/TesteProduto.java new file mode 100644 index 00000000..f7be456e --- /dev/null +++ b/comex/testes/TesteProduto.java @@ -0,0 +1,43 @@ +package br.com.alura.comex.testes; + +import br.com.alura.comex.model.Categoria; +import br.com.alura.comex.model.Produto; + +import java.math.BigDecimal; +import java.util.Scanner; + +public class TesteProduto { + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + + System.out.println("Por favor, insira o nome do produto:"); + String nome = scanner.nextLine().trim(); + + // Verificar se o nome é válido (não vazio e não nulo) + while (nome.isEmpty()) { + System.out.println("O nome do produto é obrigatório e não pode ser vazio. Por favor, insira o nome do produto:"); + nome = scanner.nextLine().trim(); + } + + System.out.println("Por favor, insira a descrição do produto:"); + String descricao = scanner.nextLine().trim(); + + System.out.println("Por favor, insira o preço unitário do produto:"); + BigDecimal precoUnitario = BigDecimal.valueOf(scanner.nextDouble()); + + System.out.println("Por favor, insira a quantidade do produto:"); + int quantidade = scanner.nextInt(); + + System.out.println("Por favor, insira a categoria do produto:"); + int categoria = scanner.nextInt(); + + // Criação do objeto Produto com dados fornecidos pelo usuário + Produto produto = new Produto(nome, descricao, precoUnitario, quantidade, categoria); + + // Impressão das informações do produto + System.out.println("Informações do Produto:"); + System.out.println(produto); + + scanner.close(); // Fechar o scanner após o uso + } +} From 58e93e791af92610c01ac9f5b308e719a1f00701 Mon Sep 17 00:00:00 2001 From: Wander Carvalho <138515773+Wander-samix@users.noreply.github.com> Date: Mon, 29 Apr 2024 08:48:48 -0300 Subject: [PATCH 04/17] Delete Entrega Semana 7 - Wander Carvalho --- Entrega Semana 7 - Wander Carvalho | 1 - 1 file changed, 1 deletion(-) delete mode 100644 Entrega Semana 7 - Wander Carvalho diff --git a/Entrega Semana 7 - Wander Carvalho b/Entrega Semana 7 - Wander Carvalho deleted file mode 100644 index 6f16acbb..00000000 --- a/Entrega Semana 7 - Wander Carvalho +++ /dev/null @@ -1 +0,0 @@ -teste From 45195071c8e27332fd5ba7bcd0d029d9d110f86a Mon Sep 17 00:00:00 2001 From: Wander Carvalho <138515773+Wander-samix@users.noreply.github.com> Date: Mon, 29 Apr 2024 08:49:38 -0300 Subject: [PATCH 05/17] Delete comex directory --- comex/DAO/CadastraCliente.java | 114 -------------------- comex/DAO/CategoriaDao.java | 42 -------- comex/DAO/ClienteAlteraBd.java | 47 -------- comex/DAO/ClienteDao.java | 81 -------------- comex/DAO/EnderecoDao.java | 70 ------------ comex/DAO/PedidoDao.java | 42 -------- comex/DAO/ProdutoDao.java | 49 --------- comex/Main.java | 81 -------------- comex/ProcessadorDeCsv.java | 56 ---------- comex/model/Categoria.java | 51 --------- comex/model/Cliente.java | 87 --------------- comex/model/Endereco.java | 113 ------------------- comex/model/ItemPedido.java | 104 ------------------ comex/model/JsonCreator.java | 4 - comex/model/Pedido.java | 137 ------------------------ comex/model/Produto.java | 134 ----------------------- comex/model/TipoDesconto.java | 5 - comex/testes/ComparaProduto.java | 25 ----- comex/testes/ConsultaCep.java | 39 ------- comex/testes/ImpressaoDadosProduto.java | 13 --- comex/testes/OrdenacaoPedido.java | 38 ------- comex/testes/TesteCep.java | 14 --- comex/testes/TesteClassePedido.java | 42 -------- comex/testes/TesteProduto.java | 43 -------- 24 files changed, 1431 deletions(-) delete mode 100644 comex/DAO/CadastraCliente.java delete mode 100644 comex/DAO/CategoriaDao.java delete mode 100644 comex/DAO/ClienteAlteraBd.java delete mode 100644 comex/DAO/ClienteDao.java delete mode 100644 comex/DAO/EnderecoDao.java delete mode 100644 comex/DAO/PedidoDao.java delete mode 100644 comex/DAO/ProdutoDao.java delete mode 100644 comex/Main.java delete mode 100644 comex/ProcessadorDeCsv.java delete mode 100644 comex/model/Categoria.java delete mode 100644 comex/model/Cliente.java delete mode 100644 comex/model/Endereco.java delete mode 100644 comex/model/ItemPedido.java delete mode 100644 comex/model/JsonCreator.java delete mode 100644 comex/model/Pedido.java delete mode 100644 comex/model/Produto.java delete mode 100644 comex/model/TipoDesconto.java delete mode 100644 comex/testes/ComparaProduto.java delete mode 100644 comex/testes/ConsultaCep.java delete mode 100644 comex/testes/ImpressaoDadosProduto.java delete mode 100644 comex/testes/OrdenacaoPedido.java delete mode 100644 comex/testes/TesteCep.java delete mode 100644 comex/testes/TesteClassePedido.java delete mode 100644 comex/testes/TesteProduto.java diff --git a/comex/DAO/CadastraCliente.java b/comex/DAO/CadastraCliente.java deleted file mode 100644 index d6bf0f26..00000000 --- a/comex/DAO/CadastraCliente.java +++ /dev/null @@ -1,114 +0,0 @@ -package br.com.alura.comex.DAO; - -import br.com.alura.comex.model.Cliente; -import br.com.alura.comex.model.Endereco; -import br.com.alura.comex.testes.ConsultaCep; - -import javax.persistence.EntityManager; -import javax.persistence.EntityManagerFactory; -import javax.persistence.Persistence; -import java.util.Scanner; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import ch.qos.logback.classic.Level; -import ch.qos.logback.classic.LoggerContext; - -public class CadastraCliente { - - private static Scanner scanner; - private static final Logger logger = LoggerFactory.getLogger(CadastraCliente.class); - - public static void main(String[] args) { - EntityManagerFactory factory = Persistence.createEntityManagerFactory("oracle"); - EntityManager entityManager = factory.createEntityManager(); - scanner = new Scanner(System.in); - - try { - setLoggingLevel(Level.ERROR); // Reduz o nível de log antes da interação com o usuário - - System.out.println("Digite 'sair' a qualquer momento para terminar o programa."); - String cep = getRequiredInput("Por favor, insira o CEP para consulta:"); - Endereco endereco = new ConsultaCep().consultaCep(cep); - - if (endereco == null) { - logger.error("Não foi possível encontrar o endereço para o CEP fornecido."); - return; - } - - Cliente cliente = getClienteData(endereco); - if (cliente != null) { - logger.info("Informações do cliente antes da persistência: {}", cliente); - logger.info("Informações do endereço antes da persistência: {}", endereco); - - EntityManager em = factory.createEntityManager(); - entityManager.getTransaction().begin(); // Inicia a transação - cliente.salvar(em); // Persiste o cliente e seu endereço - entityManager.getTransaction().commit(); // Faz o commit da transação - entityManager.close(); // Fecha o EntityManager após o uso - - logger.info("Cliente cadastrado com sucesso: {}", cliente); - } else { - logger.error("Falha ao criar dados do cliente. Cliente retornou nulo."); - } - } finally { - scanner.close(); - factory.close(); - setLoggingLevel(Level.DEBUG); // Restaura o nível de log após a interação - } - } - - private static Cliente getClienteData(Endereco endereco) { - String nomeCliente = getRequiredInput("Por favor, insira o nome do cliente:"); - if (nomeCliente.isEmpty()) { - logger.error("O nome do cliente é obrigatório e não foi fornecido."); - return null; // Retorna nulo para evitar tentativa de persistência com nome nulo. - } - String cpf = getRequiredInput("Por favor, insira o CPF do cliente:"); - String email = getEmailInput(); - String profissao = getRequiredInput("Por favor, insira a profissão do cliente:"); - String telefone = getRequiredInput("Por favor, insira o telefone do cliente:"); - endereco.setNumero(getRequiredInput("Por favor, insira o número do imóvel:")); - endereco.setComplemento(getInput("Por favor, insira o complemento do imóvel (opcional):")); - - return new Cliente(nomeCliente, cpf, email, profissao, telefone, endereco); - } - - private static String getRequiredInput(String prompt) { - System.out.println(prompt); - String input = scanner.nextLine(); - if ("sair".equalsIgnoreCase(input)) { - System.out.println("Programa encerrado."); - System.exit(0); - } - if (input.trim().isEmpty()) { - System.out.println("Este campo é obrigatório. Por favor, forneça um valor."); - return getRequiredInput(prompt); - } - return input; - } - - private static String getInput(String prompt) { - System.out.println(prompt); - return scanner.nextLine(); - } - - private static String getEmailInput() { - String email = getRequiredInput("Por favor, insira o email do cliente:"); - if (!isValidEmail(email)) { - System.out.println("Email inválido. Por favor, insira um email válido."); - return getEmailInput(); - } - return email; - } - - private static boolean isValidEmail(String email) { - return email.matches("^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(\\[?)(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}(\\]?)$"); - } - - private static void setLoggingLevel(Level newLevel) { - LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); - ch.qos.logback.classic.Logger rootLogger = loggerContext.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME); - rootLogger.setLevel(newLevel); - } -} diff --git a/comex/DAO/CategoriaDao.java b/comex/DAO/CategoriaDao.java deleted file mode 100644 index 21bf1b00..00000000 --- a/comex/DAO/CategoriaDao.java +++ /dev/null @@ -1,42 +0,0 @@ -package br.com.alura.comex.dao; - -import br.com.alura.comex.model.Categoria; -import javax.persistence.EntityManager; -import javax.persistence.EntityTransaction; -import java.util.List; - -public class CategoriaDao { - private final EntityManager em; - - public CategoriaDao(EntityManager em) { - this.em = em; - } - - // Busca uma categoria por ID - public Categoria buscarPorId(Long id) { - Categoria categoria = em.find(Categoria.class, id); - System.out.println("Buscar por ID - Categoria encontrada: " + categoria); - return categoria; - } - - // Cadastra uma nova categoria - public void cadastra(Categoria categoria) { - EntityTransaction et = em.getTransaction(); - try { - et.begin(); - em.persist(categoria); - et.commit(); - System.out.println("Cadastrando Categoria: " + categoria); - } catch (Exception e) { - et.rollback(); - System.out.println("Erro ao cadastrar categoria: " + e.getMessage()); - } - } - - // Lista todas as categorias - public List listaTodas() { - List categorias = em.createQuery("SELECT c FROM Categoria c", Categoria.class).getResultList(); - System.out.println("Listando todas as Categorias: " + categorias); - return categorias; - } -} diff --git a/comex/DAO/ClienteAlteraBd.java b/comex/DAO/ClienteAlteraBd.java deleted file mode 100644 index 68d4b5de..00000000 --- a/comex/DAO/ClienteAlteraBd.java +++ /dev/null @@ -1,47 +0,0 @@ -package br.com.alura.comex.DAO; - -import br.com.alura.comex.model.Cliente; -import br.com.alura.comex.model.Endereco; - -import javax.persistence.EntityManager; -import javax.persistence.EntityTransaction; - -public class ClienteAlteraBd { - - private final EntityManager entityManager; - - public ClienteAlteraBd(EntityManager entityManager) { - this.entityManager = entityManager; - } - - public void atualizar(Cliente cliente) { - EntityTransaction transaction = entityManager.getTransaction(); - - try { - if (!transaction.isActive()) { - transaction.begin(); - } - - // Verifica se o endereço do cliente já está persistido - if (cliente.getEndereco().getId() == null) { - // Se o endereço não está persistido, salva-o primeiro - Endereco endereco = cliente.getEndereco(); - entityManager.persist(endereco); - } - - entityManager.merge(cliente); - transaction.commit(); - } catch (Exception e) { - if (transaction.isActive()) { - transaction.rollback(); - } - throw new RuntimeException("Erro ao atualizar o cliente", e); - } - } - - public void salvar(Cliente cliente) { - } - - public void excluir(Cliente cliente) { - } -} \ No newline at end of file diff --git a/comex/DAO/ClienteDao.java b/comex/DAO/ClienteDao.java deleted file mode 100644 index a5e97cc0..00000000 --- a/comex/DAO/ClienteDao.java +++ /dev/null @@ -1,81 +0,0 @@ -package br.com.alura.comex.DAO; - -import br.com.alura.comex.model.Cliente; -import javax.persistence.EntityManager; -import javax.persistence.EntityTransaction; -import java.util.List; - -public class ClienteDao { - private final EntityManager em; - - public ClienteDao(EntityManager em) { - this.em = em; - } - - // Busca um cliente por seu ID no banco de dados - public Cliente buscaPorId(Long id) { - Cliente cliente = em.find(Cliente.class, id); - System.out.println("Busca por ID - Cliente encontrado: " + cliente); - return cliente; - } - - // Cadastra um novo cliente no banco de dados - public void cadastra(Cliente cliente) { - EntityTransaction et = em.getTransaction(); - try { - et.begin(); - em.persist(cliente); - et.commit(); - System.out.println("Cadastrando Cliente: " + cliente); - } catch (Exception e) { - et.rollback(); - System.out.println("Erro ao cadastrar cliente: " + e.getMessage()); - } - } - - // Atualiza os dados de um cliente existente no banco de dados - public void atualiza(Cliente cliente) { - EntityTransaction et = em.getTransaction(); - try { - et.begin(); - em.merge(cliente); - et.commit(); - System.out.println("Atualizando Cliente: " + cliente); - } catch (Exception e) { - et.rollback(); - System.out.println("Erro ao atualizar cliente: " + e.getMessage()); - } - } - - // Remove um cliente do banco de dados - public void remove(Cliente cliente) { - EntityTransaction et = em.getTransaction(); - try { - et.begin(); - em.remove(em.contains(cliente) ? cliente : em.merge(cliente)); - et.commit(); - System.out.println("Removendo Cliente: " + cliente); - } catch (Exception e) { - et.rollback(); - System.out.println("Erro ao remover cliente: " + e.getMessage()); - } - } - - // Lista todos os clientes cadastrados no banco de dados - public List listaTodos() { - List clientes = em.createQuery("SELECT c FROM Cliente c", Cliente.class).getResultList(); - System.out.println("Listando todos os Clientes: " + clientes); - return clientes; - } - - // Lista clientes por nome, usando uma busca parcial - public List listaPorNome(String nome) { - List clientes = em.createQuery("SELECT c FROM Cliente c WHERE c.nome LIKE :nome", Cliente.class) - .setParameter("nome", "%" + nome + "%") - .getResultList(); - System.out.println("Listando Clientes por nome (" + nome + "): " + clientes); - return clientes; - } -} - - diff --git a/comex/DAO/EnderecoDao.java b/comex/DAO/EnderecoDao.java deleted file mode 100644 index e668b9f4..00000000 --- a/comex/DAO/EnderecoDao.java +++ /dev/null @@ -1,70 +0,0 @@ -package br.com.alura.comex.DAO; - -import br.com.alura.comex.model.Endereco; - -import javax.persistence.EntityManager; -import javax.persistence.EntityTransaction; - -public class EnderecoDao { - - private final EntityManager entityManager; - - public EnderecoDao(EntityManager entityManager) { - this.entityManager = entityManager; - } - - public void salvar(Endereco endereco) { - EntityTransaction transaction = entityManager.getTransaction(); - - try { - if (!transaction.isActive()) { - transaction.begin(); - } - - entityManager.persist(endereco); - entityManager.flush(); // Sincroniza as alterações com o banco de dados - transaction.commit(); - } catch (Exception e) { - if (transaction.isActive()) { - transaction.rollback(); - } - throw new RuntimeException("Erro ao salvar o endereço", e); - } - } - - public void atualizar(Endereco endereco) { - EntityTransaction transaction = entityManager.getTransaction(); - - try { - if (!transaction.isActive()) { - transaction.begin(); - } - - entityManager.merge(endereco); - transaction.commit(); - } catch (Exception e) { - if (transaction.isActive()) { - transaction.rollback(); - } - throw new RuntimeException("Erro ao atualizar o endereço", e); - } - } - - public void excluir(Endereco endereco) { - EntityTransaction transaction = entityManager.getTransaction(); - - try { - if (!transaction.isActive()) { - transaction.begin(); - } - - entityManager.remove(endereco); - transaction.commit(); - } catch (Exception e) { - if (transaction.isActive()) { - transaction.rollback(); - } - throw new RuntimeException("Erro ao excluir o endereço", e); - } - } -} diff --git a/comex/DAO/PedidoDao.java b/comex/DAO/PedidoDao.java deleted file mode 100644 index b0fe4e0d..00000000 --- a/comex/DAO/PedidoDao.java +++ /dev/null @@ -1,42 +0,0 @@ -package br.com.alura.comex.DAO; - -import br.com.alura.comex.model.Pedido; -import javax.persistence.EntityManager; -import javax.persistence.EntityTransaction; -import java.util.List; - -public class PedidoDao { - private final EntityManager em; - - public PedidoDao(EntityManager em) { - this.em = em; - } - - // Busca um pedido por ID - public Pedido buscaPorId(Long id) { - Pedido pedido = em.find(Pedido.class, id); - System.out.println("Busca por ID - Pedido encontrado: " + pedido); - return pedido; - } - - // Cadastra um novo pedido - public void cadastra(Pedido pedido) { - EntityTransaction et = em.getTransaction(); - try { - et.begin(); - em.persist(pedido); - et.commit(); - System.out.println("Cadastrando Pedido: " + pedido); - } catch (Exception e) { - et.rollback(); - System.out.println("Erro ao cadastrar pedido: " + e.getMessage()); - } - } - - // Lista todos os pedidos - public List listaTodos() { - List pedidos = em.createQuery("SELECT p FROM Pedido p", Pedido.class).getResultList(); - System.out.println("Listando todos os Pedidos: " + pedidos); - return pedidos; - } -} diff --git a/comex/DAO/ProdutoDao.java b/comex/DAO/ProdutoDao.java deleted file mode 100644 index 69e93312..00000000 --- a/comex/DAO/ProdutoDao.java +++ /dev/null @@ -1,49 +0,0 @@ -package br.com.alura.comex.DAO; - -import br.com.alura.comex.model.Produto; -import javax.persistence.EntityManager; -import javax.persistence.EntityTransaction; -import java.util.List; - -public class ProdutoDao { - private final EntityManager em; - - public ProdutoDao(EntityManager em) { - this.em = em; - } - - // Busca um produto por ID - public Produto buscaPorId(Long id) { - Produto produto = em.find(Produto.class, id); - System.out.println("Busca por ID - Produto encontrado: " + produto); - return produto; - } - - // Cadastra um novo produto - public void cadastra(Produto produto) { - EntityTransaction et = em.getTransaction(); - try { - et.begin(); - em.persist(produto); - et.commit(); - System.out.println("Cadastrando Produto: " + produto); - } catch (Exception e) { - et.rollback(); - System.out.println("Erro ao cadastrar produto: " + e.getMessage()); - } - } - - // Lista todos os produtos - public List listaTodos() { - List produtos = em.createQuery("SELECT p FROM Produto p", Produto.class).getResultList(); - System.out.println("Listando todos os Produtos: " + produtos); - return produtos; - } - - // Lista produtos que estão indisponíveis (quantidade = 0) - public List listaIndisponiveis() { - List produtosIndisponiveis = em.createQuery("SELECT p FROM Produto p WHERE p.quantidade = 0", Produto.class).getResultList(); - System.out.println("Listando produtos indisponíveis: " + produtosIndisponiveis); - return produtosIndisponiveis; - } -} diff --git a/comex/Main.java b/comex/Main.java deleted file mode 100644 index 0cd05711..00000000 --- a/comex/Main.java +++ /dev/null @@ -1,81 +0,0 @@ -//package br.com.alura.comex; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.math.BigDecimal; -import java.math.RoundingMode; -import java.net.URISyntaxException; -import java.text.NumberFormat; -import java.util.Arrays; -import java.util.Locale; - -//public class Main { -// -// private static final Logger logger = LoggerFactory.getLogger(Main.class); -// -// public static void main(String[] args) throws IOException, URISyntaxException { -// Pedido[] pedidos = ProcessadorDeCsv.processaArquivo("pedidos.csv"); -// -// int totalDeProdutosVendidos = 0; -// int totalDePedidosRealizados = 0; -// BigDecimal montanteDeVendas = BigDecimal.ZERO; -// Pedido pedidoMaisBarato = null; -// Pedido pedidoMaisCaro = null; -// -// String[] categoriasProcessadas = new String[10]; -// int totalDeCategorias = 0; -// -// for (int i = 0; i < pedidos.length; i++) { -// Pedido pedidoAtual = pedidos[i]; -// -// if (pedidoAtual == null) { -// break; -// } -// -// if (pedidoMaisBarato == null || pedidoAtual.getPreco().multiply(new BigDecimal(pedidoAtual.getQuantidade())).compareTo(pedidoMaisBarato.getPreco().multiply(new BigDecimal(pedidoMaisBarato.getQuantidade()))) < 0) { -// pedidoMaisBarato = pedidoAtual; -// } -// -// if (pedidoMaisCaro == null || pedidoAtual.getPreco().multiply(new BigDecimal(pedidoAtual.getQuantidade())).compareTo(pedidoMaisCaro.getPreco().multiply(new BigDecimal(pedidoMaisCaro.getQuantidade()))) > 0) { -// pedidoMaisCaro = pedidoAtual; -// } -// -// montanteDeVendas = montanteDeVendas.add(pedidoAtual.getPreco().multiply(new BigDecimal(pedidoAtual.getQuantidade()))); -// totalDeProdutosVendidos += pedidoAtual.getQuantidade(); -// totalDePedidosRealizados++; -// -// boolean jahProcessouCategoria = false; -// for (int j = 0; j < categoriasProcessadas.length; j++) { -// if (pedidoAtual.getCategoria().equalsIgnoreCase(categoriasProcessadas[j])) { -// jahProcessouCategoria = true; -// } -// } -// -// if (!jahProcessouCategoria) { -// totalDeCategorias++; -// -// if (categoriasProcessadas[categoriasProcessadas.length - 1] != null) { -// categoriasProcessadas = Arrays.copyOf(categoriasProcessadas, categoriasProcessadas.length * 2); -// } else { -// for (int k = 0; k < categoriasProcessadas.length; k++) { -// if (categoriasProcessadas[k] == null) { -// categoriasProcessadas[k] = pedidoAtual.getCategoria(); -// break; -// } -// } -// } -// } -// } -// -// logger.info("##### RELATÓRIO DE VALORES TOTAIS #####"); -// logger.info("TOTAL DE PEDIDOS REALIZADOS: {}", totalDePedidosRealizados); -// logger.info("TOTAL DE PRODUTOS VENDIDOS: {}", totalDeProdutosVendidos); -// logger.info("TOTAL DE CATEGORIAS: {}", totalDeCategorias); -// logger.info("MONTANTE DE VENDAS: {}", NumberFormat.getCurrencyInstance(new Locale("pt", "BR")).format(montanteDeVendas.setScale(2, RoundingMode.HALF_DOWN))); -// logger.info("PEDIDO MAIS BARATO: {} ({})", NumberFormat.getCurrencyInstance(new Locale("pt", "BR")).format(pedidoMaisBarato.getPreco().multiply(new BigDecimal(pedidoMaisBarato.getQuantidade())).setScale(2, RoundingMode.HALF_DOWN)), pedidoMaisBarato.getProduto()); -// logger.info("PEDIDO MAIS CARO: {} ({})\n", NumberFormat.getCurrencyInstance(new Locale("pt", "BR")).format(pedidoMaisCaro.getPreco().multiply(new BigDecimal(pedidoMaisCaro.getQuantidade())).setScale(2, RoundingMode.HALF_DOWN)), pedidoMaisCaro.getProduto()); -// logger.info("### FIM DO RELATÓRIO ###"); -// } -//} \ No newline at end of file diff --git a/comex/ProcessadorDeCsv.java b/comex/ProcessadorDeCsv.java deleted file mode 100644 index 6b2496e9..00000000 --- a/comex/ProcessadorDeCsv.java +++ /dev/null @@ -1,56 +0,0 @@ -package br.com.alura.comex; - -import br.com.alura.comex.model.Pedido; - -import java.io.IOException; -import java.math.BigDecimal; -import java.net.URISyntaxException; -import java.net.URL; -import java.nio.file.Path; -import java.time.LocalDate; -import java.time.format.DateTimeFormatter; -import java.util.Arrays; -import java.util.Scanner; - -public class ProcessadorDeCsv { - - public static Pedido[] processaArquivo(String nomeDoArquivo) { - try { - URL recursoCSV = ClassLoader.getSystemResource(nomeDoArquivo); - Path caminhoDoArquivo = caminhoDoArquivo = Path.of(recursoCSV.toURI()); - - Scanner leitorDeLinhas = new Scanner(caminhoDoArquivo); - - leitorDeLinhas.nextLine(); - - Pedido[] pedidos = new Pedido[10]; - - int quantidadeDeRegistros = 0; - while (leitorDeLinhas.hasNextLine()) { - String linha = leitorDeLinhas.nextLine(); - String[] registro = linha.split(","); - - String categoria = registro[0]; - String produto = registro[1]; - BigDecimal preco = new BigDecimal(registro[2]); - int quantidade = Integer.parseInt(registro[3]); - LocalDate data = LocalDate.parse(registro[4], DateTimeFormatter.ofPattern("dd/MM/yyyy")); - String cliente = registro[5]; - - Pedido pedido = new Pedido(categoria, produto, cliente, preco, quantidade, data); - pedidos[quantidadeDeRegistros] = pedido; - - quantidadeDeRegistros++; - if (pedidos[pedidos.length - 1] != null) { - pedidos = Arrays.copyOf(pedidos, pedidos.length * 2); - } - } - - return pedidos; - } catch (URISyntaxException e) { - throw new RuntimeException(String.format("Arquivo {} não localizado!", nomeDoArquivo)); - } catch (IOException e) { - throw new RuntimeException("Erro ao abrir Scanner para processar arquivo!"); - } - } -} \ No newline at end of file diff --git a/comex/model/Categoria.java b/comex/model/Categoria.java deleted file mode 100644 index a07046e8..00000000 --- a/comex/model/Categoria.java +++ /dev/null @@ -1,51 +0,0 @@ -package br.com.alura.comex.model; - -import javax.persistence.*; - -@Entity -@Table(name = "categoria") -public class Categoria { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(nullable = false) - private String nome; - - @Enumerated(EnumType.STRING) - @Column(nullable = false, columnDefinition = "VARCHAR(10) default 'ATIVA'") - private Status status = Status.ATIVA; - - // Getters and Setters - 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 Status getStatus() { - return status; - } - - public void setStatus(Status status) { - this.status = status; - } - - // Enum for status - public enum Status { - ATIVA, INATIVA - } - } - - diff --git a/comex/model/Cliente.java b/comex/model/Cliente.java deleted file mode 100644 index 220342a0..00000000 --- a/comex/model/Cliente.java +++ /dev/null @@ -1,87 +0,0 @@ -package br.com.alura.comex.model; - -import javax.persistence.*; - -@Entity -@Table(name = "cliente") -public class Cliente { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(name = "nome", length = 120, nullable = false) - private String nome; - - @Column(name = "cpf", length = 13, unique = true, nullable = false) - private String cpf; - - @Column(name = "email", length = 50) - private String email; - - @Column(name = "profissao", length = 20, nullable = false) - private String profissao; - - @Column(name = "telefone", length = 20, nullable = false) - private String telefone; - - @ManyToOne(fetch = FetchType.EAGER) - @JoinColumn(name = "endereco_id", nullable = false) - private Endereco endereco; - - public Cliente() {} - - public Cliente(String nome, String cpf, String email, String profissao, String telefone, Endereco endereco) { - this.nome = nome; - this.cpf = cpf; - this.email = email; - this.profissao = profissao; - this.telefone = telefone; - this.endereco = endereco; - } - - public Cliente(EntityManager entityManager) { - } - - // Getters and setters - 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 getCpf() { return cpf; } - public void setCpf(String cpf) { this.cpf = cpf; } - - public String getEmail() { return email; } - public void setEmail(String email) { this.email = email; } - - public String getProfissao() { return profissao; } - public void setProfissao(String profissao) { this.profissao = profissao; } - - public String getTelefone() { return telefone; } - public void setTelefone(String telefone) { this.telefone = telefone; } - - public Endereco getEndereco() { return endereco; } - public void setEndereco(Endereco endereco) { this.endereco = endereco; } - - @Override - public String toString() { - return "Cliente{" + - "id=" + id + - ", nome='" + nome + '\'' + - ", cpf='" + cpf + '\'' + - ", email='" + email + '\'' + - ", profissao='" + profissao + '\'' + - ", telefone='" + telefone + '\'' + - ", endereco=" + endereco + - '}'; - } - - - public void salvar(Cliente clientenovo) { - } - - public void salvar(EntityManager entityManager) { - } -} diff --git a/comex/model/Endereco.java b/comex/model/Endereco.java deleted file mode 100644 index f4c0b277..00000000 --- a/comex/model/Endereco.java +++ /dev/null @@ -1,113 +0,0 @@ -package br.com.alura.comex.model; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import br.com.alura.comex.DAO.EnderecoDao; -import com.fasterxml.jackson.annotation.JsonProperty; - -import javax.persistence.*; - -@Entity -@Table(name = "endereco") -@JsonIgnoreProperties(ignoreUnknown = true) // Ignora propriedades desconhecidas durante a desserialização -public class Endereco { - -@Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(name = "cep", length = 120, nullable = false) - private String cep; - - @Column(name = "logradouro", length = 120, nullable = true) - private String logradouro; - - @Column(name = "complemento", length = 120, nullable = true) - private String complemento; - - @Column(name = "bairro", length = 120, nullable = true) - private String bairro; - - @Column(name = "localidade", length = 120, nullable = true) - private String localidade; - - @Column(name = "uf", length = 2, nullable = true) - private String uf; - - @Column(name = "numero", length = 20, nullable = true) - private String numero; - - public Endereco() { - // Construtor padrão necessário para JPA - } - - @JsonCreator - public Endereco(@JsonProperty("cep") String cep, - @JsonProperty("logradouro") String logradouro, - @JsonProperty("complemento") String complemento, - @JsonProperty("bairro") String bairro, - @JsonProperty("localidade") String localidade, - @JsonProperty("uf") String uf, - @JsonProperty("numero") String numero) { - this.cep = cep; - this.logradouro = logradouro; - this.complemento = complemento; - this.bairro = bairro; - this.localidade = localidade; - this.uf = uf; - this.numero = numero; - } - - // Getters e setters - - public Long getId() { return id; } - public void setId(Long id) { this.id = id; } - - public String getCep() { return cep; } - public void setCep(String cep) { this.cep = cep; } - - public String getLogradouro() { return logradouro; } - public void setLogradouro(String logradouro) { this.logradouro = logradouro; } - - public String getComplemento() { return complemento; } - public void setComplemento(String complemento) { this.complemento = complemento; } - - public String getBairro() { return bairro; } - public void setBairro(String bairro) { this.bairro = bairro; } - - public String getLocalidade() { return localidade; } - public void setLocalidade(String localidade) { this.localidade = localidade; } - - public String getUf() { return uf; } - public void setUf(String uf) { this.uf = uf; } - - public String getNumero() { return numero; } - public void setNumero(String numero) { this.numero = numero; } - - @Override - public String toString() { - return "Endereco{" + - "id=" + id + - ", cep='" + cep + '\'' + - ", logradouro='" + logradouro + '\'' + - ", complemento='" + complemento + '\'' + - ", bairro='" + bairro + '\'' + - ", localidade='" + localidade + '\'' + - ", uf='" + uf + '\'' + - ", numero='" + numero + '\'' + - '}'; - } - - public void salvar(EnderecoDao enderecoDao) { - enderecoDao.salvar(this); - } - - public void atualizar(EnderecoDao enderecoDao) { - enderecoDao.atualizar(this); - } - - public void excluir(EnderecoDao enderecoDao) { - enderecoDao.excluir(this); - } -} - - diff --git a/comex/model/ItemPedido.java b/comex/model/ItemPedido.java deleted file mode 100644 index b831cf1c..00000000 --- a/comex/model/ItemPedido.java +++ /dev/null @@ -1,104 +0,0 @@ -package br.com.alura.comex.model; - -import java.math.BigDecimal; -import javax.persistence.*; - -@Entity -@Table(name = "item_pedido") -public class ItemPedido { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(nullable = false, precision = 10, scale = 2) - private BigDecimal precoUnitario; - - @Column(nullable = false) - private int quantidade; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "produto_id", nullable = false) - private Produto produto; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "pedido_id", nullable = false) - private Pedido pedido; - - @Column(nullable = false, precision = 10, scale = 2) - private BigDecimal desconto; - - @Enumerated(EnumType.STRING) - @Column(nullable = false) - private TipoDesconto tipoDesconto; - - // Construtores, Getters e Setters - - public ItemPedido() {} - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public TipoDesconto getTipoDesconto() { - return tipoDesconto; - } - - public void setTipoDesconto(TipoDesconto tipoDesconto) { - this.tipoDesconto = tipoDesconto; - } - - public BigDecimal getDesconto() { - return desconto; - } - - public void setDesconto(BigDecimal desconto) { - this.desconto = desconto; - } - - public Pedido getPedido() { - return pedido; - } - - public void setPedido(Pedido pedido) { - this.pedido = pedido; - } - - public Produto getProduto() { - return produto; - } - - public void setProduto(Produto produto) { - this.produto = produto; - } - - public int getQuantidade() { - return quantidade; - } - - public void setQuantidade(int quantidade) { - this.quantidade = quantidade; - } - - public BigDecimal getPrecoUnitario() { - return precoUnitario; - } - - public void setPrecoUnitario(BigDecimal precoUnitario) { - this.precoUnitario = precoUnitario; - } - - public ItemPedido(BigDecimal precoUnitario, int quantidade, Produto produto, Pedido pedido, BigDecimal desconto, TipoDesconto tipoDesconto) { - this.precoUnitario = precoUnitario; - this.quantidade = quantidade; - this.produto = produto; - this.pedido = pedido; - this.desconto = desconto; - this.tipoDesconto = tipoDesconto; - } - - } - diff --git a/comex/model/JsonCreator.java b/comex/model/JsonCreator.java deleted file mode 100644 index 7efcf2da..00000000 --- a/comex/model/JsonCreator.java +++ /dev/null @@ -1,4 +0,0 @@ -package br.com.alura.comex.model; - -public @interface JsonCreator { -} diff --git a/comex/model/Pedido.java b/comex/model/Pedido.java deleted file mode 100644 index 890ab934..00000000 --- a/comex/model/Pedido.java +++ /dev/null @@ -1,137 +0,0 @@ -package br.com.alura.comex.model; - -import java.math.BigDecimal; -import java.time.LocalDate; -import java.util.List; -import javax.persistence.*; - -@Entity -@Table(name = "pedidos") -public class Pedido { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; // Tipo alterado para Long, que é mais comum para IDs - - @ManyToOne - @JoinColumn(name = "cliente_id", nullable = false) - private Cliente cliente; - - @OneToMany(mappedBy = "pedido", cascade = CascadeType.ALL, fetch = FetchType.LAZY) - private List itensPedido; - - @Column(nullable = false, precision = 10, scale = 2) - private BigDecimal preco; - - @Column(nullable = false) - private int quantidade; - - @Column(nullable = false) - private LocalDate data; - - @Enumerated(EnumType.STRING) - @Column(nullable = false) - private TipoDesconto tipoDesconto; - - // Construtores - public Pedido(int id, Cliente cliente, BigDecimal preco, int quantidade, LocalDate data, TipoDesconto tipoDesconto) { - this.id = (long) id; - this.cliente = cliente; - this.preco = preco; - this.quantidade = quantidade; - this.data = data; - this.tipoDesconto = tipoDesconto; - } - - public Pedido(int id, Cliente cliente, BigDecimal preco, int quantidade, int id1) { - this.id = (long) id1; - } - - public Pedido(String categoria, String produto, String cliente, BigDecimal preco, int quantidade, LocalDate data, int id) { - this.id = (long) id; - } - - public Pedido(String categoria, String produto, String cliente, BigDecimal preco, int quantidade, LocalDate data) { - } - - public Pedido(int i, Cliente cliente, BigDecimal bigDecimal, int i1) { - } - - // Getters e Setters - public int getId() { - return Math.toIntExact(id); - } - - public void setId(int id) { - this.id = (long) id; - } - - public Cliente getCliente() { - return cliente; - } - - public void setCliente(Cliente cliente) { - this.cliente = cliente; - } - - public BigDecimal getPreco() { - return preco; - } - - public void setPreco(BigDecimal preco) { - this.preco = preco; - } - - public int getQuantidade() { - return quantidade; - } - - public void setQuantidade(int quantidade) { - this.quantidade = quantidade; - } - - public LocalDate getData() { - return data; - } - - public void setData(LocalDate data) { - this.data = data; - } - - public TipoDesconto getTipoDesconto() { - return tipoDesconto; - } - - public void setTipoDesconto(TipoDesconto tipoDesconto) { - this.tipoDesconto = tipoDesconto; - } - - // Método para calcular o valor total do pedido com desconto aplicado - public BigDecimal getValorTotal() { - BigDecimal total = preco.multiply(BigDecimal.valueOf(quantidade)); - if (tipoDesconto == TipoDesconto.FIDELIDADE) { - return total.multiply(BigDecimal.valueOf(0.90)); // Aplica 10% de desconto - } - return total; - } - - @Override - public String toString() { - return "Pedido{" + - "id=" + id + - ", cliente=" + (cliente != null ? cliente.getNome() : "N/D") + - ", preço=" + preco + - ", quantidade=" + quantidade + - ", data=" + data + - ", tipoDesconto=" + tipoDesconto + - ", valor total=" + getValorTotal() + - '}'; - } - - public boolean isMaisCaroQue(Pedido pedido2) { - return false; - } - - public boolean isMaisBaratoQue(Pedido pedido2) { - return false; - } -} diff --git a/comex/model/Produto.java b/comex/model/Produto.java deleted file mode 100644 index bc18c8a5..00000000 --- a/comex/model/Produto.java +++ /dev/null @@ -1,134 +0,0 @@ -package br.com.alura.comex.model; - -import javax.persistence.*; -import java.math.BigDecimal; -import java.util.Objects; - -@Entity -@Table(name = "produto") -public class Produto { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(name = "nome", length = 220, nullable = false) - private String nome; - - @Column(name = "descricao", length = 220, nullable = false) - private String descricao; - - @Column(name = "preco_unitario", nullable = false) - private BigDecimal precoUnitario; - - @Column(name = "quantidade", nullable = false) - private int quantidade; - - @ManyToOne - @JoinColumn(name = "categoria_id", referencedColumnName = "id", nullable = false, foreignKey = @ForeignKey(name = "fk_categoria_produto")) - private Categoria categoria; - - // Construtor vazio para JPA - public Produto(String livro, String s, double v, int i) {} - - // Construtor principal - public Produto(String nome, String descricao, BigDecimal precoUnitario, int quantidade, Categoria categoria) { - setNome(nome); - this.descricao = descricao; - this.precoUnitario = precoUnitario; - this.quantidade = quantidade; - this.categoria = categoria; - } - - public Produto(String nome, String descricao, BigDecimal precoUnitario, int quantidade, int categoria) { - } - - // Getters - public Long getId() { - return id; - } - - public String getNome() { - return nome; - } - - public String getDescricao() { - return descricao; - } - - public BigDecimal getPrecoUnitario() { - return precoUnitario; - } - - public int getQuantidade() { - return quantidade; - } - - public Categoria getCategoria() { - return categoria; - } - - // Setters - public void setId(Long id) { - this.id = id; - } - - public void setNome(String nome) { - if (nome == null || nome.trim().isEmpty()) { - throw new IllegalArgumentException("O nome do produto é obrigatório e não pode ser vazio."); - } - this.nome = nome; - } - - public void setDescricao(String descricao) { - this.descricao = descricao; - } - - public void setPrecoUnitario(BigDecimal precoUnitario) { - this.precoUnitario = precoUnitario; - } - - public void setQuantidade(int quantidade) { - this.quantidade = quantidade; - } - - public void setCategoria(Categoria categoria) { - this.categoria = categoria; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Produto produto = (Produto) o; - return quantidade == produto.quantidade && - Objects.equals(id, produto.id) && - Objects.equals(nome, produto.nome) && - Objects.equals(descricao, produto.descricao) && - Objects.equals(precoUnitario, produto.precoUnitario) && - Objects.equals(categoria, produto.categoria); - } - - @Override - public int hashCode() { - return Objects.hash(id, nome, descricao, precoUnitario, quantidade, categoria); - } - - @Override - public String toString() { - return "Produto{" + - "id=" + id + - ", nome='" + nome + '\'' + - ", descricao='" + descricao + '\'' + - ", precoUnitario=" + precoUnitario + - ", quantidade=" + quantidade + - ", categoria=" + categoria + - '}'; - } - - public void imprimirDetalhes() { - System.out.println(this.toString()); - } -} - - diff --git a/comex/model/TipoDesconto.java b/comex/model/TipoDesconto.java deleted file mode 100644 index 8f36ba8f..00000000 --- a/comex/model/TipoDesconto.java +++ /dev/null @@ -1,5 +0,0 @@ -package br.com.alura.comex.model; - -public enum TipoDesconto { - FIDELIDADE, QUANTIDADE, PROMOCAO, NENHUM; -} \ No newline at end of file diff --git a/comex/testes/ComparaProduto.java b/comex/testes/ComparaProduto.java deleted file mode 100644 index 72c24291..00000000 --- a/comex/testes/ComparaProduto.java +++ /dev/null @@ -1,25 +0,0 @@ -package br.com.alura.comex.testes; - -import br.com.alura.comex.model.Cliente; -import br.com.alura.comex.model.Pedido; - -import java.math.BigDecimal; - -// Classe TestePedido -public class ComparaProduto { - public static void main(String[] args) { - Cliente cliente = new Cliente("João Silva", "123.456.789-00", "joao.silva@gmail.com", "Engenheiro", "51 99876-5432", null); - Pedido pedido1 = new Pedido(101, cliente, new BigDecimal("150.00"), 2); - Pedido pedido2 = new Pedido(102, cliente, new BigDecimal("200.00"), 1); - - System.out.println(pedido1); - System.out.println(pedido2); - - // Usando operador ternário para converter boolean para "Sim" ou "Não" - String maisCaro = pedido1.isMaisCaroQue(pedido2) ? "Sim" : "Não"; - String maisBarato = pedido1.isMaisBaratoQue(pedido2) ? "Sim" : "Não"; - - System.out.println("Pedido 1 é mais caro que Pedido 2? " + maisCaro); - System.out.println("Pedido 1 é mais barato que Pedido 2? " + maisBarato); - } -} diff --git a/comex/testes/ConsultaCep.java b/comex/testes/ConsultaCep.java deleted file mode 100644 index 063cb281..00000000 --- a/comex/testes/ConsultaCep.java +++ /dev/null @@ -1,39 +0,0 @@ -package br.com.alura.comex.testes; - -import java.net.URI; -import java.net.http.HttpClient; -import java.net.http.HttpRequest; -import java.net.http.HttpResponse; -import java.net.http.HttpClient.Version; - -import br.com.alura.comex.model.Endereco; -import com.fasterxml.jackson.databind.ObjectMapper; - -public class ConsultaCep { - - private static final String BASE_URL = "https://viacep.com.br/ws/"; - - public Endereco consultaCep(String cep) { - try { - HttpClient client = HttpClient.newBuilder() - .version(Version.HTTP_2) - .build(); - HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(BASE_URL + cep + "/json/")) - .GET() - .build(); - HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); - - if (response.statusCode() == 200) { - ObjectMapper mapper = new ObjectMapper(); - return mapper.readValue(response.body(), Endereco.class); - } else { - System.err.println("Erro na consulta do CEP: " + response.statusCode()); - return null; - } - } catch (Exception e) { - System.err.println("Erro ao consultar CEP: " + e.getMessage()); - return null; - } - } -} diff --git a/comex/testes/ImpressaoDadosProduto.java b/comex/testes/ImpressaoDadosProduto.java deleted file mode 100644 index b1112180..00000000 --- a/comex/testes/ImpressaoDadosProduto.java +++ /dev/null @@ -1,13 +0,0 @@ -package br.com.alura.comex.testes; - -import br.com.alura.comex.model.Produto; - -public class ImpressaoDadosProduto { - public static void main(String[] args) { - // Criação e inicialização do produto - Produto produto = new Produto("Livro", "Conjunto de folhas impressas.", 19.99, 100); - - // Invocação do método de impressão dos detalhes do produto - produto.imprimirDetalhes(); - } -} diff --git a/comex/testes/OrdenacaoPedido.java b/comex/testes/OrdenacaoPedido.java deleted file mode 100644 index b9634fc1..00000000 --- a/comex/testes/OrdenacaoPedido.java +++ /dev/null @@ -1,38 +0,0 @@ -package br.com.alura.comex.testes; - - -import br.com.alura.comex.model.Cliente; -import br.com.alura.comex.model.Pedido; - -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -public class OrdenacaoPedido { - public static void main(String... args){ - // Criação de pedidos simulada, substitua isto pelo código de criação dos pedidos - List pedidos = new ArrayList<>(); - pedidos.add(new Pedido(101, new Cliente("João Silva", "123.456.789-00", "joao@gmail.com", "Engenheiro", "9988776655", null), new BigDecimal("1200.00"), 2)); - pedidos.add(new Pedido(102, new Cliente("Maria Fernanda", "987.654.321-00", "maria@gmail.com", "Advogada", "9966554433", null), new BigDecimal("300.00"), 1)); - pedidos.add(new Pedido(103, new Cliente("Carlos Eduardo", "321.654.987-00", "carlos@gmail.com", "Médico", "9944221100", null), new BigDecimal("450.00"), 3)); - pedidos.add(new Pedido(104, new Cliente("Ana Paula", "321.654.987-00", "ana@gmail.com", "Designer", "9944221100", null), new BigDecimal("850.00"), 1)); - pedidos.add(new Pedido(105, new Cliente("Paulo Henrique", "321.654.987-00", "paulo@gmail.com", "Fotógrafo", "9944221100", null), new BigDecimal("1250.00"), 2)); - - // Ordenando por maior valor total - Collections.sort(pedidos, Comparator.comparing(Pedido::getValorTotal).reversed()); - System.out.println("\nPedidos ordenados por maior valor total:"); - for (Pedido pedido : pedidos) { - System.out.println("Pedido ID: " + pedido.getId() + ", Valor Total: " + pedido.getValorTotal()); - } - - // Ordenando por menor valor total - Collections.sort(pedidos, Comparator.comparing(Pedido::getValorTotal)); - System.out.println("\nPedidos ordenados por menor valor total:"); - for (Pedido pedido : pedidos) { - System.out.println("Pedido ID: " + pedido.getId() + ", Valor Total: " + pedido.getValorTotal()); - } - } -} - diff --git a/comex/testes/TesteCep.java b/comex/testes/TesteCep.java deleted file mode 100644 index 88bcb5c9..00000000 --- a/comex/testes/TesteCep.java +++ /dev/null @@ -1,14 +0,0 @@ -package br.com.alura.comex.testes; - -import br.com.alura.comex.model.Endereco; - -public class TesteCep { - public static void main(String[] args) { - ConsultaCep service = new ConsultaCep(); - Endereco endereco = service.consultaCep("12237600"); - if (endereco != null) { - System.out.println(endereco); - } - } -} - diff --git a/comex/testes/TesteClassePedido.java b/comex/testes/TesteClassePedido.java deleted file mode 100644 index 367af116..00000000 --- a/comex/testes/TesteClassePedido.java +++ /dev/null @@ -1,42 +0,0 @@ -package br.com.alura.comex.testes; - -import br.com.alura.comex.model.Cliente; -import br.com.alura.comex.model.Pedido; -import br.com.alura.comex.model.Produto; - -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.List; - -public class TesteClassePedido { - public static void main(String[] args) { - // Criando clientes - Cliente cliente1 = new Cliente("João Silva", "123.456.789-00", "joao.silva@gmail.com", "Engenheiro", "51 99876-5432", null); - Cliente cliente2 = new Cliente("Maria Oliveira", "987.654.321-00", "maria.oliveira@gmail.com", "Médica", "21 98765-4321", null); - - // Criando produtos - Produto produto1 = new Produto("Notebook", "Notebook Dell", 3500.00, 10); - Produto produto2 = new Produto("Smartphone", "iPhone 13", 5000.00, 5); - Produto produto3 = new Produto("Impressora", "Impressora HP", 800.00, 15); - - // Criando pedidos - List pedidos = new ArrayList<>(); - pedidos.add(new Pedido(101, cliente1, new BigDecimal("3500.00"), 1)); - pedidos.add(new Pedido(102, cliente1, new BigDecimal("7000.00"), 2)); // 2 notebooks - pedidos.add(new Pedido(103, cliente2, new BigDecimal("5000.00"), 1)); - pedidos.add(new Pedido(104, cliente2, new BigDecimal("1600.00"), 2)); // 2 impressoras - pedidos.add(new Pedido(105, cliente1, new BigDecimal("800.00"), 1)); - - // Exibindo informações dos pedidos de forma segura - pedidos.forEach(pedido -> { - if (pedido.getCliente() != null) { - System.out.println("Pedido ID: " + pedido.getId() + ", Cliente: " + pedido.getCliente().getNome() + - ", Preço: " + pedido.getPreco() + ", Quantidade: " + pedido.getQuantidade() + - ", Valor Total: " + pedido.getValorTotal()); - } else { - System.out.println("Pedido ID: " + pedido.getId() + " tem um cliente nulo!"); - } - }); - } -} - diff --git a/comex/testes/TesteProduto.java b/comex/testes/TesteProduto.java deleted file mode 100644 index f7be456e..00000000 --- a/comex/testes/TesteProduto.java +++ /dev/null @@ -1,43 +0,0 @@ -package br.com.alura.comex.testes; - -import br.com.alura.comex.model.Categoria; -import br.com.alura.comex.model.Produto; - -import java.math.BigDecimal; -import java.util.Scanner; - -public class TesteProduto { - public static void main(String[] args) { - Scanner scanner = new Scanner(System.in); - - System.out.println("Por favor, insira o nome do produto:"); - String nome = scanner.nextLine().trim(); - - // Verificar se o nome é válido (não vazio e não nulo) - while (nome.isEmpty()) { - System.out.println("O nome do produto é obrigatório e não pode ser vazio. Por favor, insira o nome do produto:"); - nome = scanner.nextLine().trim(); - } - - System.out.println("Por favor, insira a descrição do produto:"); - String descricao = scanner.nextLine().trim(); - - System.out.println("Por favor, insira o preço unitário do produto:"); - BigDecimal precoUnitario = BigDecimal.valueOf(scanner.nextDouble()); - - System.out.println("Por favor, insira a quantidade do produto:"); - int quantidade = scanner.nextInt(); - - System.out.println("Por favor, insira a categoria do produto:"); - int categoria = scanner.nextInt(); - - // Criação do objeto Produto com dados fornecidos pelo usuário - Produto produto = new Produto(nome, descricao, precoUnitario, quantidade, categoria); - - // Impressão das informações do produto - System.out.println("Informações do Produto:"); - System.out.println(produto); - - scanner.close(); // Fechar o scanner após o uso - } -} From 9d75bc16c51754f2d4b12957b0ee749c5aa13c9e Mon Sep 17 00:00:00 2001 From: Wander Carvalho <138515773+Wander-samix@users.noreply.github.com> Date: Mon, 29 Apr 2024 08:50:40 -0300 Subject: [PATCH 06/17] Create teste --- Semana 7_Wander Carvalho/teste | 1 + 1 file changed, 1 insertion(+) create mode 100644 Semana 7_Wander Carvalho/teste diff --git a/Semana 7_Wander Carvalho/teste b/Semana 7_Wander Carvalho/teste new file mode 100644 index 00000000..6f16acbb --- /dev/null +++ b/Semana 7_Wander Carvalho/teste @@ -0,0 +1 @@ +teste From 1eac66a72982bacb6ad4b6c3a745728689457a21 Mon Sep 17 00:00:00 2001 From: Wander Carvalho <138515773+Wander-samix@users.noreply.github.com> Date: Mon, 29 Apr 2024 08:51:12 -0300 Subject: [PATCH 07/17] Add files via upload --- .../comex/DAO/CadastraCliente.java | 114 +++++++++++++++ .../comex/DAO/CategoriaDao.java | 42 ++++++ .../comex/DAO/ClienteAlteraBd.java | 47 ++++++ .../comex/DAO/ClienteDao.java | 81 +++++++++++ .../comex/DAO/EnderecoDao.java | 70 +++++++++ .../comex/DAO/PedidoDao.java | 42 ++++++ .../comex/DAO/ProdutoDao.java | 49 +++++++ Semana 7_Wander Carvalho/comex/Main.java | 81 +++++++++++ .../comex/ProcessadorDeCsv.java | 56 +++++++ .../comex/model/Categoria.java | 51 +++++++ .../comex/model/Cliente.java | 87 +++++++++++ .../comex/model/Endereco.java | 113 +++++++++++++++ .../comex/model/ItemPedido.java | 104 +++++++++++++ .../comex/model/JsonCreator.java | 4 + .../comex/model/Pedido.java | 137 ++++++++++++++++++ .../comex/model/Produto.java | 134 +++++++++++++++++ .../comex/model/TipoDesconto.java | 5 + .../comex/testes/ComparaProduto.java | 25 ++++ .../comex/testes/ConsultaCep.java | 39 +++++ .../comex/testes/ImpressaoDadosProduto.java | 13 ++ .../comex/testes/OrdenacaoPedido.java | 38 +++++ .../comex/testes/TesteCep.java | 14 ++ .../comex/testes/TesteClassePedido.java | 42 ++++++ .../comex/testes/TesteProduto.java | 43 ++++++ 24 files changed, 1431 insertions(+) create mode 100644 Semana 7_Wander Carvalho/comex/DAO/CadastraCliente.java create mode 100644 Semana 7_Wander Carvalho/comex/DAO/CategoriaDao.java create mode 100644 Semana 7_Wander Carvalho/comex/DAO/ClienteAlteraBd.java create mode 100644 Semana 7_Wander Carvalho/comex/DAO/ClienteDao.java create mode 100644 Semana 7_Wander Carvalho/comex/DAO/EnderecoDao.java create mode 100644 Semana 7_Wander Carvalho/comex/DAO/PedidoDao.java create mode 100644 Semana 7_Wander Carvalho/comex/DAO/ProdutoDao.java create mode 100644 Semana 7_Wander Carvalho/comex/Main.java create mode 100644 Semana 7_Wander Carvalho/comex/ProcessadorDeCsv.java create mode 100644 Semana 7_Wander Carvalho/comex/model/Categoria.java create mode 100644 Semana 7_Wander Carvalho/comex/model/Cliente.java create mode 100644 Semana 7_Wander Carvalho/comex/model/Endereco.java create mode 100644 Semana 7_Wander Carvalho/comex/model/ItemPedido.java create mode 100644 Semana 7_Wander Carvalho/comex/model/JsonCreator.java create mode 100644 Semana 7_Wander Carvalho/comex/model/Pedido.java create mode 100644 Semana 7_Wander Carvalho/comex/model/Produto.java create mode 100644 Semana 7_Wander Carvalho/comex/model/TipoDesconto.java create mode 100644 Semana 7_Wander Carvalho/comex/testes/ComparaProduto.java create mode 100644 Semana 7_Wander Carvalho/comex/testes/ConsultaCep.java create mode 100644 Semana 7_Wander Carvalho/comex/testes/ImpressaoDadosProduto.java create mode 100644 Semana 7_Wander Carvalho/comex/testes/OrdenacaoPedido.java create mode 100644 Semana 7_Wander Carvalho/comex/testes/TesteCep.java create mode 100644 Semana 7_Wander Carvalho/comex/testes/TesteClassePedido.java create mode 100644 Semana 7_Wander Carvalho/comex/testes/TesteProduto.java diff --git a/Semana 7_Wander Carvalho/comex/DAO/CadastraCliente.java b/Semana 7_Wander Carvalho/comex/DAO/CadastraCliente.java new file mode 100644 index 00000000..d6bf0f26 --- /dev/null +++ b/Semana 7_Wander Carvalho/comex/DAO/CadastraCliente.java @@ -0,0 +1,114 @@ +package br.com.alura.comex.DAO; + +import br.com.alura.comex.model.Cliente; +import br.com.alura.comex.model.Endereco; +import br.com.alura.comex.testes.ConsultaCep; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; +import java.util.Scanner; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.LoggerContext; + +public class CadastraCliente { + + private static Scanner scanner; + private static final Logger logger = LoggerFactory.getLogger(CadastraCliente.class); + + public static void main(String[] args) { + EntityManagerFactory factory = Persistence.createEntityManagerFactory("oracle"); + EntityManager entityManager = factory.createEntityManager(); + scanner = new Scanner(System.in); + + try { + setLoggingLevel(Level.ERROR); // Reduz o nível de log antes da interação com o usuário + + System.out.println("Digite 'sair' a qualquer momento para terminar o programa."); + String cep = getRequiredInput("Por favor, insira o CEP para consulta:"); + Endereco endereco = new ConsultaCep().consultaCep(cep); + + if (endereco == null) { + logger.error("Não foi possível encontrar o endereço para o CEP fornecido."); + return; + } + + Cliente cliente = getClienteData(endereco); + if (cliente != null) { + logger.info("Informações do cliente antes da persistência: {}", cliente); + logger.info("Informações do endereço antes da persistência: {}", endereco); + + EntityManager em = factory.createEntityManager(); + entityManager.getTransaction().begin(); // Inicia a transação + cliente.salvar(em); // Persiste o cliente e seu endereço + entityManager.getTransaction().commit(); // Faz o commit da transação + entityManager.close(); // Fecha o EntityManager após o uso + + logger.info("Cliente cadastrado com sucesso: {}", cliente); + } else { + logger.error("Falha ao criar dados do cliente. Cliente retornou nulo."); + } + } finally { + scanner.close(); + factory.close(); + setLoggingLevel(Level.DEBUG); // Restaura o nível de log após a interação + } + } + + private static Cliente getClienteData(Endereco endereco) { + String nomeCliente = getRequiredInput("Por favor, insira o nome do cliente:"); + if (nomeCliente.isEmpty()) { + logger.error("O nome do cliente é obrigatório e não foi fornecido."); + return null; // Retorna nulo para evitar tentativa de persistência com nome nulo. + } + String cpf = getRequiredInput("Por favor, insira o CPF do cliente:"); + String email = getEmailInput(); + String profissao = getRequiredInput("Por favor, insira a profissão do cliente:"); + String telefone = getRequiredInput("Por favor, insira o telefone do cliente:"); + endereco.setNumero(getRequiredInput("Por favor, insira o número do imóvel:")); + endereco.setComplemento(getInput("Por favor, insira o complemento do imóvel (opcional):")); + + return new Cliente(nomeCliente, cpf, email, profissao, telefone, endereco); + } + + private static String getRequiredInput(String prompt) { + System.out.println(prompt); + String input = scanner.nextLine(); + if ("sair".equalsIgnoreCase(input)) { + System.out.println("Programa encerrado."); + System.exit(0); + } + if (input.trim().isEmpty()) { + System.out.println("Este campo é obrigatório. Por favor, forneça um valor."); + return getRequiredInput(prompt); + } + return input; + } + + private static String getInput(String prompt) { + System.out.println(prompt); + return scanner.nextLine(); + } + + private static String getEmailInput() { + String email = getRequiredInput("Por favor, insira o email do cliente:"); + if (!isValidEmail(email)) { + System.out.println("Email inválido. Por favor, insira um email válido."); + return getEmailInput(); + } + return email; + } + + private static boolean isValidEmail(String email) { + return email.matches("^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(\\[?)(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}(\\]?)$"); + } + + private static void setLoggingLevel(Level newLevel) { + LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); + ch.qos.logback.classic.Logger rootLogger = loggerContext.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME); + rootLogger.setLevel(newLevel); + } +} diff --git a/Semana 7_Wander Carvalho/comex/DAO/CategoriaDao.java b/Semana 7_Wander Carvalho/comex/DAO/CategoriaDao.java new file mode 100644 index 00000000..21bf1b00 --- /dev/null +++ b/Semana 7_Wander Carvalho/comex/DAO/CategoriaDao.java @@ -0,0 +1,42 @@ +package br.com.alura.comex.dao; + +import br.com.alura.comex.model.Categoria; +import javax.persistence.EntityManager; +import javax.persistence.EntityTransaction; +import java.util.List; + +public class CategoriaDao { + private final EntityManager em; + + public CategoriaDao(EntityManager em) { + this.em = em; + } + + // Busca uma categoria por ID + public Categoria buscarPorId(Long id) { + Categoria categoria = em.find(Categoria.class, id); + System.out.println("Buscar por ID - Categoria encontrada: " + categoria); + return categoria; + } + + // Cadastra uma nova categoria + public void cadastra(Categoria categoria) { + EntityTransaction et = em.getTransaction(); + try { + et.begin(); + em.persist(categoria); + et.commit(); + System.out.println("Cadastrando Categoria: " + categoria); + } catch (Exception e) { + et.rollback(); + System.out.println("Erro ao cadastrar categoria: " + e.getMessage()); + } + } + + // Lista todas as categorias + public List listaTodas() { + List categorias = em.createQuery("SELECT c FROM Categoria c", Categoria.class).getResultList(); + System.out.println("Listando todas as Categorias: " + categorias); + return categorias; + } +} diff --git a/Semana 7_Wander Carvalho/comex/DAO/ClienteAlteraBd.java b/Semana 7_Wander Carvalho/comex/DAO/ClienteAlteraBd.java new file mode 100644 index 00000000..68d4b5de --- /dev/null +++ b/Semana 7_Wander Carvalho/comex/DAO/ClienteAlteraBd.java @@ -0,0 +1,47 @@ +package br.com.alura.comex.DAO; + +import br.com.alura.comex.model.Cliente; +import br.com.alura.comex.model.Endereco; + +import javax.persistence.EntityManager; +import javax.persistence.EntityTransaction; + +public class ClienteAlteraBd { + + private final EntityManager entityManager; + + public ClienteAlteraBd(EntityManager entityManager) { + this.entityManager = entityManager; + } + + public void atualizar(Cliente cliente) { + EntityTransaction transaction = entityManager.getTransaction(); + + try { + if (!transaction.isActive()) { + transaction.begin(); + } + + // Verifica se o endereço do cliente já está persistido + if (cliente.getEndereco().getId() == null) { + // Se o endereço não está persistido, salva-o primeiro + Endereco endereco = cliente.getEndereco(); + entityManager.persist(endereco); + } + + entityManager.merge(cliente); + transaction.commit(); + } catch (Exception e) { + if (transaction.isActive()) { + transaction.rollback(); + } + throw new RuntimeException("Erro ao atualizar o cliente", e); + } + } + + public void salvar(Cliente cliente) { + } + + public void excluir(Cliente cliente) { + } +} \ No newline at end of file diff --git a/Semana 7_Wander Carvalho/comex/DAO/ClienteDao.java b/Semana 7_Wander Carvalho/comex/DAO/ClienteDao.java new file mode 100644 index 00000000..a5e97cc0 --- /dev/null +++ b/Semana 7_Wander Carvalho/comex/DAO/ClienteDao.java @@ -0,0 +1,81 @@ +package br.com.alura.comex.DAO; + +import br.com.alura.comex.model.Cliente; +import javax.persistence.EntityManager; +import javax.persistence.EntityTransaction; +import java.util.List; + +public class ClienteDao { + private final EntityManager em; + + public ClienteDao(EntityManager em) { + this.em = em; + } + + // Busca um cliente por seu ID no banco de dados + public Cliente buscaPorId(Long id) { + Cliente cliente = em.find(Cliente.class, id); + System.out.println("Busca por ID - Cliente encontrado: " + cliente); + return cliente; + } + + // Cadastra um novo cliente no banco de dados + public void cadastra(Cliente cliente) { + EntityTransaction et = em.getTransaction(); + try { + et.begin(); + em.persist(cliente); + et.commit(); + System.out.println("Cadastrando Cliente: " + cliente); + } catch (Exception e) { + et.rollback(); + System.out.println("Erro ao cadastrar cliente: " + e.getMessage()); + } + } + + // Atualiza os dados de um cliente existente no banco de dados + public void atualiza(Cliente cliente) { + EntityTransaction et = em.getTransaction(); + try { + et.begin(); + em.merge(cliente); + et.commit(); + System.out.println("Atualizando Cliente: " + cliente); + } catch (Exception e) { + et.rollback(); + System.out.println("Erro ao atualizar cliente: " + e.getMessage()); + } + } + + // Remove um cliente do banco de dados + public void remove(Cliente cliente) { + EntityTransaction et = em.getTransaction(); + try { + et.begin(); + em.remove(em.contains(cliente) ? cliente : em.merge(cliente)); + et.commit(); + System.out.println("Removendo Cliente: " + cliente); + } catch (Exception e) { + et.rollback(); + System.out.println("Erro ao remover cliente: " + e.getMessage()); + } + } + + // Lista todos os clientes cadastrados no banco de dados + public List listaTodos() { + List clientes = em.createQuery("SELECT c FROM Cliente c", Cliente.class).getResultList(); + System.out.println("Listando todos os Clientes: " + clientes); + return clientes; + } + + // Lista clientes por nome, usando uma busca parcial + public List listaPorNome(String nome) { + List clientes = em.createQuery("SELECT c FROM Cliente c WHERE c.nome LIKE :nome", Cliente.class) + .setParameter("nome", "%" + nome + "%") + .getResultList(); + System.out.println("Listando Clientes por nome (" + nome + "): " + clientes); + return clientes; + } +} + + diff --git a/Semana 7_Wander Carvalho/comex/DAO/EnderecoDao.java b/Semana 7_Wander Carvalho/comex/DAO/EnderecoDao.java new file mode 100644 index 00000000..e668b9f4 --- /dev/null +++ b/Semana 7_Wander Carvalho/comex/DAO/EnderecoDao.java @@ -0,0 +1,70 @@ +package br.com.alura.comex.DAO; + +import br.com.alura.comex.model.Endereco; + +import javax.persistence.EntityManager; +import javax.persistence.EntityTransaction; + +public class EnderecoDao { + + private final EntityManager entityManager; + + public EnderecoDao(EntityManager entityManager) { + this.entityManager = entityManager; + } + + public void salvar(Endereco endereco) { + EntityTransaction transaction = entityManager.getTransaction(); + + try { + if (!transaction.isActive()) { + transaction.begin(); + } + + entityManager.persist(endereco); + entityManager.flush(); // Sincroniza as alterações com o banco de dados + transaction.commit(); + } catch (Exception e) { + if (transaction.isActive()) { + transaction.rollback(); + } + throw new RuntimeException("Erro ao salvar o endereço", e); + } + } + + public void atualizar(Endereco endereco) { + EntityTransaction transaction = entityManager.getTransaction(); + + try { + if (!transaction.isActive()) { + transaction.begin(); + } + + entityManager.merge(endereco); + transaction.commit(); + } catch (Exception e) { + if (transaction.isActive()) { + transaction.rollback(); + } + throw new RuntimeException("Erro ao atualizar o endereço", e); + } + } + + public void excluir(Endereco endereco) { + EntityTransaction transaction = entityManager.getTransaction(); + + try { + if (!transaction.isActive()) { + transaction.begin(); + } + + entityManager.remove(endereco); + transaction.commit(); + } catch (Exception e) { + if (transaction.isActive()) { + transaction.rollback(); + } + throw new RuntimeException("Erro ao excluir o endereço", e); + } + } +} diff --git a/Semana 7_Wander Carvalho/comex/DAO/PedidoDao.java b/Semana 7_Wander Carvalho/comex/DAO/PedidoDao.java new file mode 100644 index 00000000..b0fe4e0d --- /dev/null +++ b/Semana 7_Wander Carvalho/comex/DAO/PedidoDao.java @@ -0,0 +1,42 @@ +package br.com.alura.comex.DAO; + +import br.com.alura.comex.model.Pedido; +import javax.persistence.EntityManager; +import javax.persistence.EntityTransaction; +import java.util.List; + +public class PedidoDao { + private final EntityManager em; + + public PedidoDao(EntityManager em) { + this.em = em; + } + + // Busca um pedido por ID + public Pedido buscaPorId(Long id) { + Pedido pedido = em.find(Pedido.class, id); + System.out.println("Busca por ID - Pedido encontrado: " + pedido); + return pedido; + } + + // Cadastra um novo pedido + public void cadastra(Pedido pedido) { + EntityTransaction et = em.getTransaction(); + try { + et.begin(); + em.persist(pedido); + et.commit(); + System.out.println("Cadastrando Pedido: " + pedido); + } catch (Exception e) { + et.rollback(); + System.out.println("Erro ao cadastrar pedido: " + e.getMessage()); + } + } + + // Lista todos os pedidos + public List listaTodos() { + List pedidos = em.createQuery("SELECT p FROM Pedido p", Pedido.class).getResultList(); + System.out.println("Listando todos os Pedidos: " + pedidos); + return pedidos; + } +} diff --git a/Semana 7_Wander Carvalho/comex/DAO/ProdutoDao.java b/Semana 7_Wander Carvalho/comex/DAO/ProdutoDao.java new file mode 100644 index 00000000..69e93312 --- /dev/null +++ b/Semana 7_Wander Carvalho/comex/DAO/ProdutoDao.java @@ -0,0 +1,49 @@ +package br.com.alura.comex.DAO; + +import br.com.alura.comex.model.Produto; +import javax.persistence.EntityManager; +import javax.persistence.EntityTransaction; +import java.util.List; + +public class ProdutoDao { + private final EntityManager em; + + public ProdutoDao(EntityManager em) { + this.em = em; + } + + // Busca um produto por ID + public Produto buscaPorId(Long id) { + Produto produto = em.find(Produto.class, id); + System.out.println("Busca por ID - Produto encontrado: " + produto); + return produto; + } + + // Cadastra um novo produto + public void cadastra(Produto produto) { + EntityTransaction et = em.getTransaction(); + try { + et.begin(); + em.persist(produto); + et.commit(); + System.out.println("Cadastrando Produto: " + produto); + } catch (Exception e) { + et.rollback(); + System.out.println("Erro ao cadastrar produto: " + e.getMessage()); + } + } + + // Lista todos os produtos + public List listaTodos() { + List produtos = em.createQuery("SELECT p FROM Produto p", Produto.class).getResultList(); + System.out.println("Listando todos os Produtos: " + produtos); + return produtos; + } + + // Lista produtos que estão indisponíveis (quantidade = 0) + public List listaIndisponiveis() { + List produtosIndisponiveis = em.createQuery("SELECT p FROM Produto p WHERE p.quantidade = 0", Produto.class).getResultList(); + System.out.println("Listando produtos indisponíveis: " + produtosIndisponiveis); + return produtosIndisponiveis; + } +} diff --git a/Semana 7_Wander Carvalho/comex/Main.java b/Semana 7_Wander Carvalho/comex/Main.java new file mode 100644 index 00000000..0cd05711 --- /dev/null +++ b/Semana 7_Wander Carvalho/comex/Main.java @@ -0,0 +1,81 @@ +//package br.com.alura.comex; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.net.URISyntaxException; +import java.text.NumberFormat; +import java.util.Arrays; +import java.util.Locale; + +//public class Main { +// +// private static final Logger logger = LoggerFactory.getLogger(Main.class); +// +// public static void main(String[] args) throws IOException, URISyntaxException { +// Pedido[] pedidos = ProcessadorDeCsv.processaArquivo("pedidos.csv"); +// +// int totalDeProdutosVendidos = 0; +// int totalDePedidosRealizados = 0; +// BigDecimal montanteDeVendas = BigDecimal.ZERO; +// Pedido pedidoMaisBarato = null; +// Pedido pedidoMaisCaro = null; +// +// String[] categoriasProcessadas = new String[10]; +// int totalDeCategorias = 0; +// +// for (int i = 0; i < pedidos.length; i++) { +// Pedido pedidoAtual = pedidos[i]; +// +// if (pedidoAtual == null) { +// break; +// } +// +// if (pedidoMaisBarato == null || pedidoAtual.getPreco().multiply(new BigDecimal(pedidoAtual.getQuantidade())).compareTo(pedidoMaisBarato.getPreco().multiply(new BigDecimal(pedidoMaisBarato.getQuantidade()))) < 0) { +// pedidoMaisBarato = pedidoAtual; +// } +// +// if (pedidoMaisCaro == null || pedidoAtual.getPreco().multiply(new BigDecimal(pedidoAtual.getQuantidade())).compareTo(pedidoMaisCaro.getPreco().multiply(new BigDecimal(pedidoMaisCaro.getQuantidade()))) > 0) { +// pedidoMaisCaro = pedidoAtual; +// } +// +// montanteDeVendas = montanteDeVendas.add(pedidoAtual.getPreco().multiply(new BigDecimal(pedidoAtual.getQuantidade()))); +// totalDeProdutosVendidos += pedidoAtual.getQuantidade(); +// totalDePedidosRealizados++; +// +// boolean jahProcessouCategoria = false; +// for (int j = 0; j < categoriasProcessadas.length; j++) { +// if (pedidoAtual.getCategoria().equalsIgnoreCase(categoriasProcessadas[j])) { +// jahProcessouCategoria = true; +// } +// } +// +// if (!jahProcessouCategoria) { +// totalDeCategorias++; +// +// if (categoriasProcessadas[categoriasProcessadas.length - 1] != null) { +// categoriasProcessadas = Arrays.copyOf(categoriasProcessadas, categoriasProcessadas.length * 2); +// } else { +// for (int k = 0; k < categoriasProcessadas.length; k++) { +// if (categoriasProcessadas[k] == null) { +// categoriasProcessadas[k] = pedidoAtual.getCategoria(); +// break; +// } +// } +// } +// } +// } +// +// logger.info("##### RELATÓRIO DE VALORES TOTAIS #####"); +// logger.info("TOTAL DE PEDIDOS REALIZADOS: {}", totalDePedidosRealizados); +// logger.info("TOTAL DE PRODUTOS VENDIDOS: {}", totalDeProdutosVendidos); +// logger.info("TOTAL DE CATEGORIAS: {}", totalDeCategorias); +// logger.info("MONTANTE DE VENDAS: {}", NumberFormat.getCurrencyInstance(new Locale("pt", "BR")).format(montanteDeVendas.setScale(2, RoundingMode.HALF_DOWN))); +// logger.info("PEDIDO MAIS BARATO: {} ({})", NumberFormat.getCurrencyInstance(new Locale("pt", "BR")).format(pedidoMaisBarato.getPreco().multiply(new BigDecimal(pedidoMaisBarato.getQuantidade())).setScale(2, RoundingMode.HALF_DOWN)), pedidoMaisBarato.getProduto()); +// logger.info("PEDIDO MAIS CARO: {} ({})\n", NumberFormat.getCurrencyInstance(new Locale("pt", "BR")).format(pedidoMaisCaro.getPreco().multiply(new BigDecimal(pedidoMaisCaro.getQuantidade())).setScale(2, RoundingMode.HALF_DOWN)), pedidoMaisCaro.getProduto()); +// logger.info("### FIM DO RELATÓRIO ###"); +// } +//} \ No newline at end of file diff --git a/Semana 7_Wander Carvalho/comex/ProcessadorDeCsv.java b/Semana 7_Wander Carvalho/comex/ProcessadorDeCsv.java new file mode 100644 index 00000000..6b2496e9 --- /dev/null +++ b/Semana 7_Wander Carvalho/comex/ProcessadorDeCsv.java @@ -0,0 +1,56 @@ +package br.com.alura.comex; + +import br.com.alura.comex.model.Pedido; + +import java.io.IOException; +import java.math.BigDecimal; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.Path; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.Arrays; +import java.util.Scanner; + +public class ProcessadorDeCsv { + + public static Pedido[] processaArquivo(String nomeDoArquivo) { + try { + URL recursoCSV = ClassLoader.getSystemResource(nomeDoArquivo); + Path caminhoDoArquivo = caminhoDoArquivo = Path.of(recursoCSV.toURI()); + + Scanner leitorDeLinhas = new Scanner(caminhoDoArquivo); + + leitorDeLinhas.nextLine(); + + Pedido[] pedidos = new Pedido[10]; + + int quantidadeDeRegistros = 0; + while (leitorDeLinhas.hasNextLine()) { + String linha = leitorDeLinhas.nextLine(); + String[] registro = linha.split(","); + + String categoria = registro[0]; + String produto = registro[1]; + BigDecimal preco = new BigDecimal(registro[2]); + int quantidade = Integer.parseInt(registro[3]); + LocalDate data = LocalDate.parse(registro[4], DateTimeFormatter.ofPattern("dd/MM/yyyy")); + String cliente = registro[5]; + + Pedido pedido = new Pedido(categoria, produto, cliente, preco, quantidade, data); + pedidos[quantidadeDeRegistros] = pedido; + + quantidadeDeRegistros++; + if (pedidos[pedidos.length - 1] != null) { + pedidos = Arrays.copyOf(pedidos, pedidos.length * 2); + } + } + + return pedidos; + } catch (URISyntaxException e) { + throw new RuntimeException(String.format("Arquivo {} não localizado!", nomeDoArquivo)); + } catch (IOException e) { + throw new RuntimeException("Erro ao abrir Scanner para processar arquivo!"); + } + } +} \ No newline at end of file diff --git a/Semana 7_Wander Carvalho/comex/model/Categoria.java b/Semana 7_Wander Carvalho/comex/model/Categoria.java new file mode 100644 index 00000000..a07046e8 --- /dev/null +++ b/Semana 7_Wander Carvalho/comex/model/Categoria.java @@ -0,0 +1,51 @@ +package br.com.alura.comex.model; + +import javax.persistence.*; + +@Entity +@Table(name = "categoria") +public class Categoria { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private String nome; + + @Enumerated(EnumType.STRING) + @Column(nullable = false, columnDefinition = "VARCHAR(10) default 'ATIVA'") + private Status status = Status.ATIVA; + + // Getters and Setters + 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 Status getStatus() { + return status; + } + + public void setStatus(Status status) { + this.status = status; + } + + // Enum for status + public enum Status { + ATIVA, INATIVA + } + } + + diff --git a/Semana 7_Wander Carvalho/comex/model/Cliente.java b/Semana 7_Wander Carvalho/comex/model/Cliente.java new file mode 100644 index 00000000..220342a0 --- /dev/null +++ b/Semana 7_Wander Carvalho/comex/model/Cliente.java @@ -0,0 +1,87 @@ +package br.com.alura.comex.model; + +import javax.persistence.*; + +@Entity +@Table(name = "cliente") +public class Cliente { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "nome", length = 120, nullable = false) + private String nome; + + @Column(name = "cpf", length = 13, unique = true, nullable = false) + private String cpf; + + @Column(name = "email", length = 50) + private String email; + + @Column(name = "profissao", length = 20, nullable = false) + private String profissao; + + @Column(name = "telefone", length = 20, nullable = false) + private String telefone; + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "endereco_id", nullable = false) + private Endereco endereco; + + public Cliente() {} + + public Cliente(String nome, String cpf, String email, String profissao, String telefone, Endereco endereco) { + this.nome = nome; + this.cpf = cpf; + this.email = email; + this.profissao = profissao; + this.telefone = telefone; + this.endereco = endereco; + } + + public Cliente(EntityManager entityManager) { + } + + // Getters and setters + 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 getCpf() { return cpf; } + public void setCpf(String cpf) { this.cpf = cpf; } + + public String getEmail() { return email; } + public void setEmail(String email) { this.email = email; } + + public String getProfissao() { return profissao; } + public void setProfissao(String profissao) { this.profissao = profissao; } + + public String getTelefone() { return telefone; } + public void setTelefone(String telefone) { this.telefone = telefone; } + + public Endereco getEndereco() { return endereco; } + public void setEndereco(Endereco endereco) { this.endereco = endereco; } + + @Override + public String toString() { + return "Cliente{" + + "id=" + id + + ", nome='" + nome + '\'' + + ", cpf='" + cpf + '\'' + + ", email='" + email + '\'' + + ", profissao='" + profissao + '\'' + + ", telefone='" + telefone + '\'' + + ", endereco=" + endereco + + '}'; + } + + + public void salvar(Cliente clientenovo) { + } + + public void salvar(EntityManager entityManager) { + } +} diff --git a/Semana 7_Wander Carvalho/comex/model/Endereco.java b/Semana 7_Wander Carvalho/comex/model/Endereco.java new file mode 100644 index 00000000..f4c0b277 --- /dev/null +++ b/Semana 7_Wander Carvalho/comex/model/Endereco.java @@ -0,0 +1,113 @@ +package br.com.alura.comex.model; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import br.com.alura.comex.DAO.EnderecoDao; +import com.fasterxml.jackson.annotation.JsonProperty; + +import javax.persistence.*; + +@Entity +@Table(name = "endereco") +@JsonIgnoreProperties(ignoreUnknown = true) // Ignora propriedades desconhecidas durante a desserialização +public class Endereco { + +@Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "cep", length = 120, nullable = false) + private String cep; + + @Column(name = "logradouro", length = 120, nullable = true) + private String logradouro; + + @Column(name = "complemento", length = 120, nullable = true) + private String complemento; + + @Column(name = "bairro", length = 120, nullable = true) + private String bairro; + + @Column(name = "localidade", length = 120, nullable = true) + private String localidade; + + @Column(name = "uf", length = 2, nullable = true) + private String uf; + + @Column(name = "numero", length = 20, nullable = true) + private String numero; + + public Endereco() { + // Construtor padrão necessário para JPA + } + + @JsonCreator + public Endereco(@JsonProperty("cep") String cep, + @JsonProperty("logradouro") String logradouro, + @JsonProperty("complemento") String complemento, + @JsonProperty("bairro") String bairro, + @JsonProperty("localidade") String localidade, + @JsonProperty("uf") String uf, + @JsonProperty("numero") String numero) { + this.cep = cep; + this.logradouro = logradouro; + this.complemento = complemento; + this.bairro = bairro; + this.localidade = localidade; + this.uf = uf; + this.numero = numero; + } + + // Getters e setters + + public Long getId() { return id; } + public void setId(Long id) { this.id = id; } + + public String getCep() { return cep; } + public void setCep(String cep) { this.cep = cep; } + + public String getLogradouro() { return logradouro; } + public void setLogradouro(String logradouro) { this.logradouro = logradouro; } + + public String getComplemento() { return complemento; } + public void setComplemento(String complemento) { this.complemento = complemento; } + + public String getBairro() { return bairro; } + public void setBairro(String bairro) { this.bairro = bairro; } + + public String getLocalidade() { return localidade; } + public void setLocalidade(String localidade) { this.localidade = localidade; } + + public String getUf() { return uf; } + public void setUf(String uf) { this.uf = uf; } + + public String getNumero() { return numero; } + public void setNumero(String numero) { this.numero = numero; } + + @Override + public String toString() { + return "Endereco{" + + "id=" + id + + ", cep='" + cep + '\'' + + ", logradouro='" + logradouro + '\'' + + ", complemento='" + complemento + '\'' + + ", bairro='" + bairro + '\'' + + ", localidade='" + localidade + '\'' + + ", uf='" + uf + '\'' + + ", numero='" + numero + '\'' + + '}'; + } + + public void salvar(EnderecoDao enderecoDao) { + enderecoDao.salvar(this); + } + + public void atualizar(EnderecoDao enderecoDao) { + enderecoDao.atualizar(this); + } + + public void excluir(EnderecoDao enderecoDao) { + enderecoDao.excluir(this); + } +} + + diff --git a/Semana 7_Wander Carvalho/comex/model/ItemPedido.java b/Semana 7_Wander Carvalho/comex/model/ItemPedido.java new file mode 100644 index 00000000..b831cf1c --- /dev/null +++ b/Semana 7_Wander Carvalho/comex/model/ItemPedido.java @@ -0,0 +1,104 @@ +package br.com.alura.comex.model; + +import java.math.BigDecimal; +import javax.persistence.*; + +@Entity +@Table(name = "item_pedido") +public class ItemPedido { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false, precision = 10, scale = 2) + private BigDecimal precoUnitario; + + @Column(nullable = false) + private int quantidade; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "produto_id", nullable = false) + private Produto produto; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "pedido_id", nullable = false) + private Pedido pedido; + + @Column(nullable = false, precision = 10, scale = 2) + private BigDecimal desconto; + + @Enumerated(EnumType.STRING) + @Column(nullable = false) + private TipoDesconto tipoDesconto; + + // Construtores, Getters e Setters + + public ItemPedido() {} + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public TipoDesconto getTipoDesconto() { + return tipoDesconto; + } + + public void setTipoDesconto(TipoDesconto tipoDesconto) { + this.tipoDesconto = tipoDesconto; + } + + public BigDecimal getDesconto() { + return desconto; + } + + public void setDesconto(BigDecimal desconto) { + this.desconto = desconto; + } + + public Pedido getPedido() { + return pedido; + } + + public void setPedido(Pedido pedido) { + this.pedido = pedido; + } + + public Produto getProduto() { + return produto; + } + + public void setProduto(Produto produto) { + this.produto = produto; + } + + public int getQuantidade() { + return quantidade; + } + + public void setQuantidade(int quantidade) { + this.quantidade = quantidade; + } + + public BigDecimal getPrecoUnitario() { + return precoUnitario; + } + + public void setPrecoUnitario(BigDecimal precoUnitario) { + this.precoUnitario = precoUnitario; + } + + public ItemPedido(BigDecimal precoUnitario, int quantidade, Produto produto, Pedido pedido, BigDecimal desconto, TipoDesconto tipoDesconto) { + this.precoUnitario = precoUnitario; + this.quantidade = quantidade; + this.produto = produto; + this.pedido = pedido; + this.desconto = desconto; + this.tipoDesconto = tipoDesconto; + } + + } + diff --git a/Semana 7_Wander Carvalho/comex/model/JsonCreator.java b/Semana 7_Wander Carvalho/comex/model/JsonCreator.java new file mode 100644 index 00000000..7efcf2da --- /dev/null +++ b/Semana 7_Wander Carvalho/comex/model/JsonCreator.java @@ -0,0 +1,4 @@ +package br.com.alura.comex.model; + +public @interface JsonCreator { +} diff --git a/Semana 7_Wander Carvalho/comex/model/Pedido.java b/Semana 7_Wander Carvalho/comex/model/Pedido.java new file mode 100644 index 00000000..890ab934 --- /dev/null +++ b/Semana 7_Wander Carvalho/comex/model/Pedido.java @@ -0,0 +1,137 @@ +package br.com.alura.comex.model; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.List; +import javax.persistence.*; + +@Entity +@Table(name = "pedidos") +public class Pedido { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; // Tipo alterado para Long, que é mais comum para IDs + + @ManyToOne + @JoinColumn(name = "cliente_id", nullable = false) + private Cliente cliente; + + @OneToMany(mappedBy = "pedido", cascade = CascadeType.ALL, fetch = FetchType.LAZY) + private List itensPedido; + + @Column(nullable = false, precision = 10, scale = 2) + private BigDecimal preco; + + @Column(nullable = false) + private int quantidade; + + @Column(nullable = false) + private LocalDate data; + + @Enumerated(EnumType.STRING) + @Column(nullable = false) + private TipoDesconto tipoDesconto; + + // Construtores + public Pedido(int id, Cliente cliente, BigDecimal preco, int quantidade, LocalDate data, TipoDesconto tipoDesconto) { + this.id = (long) id; + this.cliente = cliente; + this.preco = preco; + this.quantidade = quantidade; + this.data = data; + this.tipoDesconto = tipoDesconto; + } + + public Pedido(int id, Cliente cliente, BigDecimal preco, int quantidade, int id1) { + this.id = (long) id1; + } + + public Pedido(String categoria, String produto, String cliente, BigDecimal preco, int quantidade, LocalDate data, int id) { + this.id = (long) id; + } + + public Pedido(String categoria, String produto, String cliente, BigDecimal preco, int quantidade, LocalDate data) { + } + + public Pedido(int i, Cliente cliente, BigDecimal bigDecimal, int i1) { + } + + // Getters e Setters + public int getId() { + return Math.toIntExact(id); + } + + public void setId(int id) { + this.id = (long) id; + } + + public Cliente getCliente() { + return cliente; + } + + public void setCliente(Cliente cliente) { + this.cliente = cliente; + } + + public BigDecimal getPreco() { + return preco; + } + + public void setPreco(BigDecimal preco) { + this.preco = preco; + } + + public int getQuantidade() { + return quantidade; + } + + public void setQuantidade(int quantidade) { + this.quantidade = quantidade; + } + + public LocalDate getData() { + return data; + } + + public void setData(LocalDate data) { + this.data = data; + } + + public TipoDesconto getTipoDesconto() { + return tipoDesconto; + } + + public void setTipoDesconto(TipoDesconto tipoDesconto) { + this.tipoDesconto = tipoDesconto; + } + + // Método para calcular o valor total do pedido com desconto aplicado + public BigDecimal getValorTotal() { + BigDecimal total = preco.multiply(BigDecimal.valueOf(quantidade)); + if (tipoDesconto == TipoDesconto.FIDELIDADE) { + return total.multiply(BigDecimal.valueOf(0.90)); // Aplica 10% de desconto + } + return total; + } + + @Override + public String toString() { + return "Pedido{" + + "id=" + id + + ", cliente=" + (cliente != null ? cliente.getNome() : "N/D") + + ", preço=" + preco + + ", quantidade=" + quantidade + + ", data=" + data + + ", tipoDesconto=" + tipoDesconto + + ", valor total=" + getValorTotal() + + '}'; + } + + public boolean isMaisCaroQue(Pedido pedido2) { + return false; + } + + public boolean isMaisBaratoQue(Pedido pedido2) { + return false; + } +} diff --git a/Semana 7_Wander Carvalho/comex/model/Produto.java b/Semana 7_Wander Carvalho/comex/model/Produto.java new file mode 100644 index 00000000..bc18c8a5 --- /dev/null +++ b/Semana 7_Wander Carvalho/comex/model/Produto.java @@ -0,0 +1,134 @@ +package br.com.alura.comex.model; + +import javax.persistence.*; +import java.math.BigDecimal; +import java.util.Objects; + +@Entity +@Table(name = "produto") +public class Produto { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "nome", length = 220, nullable = false) + private String nome; + + @Column(name = "descricao", length = 220, nullable = false) + private String descricao; + + @Column(name = "preco_unitario", nullable = false) + private BigDecimal precoUnitario; + + @Column(name = "quantidade", nullable = false) + private int quantidade; + + @ManyToOne + @JoinColumn(name = "categoria_id", referencedColumnName = "id", nullable = false, foreignKey = @ForeignKey(name = "fk_categoria_produto")) + private Categoria categoria; + + // Construtor vazio para JPA + public Produto(String livro, String s, double v, int i) {} + + // Construtor principal + public Produto(String nome, String descricao, BigDecimal precoUnitario, int quantidade, Categoria categoria) { + setNome(nome); + this.descricao = descricao; + this.precoUnitario = precoUnitario; + this.quantidade = quantidade; + this.categoria = categoria; + } + + public Produto(String nome, String descricao, BigDecimal precoUnitario, int quantidade, int categoria) { + } + + // Getters + public Long getId() { + return id; + } + + public String getNome() { + return nome; + } + + public String getDescricao() { + return descricao; + } + + public BigDecimal getPrecoUnitario() { + return precoUnitario; + } + + public int getQuantidade() { + return quantidade; + } + + public Categoria getCategoria() { + return categoria; + } + + // Setters + public void setId(Long id) { + this.id = id; + } + + public void setNome(String nome) { + if (nome == null || nome.trim().isEmpty()) { + throw new IllegalArgumentException("O nome do produto é obrigatório e não pode ser vazio."); + } + this.nome = nome; + } + + public void setDescricao(String descricao) { + this.descricao = descricao; + } + + public void setPrecoUnitario(BigDecimal precoUnitario) { + this.precoUnitario = precoUnitario; + } + + public void setQuantidade(int quantidade) { + this.quantidade = quantidade; + } + + public void setCategoria(Categoria categoria) { + this.categoria = categoria; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Produto produto = (Produto) o; + return quantidade == produto.quantidade && + Objects.equals(id, produto.id) && + Objects.equals(nome, produto.nome) && + Objects.equals(descricao, produto.descricao) && + Objects.equals(precoUnitario, produto.precoUnitario) && + Objects.equals(categoria, produto.categoria); + } + + @Override + public int hashCode() { + return Objects.hash(id, nome, descricao, precoUnitario, quantidade, categoria); + } + + @Override + public String toString() { + return "Produto{" + + "id=" + id + + ", nome='" + nome + '\'' + + ", descricao='" + descricao + '\'' + + ", precoUnitario=" + precoUnitario + + ", quantidade=" + quantidade + + ", categoria=" + categoria + + '}'; + } + + public void imprimirDetalhes() { + System.out.println(this.toString()); + } +} + + diff --git a/Semana 7_Wander Carvalho/comex/model/TipoDesconto.java b/Semana 7_Wander Carvalho/comex/model/TipoDesconto.java new file mode 100644 index 00000000..8f36ba8f --- /dev/null +++ b/Semana 7_Wander Carvalho/comex/model/TipoDesconto.java @@ -0,0 +1,5 @@ +package br.com.alura.comex.model; + +public enum TipoDesconto { + FIDELIDADE, QUANTIDADE, PROMOCAO, NENHUM; +} \ No newline at end of file diff --git a/Semana 7_Wander Carvalho/comex/testes/ComparaProduto.java b/Semana 7_Wander Carvalho/comex/testes/ComparaProduto.java new file mode 100644 index 00000000..72c24291 --- /dev/null +++ b/Semana 7_Wander Carvalho/comex/testes/ComparaProduto.java @@ -0,0 +1,25 @@ +package br.com.alura.comex.testes; + +import br.com.alura.comex.model.Cliente; +import br.com.alura.comex.model.Pedido; + +import java.math.BigDecimal; + +// Classe TestePedido +public class ComparaProduto { + public static void main(String[] args) { + Cliente cliente = new Cliente("João Silva", "123.456.789-00", "joao.silva@gmail.com", "Engenheiro", "51 99876-5432", null); + Pedido pedido1 = new Pedido(101, cliente, new BigDecimal("150.00"), 2); + Pedido pedido2 = new Pedido(102, cliente, new BigDecimal("200.00"), 1); + + System.out.println(pedido1); + System.out.println(pedido2); + + // Usando operador ternário para converter boolean para "Sim" ou "Não" + String maisCaro = pedido1.isMaisCaroQue(pedido2) ? "Sim" : "Não"; + String maisBarato = pedido1.isMaisBaratoQue(pedido2) ? "Sim" : "Não"; + + System.out.println("Pedido 1 é mais caro que Pedido 2? " + maisCaro); + System.out.println("Pedido 1 é mais barato que Pedido 2? " + maisBarato); + } +} diff --git a/Semana 7_Wander Carvalho/comex/testes/ConsultaCep.java b/Semana 7_Wander Carvalho/comex/testes/ConsultaCep.java new file mode 100644 index 00000000..063cb281 --- /dev/null +++ b/Semana 7_Wander Carvalho/comex/testes/ConsultaCep.java @@ -0,0 +1,39 @@ +package br.com.alura.comex.testes; + +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.net.http.HttpClient.Version; + +import br.com.alura.comex.model.Endereco; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class ConsultaCep { + + private static final String BASE_URL = "https://viacep.com.br/ws/"; + + public Endereco consultaCep(String cep) { + try { + HttpClient client = HttpClient.newBuilder() + .version(Version.HTTP_2) + .build(); + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(BASE_URL + cep + "/json/")) + .GET() + .build(); + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + + if (response.statusCode() == 200) { + ObjectMapper mapper = new ObjectMapper(); + return mapper.readValue(response.body(), Endereco.class); + } else { + System.err.println("Erro na consulta do CEP: " + response.statusCode()); + return null; + } + } catch (Exception e) { + System.err.println("Erro ao consultar CEP: " + e.getMessage()); + return null; + } + } +} diff --git a/Semana 7_Wander Carvalho/comex/testes/ImpressaoDadosProduto.java b/Semana 7_Wander Carvalho/comex/testes/ImpressaoDadosProduto.java new file mode 100644 index 00000000..b1112180 --- /dev/null +++ b/Semana 7_Wander Carvalho/comex/testes/ImpressaoDadosProduto.java @@ -0,0 +1,13 @@ +package br.com.alura.comex.testes; + +import br.com.alura.comex.model.Produto; + +public class ImpressaoDadosProduto { + public static void main(String[] args) { + // Criação e inicialização do produto + Produto produto = new Produto("Livro", "Conjunto de folhas impressas.", 19.99, 100); + + // Invocação do método de impressão dos detalhes do produto + produto.imprimirDetalhes(); + } +} diff --git a/Semana 7_Wander Carvalho/comex/testes/OrdenacaoPedido.java b/Semana 7_Wander Carvalho/comex/testes/OrdenacaoPedido.java new file mode 100644 index 00000000..b9634fc1 --- /dev/null +++ b/Semana 7_Wander Carvalho/comex/testes/OrdenacaoPedido.java @@ -0,0 +1,38 @@ +package br.com.alura.comex.testes; + + +import br.com.alura.comex.model.Cliente; +import br.com.alura.comex.model.Pedido; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +public class OrdenacaoPedido { + public static void main(String... args){ + // Criação de pedidos simulada, substitua isto pelo código de criação dos pedidos + List pedidos = new ArrayList<>(); + pedidos.add(new Pedido(101, new Cliente("João Silva", "123.456.789-00", "joao@gmail.com", "Engenheiro", "9988776655", null), new BigDecimal("1200.00"), 2)); + pedidos.add(new Pedido(102, new Cliente("Maria Fernanda", "987.654.321-00", "maria@gmail.com", "Advogada", "9966554433", null), new BigDecimal("300.00"), 1)); + pedidos.add(new Pedido(103, new Cliente("Carlos Eduardo", "321.654.987-00", "carlos@gmail.com", "Médico", "9944221100", null), new BigDecimal("450.00"), 3)); + pedidos.add(new Pedido(104, new Cliente("Ana Paula", "321.654.987-00", "ana@gmail.com", "Designer", "9944221100", null), new BigDecimal("850.00"), 1)); + pedidos.add(new Pedido(105, new Cliente("Paulo Henrique", "321.654.987-00", "paulo@gmail.com", "Fotógrafo", "9944221100", null), new BigDecimal("1250.00"), 2)); + + // Ordenando por maior valor total + Collections.sort(pedidos, Comparator.comparing(Pedido::getValorTotal).reversed()); + System.out.println("\nPedidos ordenados por maior valor total:"); + for (Pedido pedido : pedidos) { + System.out.println("Pedido ID: " + pedido.getId() + ", Valor Total: " + pedido.getValorTotal()); + } + + // Ordenando por menor valor total + Collections.sort(pedidos, Comparator.comparing(Pedido::getValorTotal)); + System.out.println("\nPedidos ordenados por menor valor total:"); + for (Pedido pedido : pedidos) { + System.out.println("Pedido ID: " + pedido.getId() + ", Valor Total: " + pedido.getValorTotal()); + } + } +} + diff --git a/Semana 7_Wander Carvalho/comex/testes/TesteCep.java b/Semana 7_Wander Carvalho/comex/testes/TesteCep.java new file mode 100644 index 00000000..88bcb5c9 --- /dev/null +++ b/Semana 7_Wander Carvalho/comex/testes/TesteCep.java @@ -0,0 +1,14 @@ +package br.com.alura.comex.testes; + +import br.com.alura.comex.model.Endereco; + +public class TesteCep { + public static void main(String[] args) { + ConsultaCep service = new ConsultaCep(); + Endereco endereco = service.consultaCep("12237600"); + if (endereco != null) { + System.out.println(endereco); + } + } +} + diff --git a/Semana 7_Wander Carvalho/comex/testes/TesteClassePedido.java b/Semana 7_Wander Carvalho/comex/testes/TesteClassePedido.java new file mode 100644 index 00000000..367af116 --- /dev/null +++ b/Semana 7_Wander Carvalho/comex/testes/TesteClassePedido.java @@ -0,0 +1,42 @@ +package br.com.alura.comex.testes; + +import br.com.alura.comex.model.Cliente; +import br.com.alura.comex.model.Pedido; +import br.com.alura.comex.model.Produto; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +public class TesteClassePedido { + public static void main(String[] args) { + // Criando clientes + Cliente cliente1 = new Cliente("João Silva", "123.456.789-00", "joao.silva@gmail.com", "Engenheiro", "51 99876-5432", null); + Cliente cliente2 = new Cliente("Maria Oliveira", "987.654.321-00", "maria.oliveira@gmail.com", "Médica", "21 98765-4321", null); + + // Criando produtos + Produto produto1 = new Produto("Notebook", "Notebook Dell", 3500.00, 10); + Produto produto2 = new Produto("Smartphone", "iPhone 13", 5000.00, 5); + Produto produto3 = new Produto("Impressora", "Impressora HP", 800.00, 15); + + // Criando pedidos + List pedidos = new ArrayList<>(); + pedidos.add(new Pedido(101, cliente1, new BigDecimal("3500.00"), 1)); + pedidos.add(new Pedido(102, cliente1, new BigDecimal("7000.00"), 2)); // 2 notebooks + pedidos.add(new Pedido(103, cliente2, new BigDecimal("5000.00"), 1)); + pedidos.add(new Pedido(104, cliente2, new BigDecimal("1600.00"), 2)); // 2 impressoras + pedidos.add(new Pedido(105, cliente1, new BigDecimal("800.00"), 1)); + + // Exibindo informações dos pedidos de forma segura + pedidos.forEach(pedido -> { + if (pedido.getCliente() != null) { + System.out.println("Pedido ID: " + pedido.getId() + ", Cliente: " + pedido.getCliente().getNome() + + ", Preço: " + pedido.getPreco() + ", Quantidade: " + pedido.getQuantidade() + + ", Valor Total: " + pedido.getValorTotal()); + } else { + System.out.println("Pedido ID: " + pedido.getId() + " tem um cliente nulo!"); + } + }); + } +} + diff --git a/Semana 7_Wander Carvalho/comex/testes/TesteProduto.java b/Semana 7_Wander Carvalho/comex/testes/TesteProduto.java new file mode 100644 index 00000000..f7be456e --- /dev/null +++ b/Semana 7_Wander Carvalho/comex/testes/TesteProduto.java @@ -0,0 +1,43 @@ +package br.com.alura.comex.testes; + +import br.com.alura.comex.model.Categoria; +import br.com.alura.comex.model.Produto; + +import java.math.BigDecimal; +import java.util.Scanner; + +public class TesteProduto { + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + + System.out.println("Por favor, insira o nome do produto:"); + String nome = scanner.nextLine().trim(); + + // Verificar se o nome é válido (não vazio e não nulo) + while (nome.isEmpty()) { + System.out.println("O nome do produto é obrigatório e não pode ser vazio. Por favor, insira o nome do produto:"); + nome = scanner.nextLine().trim(); + } + + System.out.println("Por favor, insira a descrição do produto:"); + String descricao = scanner.nextLine().trim(); + + System.out.println("Por favor, insira o preço unitário do produto:"); + BigDecimal precoUnitario = BigDecimal.valueOf(scanner.nextDouble()); + + System.out.println("Por favor, insira a quantidade do produto:"); + int quantidade = scanner.nextInt(); + + System.out.println("Por favor, insira a categoria do produto:"); + int categoria = scanner.nextInt(); + + // Criação do objeto Produto com dados fornecidos pelo usuário + Produto produto = new Produto(nome, descricao, precoUnitario, quantidade, categoria); + + // Impressão das informações do produto + System.out.println("Informações do Produto:"); + System.out.println(produto); + + scanner.close(); // Fechar o scanner após o uso + } +} From 329a1bf9d976d7ee97e22a6b59d79996ac579259 Mon Sep 17 00:00:00 2001 From: Wander Carvalho <138515773+Wander-samix@users.noreply.github.com> Date: Mon, 29 Apr 2024 09:32:14 -0300 Subject: [PATCH 08/17] CadastraCliente.java --- .../comex/DAO/CadastraCliente.java | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/Semana 7_Wander Carvalho/comex/DAO/CadastraCliente.java b/Semana 7_Wander Carvalho/comex/DAO/CadastraCliente.java index d6bf0f26..ee8f9a68 100644 --- a/Semana 7_Wander Carvalho/comex/DAO/CadastraCliente.java +++ b/Semana 7_Wander Carvalho/comex/DAO/CadastraCliente.java @@ -41,18 +41,26 @@ public static void main(String[] args) { logger.info("Informações do cliente antes da persistência: {}", cliente); logger.info("Informações do endereço antes da persistência: {}", endereco); - EntityManager em = factory.createEntityManager(); entityManager.getTransaction().begin(); // Inicia a transação - cliente.salvar(em); // Persiste o cliente e seu endereço - entityManager.getTransaction().commit(); // Faz o commit da transação - entityManager.close(); // Fecha o EntityManager após o uso - + // Persiste o Endereco antes do Cliente + entityManager.persist(endereco); // Persiste o endereço + // Associa o Endereco persistido ao Cliente + cliente.setEndereco(endereco); + // Agora persiste o Cliente + entityManager.persist(cliente); // Persiste o cliente + entityManager.getTransaction().commit(); // Finaliza a transação logger.info("Cliente cadastrado com sucesso: {}", cliente); } else { logger.error("Falha ao criar dados do cliente. Cliente retornou nulo."); } + } catch (Exception e) { + logger.error("Ocorreu uma exceção: ", e); + if (entityManager.getTransaction().isActive()) { + entityManager.getTransaction().rollback(); // Desfaz a transação em caso de exceção + } } finally { scanner.close(); + entityManager.close(); // Fecha o EntityManager após o uso factory.close(); setLoggingLevel(Level.DEBUG); // Restaura o nível de log após a interação } From c472f9349a01f82530bba663b2a20c8304ed9fce Mon Sep 17 00:00:00 2001 From: Wander Carvalho <138515773+Wander-samix@users.noreply.github.com> Date: Wed, 15 May 2024 11:08:28 -0300 Subject: [PATCH 09/17] Create teste --- Semana 8_Wander Carvalho/teste | 1 + 1 file changed, 1 insertion(+) create mode 100644 Semana 8_Wander Carvalho/teste diff --git a/Semana 8_Wander Carvalho/teste b/Semana 8_Wander Carvalho/teste new file mode 100644 index 00000000..6f16acbb --- /dev/null +++ b/Semana 8_Wander Carvalho/teste @@ -0,0 +1 @@ +teste From 610bf1e8a9ea99c1601cd9e7593a04020db39086 Mon Sep 17 00:00:00 2001 From: Wander Carvalho <138515773+Wander-samix@users.noreply.github.com> Date: Wed, 15 May 2024 11:26:46 -0300 Subject: [PATCH 10/17] Add files via upload --- .../SEMANA 8_WANDER CARVALHO/README.md | 13 + .../SEMANA 8_WANDER CARVALHO/pom.xml | 76 ++ .../br/com/alura/comex/ComexApplication.java | 13 + .../main/java/br/com/alura/comex/Main.java | 81 ++ .../br/com/alura/comex/ProcessadorDeCsv.java | 56 ++ .../comex/controller/BemVindoController.java | 13 + .../comex/controller/CategoriaController.java | 19 + .../alura/comex/controller/ComexService.java | 53 ++ .../comex/controller/ComexServiceImpl.java | 9 + .../com/alura/comex/dao/CadastrarCliente.java | 133 ++++ .../comex/dao/CadastrarProdutoPedido.java | 690 ++++++++++++++++++ .../br/com/alura/comex/dao/CategoriaDao.java | 66 ++ .../com/alura/comex/dao/ClienteAlteraBd.java | 47 ++ .../br/com/alura/comex/dao/ClienteDao.java | 93 +++ .../br/com/alura/comex/dao/DeleteCliente.java | 59 ++ .../br/com/alura/comex/dao/EnderecoDao.java | 70 ++ .../comex/dao/GeralPedidoClienteProduto.java | 71 ++ .../alura/comex/dao/ImprimeDadosClientes.java | 38 + .../br/com/alura/comex/dao/PedidoDao.java | 51 ++ .../br/com/alura/comex/dao/ProdutoDao.java | 74 ++ .../com/alura/comex/dao/TestaPedidoDao.java | 33 + .../comex/dao/TodosProdutosCadastradosBd.java | 58 ++ .../br/com/alura/comex/model/Categoria.java | 69 ++ .../br/com/alura/comex/model/Cliente.java | 88 +++ .../br/com/alura/comex/model/Endereco.java | 105 +++ .../br/com/alura/comex/model/Estoque.java | 75 ++ .../br/com/alura/comex/model/ItemPedido.java | 149 ++++ .../br/com/alura/comex/model/JsonCreator.java | 4 + .../java/br/com/alura/comex/model/Pedido.java | 175 +++++ .../br/com/alura/comex/model/Produto.java | 161 ++++ .../alura/comex/model/RelatorioCliente.java | 35 + .../com/alura/comex/model/TipoDesconto.java | 26 + .../com/alura/comex/testes/ConsultaCep.java | 39 + .../alura/comex/testes/OrdenacaoPedido.java | 66 ++ .../alura/comex/testes/TestaPedidoDao.java | 32 + .../comex/testes/TestaPedidoOrdenado.java | 68 ++ .../br/com/alura/comex/testes/TesteCep.java | 14 + .../com/alura/comex/testes/TesteProduto.java | 64 ++ .../main/resources/META-INF/persistence.xml | 39 + .../src/main/resources/pedidos.csv | 17 + .../com/alura/comex/dao/CategoriaDaoTest.java | 28 + .../br/com/alura/comex/model/EstoqueTest.java | 35 + .../br/com/alura/comex/model/PedidoTest.java | 76 ++ .../src/test/resources/pedidos.csv | 17 + .../target/classes/DeleteCliente.class | Bin 0 -> 3205 bytes .../target/classes/META-INF/persistence.xml | 39 + .../target/classes/TestaPedidoDao.class | Bin 0 -> 2830 bytes .../target/classes/TestaPedidoOrdenado.class | Bin 0 -> 5584 bytes .../br/com/alura/comex/ComexApplication.class | Bin 0 -> 740 bytes .../br/com/alura/comex/ProcessadorDeCsv.class | Bin 0 -> 2888 bytes .../comex/controller/BemVindoController.class | Bin 0 -> 666 bytes .../controller/CategoriaController.class | Bin 0 -> 1644 bytes .../alura/comex/controller/ComexService.class | Bin 0 -> 3064 bytes .../comex/controller/ComexServiceImpl.class | Bin 0 -> 478 bytes .../alura/comex/dao/CadastrarCliente.class | Bin 0 -> 6407 bytes .../comex/dao/CadastrarProdutoPedido.class | Bin 0 -> 18685 bytes .../br/com/alura/comex/dao/CategoriaDao.class | Bin 0 -> 3535 bytes .../com/alura/comex/dao/ClienteAlteraBd.class | Bin 0 -> 1852 bytes .../br/com/alura/comex/dao/ClienteDao.class | Bin 0 -> 4905 bytes .../br/com/alura/comex/dao/EnderecoDao.class | Bin 0 -> 2015 bytes ...GeralPedidoClienteProduto$ClienteDao.class | Bin 0 -> 1645 bytes .../GeralPedidoClienteProduto$PedidoDao.class | Bin 0 -> 1636 bytes ...GeralPedidoClienteProduto$ProdutoDao.class | Bin 0 -> 2003 bytes .../comex/dao/GeralPedidoClienteProduto.class | Bin 0 -> 653 bytes .../comex/dao/ImprimeDadosClientes.class | Bin 0 -> 3734 bytes .../br/com/alura/comex/dao/PedidoDao.class | Bin 0 -> 3093 bytes .../br/com/alura/comex/dao/ProdutoDao.class | Bin 0 -> 3638 bytes .../dao/TodosProdutosCadastradosBd.class | Bin 0 -> 3394 bytes .../alura/comex/model/Categoria$Status.class | Bin 0 -> 1293 bytes .../br/com/alura/comex/model/Categoria.class | Bin 0 -> 2625 bytes .../br/com/alura/comex/model/Cliente.class | Bin 0 -> 4064 bytes .../br/com/alura/comex/model/Endereco.class | Bin 0 -> 4556 bytes .../br/com/alura/comex/model/Estoque.class | Bin 0 -> 3287 bytes .../br/com/alura/comex/model/ItemPedido.class | Bin 0 -> 5480 bytes .../com/alura/comex/model/JsonCreator.class | Bin 0 -> 167 bytes .../br/com/alura/comex/model/Pedido.class | Bin 0 -> 7676 bytes .../br/com/alura/comex/model/Produto.class | Bin 0 -> 6452 bytes .../alura/comex/model/RelatorioCliente.class | Bin 0 -> 1234 bytes .../com/alura/comex/model/TipoDesconto.class | Bin 0 -> 2185 bytes .../com/alura/comex/testes/ConsultaCep.class | Bin 0 -> 3330 bytes .../alura/comex/testes/OrdenacaoPedido.class | Bin 0 -> 5748 bytes .../alura/comex/testes/TestaPedidoDao.class | Bin 0 -> 2799 bytes .../br/com/alura/comex/testes/TesteCep.class | Bin 0 -> 959 bytes .../com/alura/comex/testes/TesteProduto.class | Bin 0 -> 2754 bytes .../target/classes/pedidos.csv | 17 + .../alura/comex/dao/CategoriaDaoTest.class | Bin 0 -> 810 bytes .../com/alura/comex/model/EstoqueTest.class | Bin 0 -> 952 bytes .../br/com/alura/comex/model/PedidoTest.class | Bin 0 -> 1771 bytes .../target/test-classes/pedidos.csv | 17 + 89 files changed, 3271 insertions(+) create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/README.md create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/pom.xml create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/ComexApplication.java create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/Main.java create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/ProcessadorDeCsv.java create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/BemVindoController.java create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/CategoriaController.java create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/ComexService.java create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/ComexServiceImpl.java create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/CadastrarCliente.java create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/CadastrarProdutoPedido.java create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/CategoriaDao.java create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/ClienteAlteraBd.java create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/ClienteDao.java create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/DeleteCliente.java create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/EnderecoDao.java create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/GeralPedidoClienteProduto.java create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/ImprimeDadosClientes.java create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/PedidoDao.java create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/ProdutoDao.java create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/TestaPedidoDao.java create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/TodosProdutosCadastradosBd.java create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Categoria.java create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Cliente.java create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Endereco.java create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Estoque.java create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/ItemPedido.java create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/JsonCreator.java create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Pedido.java create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Produto.java create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/RelatorioCliente.java create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/TipoDesconto.java create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/ConsultaCep.java create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/OrdenacaoPedido.java create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/TestaPedidoDao.java create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/TestaPedidoOrdenado.java create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/TesteCep.java create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/TesteProduto.java create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/resources/META-INF/persistence.xml create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/resources/pedidos.csv create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/test/java/br/com/alura/comex/dao/CategoriaDaoTest.java create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/test/java/br/com/alura/comex/model/EstoqueTest.java create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/test/java/br/com/alura/comex/model/PedidoTest.java create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/test/resources/pedidos.csv create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/DeleteCliente.class create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/META-INF/persistence.xml create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/TestaPedidoDao.class create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/TestaPedidoOrdenado.class create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/ComexApplication.class create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/ProcessadorDeCsv.class create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/controller/BemVindoController.class create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/controller/CategoriaController.class create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/controller/ComexService.class create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/controller/ComexServiceImpl.class create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/dao/CadastrarCliente.class create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/dao/CadastrarProdutoPedido.class create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/dao/CategoriaDao.class create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/dao/ClienteAlteraBd.class create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/dao/ClienteDao.class create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/dao/EnderecoDao.class create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/dao/GeralPedidoClienteProduto$ClienteDao.class create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/dao/GeralPedidoClienteProduto$PedidoDao.class create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/dao/GeralPedidoClienteProduto$ProdutoDao.class create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/dao/GeralPedidoClienteProduto.class create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/dao/ImprimeDadosClientes.class create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/dao/PedidoDao.class create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/dao/ProdutoDao.class create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/dao/TodosProdutosCadastradosBd.class create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/model/Categoria$Status.class create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/model/Categoria.class create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/model/Cliente.class create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/model/Endereco.class create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/model/Estoque.class create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/model/ItemPedido.class create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/model/JsonCreator.class create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/model/Pedido.class create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/model/Produto.class create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/model/RelatorioCliente.class create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/model/TipoDesconto.class create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/testes/ConsultaCep.class create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/testes/OrdenacaoPedido.class create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/testes/TestaPedidoDao.class create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/testes/TesteCep.class create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/testes/TesteProduto.class create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/pedidos.csv create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/test-classes/br/com/alura/comex/dao/CategoriaDaoTest.class create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/test-classes/br/com/alura/comex/model/EstoqueTest.class create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/test-classes/br/com/alura/comex/model/PedidoTest.class create mode 100644 Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/test-classes/pedidos.csv diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/README.md b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/README.md new file mode 100644 index 00000000..cb743333 --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/README.md @@ -0,0 +1,13 @@ +# Comex + +## Informações gerais dos pedidos em _pedidos.csv_ +- Campos: **CATEGORIA, PRODUTO, PREÇO, QUANTIDADE, DATA, CLIENTE** + + +### RELATÓRIO DE VALORES TOTAIS +- TOTAL DE PEDIDOS REALIZADOS: 16 +- TOTAL DE PRODUTOS VENDIDOS: 35 +- TOTAL DE CATEGORIAS: 5 +- MONTANTE DE VENDAS: R$ 178.374,49 +- PEDIDO MAIS BARATO: R$ 95,17 (Clean Code) +- PEDIDO MAIS CARO: R$ 55.056,00 (iPhone 13 Pro) diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/pom.xml b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/pom.xml new file mode 100644 index 00000000..5cdffe01 --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/pom.xml @@ -0,0 +1,76 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 3.1.1 + + + + br.com.alura + comex + 0.0.1-SNAPSHOT + + + 17 + 17 + + + + + org.junit.jupiter + junit-jupiter + 5.8.2 + test + + + + com.fasterxml.jackson.core + jackson-databind + 2.13.1 + + + + com.google.code.gson + gson + 2.10.1 + + + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + 2.13.1 + + + + + org.hibernate + hibernate-entitymanager + 5.4.20.Final + + + + com.oracle.database.jdbc + ojdbc8 + 23.3.0.23.09 + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-validation + + + + + + \ No newline at end of file diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/ComexApplication.java b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/ComexApplication.java new file mode 100644 index 00000000..1285bf08 --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/ComexApplication.java @@ -0,0 +1,13 @@ +package br.com.alura.comex; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + + + @SpringBootApplication + public class ComexApplication { + public static void main(String[] args) { + SpringApplication.run(ComexApplication.class, args); + } + } + diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/Main.java b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/Main.java new file mode 100644 index 00000000..0cd05711 --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/Main.java @@ -0,0 +1,81 @@ +//package br.com.alura.comex; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.net.URISyntaxException; +import java.text.NumberFormat; +import java.util.Arrays; +import java.util.Locale; + +//public class Main { +// +// private static final Logger logger = LoggerFactory.getLogger(Main.class); +// +// public static void main(String[] args) throws IOException, URISyntaxException { +// Pedido[] pedidos = ProcessadorDeCsv.processaArquivo("pedidos.csv"); +// +// int totalDeProdutosVendidos = 0; +// int totalDePedidosRealizados = 0; +// BigDecimal montanteDeVendas = BigDecimal.ZERO; +// Pedido pedidoMaisBarato = null; +// Pedido pedidoMaisCaro = null; +// +// String[] categoriasProcessadas = new String[10]; +// int totalDeCategorias = 0; +// +// for (int i = 0; i < pedidos.length; i++) { +// Pedido pedidoAtual = pedidos[i]; +// +// if (pedidoAtual == null) { +// break; +// } +// +// if (pedidoMaisBarato == null || pedidoAtual.getPreco().multiply(new BigDecimal(pedidoAtual.getQuantidade())).compareTo(pedidoMaisBarato.getPreco().multiply(new BigDecimal(pedidoMaisBarato.getQuantidade()))) < 0) { +// pedidoMaisBarato = pedidoAtual; +// } +// +// if (pedidoMaisCaro == null || pedidoAtual.getPreco().multiply(new BigDecimal(pedidoAtual.getQuantidade())).compareTo(pedidoMaisCaro.getPreco().multiply(new BigDecimal(pedidoMaisCaro.getQuantidade()))) > 0) { +// pedidoMaisCaro = pedidoAtual; +// } +// +// montanteDeVendas = montanteDeVendas.add(pedidoAtual.getPreco().multiply(new BigDecimal(pedidoAtual.getQuantidade()))); +// totalDeProdutosVendidos += pedidoAtual.getQuantidade(); +// totalDePedidosRealizados++; +// +// boolean jahProcessouCategoria = false; +// for (int j = 0; j < categoriasProcessadas.length; j++) { +// if (pedidoAtual.getCategoria().equalsIgnoreCase(categoriasProcessadas[j])) { +// jahProcessouCategoria = true; +// } +// } +// +// if (!jahProcessouCategoria) { +// totalDeCategorias++; +// +// if (categoriasProcessadas[categoriasProcessadas.length - 1] != null) { +// categoriasProcessadas = Arrays.copyOf(categoriasProcessadas, categoriasProcessadas.length * 2); +// } else { +// for (int k = 0; k < categoriasProcessadas.length; k++) { +// if (categoriasProcessadas[k] == null) { +// categoriasProcessadas[k] = pedidoAtual.getCategoria(); +// break; +// } +// } +// } +// } +// } +// +// logger.info("##### RELATÓRIO DE VALORES TOTAIS #####"); +// logger.info("TOTAL DE PEDIDOS REALIZADOS: {}", totalDePedidosRealizados); +// logger.info("TOTAL DE PRODUTOS VENDIDOS: {}", totalDeProdutosVendidos); +// logger.info("TOTAL DE CATEGORIAS: {}", totalDeCategorias); +// logger.info("MONTANTE DE VENDAS: {}", NumberFormat.getCurrencyInstance(new Locale("pt", "BR")).format(montanteDeVendas.setScale(2, RoundingMode.HALF_DOWN))); +// logger.info("PEDIDO MAIS BARATO: {} ({})", NumberFormat.getCurrencyInstance(new Locale("pt", "BR")).format(pedidoMaisBarato.getPreco().multiply(new BigDecimal(pedidoMaisBarato.getQuantidade())).setScale(2, RoundingMode.HALF_DOWN)), pedidoMaisBarato.getProduto()); +// logger.info("PEDIDO MAIS CARO: {} ({})\n", NumberFormat.getCurrencyInstance(new Locale("pt", "BR")).format(pedidoMaisCaro.getPreco().multiply(new BigDecimal(pedidoMaisCaro.getQuantidade())).setScale(2, RoundingMode.HALF_DOWN)), pedidoMaisCaro.getProduto()); +// logger.info("### FIM DO RELATÓRIO ###"); +// } +//} \ No newline at end of file diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/ProcessadorDeCsv.java b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/ProcessadorDeCsv.java new file mode 100644 index 00000000..ea0b3676 --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/ProcessadorDeCsv.java @@ -0,0 +1,56 @@ +package br.com.alura.comex; + +import br.com.alura.comex.model.Pedido; + +import java.io.IOException; +import java.math.BigDecimal; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.Path; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.Arrays; +import java.util.Scanner; + +public class ProcessadorDeCsv { + + public static Pedido[] processaArquivo(String nomeDoArquivo) { + try { + URL recursoCSV = ClassLoader.getSystemResource(nomeDoArquivo); + Path caminhoDoArquivo = caminhoDoArquivo = Path.of(recursoCSV.toURI()); + + Scanner leitorDeLinhas = new Scanner(caminhoDoArquivo); + + leitorDeLinhas.nextLine(); + + Pedido[] pedidos = new Pedido[10]; + + int quantidadeDeRegistros = 0; + while (leitorDeLinhas.hasNextLine()) { + String linha = leitorDeLinhas.nextLine(); + String[] registro = linha.split(","); + + String categoria = registro[0]; + String produto = registro[1]; + BigDecimal preco = new BigDecimal(registro[2]); + int quantidade = Integer.parseInt(registro[3]); + LocalDate data = LocalDate.parse(registro[4], DateTimeFormatter.ofPattern("dd/MM/yyyy")); + String cliente = registro[5]; + + Pedido pedido = Pedido.createPedido(categoria, produto, cliente, preco, quantidade, data); + pedidos[quantidadeDeRegistros] = pedido; + + quantidadeDeRegistros++; + if (pedidos[pedidos.length - 1] != null) { + pedidos = Arrays.copyOf(pedidos, pedidos.length * 2); + } + } + + return pedidos; + } catch (URISyntaxException e) { + throw new RuntimeException(String.format("Arquivo {} não localizado!", nomeDoArquivo)); + } catch (IOException e) { + throw new RuntimeException("Erro ao abrir Scanner para processar arquivo!"); + } + } +} \ No newline at end of file diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/BemVindoController.java b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/BemVindoController.java new file mode 100644 index 00000000..1bd787ae --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/BemVindoController.java @@ -0,0 +1,13 @@ +package br.com.alura.comex.controller; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class BemVindoController { + @RequestMapping ("/api/bemvindo") + public String bemvindo(){ + return "Bem-vindo ao sistema Comex"; + } + +} diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/CategoriaController.java b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/CategoriaController.java new file mode 100644 index 00000000..b6897cb8 --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/CategoriaController.java @@ -0,0 +1,19 @@ +package br.com.alura.comex.controller; + +import br.com.alura.comex.dao.CategoriaDao; +import br.com.alura.comex.model.Categoria; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class CategoriaController { + + @RequestMapping("/categoria") + public void cadastra(String nomeDaCategoria) { + System.out.println("Estou cadastrando uma nova categoria: " + nomeDaCategoria); + Categoria novaCategoria = new Categoria(nomeDaCategoria); + CategoriaDao categoriaDao = new CategoriaDao(); + categoriaDao.cadastrar(novaCategoria); + } + +} \ No newline at end of file diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/ComexService.java b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/ComexService.java new file mode 100644 index 00000000..9108a639 --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/ComexService.java @@ -0,0 +1,53 @@ +package br.com.alura.comex.controller; + +import br.com.alura.comex.dao.ClienteDao; +import br.com.alura.comex.dao.PedidoDao; +import br.com.alura.comex.dao.ProdutoDao; +import br.com.alura.comex.model.Cliente; +import br.com.alura.comex.model.Pedido; +import br.com.alura.comex.model.Produto; +import javax.persistence.EntityManager; +import java.util.List; + +import javax.persistence.EntityManager; +import java.util.List; + +public class ComexService { + private ClienteDao clienteDao; + private PedidoDao pedidoDao; + private ProdutoDao produtoDao; + + public ComexService(EntityManager em) { + this.clienteDao = new ClienteDao(em); + this.pedidoDao = new PedidoDao(em); + this.produtoDao = new ProdutoDao(em); + } + + public void cadastrarCliente(Cliente cliente) { + clienteDao.salvar(cliente); + } + + public void cadastrarPedido(Pedido pedido) { + pedidoDao.salvar(pedido); + // Correção: Usando o método correto para obter os itens do pedido + pedido.getItensPedidos().forEach(item -> { + produtoDao.atualizarEstoque(item.getProduto(), -item.getQuantidade()); + }); + } + + public void cadastrarProduto(Produto produto) { + produtoDao.salvar(produto); + } + + public List listarClientes() { + return clienteDao.buscarTodos(); + } + + public List listarPedidos() { + return pedidoDao.buscarTodos(); + } + + public List listarProdutos() { + return produtoDao.buscarTodos(); + } +} diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/ComexServiceImpl.java b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/ComexServiceImpl.java new file mode 100644 index 00000000..0e590937 --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/ComexServiceImpl.java @@ -0,0 +1,9 @@ +package br.com.alura.comex.controller; + +import javax.persistence.EntityManager; + +public class ComexServiceImpl extends ComexService { + public ComexServiceImpl(EntityManager em) { + super(em); + } +} diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/CadastrarCliente.java b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/CadastrarCliente.java new file mode 100644 index 00000000..b6f378b2 --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/CadastrarCliente.java @@ -0,0 +1,133 @@ +package br.com.alura.comex.dao; + +import br.com.alura.comex.model.Cliente; +import br.com.alura.comex.model.Endereco; +import br.com.alura.comex.testes.ConsultaCep; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; +import java.util.Scanner; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.LoggerContext; + +import static javax.persistence.Persistence.createEntityManagerFactory; + +public class CadastrarCliente { + + private static Scanner scanner; + private static final Logger logger = LoggerFactory.getLogger(CadastrarCliente.class); + + public static void main(String[] args) { + EntityManagerFactory factory = createEntityManagerFactory("oracle"); + EntityManager entityManager = factory.createEntityManager(); + setScanner(new Scanner(System.in)); + + try { + setLoggingLevel(Level.ERROR); // Reduz o nível de log antes da interação com o usuário + + System.out.println("Digite 'sair' a qualquer momento para terminar o programa."); + String cep = getRequiredInput("Por favor, insira o CEP para consulta:"); + Endereco endereco = new ConsultaCep().consultaCep(cep); + + if (endereco == null) { + logger.error("Não foi possível encontrar o endereço para o CEP fornecido."); + return; + } + + Cliente cliente = getClienteData(endereco); + if (cliente != null) { + logger.info("Informações do cliente antes da persistência: {}", cliente); + logger.info("Informações do endereço antes da persistência: {}", endereco); + + entityManager.getTransaction().begin(); + entityManager.persist(endereco); + cliente.setEndereco(endereco); + entityManager.persist(cliente); + entityManager.getTransaction().commit(); + logger.info("Cliente cadastrado com sucesso: {}", cliente); + } else { + logger.error("Falha ao criar dados do cliente. Cliente retornou nulo."); + } + } catch (Exception e) { + logger.error("Ocorreu uma exceção: ", e); + if (entityManager.getTransaction().isActive()) { + entityManager.getTransaction().rollback(); + } + } finally { + getScanner().close(); + if (entityManager.isOpen()) { + entityManager.close(); + } + if (factory.isOpen()) { + factory.close(); + } + setLoggingLevel(Level.DEBUG); // Restaura o nível de log após a interação + } + } + + private static Cliente getClienteData(Endereco endereco) { + String nomeCliente = getRequiredInput("Por favor, insira o nome do cliente:"); + if (nomeCliente.isEmpty()) { + logger.error("O nome do cliente é obrigatório e não foi fornecido."); + return null; + } + String cpf = getRequiredInput("Por favor, insira o CPF do cliente:"); + String email = getEmailInput(); + String profissao = getRequiredInput("Por favor, insira a profissão do cliente:"); + String telefone = getRequiredInput("Por favor, insira o telefone do cliente:"); + endereco.setNumero(getRequiredInput("Por favor, insira o número do imóvel:")); + endereco.setComplemento(getInput("Por favor, insira o complemento do imóvel (opcional):")); + + return new Cliente(nomeCliente, cpf, email, profissao, telefone, endereco); + } + + private static String getRequiredInput(String prompt) { + System.out.println(prompt); + String input = getScanner().nextLine(); + if ("sair".equalsIgnoreCase(input)) { + System.out.println("Programa encerrado."); + System.exit(0); + } + if (input.trim().isEmpty()) { + System.out.println("Este campo é obrigatório. Por favor, forneça um valor."); + return getRequiredInput(prompt); + } + return input; + } + + private static String getInput(String prompt) { + System.out.println(prompt); + return getScanner().nextLine(); + } + + private static String getEmailInput() { + String email = getRequiredInput("Por favor, insira o email do cliente:"); + if (!isValidEmail(email)) { + System.out.println("Email inválido. Por favor, insira um email válido."); + return getEmailInput(); + } + return email; + } + + private static boolean isValidEmail(String email) { + return email.matches("^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(\\[?)(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}(\\]?)$"); + } + + private static void setLoggingLevel(Level newLevel) { + LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); + ch.qos.logback.classic.Logger rootLogger = loggerContext.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME); + rootLogger.setLevel(newLevel); + } + + public static Scanner getScanner() { + return scanner; + } + + public static void setScanner(Scanner scanner) { + CadastrarCliente.scanner = scanner; + } +} diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/CadastrarProdutoPedido.java b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/CadastrarProdutoPedido.java new file mode 100644 index 00000000..771afb45 --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/CadastrarProdutoPedido.java @@ -0,0 +1,690 @@ +//package br.com.alura.comex.dao; +// +//import br.com.alura.comex.model.*; +//import br.com.alura.comex.testes.ConsultaCep; +//import javax.persistence.EntityManager; +//import javax.persistence.EntityManagerFactory; +//import javax.persistence.NoResultException; +//import javax.persistence.TypedQuery; +//import javax.persistence.Query; +//import java.math.BigDecimal; +//import java.time.LocalDate; +//import java.util.List; +//import java.util.Scanner; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +//import ch.qos.logback.classic.Level; +//import ch.qos.logback.classic.LoggerContext; +//import static javax.persistence.Persistence.createEntityManagerFactory; +// +//public class CadastrarProdutoPedido { +// +// private static Scanner scanner; +// private static final Logger logger = LoggerFactory.getLogger(CadastrarProdutoPedido.class); +// +// public static void main(String[] args) { +// EntityManagerFactory factory = createEntityManagerFactory("oracle"); +// EntityManager entityManager = factory.createEntityManager(); +// setScanner(new Scanner(System.in)); +// +// try { +// setLoggingLevel(Level.ERROR); // Reduz o nível de log antes da interação com o usuário +// +// System.out.println("Digite 'sair' a qualquer momento para terminar o programa."); +// +// boolean running = true; +// while (running) { +// System.out.println("Selecione uma opção:"); +// System.out.println("1. Cadastrar nova compra"); +// System.out.println("2. Consultar compras de um cliente específico"); +// System.out.println("3. Consultar compras de todos os clientes"); +// System.out.println("4. Exibir o cliente mais fiel"); +// System.out.println("5. Sair"); +// String option = getRequiredInput("Opção:"); +// +// switch (option) { +// case "1": +// cadastrarNovaCompra(entityManager); +// break; +// case "2": +// consultarComprasCliente(entityManager); +// break; +// case "3": +// consultarComprasTodosClientes(entityManager); +// break; +// case "4": +// exibirClienteMaisFiel(entityManager); +// break; +// case "5": +// running = false; +// break; +// default: +// System.out.println("Opção inválida. Por favor, tente novamente."); +// } +// } +// } catch (Exception e) { +// logger.error("Ocorreu uma exceção: ", e); +// if (entityManager.getTransaction().isActive()) { +// entityManager.getTransaction().rollback(); +// } +// } finally { +// getScanner().close(); +// if (entityManager.isOpen()) { +// entityManager.close(); +// } +// if (factory.isOpen()) { +// factory.close(); +// } +// setLoggingLevel(Level.DEBUG); // Restaura o nível de log após a interação +// } +// } +// +// private static void cadastrarNovaCompra(EntityManager entityManager) { +// try { +// listarClientesCadastrados(entityManager); +// String cpf = getRequiredInput("Por favor, insira o CPF do cliente:"); +// Cliente cliente = buscarClientePorCpf(entityManager, cpf); +// Categoria categoria = getCategoriaData(entityManager); +// Produto produto = getProdutoData(categoria); +// Pedido pedido = getPedidoData(entityManager, cliente, cpf); +// if (pedido != null && produto != null) { +// ItemPedido itemPedido = new ItemPedido(produto, 2, produto.getPrecoUnitario(), TipoDesconto.NENHUM, pedido); +// entityManager.getTransaction().begin(); +// entityManager.persist(itemPedido); +// pedido.adicionarItem(itemPedido); +// entityManager.merge(pedido); +// entityManager.getTransaction().commit(); +// logger.info("Item do pedido cadastrado com sucesso: {}", itemPedido); +// } +// gerarRelatorio(entityManager); +// } catch (Exception e) { +// logger.error("Ocorreu uma exceção: ", e); +// if (entityManager.getTransaction().isActive()) { +// entityManager.getTransaction().rollback(); +// } +// } +// } +// +// private static void listarClientesCadastrados(EntityManager entityManager) { +// List clientes = entityManager.createQuery("SELECT c FROM Cliente c", Cliente.class).getResultList(); +// System.out.println("Clientes já cadastrados:"); +// clientes.stream().forEach(cliente -> System.out.println(cliente.getCpf() + " - " + cliente.getNome())); +// System.out.println("-------------------------------------------------"); +// } +// +// private static Categoria getCategoriaData(EntityManager entityManager) { +// String nomeCategoria = getRequiredInput("Por favor, insira o nome da categoria:"); +// Categoria categoria = new Categoria(nomeCategoria); +// entityManager.getTransaction().begin(); +// entityManager.persist(categoria); +// entityManager.getTransaction().commit(); +// return categoria; +// } +// +// private static Produto getProdutoData(Categoria categoria) { +// String nomeProduto = getRequiredInput("Por favor, insira o nome do produto:"); +// String descricao = getRequiredInput("Por favor, insira a descrição do produto:"); +// BigDecimal precoUnitario = new BigDecimal(getRequiredInput("Por favor, insira o preço unitário do produto:")); +// int quantidade = Integer.parseInt(getRequiredInput("Por favor, insira a quantidade do produto:")); +// return new Produto(nomeProduto, descricao, precoUnitario, quantidade, categoria); +// } +// +// private static Pedido getPedidoData(EntityManager entityManager, Cliente cliente, String cpf) { +// if (cliente == null) { +// System.out.println("Cliente não encontrado. Iniciando cadastro..."); +// String cep = getRequiredInput("Por favor, insira o CEP para consulta:"); +// Endereco endereco = new ConsultaCep().consultaCep(cep); +// if (endereco == null) { +// logger.error("Não foi possível encontrar o endereço para o CEP fornecido."); +// return null; +// } +// endereco.setNumero(getRequiredInput("Por favor, insira o número do imóvel:")); +// endereco.setComplemento(getInput("Por favor, insira o complemento do imóvel (opcional):")); +// cliente = getClienteData(endereco, cpf); +// if (cliente != null) { +// entityManager.getTransaction().begin(); +// entityManager.persist(endereco); +// cliente.setEndereco(endereco); +// entityManager.persist(cliente); +// entityManager.getTransaction().commit(); +// } else { +// logger.error("Falha ao criar dados do cliente. Cliente retornou nulo."); +// return null; +// } +// } +// LocalDate data = LocalDate.now(); +// TipoDesconto tipoDesconto = TipoDesconto.NENHUM; +// return new Pedido(cliente, data, tipoDesconto); +// } +// +// private static Cliente buscarClientePorCpf(EntityManager entityManager, String cpf) { +// try { +// TypedQuery query = entityManager.createQuery("SELECT c FROM Cliente c WHERE c.cpf = :cpf", Cliente.class); +// query.setParameter("cpf", cpf); +// return query.getSingleResult(); +// } catch (NoResultException e) { +// return null; +// } +// } +// +// private static Cliente getClienteData(Endereco endereco, String cpf) { +// String nomeCliente = getRequiredInput("Por favor, insira o nome do cliente:"); +// String email = getEmailInput(); +// String profissao = getRequiredInput("Por favor, insira a profissão do cliente:"); +// String telefone = getRequiredInput("Por favor, insira o telefone do cliente:"); +// return new Cliente(nomeCliente, cpf, email, profissao, telefone, endereco); +// } +// +// private static void consultarComprasCliente(EntityManager entityManager) { +// String cpf = getRequiredInput("Por favor, insira o CPF do cliente:"); +// Cliente cliente = buscarClientePorCpf(entityManager, cpf); +// if (cliente == null) { +// System.out.println("Cliente não encontrado."); +// return; +// } +// List pedidos = entityManager.createQuery("SELECT p FROM Pedido p WHERE p.cliente = :cliente", Pedido.class) +// .setParameter("cliente", cliente) +// .getResultList(); +// +// pedidos.stream().forEach(pedido -> { +// System.out.println("-------------------------------------------------------------------------"); +// System.out.println("Histórico de compras do cliente " + cliente.getNome() + " (" + cliente.getCpf() + "):"); +// System.out.println("-------------------------------------------------------------------------"); +// System.out.printf("Pedido ID: %-5d | Data: %-10s | Total: %-10.2f\n", pedido.getId(), pedido.getData(), pedido.getValorTotal()); +// System.out.println("Itens do Pedido:"); +// System.out.println("Produto Quantidade Valor Montante Vendido "); +// pedido.getItensPedidos().stream().forEach(item -> System.out.printf("%-30s %-10d %-15.2f %-15.2f\n", +// item.getNomeProduto(), item.getQuantidade(), item.getPrecoUnitario(), item.calcularValorTotal())); +// }); +// System.out.println("-------------------------------------------------------------------------"); +// } +// +// private static void consultarComprasTodosClientes(EntityManager entityManager) { +// List clientes = entityManager.createQuery("SELECT c FROM Cliente c", Cliente.class).getResultList(); +// System.out.println("-------------------------------------------------------------------------"); +// System.out.println("Relatório de compras de todos os clientes:"); +// clientes.stream().forEach(cliente -> { +// System.out.println("-------------------------------------------------------------------------"); +// System.out.println("Cliente: " + cliente.getNome()); +// List pedidos = entityManager.createQuery("SELECT p FROM Pedido p WHERE p.cliente = :cliente", Pedido.class) +// .setParameter("cliente", cliente) +// .getResultList(); +// pedidos.stream().forEach(pedido -> { +// System.out.println("Pedido ID: " + pedido.getId() + " | Data: " + pedido.getData() + " | Total: " + pedido.getValorTotal()); +// System.out.println("Itens do Pedido:"); +// System.out.println("Produto Quantidade Valor Montante Vendido "); +// pedido.getItensPedidos().stream().forEach(item -> System.out.printf("%-30s %-10d %-15.2f %-15.2f\n", +// item.getNomeProduto(), item.getQuantidade(), item.getPrecoUnitario(), item.calcularValorTotal())); +// }); +// System.out.println("-------------------------------------------------------------------------"); +// }); +// } +// +// private static void exibirClienteMaisFiel(EntityManager entityManager) { +// try { +// Query query = entityManager.createQuery( +// "SELECT c.id, COUNT(p.id) AS totalPedidos " + +// "FROM Pedido p " + +// "JOIN p.cliente c " + +// "GROUP BY c.id " + +// "ORDER BY totalPedidos DESC" +// ); +// query.setMaxResults(1); +// Object[] resultado = (Object[]) query.getSingleResult(); +// Long clienteId = (Long) resultado[0]; +// Long totalPedidos = (Long) resultado[1]; +// Cliente cliente = entityManager.find(Cliente.class, clienteId); +// System.out.println("-------------------------------------------------------------------------"); +// System.out.println("Cliente mais fiel:"); +// System.out.printf("%-30s %-20s\n", "Cliente", "Total de Pedidos"); +// System.out.printf("%-30s %-20d\n", cliente.getNome(), totalPedidos); +// System.out.println("-------------------------------------------------------------------------"); +// } catch (NoResultException e) { +// System.out.println("Nenhum cliente encontrado."); +// } +// } +// +// private static void gerarRelatorio(EntityManager entityManager) { +// List resultados = entityManager.createQuery( +// "SELECT c.nome, COUNT(ip), SUM(ip.quantidade * ip.precoUnitario) " + +// "FROM ItemPedido ip " + +// "JOIN ip.produto p " + +// "JOIN p.categoria c " + +// "GROUP BY c.nome", Object[].class) +// .getResultList(); +// System.out.println("-------------------------------------------------------------------------"); +// System.out.println("Categoria Produtos Vendidos Montante Vendido "); +// resultados.stream().forEach(resultado -> { +// String nomeCategoria = (String) resultado[0]; +// Long produtosVendidos = (Long) resultado[1]; +// BigDecimal montanteVendido = (BigDecimal) resultado[2]; +// System.out.printf("%-30s %-20s %-20s\n", nomeCategoria, produtosVendidos, montanteVendido); +// }); +// System.out.println("-------------------------------------------------------------------------"); +// } +// +// private static String getRequiredInput(String prompt) { +// System.out.println(prompt); +// String input = getScanner().nextLine(); +// if ("sair".equalsIgnoreCase(input)) { +// System.out.println("Programa encerrado."); +// System.exit(0); +// } +// if (input.trim().isEmpty()) { +// System.out.println("Este campo é obrigatório. Por favor, forneça um valor."); +// return getRequiredInput(prompt); +// } +// return input; +// } +// +// private static String getInput(String prompt) { +// System.out.println(prompt); +// return getScanner().nextLine(); +// } +// +// private static String getEmailInput() { +// String email = getRequiredInput("Por favor, insira o email do cliente:"); +// if (!isValidEmail(email)) { +// System.out.println("Email inválido. Por favor, insira um email válido."); +// return getEmailInput(); +// } +// return email; +// } +// +// private static boolean isValidEmail(String email) { +// return email.matches("[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}"); +// } +// +// private static Scanner getScanner() { +// return scanner; +// } +// +// private static void setScanner(Scanner scanner) { +// CadastrarProdutoPedido.scanner = scanner; +// } +// +// private static void setLoggingLevel(Level level) { +// LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); +// loggerContext.getLogger("org.hibernate").setLevel(level); +// loggerContext.getLogger("org.springframework").setLevel(level); +// } +//} + +package br.com.alura.comex.dao; + +import br.com.alura.comex.model.*; +import br.com.alura.comex.testes.ConsultaCep; +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.NoResultException; +import javax.persistence.TypedQuery; +import javax.persistence.Query; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.YearMonth; +import java.time.format.DateTimeFormatter; +import java.util.List; +import java.util.Scanner; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.LoggerContext; +import static javax.persistence.Persistence.createEntityManagerFactory; + +public class CadastrarProdutoPedido { + + private static Scanner scanner; + private static final Logger logger = LoggerFactory.getLogger(CadastrarProdutoPedido.class); + + public static void main(String[] args) { + EntityManagerFactory factory = createEntityManagerFactory("oracle"); + EntityManager entityManager = factory.createEntityManager(); + setScanner(new Scanner(System.in)); + + try { + setLoggingLevel(Level.ERROR); // Reduz o nível de log antes da interação com o usuário + + System.out.println("Digite 'sair' a qualquer momento para terminar o programa."); + + boolean running = true; + while (running) { + System.out.println("Selecione uma opção:"); + System.out.println("1. Cadastrar nova compra"); + System.out.println("2. Consultar compras de um cliente específico"); + System.out.println("3. Consultar compras de todos os clientes"); + System.out.println("4. Exibir o cliente mais fiel"); + System.out.println("5. Relatório de total de clientes ativos e total vendido no mês"); + System.out.println("6. Sair"); + String option = getRequiredInput("Opção:"); + + switch (option) { + case "1": + cadastrarNovaCompra(entityManager); + break; + case "2": + consultarComprasCliente(entityManager); + break; + case "3": + consultarComprasTodosClientes(entityManager); + break; + case "4": + exibirClienteMaisFiel(entityManager); + break; + case "5": + gerarRelatorioClientesAtivosEVendas(entityManager); + break; + case "6": + running = false; + break; + default: + System.out.println("Opção inválida. Por favor, tente novamente."); + } + } + } catch (Exception e) { + logger.error("Ocorreu uma exceção: ", e); + if (entityManager.getTransaction().isActive()) { + entityManager.getTransaction().rollback(); + } + } finally { + getScanner().close(); + if (entityManager.isOpen()) { + entityManager.close(); + } + if (factory.isOpen()) { + factory.close(); + } + setLoggingLevel(Level.DEBUG); // Restaura o nível de log após a interação + } + } + + private static void cadastrarNovaCompra(EntityManager entityManager) { + try { + listarClientesCadastrados(entityManager); + String cpf = getRequiredInput("Por favor, insira o CPF do cliente:"); + Cliente cliente = buscarClientePorCpf(entityManager, cpf); + Categoria categoria = getCategoriaData(entityManager); + Produto produto = getProdutoData(categoria); + + // Persistir o produto antes de criar o ItemPedido + entityManager.getTransaction().begin(); + entityManager.persist(produto); + entityManager.getTransaction().commit(); + + Pedido pedido = getPedidoData(entityManager, cliente, cpf); + + // Persistir o pedido antes de criar o ItemPedido + entityManager.getTransaction().begin(); + entityManager.persist(pedido); + entityManager.getTransaction().commit(); + + if (pedido != null && produto != null) { + int quantidadeItens = Integer.parseInt(getRequiredInput("Por favor, insira a quantidade de itens para o pedido:")); + ItemPedido itemPedido = new ItemPedido(produto, quantidadeItens, produto.getPrecoUnitario(), TipoDesconto.NENHUM, pedido); + entityManager.getTransaction().begin(); + entityManager.persist(itemPedido); + pedido.adicionarItem(itemPedido); + entityManager.merge(pedido); + entityManager.getTransaction().commit(); + logger.info("Item do pedido cadastrado com sucesso: {}", itemPedido); + } + gerarRelatorio(entityManager); + } catch (Exception e) { + logger.error("Ocorreu uma exceção: ", e); + if (entityManager.getTransaction().isActive()) { + entityManager.getTransaction().rollback(); + } + } + } + + private static void listarClientesCadastrados(EntityManager entityManager) { + List clientes = entityManager.createQuery("SELECT c FROM Cliente c", Cliente.class).getResultList(); + System.out.println("-------------------------------------------------"); + System.out.println(" RELATÓRIO DE CLIENTES "); + System.out.println("-------------------------------------------------"); + System.out.printf("%-5s %-20s %-15s %-30s %-20s %-15s\n", "ID", "Nome", "CPF", "Email", "Profissão", "Telefone"); + System.out.println("-------------------------------------------------"); + clientes.forEach(cliente -> { + System.out.printf("%-5d %-20s %-15s %-30s %-20s %-15s\n", + cliente.getId(), + cliente.getNome(), + cliente.getCpf(), + cliente.getEmail(), + cliente.getProfissao(), + cliente.getTelefone()); + }); + System.out.println("-------------------------------------------------"); + } + + private static Categoria getCategoriaData(EntityManager entityManager) { + String nomeCategoria = getRequiredInput("Por favor, insira o nome da categoria:"); + Categoria categoria = new Categoria(nomeCategoria); + entityManager.getTransaction().begin(); + entityManager.persist(categoria); + entityManager.getTransaction().commit(); + return categoria; + } + + private static Produto getProdutoData(Categoria categoria) { + String nomeProduto = getRequiredInput("Por favor, insira o nome do produto:"); + String descricao = getRequiredInput("Por favor, insira a descrição do produto:"); + BigDecimal precoUnitario = new BigDecimal(getRequiredInput("Por favor, insira o preço unitário do produto:")); + int quantidade = Integer.parseInt(getRequiredInput("Por favor, insira a quantidade do produto:")); + return new Produto(nomeProduto, descricao, precoUnitario, quantidade, categoria); + } + + private static Pedido getPedidoData(EntityManager entityManager, Cliente cliente, String cpf) { + if (cliente == null) { + System.out.println("Cliente não encontrado. Iniciando cadastro..."); + String cep = getRequiredInput("Por favor, insira o CEP para consulta:"); + Endereco endereco = new ConsultaCep().consultaCep(cep); + if (endereco == null) { + logger.error("Não foi possível encontrar o endereço para o CEP fornecido."); + return null; + } + endereco.setNumero(getRequiredInput("Por favor, insira o número do imóvel:")); + endereco.setComplemento(getInput("Por favor, insira o complemento do imóvel (opcional):")); + cliente = getClienteData(endereco, cpf); + if (cliente != null) { + entityManager.getTransaction().begin(); + entityManager.persist(endereco); + cliente.setEndereco(endereco); + entityManager.persist(cliente); + entityManager.getTransaction().commit(); + } else { + logger.error("Falha ao criar dados do cliente. Cliente retornou nulo."); + return null; + } + } + LocalDate data = LocalDate.now(); + TipoDesconto tipoDesconto = TipoDesconto.NENHUM; + return new Pedido(cliente, data, tipoDesconto); + } + + private static Cliente buscarClientePorCpf(EntityManager entityManager, String cpf) { + try { + TypedQuery query = entityManager.createQuery("SELECT c FROM Cliente c WHERE c.cpf = :cpf", Cliente.class); + query.setParameter("cpf", cpf); + return query.getSingleResult(); + } catch (NoResultException e) { + return null; + } + } + + private static Cliente getClienteData(Endereco endereco, String cpf) { + String nomeCliente = getRequiredInput("Por favor, insira o nome do cliente:"); + String email = getEmailInput(); + String profissao = getRequiredInput("Por favor, insira a profissão do cliente:"); + String telefone = getRequiredInput("Por favor, insira o telefone do cliente:"); + return new Cliente(nomeCliente, cpf, email, profissao, telefone, endereco); + } + + private static void consultarComprasCliente(EntityManager entityManager) { + String cpf = getRequiredInput("Por favor, insira o CPF do cliente:"); + Cliente cliente = buscarClientePorCpf(entityManager, cpf); + if (cliente == null) { + System.out.println("Cliente não encontrado."); + return; + } + exibirDetalhesCliente(cliente); + exibirPedidosCliente(entityManager, cliente); + } + + private static void consultarComprasTodosClientes(EntityManager entityManager) { + List clientes = entityManager.createQuery("SELECT c FROM Cliente c", Cliente.class).getResultList(); + System.out.println("-------------------------------------------------"); + System.out.println(" RELATÓRIO DE COMPRAS DE TODOS OS CLIENTES "); + System.out.println("-------------------------------------------------"); + + if (clientes.isEmpty()) { + System.out.println("Nenhum cliente encontrado."); + } else { + clientes.forEach(cliente -> { + exibirDetalhesCliente(cliente); + exibirPedidosCliente(entityManager, cliente); + System.out.println("-------------------------------------------------"); + }); + } + } + private static void exibirClienteMaisFiel(EntityManager entityManager) { + try { + Query query = entityManager.createQuery( + "SELECT c.id, COUNT(p.id) AS totalPedidos " + + "FROM Pedido p " + + "JOIN p.cliente c " + + "GROUP BY c.id " + + "ORDER BY totalPedidos DESC" + ); + query.setMaxResults(1); + Object[] resultado = (Object[]) query.getSingleResult(); + Long clienteId = (Long) resultado[0]; + Long totalPedidos = (Long) resultado[1]; + Cliente cliente = entityManager.find(Cliente.class, clienteId); + System.out.println("-------------------------------------------------------------------------"); + System.out.println("Cliente mais fiel:"); + System.out.printf("%-30s %-20s\n", "Cliente", "Total de Pedidos"); + System.out.printf("%-30s %-20d\n", cliente.getNome(), totalPedidos); + System.out.println("-------------------------------------------------------------------------"); + } catch (NoResultException e) { + System.out.println("Nenhum cliente encontrado."); + } + } + + private static void gerarRelatorio(EntityManager entityManager) { + List clientes = entityManager.createQuery("SELECT c FROM Cliente c", Cliente.class).getResultList(); + clientes.forEach(cliente -> { + exibirDetalhesCliente(cliente); + exibirPedidosCliente(entityManager, cliente); + }); + } + + private static void gerarRelatorioClientesAtivosEVendas(EntityManager entityManager) { + YearMonth currentMonth = YearMonth.now(); + LocalDate startDate = currentMonth.atDay(1); + LocalDate endDate = currentMonth.atEndOfMonth(); + + // Total de clientes ativos (clientes com pelo menos um pedido no mês) + TypedQuery queryClientesAtivos = entityManager.createQuery( + "SELECT COUNT(DISTINCT p.cliente.id) FROM Pedido p WHERE p.data BETWEEN :startDate AND :endDate", + Long.class); + queryClientesAtivos.setParameter("startDate", startDate); + queryClientesAtivos.setParameter("endDate", endDate); + Long totalClientesAtivos = queryClientesAtivos.getSingleResult(); + + // Total vendido no mês + TypedQuery queryTotalVendas = entityManager.createQuery( + "SELECT SUM(ip.precoUnitario * ip.quantidade) FROM ItemPedido ip WHERE ip.pedido.data BETWEEN :startDate AND :endDate", + BigDecimal.class); + queryTotalVendas.setParameter("startDate", startDate); + queryTotalVendas.setParameter("endDate", endDate); + BigDecimal totalVendas = queryTotalVendas.getSingleResult(); + + System.out.println("-------------------------------------------------"); + System.out.println(" RELATÓRIO DE CLIENTES ATIVOS E TOTAL VENDIDO NO MÊS "); + System.out.println("-------------------------------------------------"); + System.out.printf("Total de clientes ativos no mês: %d\n", totalClientesAtivos); + System.out.printf("Total vendido no mês: R$ %.2f\n", totalVendas); + System.out.println("-------------------------------------------------"); + } + + private static void exibirDetalhesCliente(Cliente cliente) { + System.out.println("-------------------------------------------------------------------------"); + System.out.println("Cliente #" + cliente.getId() + ":"); + System.out.println("Nome: " + cliente.getNome()); + System.out.println("CPF: " + cliente.getCpf()); + System.out.println("Email: " + cliente.getEmail()); + System.out.println("Profissão: " + cliente.getProfissao()); + System.out.println("Telefone: " + cliente.getTelefone()); + Endereco endereco = cliente.getEndereco(); + if (endereco != null) { + System.out.println("Endereço: " + endereco.getLogradouro() + ", Número: " + endereco.getNumero() + ", Complemento: " + endereco.getComplemento() + ", CEP: " + endereco.getCep()); + } + } + + private static void exibirPedidosCliente(EntityManager entityManager, Cliente cliente) { + List pedidos = entityManager.createQuery("SELECT p FROM Pedido p WHERE p.cliente = :cliente", Pedido.class) + .setParameter("cliente", cliente) + .getResultList(); + + if (pedidos.isEmpty()) { + System.out.println("Nenhum pedido encontrado para este cliente."); + } else { + System.out.println("-------------------------------------------------------------------------"); + System.out.println("Pedidos do Cliente:"); + pedidos.forEach(pedido -> { + System.out.println("Pedido ID: " + pedido.getId() + " | Data: " + pedido.getData() + " | Total: " + pedido.getValorTotal()); + System.out.println("Itens do Pedido:"); + System.out.printf("%-30s %-10s %-15s %-15s\n", "Produto", "Quantidade", "Preço Unitário", "Valor Total"); + pedido.getItensPedidos().forEach(item -> System.out.printf("%-30s %-10d %-15.2f %-15.2f\n", + item.getNomeProduto(), item.getQuantidade(), item.getPrecoUnitario(), item.calcularValorTotal())); + System.out.println("-------------------------------------------------------------------------"); + }); + System.out.println("-------------------------------------------------------------------------"); + } + } + + private static String getRequiredInput(String prompt) { + System.out.println(prompt); + String input = getScanner().nextLine(); + if ("sair".equalsIgnoreCase(input)) { + System.out.println("Programa encerrado."); + System.exit(0); + } + if (input.trim().isEmpty()) { + System.out.println("Este campo é obrigatório. Por favor, forneça um valor."); + return getRequiredInput(prompt); + } + return input; + } + + private static String getInput(String prompt) { + System.out.println(prompt); + return getScanner().nextLine(); + } + + private static String getEmailInput() { + String email = getRequiredInput("Por favor, insira o email do cliente:"); + if (!isValidEmail(email)) { + System.out.println("Email inválido. Por favor, insira um email válido."); + return getEmailInput(); + } + return email; + } + + private static boolean isValidEmail(String email) { + return email.matches("[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}"); + } + + private static Scanner getScanner() { + return scanner; + } + + private static void setScanner(Scanner scanner) { + CadastrarProdutoPedido.scanner = scanner; + } + + private static void setLoggingLevel(Level level) { + LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); + loggerContext.getLogger("org.hibernate").setLevel(level); + loggerContext.getLogger("org.springframework").setLevel(level); + } +} diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/CategoriaDao.java b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/CategoriaDao.java new file mode 100644 index 00000000..05f1f0d0 --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/CategoriaDao.java @@ -0,0 +1,66 @@ +package br.com.alura.comex.dao; + +import br.com.alura.comex.model.Categoria; +import javax.persistence.EntityManager; +import javax.persistence.EntityTransaction; +import java.util.List; + +public class CategoriaDao { + private EntityManager em; + + public CategoriaDao(EntityManager em) { + this.em = em; + } + + public CategoriaDao() { + + } + + // Busca uma categoria por ID + public Categoria buscarPorId(Long id) { + Categoria categoria = em.find(Categoria.class, id); + System.out.println("Buscar por ID - Categoria encontrada: " + categoria); + return categoria; + } + + // Cadastra uma nova categoria + public void cadastrar(Categoria categoria) { + EntityTransaction et = em.getTransaction(); + try { + et.begin(); + em.persist(categoria); + et.commit(); + System.out.println("Cadastrando Categoria: " + categoria); + } catch (Exception e) { + et.rollback(); + System.out.println("Erro ao cadastrar categoria: " + e.getMessage()); + } + } + + // Lista todas as categorias + public List listaTodas() { + List categorias = em.createQuery("SELECT c FROM Categoria c", Categoria.class).getResultList(); + System.out.println("Listando todas as Categorias: " + categorias); + return categorias; + } + public List relatorioDeVendasPorCategoria() { + return em.createQuery( + "SELECT c.nome, COUNT(p.id), SUM(ip.quantidade * ip.precoUnitario) " + + "FROM Categoria c " + + "JOIN c.produtos p " + + "JOIN p.itensPedido ip " + + "GROUP BY c.nome", Object[].class) + .getResultList(); + + } + + public Categoria buscarPorNome(String nomeDaCategoria) { + return null; + } + + + +} + + + diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/ClienteAlteraBd.java b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/ClienteAlteraBd.java new file mode 100644 index 00000000..35bb0feb --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/ClienteAlteraBd.java @@ -0,0 +1,47 @@ +package br.com.alura.comex.dao; + +import br.com.alura.comex.model.Cliente; +import br.com.alura.comex.model.Endereco; + +import javax.persistence.EntityManager; +import javax.persistence.EntityTransaction; + +public class ClienteAlteraBd { + + private final EntityManager entityManager; + + public ClienteAlteraBd(EntityManager entityManager) { + this.entityManager = entityManager; + } + + public void atualizar(Cliente cliente) { + EntityTransaction transaction = entityManager.getTransaction(); + + try { + if (!transaction.isActive()) { + transaction.begin(); + } + + // Verifica se o endereço do cliente já está persistido + if (cliente.getEndereco().getId() == null) { + // Se o endereço não está persistido, salva-o primeiro + Endereco endereco = cliente.getEndereco(); + entityManager.persist(endereco); + } + + entityManager.merge(cliente); + transaction.commit(); + } catch (Exception e) { + if (transaction.isActive()) { + transaction.rollback(); + } + throw new RuntimeException("Erro ao atualizar o cliente", e); + } + } + + public void salvar(Cliente cliente) { + } + + public void excluir(Cliente cliente) { + } +} \ No newline at end of file diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/ClienteDao.java b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/ClienteDao.java new file mode 100644 index 00000000..b39307d4 --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/ClienteDao.java @@ -0,0 +1,93 @@ +package br.com.alura.comex.dao; + +import br.com.alura.comex.model.Cliente; +import javax.persistence.EntityManager; +import javax.persistence.EntityTransaction; +import java.util.Collections; +import java.util.List; + +public class ClienteDao { + private final EntityManager em; + + public ClienteDao(EntityManager em) { + this.em = em; + } + + // Busca um cliente por seu ID no banco de dados + public Cliente buscaPorId(Long id) { + Cliente cliente = em.find(Cliente.class, id); + System.out.println("Busca por ID - Cliente encontrado: " + cliente); + return cliente; + } + + // Cadastra um novo cliente no banco de dados + public void cadastra(Cliente cliente) { + EntityTransaction et = em.getTransaction(); + try { + et.begin(); + em.persist(cliente); + et.commit(); + System.out.println("Cadastrando Cliente: " + cliente); + } catch (Exception e) { + et.rollback(); + System.out.println("Erro ao cadastrar cliente: " + e.getMessage()); + } + } + + // Atualiza os dados de um cliente existente no banco de dados + public void atualiza(Cliente cliente) { + EntityTransaction et = em.getTransaction(); + try { + et.begin(); + em.merge(cliente); + et.commit(); + System.out.println("Atualizando Cliente: " + cliente); + } catch (Exception e) { + et.rollback(); + System.out.println("Erro ao atualizar cliente: " + e.getMessage()); + } + } + + // Remove um cliente do banco de dados + public void remove(long cliente) { + EntityTransaction et = em.getTransaction(); + try { + et.begin(); + em.remove(em.contains(cliente) ? cliente : em.merge(cliente)); + et.commit(); + System.out.println("Removendo Cliente: " + cliente); + } catch (Exception e) { + et.rollback(); + System.out.println("Erro ao remover cliente: " + e.getMessage()); + } + } + + // Lista todos os clientes cadastrados no banco de dados + public List listaTodos() { + List clientes = em.createQuery("SELECT c FROM Cliente c", Cliente.class).getResultList(); + System.out.println("Listando todos os Clientes: " + clientes); + return clientes; + } + + // Lista clientes por nome, usando uma busca parcial + public List listaPorNome(String nome) { + List clientes = em.createQuery("SELECT c FROM Cliente c WHERE c.nome LIKE :nome", Cliente.class) + .setParameter("nome", "%" + nome + "%") + .getResultList(); + System.out.println("Listando Clientes por nome (" + nome + "): " + clientes); + return clientes; + } + + public void salvar(Cliente cliente) { + } + + public List buscarTodos() { + List clientes = em.createQuery("SELECT c FROM Cliente c", Cliente.class).getResultList(); + return clientes != null ? clientes : Collections.emptyList(); // Garante que nunca retorne null + } + + public void deletarCliente(Long clienteId) { + } +} + + diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/DeleteCliente.java b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/DeleteCliente.java new file mode 100644 index 00000000..db05fe64 --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/DeleteCliente.java @@ -0,0 +1,59 @@ +import br.com.alura.comex.dao.ClienteDao; +import br.com.alura.comex.model.Cliente; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; +import java.util.List; +import java.util.Scanner; + +public class DeleteCliente { + public static void main(String[] args) { + EntityManagerFactory emf = Persistence.createEntityManagerFactory("oracle"); + EntityManager em = emf.createEntityManager(); + ClienteDao clienteDao = new ClienteDao(em); + + try { + // Verifica se a transação já está ativa antes de começar uma nova + if (!em.getTransaction().isActive()) { + em.getTransaction().begin(); + } + + List clientes = clienteDao.buscarTodos(); + if (clientes.isEmpty()) { + System.out.println("Não há clientes cadastrados."); + // Certifique-se de fechar a transação se não houver clientes + if (em.getTransaction().isActive()) { + em.getTransaction().rollback(); + } + } else { + System.out.println("Selecione o ID do cliente que deseja deletar:"); + for (Cliente cliente : clientes) { + System.out.printf("ID: %d, Nome: %s, CPF: %s\n", cliente.getId(), cliente.getNome(), cliente.getCpf()); + } + + Scanner scanner = new Scanner(System.in); + System.out.print("Digite o ID do cliente: "); + long clienteId = scanner.nextLong(); + scanner.close(); + + clienteDao.remove(clienteId); // Assume que este método não faz commit ou rollback internamente + + // Verifica se a transação ainda pode ser commitada + if (em.getTransaction().isActive() && !em.getTransaction().getRollbackOnly()) { + em.getTransaction().commit(); + } else { + em.getTransaction().rollback(); + } + } + } catch (Exception e) { + if (em.getTransaction().isActive()) { + em.getTransaction().rollback(); + } + e.printStackTrace(); + } finally { + if (em.isOpen()) em.close(); + if (emf.isOpen()) emf.close(); + } + } +} diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/EnderecoDao.java b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/EnderecoDao.java new file mode 100644 index 00000000..67957397 --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/EnderecoDao.java @@ -0,0 +1,70 @@ +package br.com.alura.comex.dao; + +import br.com.alura.comex.model.Endereco; + +import javax.persistence.EntityManager; +import javax.persistence.EntityTransaction; + +public class EnderecoDao { + + private final EntityManager entityManager; + + public EnderecoDao(EntityManager entityManager) { + this.entityManager = entityManager; + } + + public void salvar(Endereco endereco) { + EntityTransaction transaction = entityManager.getTransaction(); + + try { + if (!transaction.isActive()) { + transaction.begin(); + } + + entityManager.persist(endereco); + entityManager.flush(); // Sincroniza as alterações com o banco de dados + transaction.commit(); + } catch (Exception e) { + if (transaction.isActive()) { + transaction.rollback(); + } + throw new RuntimeException("Erro ao salvar o endereço", e); + } + } + + public void atualizar(Endereco endereco) { + EntityTransaction transaction = entityManager.getTransaction(); + + try { + if (!transaction.isActive()) { + transaction.begin(); + } + + entityManager.merge(endereco); + transaction.commit(); + } catch (Exception e) { + if (transaction.isActive()) { + transaction.rollback(); + } + throw new RuntimeException("Erro ao atualizar o endereço", e); + } + } + + public void excluir(Endereco endereco) { + EntityTransaction transaction = entityManager.getTransaction(); + + try { + if (!transaction.isActive()) { + transaction.begin(); + } + + entityManager.remove(endereco); + transaction.commit(); + } catch (Exception e) { + if (transaction.isActive()) { + transaction.rollback(); + } + throw new RuntimeException("Erro ao excluir o endereço", e); + } + } +} diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/GeralPedidoClienteProduto.java b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/GeralPedidoClienteProduto.java new file mode 100644 index 00000000..44db5a3e --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/GeralPedidoClienteProduto.java @@ -0,0 +1,71 @@ +package br.com.alura.comex.dao; +import br.com.alura.comex.model.Cliente; +import br.com.alura.comex.model.Pedido; +import br.com.alura.comex.model.Produto; + +import javax.persistence.EntityManager; +import java.util.List; + +public class GeralPedidoClienteProduto { + + public class ClienteDao { + private EntityManager em; + public ClienteDao(EntityManager em) { + this.em = em; + } + + public void salvar(Cliente cliente) { + em.getTransaction().begin(); + em.persist(cliente); + em.getTransaction().commit(); + } + + public List buscarTodos() { + return em.createQuery("SELECT c FROM Cliente c", Cliente.class).getResultList(); + } + } + + + + public class PedidoDao { + private EntityManager em; + public PedidoDao(EntityManager em) { + this.em = em; + } + + public void salvar(Pedido pedido) { + em.getTransaction().begin(); + em.persist(pedido); + em.getTransaction().commit(); + } + + public List buscarTodos() { + return em.createQuery("SELECT p FROM Pedido p", Pedido.class).getResultList(); + } + } + + public class ProdutoDao { + private EntityManager em; + public ProdutoDao(EntityManager em) { + this.em = em; + } + + public void salvar(Produto produto) { + em.getTransaction().begin(); + em.persist(produto); + em.getTransaction().commit(); + } + + public void atualizarEstoque(Produto produto, int quantidade) { + em.getTransaction().begin(); + produto.setQuantidade(produto.getQuantidade() + quantidade); + em.merge(produto); + em.getTransaction().commit(); + } + + public List buscarTodos() { + return em.createQuery("SELECT p FROM Produto p", Produto.class).getResultList(); + } + } + +} \ No newline at end of file diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/ImprimeDadosClientes.java b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/ImprimeDadosClientes.java new file mode 100644 index 00000000..d96b4995 --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/ImprimeDadosClientes.java @@ -0,0 +1,38 @@ +package br.com.alura.comex.dao; + +import br.com.alura.comex.model.Cliente; +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +public class ImprimeDadosClientes { + + public static void main(String[] args) { + // Certifique-se de que o nome da unidade de persistência corresponde à sua configuração em persistence.xml + EntityManagerFactory factory = Persistence.createEntityManagerFactory("oracle"); + EntityManager entityManager = factory.createEntityManager(); + + try { + List clientes = findAllClientesWithEndereco(entityManager); + AtomicInteger counter = new AtomicInteger(1); + + clientes.forEach(cliente -> { + System.out.printf("Cliente #%d:\n", counter.getAndIncrement()); + System.out.printf("Nome: %s\nCPF: %s\nEmail: %s\nProfissão: %s\nTelefone: %s\n", + cliente.getNome(), cliente.getCpf(), cliente.getEmail(), cliente.getProfissao(), cliente.getTelefone()); + System.out.printf("Endereço: %s, Número: %s, Complemento: %s, CEP: %s\n\n", + cliente.getEndereco().getLogradouro(), cliente.getEndereco().getNumero(), + cliente.getEndereco().getComplemento(), cliente.getEndereco().getCep()); + }); + } finally { + entityManager.close(); + } + } + + private static List findAllClientesWithEndereco(EntityManager em) { + return em.createQuery("SELECT c FROM Cliente c JOIN FETCH c.endereco", Cliente.class) + .getResultList(); + } +} diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/PedidoDao.java b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/PedidoDao.java new file mode 100644 index 00000000..90550c2b --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/PedidoDao.java @@ -0,0 +1,51 @@ +package br.com.alura.comex.dao; + +import br.com.alura.comex.model.Pedido; +import javax.persistence.EntityManager; +import javax.persistence.EntityTransaction; +import java.util.List; + +public class PedidoDao { + private final EntityManager em; + + public PedidoDao(EntityManager em) { + this.em = em; + } + + // Busca um pedido por ID + public Pedido buscaPorId(Long id) { + Pedido pedido = em.find(Pedido.class, id); + System.out.println("Busca por ID - Pedido encontrado: " + pedido); + return pedido; + } + + // Cadastra um novo pedido + public void cadastra(Pedido pedido) { + EntityTransaction et = em.getTransaction(); + try { + et.begin(); + em.persist(pedido); + et.commit(); + System.out.println("Cadastrando Pedido: " + pedido); + } catch (Exception e) { + et.rollback(); + System.out.println("Erro ao cadastrar pedido: " + e.getMessage()); + } + } + + // Lista todos os pedidos + public List listaTodos() { + List pedidos = em.createQuery("SELECT p FROM Pedido p", Pedido.class).getResultList(); + System.out.println("Listando todos os Pedidos: " + pedidos); + return pedidos; + } + + public void salvar(Pedido pedido) { + + } + + public List buscarTodos() { + return List.of(); + } + +} diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/ProdutoDao.java b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/ProdutoDao.java new file mode 100644 index 00000000..6a602983 --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/ProdutoDao.java @@ -0,0 +1,74 @@ +package br.com.alura.comex.dao; + +import br.com.alura.comex.model.Produto; +import javax.persistence.EntityManager; +import javax.persistence.EntityTransaction; +import java.util.List; + +public class ProdutoDao { + private final EntityManager em; + + public ProdutoDao(EntityManager em) { + this.em = em; + } + + public Produto buscaPorId(Long id) { + return em.find(Produto.class, id); + } + + public void cadastra(Produto produto) { + EntityTransaction et = em.getTransaction(); + try { + et.begin(); + em.persist(produto); + et.commit(); + } catch (Exception e) { + if (et.isActive()) { + et.rollback(); + } + throw new RuntimeException("Erro ao cadastrar produto", e); + } + } + + public List listaTodos() { + return em.createQuery("SELECT p FROM Produto p", Produto.class).getResultList(); + } + + public List listaIndisponiveis() { + return em.createQuery("SELECT p FROM Produto p WHERE p.quantidade = 0", Produto.class).getResultList(); + } + + /** + * Atualiza a quantidade em estoque de um produto específico. + * + * @param produtoId O ID do produto a ser atualizado. + * @param novaQuantidade A nova quantidade do produto. + */ + public void atualizarEstoque(Long produtoId, int novaQuantidade) { + EntityTransaction et = em.getTransaction(); + try { + et.begin(); + Produto produto = em.find(Produto.class, produtoId); + if (produto != null) { + produto.setQuantidade(novaQuantidade); + em.merge(produto); + System.out.println("Estoque atualizado - Produto: " + produto.getNome() + ", Quantidade: " + novaQuantidade); + } else { + System.out.println("Produto não encontrado para atualização de estoque."); + } + et.commit(); + } catch (Exception e) { + if (et.isActive()) { + et.rollback(); + } + throw new RuntimeException("Erro ao atualizar o estoque do produto", e); + } + } + + public void salvar(Produto produto) { + } + + public List buscarTodos() { + return List.of(); + } +} diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/TestaPedidoDao.java b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/TestaPedidoDao.java new file mode 100644 index 00000000..95a0f202 --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/TestaPedidoDao.java @@ -0,0 +1,33 @@ +import br.com.alura.comex.model.RelatorioCliente; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.util.List; + +import static java.sql.DriverManager.getConnection; +import static oracle.jdbc.util.OracleEnvironment.SID; + +public class TestaPedidoDao { + + public static void main(String[] args) { + String url = "jdbc:oracle:thin:@localhost:1521"; + String usuario = "system"; + String senha = "12345678"; + + try (Connection connection = DriverManager.getConnection(url, usuario, senha)) { + RelatorioCliente relatorioClienteDao = new RelatorioCliente(connection); + List relatorioClientes = relatorioClienteDao.gerarRelatorioCliente(); + + System.out.println("Relatório dos Três Clientes que Mais Gastaram:"); + for (RelatorioCliente relatorioCliente : relatorioClientes) { + System.out.println("Nome do Cliente: " + relatorioCliente.getNomeCliente()); + System.out.println("Quantidade de Pedidos: " + relatorioCliente.getQuantidadePedidos()); + System.out.println("Montante Gasto: " + relatorioCliente.getMontanteGasto()); + System.out.println(); + } + } catch (SQLException e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/TodosProdutosCadastradosBd.java b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/TodosProdutosCadastradosBd.java new file mode 100644 index 00000000..e8c9ed34 --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/TodosProdutosCadastradosBd.java @@ -0,0 +1,58 @@ +package br.com.alura.comex.dao; + +import br.com.alura.comex.model.Produto; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.TypedQuery; +import java.util.List; +import static javax.persistence.Persistence.createEntityManagerFactory; + +public class TodosProdutosCadastradosBd { + + private EntityManager entityManager; + + public TodosProdutosCadastradosBd(EntityManager entityManager) { + this.entityManager = entityManager; + } + + public List listarTodos() { + TypedQuery query = entityManager.createQuery("SELECT p FROM Produto p", Produto.class); + return query.getResultList(); + } + + public static void main(String[] args) { + EntityManagerFactory factory = createEntityManagerFactory("oracle"); + EntityManager entityManager = factory.createEntityManager(); + + TodosProdutosCadastradosBd produtoDAO = new TodosProdutosCadastradosBd(entityManager); + + List produtos = produtoDAO.listarTodos(); + + // Gerar relatório + gerarRelatorio(produtos); + + entityManager.close(); + factory.close(); + } + + private static void gerarRelatorio(List produtos) { + System.out.println("-------------------------------------------------"); + System.out.println(" RELATÓRIO DE PRODUTOS "); + System.out.println("-------------------------------------------------"); + System.out.printf("%-5s %-30s %-20s %-10s %-10s %-10s\n", "ID", "Nome", "Descrição", "Preço Unit.", "Quantidade", "Categoria"); + System.out.println("-------------------------------------------------"); + + for (Produto produto : produtos) { + System.out.printf("%-5d %-30s %-20s %-10.2f %-10d %-10s\n", + produto.getId(), + produto.getNome(), + produto.getDescricao(), + produto.getPrecoUnitario(), + produto.getQuantidade(), + produto.getCategoria().getNome()); + } + + System.out.println("-------------------------------------------------"); + } +} diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Categoria.java b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Categoria.java new file mode 100644 index 00000000..06f16f58 --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Categoria.java @@ -0,0 +1,69 @@ +package br.com.alura.comex.model; + +import javax.persistence.*; +import java.util.List; + +@Entity +@Table(name = "categoria") +public class Categoria { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private String nome; + + @Enumerated(EnumType.STRING) + @Column(nullable = false, columnDefinition = "VARCHAR(10) default 'ATIVA'") + private Status status = Status.ATIVA; + + // Adicionando a relação com Produto + @OneToMany(mappedBy = "categoria", cascade = CascadeType.ALL, fetch = FetchType.LAZY) + private List produtos; + + public Categoria() { + } + + public Categoria(String nomeDaCategoria) { + this.nome = nomeDaCategoria; + } + + // Getters and Setters + 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 Status getStatus() { + return status; + } + + public void setStatus(Status status) { + this.status = status; + } + + public List getProdutos() { + return produtos; + } + + public void setProdutos(List produtos) { + this.produtos = produtos; + } + + // Enum for status + public enum Status { + ATIVA, INATIVA + } +} diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Cliente.java b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Cliente.java new file mode 100644 index 00000000..f9bc7514 --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Cliente.java @@ -0,0 +1,88 @@ +package br.com.alura.comex.model; + +import javax.persistence.*; + +@Entity +@Table(name = "cliente") +public class Cliente { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "nome", length = 120, nullable = false) + private String nome; + + @Column(name = "cpf", length = 13, unique = true, nullable = false) + private String cpf; + + @Column(name = "email", length = 50) + private String email; + + @Column(name = "profissao", length = 20, nullable = false) + private String profissao; + + @Column(name = "telefone", length = 20, nullable = false) + private String telefone; + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "endereco_id", nullable = false) + private Endereco endereco; + + + public Cliente() {} + + public Cliente(String nome, String cpf, String email, String profissao, String telefone, Endereco endereco) { + this.nome = nome; + this.cpf = cpf; + this.email = email; + this.profissao = profissao; + this.telefone = telefone; + this.endereco = endereco; + } + + public Cliente(EntityManager entityManager) { + } + + // Getters and setters + 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 getCpf() { return cpf; } + public void setCpf(String cpf) { this.cpf = cpf; } + + public String getEmail() { return email; } + public void setEmail(String email) { this.email = email; } + + public String getProfissao() { return profissao; } + public void setProfissao(String profissao) { this.profissao = profissao; } + + public String getTelefone() { return telefone; } + public void setTelefone(String telefone) { this.telefone = telefone; } + + public Endereco getEndereco() { return endereco; } + public void setEndereco(Endereco endereco) { this.endereco = endereco; } + + @Override + public String toString() { + return "Cliente{" + + "id=" + id + + ", nome='" + nome + '\'' + + ", cpf='" + cpf + '\'' + + ", email='" + email + '\'' + + ", profissao='" + profissao + '\'' + + ", telefone='" + telefone + '\'' + + ", endereco=" + endereco + + '}'; + } + + + public void salvar(Cliente clientenovo) { + } + + public void salvar(EntityManager entityManager) { + } +} diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Endereco.java b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Endereco.java new file mode 100644 index 00000000..92af7696 --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Endereco.java @@ -0,0 +1,105 @@ +package br.com.alura.comex.model; + +import br.com.alura.comex.dao.EnderecoDao; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import javax.persistence.*; + +@Entity +@Table(name = "endereco") +@JsonIgnoreProperties(ignoreUnknown = true) // Ignora propriedades desconhecidas durante a desserialização +public class Endereco { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "cep", length = 120, nullable = false) + private String cep; + + @Column(name = "logradouro", length = 120, nullable = true) + private String logradouro; + + @Column(name = "complemento", length = 120, nullable = true) + private String complemento; + + @Column(name = "bairro", length = 120, nullable = true) + private String bairro; + + @Column(name = "localidade", length = 120, nullable = true) + private String localidade; + + @Column(name = "uf", length = 2, nullable = true) + private String uf; + + @Column(name = "numero", length = 20, nullable = true) + private String numero; + + public Endereco() { + // Construtor padrão necessário para JPA + } + + public Endereco(String cep, String logradouro, String complemento, String bairro, String localidade, String uf, String numero) { + this.cep = cep; + this.logradouro = logradouro; + this.complemento = complemento; + this.bairro = bairro; + this.localidade = localidade; + this.uf = uf; + this.numero = numero; + } + + public Endereco(String ruaA, String number, String bairroX, String cidadeY, String s) { + } + + // Getters e setters + public Long getId() { return id; } + public void setId(Long id) { this.id = id; } + + public String getCep() { return cep; } + public void setCep(String cep) { this.cep = cep; } + + public String getLogradouro() { return logradouro; } + public void setLogradouro(String logradouro) { this.logradouro = logradouro; } + + public String getComplemento() { return complemento; } + public void setComplemento(String complemento) { this.complemento = complemento; } + + public String getBairro() { return bairro; } + public void setBairro(String bairro) { this.bairro = bairro; } + + public String getLocalidade() { return localidade; } + public void setLocalidade(String localidade) { this.localidade = localidade; } + + public String getUf() { return uf; } + public void setUf(String uf) { this.uf = uf; } + + public String getNumero() { return numero; } + public void setNumero(String numero) { this.numero = numero; } + + @Override + public String toString() { + return "Endereco{" + + "id=" + id + + ", cep='" + cep + '\'' + + ", logradouro='" + logradouro + '\'' + + ", complemento='" + complemento + '\'' + + ", bairro='" + bairro + '\'' + + ", localidade='" + localidade + '\'' + + ", uf='" + uf + '\'' + + ", numero='" + numero + '\'' + + '}'; + } + + public void salvar(EnderecoDao enderecoDao) { + enderecoDao.salvar(this); + } + + public void atualizar(EnderecoDao enderecoDao) { + enderecoDao.atualizar(this); + } + + public void excluir(EnderecoDao enderecoDao) { + enderecoDao.excluir(this); + } +} diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Estoque.java b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Estoque.java new file mode 100644 index 00000000..b35c2470 --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Estoque.java @@ -0,0 +1,75 @@ +package br.com.alura.comex.model; + +import javax.persistence.*; +import java.util.HashMap; +import java.util.Map; + +@Entity +@Table(name = "estoque") +public class Estoque { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + // Mapa de produtos e suas quantidades em estoque + @ElementCollection(fetch = FetchType.LAZY) + @CollectionTable(name = "estoque_itens", joinColumns = @JoinColumn(name = "estoque_id")) + @MapKeyColumn(name = "produto_id") + @Column(name = "quantidade") + private Map produtos; + + public Estoque() { + this.produtos = new HashMap<>(); + } + + /** + * Adiciona produtos ao estoque. + * @param produtoId o ID do produto + * @param quantidade a quantidade a ser adicionada + */ + public void adicionarProduto(Long produtoId, int quantidade) { + this.produtos.merge(produtoId, quantidade, Integer::sum); + } + + /** + * Remove produtos do estoque. + * @param produtoId o ID do produto + * @param quantidade a quantidade a ser removida + * @return true se a operação foi bem sucedida, false caso contrário (e.g., estoque insuficiente) + */ + public boolean removerProduto(Long produtoId, int quantidade) { + Integer atual = produtos.get(produtoId); + if (atual == null || atual < quantidade) { + return false; // Não é possível remover mais produtos do que o disponível + } + produtos.put(produtoId, atual - quantidade); + return true; + } + + /** + * Retorna a quantidade disponível de um produto no estoque. + * @param produtoId o ID do produto + * @return a quantidade disponível + */ + public int consultarQuantidade(Long produtoId) { + return produtos.getOrDefault(produtoId, 0); + } + + // Getters and Setters + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Map getProdutos() { + return produtos; + } + + public void setProdutos(Map produtos) { + this.produtos = produtos; + } +} + diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/ItemPedido.java b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/ItemPedido.java new file mode 100644 index 00000000..42a3487b --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/ItemPedido.java @@ -0,0 +1,149 @@ +package br.com.alura.comex.model; + +import java.math.BigDecimal; +import javax.persistence.*; + +@Entity +@Table(name = "item_pedido") +public class ItemPedido { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "produto_id", nullable = false) + private Produto produto; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "pedido_id", nullable = false) + private Pedido pedido; + + @Column(nullable = false, precision = 10, scale = 2) + private BigDecimal precoUnitario; + + @Column(nullable = false) + private int quantidade; + + @Column(nullable = false, precision = 10, scale = 2) + private BigDecimal desconto; + + @Enumerated(EnumType.STRING) + @Column(nullable = false) + private TipoDesconto tipoDesconto; + + // Construtores + public ItemPedido() { + // Inicialização segura com valores padrão que não podem ser nulos + this.precoUnitario = BigDecimal.ZERO; + this.desconto = BigDecimal.ZERO; + this.tipoDesconto = TipoDesconto.NENHUM; + } + + public ItemPedido(Produto produto, int quantidade, BigDecimal precoUnitario, TipoDesconto tipoDesconto, Pedido pedido) { + if (produto == null) { + throw new IllegalArgumentException("Produto não pode ser nulo."); + } + if (pedido == null) { + throw new IllegalArgumentException("Pedido não pode ser nulo."); + } + this.produto = produto; + this.quantidade = quantidade; + this.precoUnitario = precoUnitario != null ? precoUnitario : BigDecimal.ZERO; + this.desconto = BigDecimal.ZERO; + this.tipoDesconto = tipoDesconto != null ? tipoDesconto : TipoDesconto.NENHUM; + this.pedido = pedido; + } + + // Getters e Setters + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getProduto() { + return produto.getId(); + } + + public void setProduto(Produto produto) { + if (produto == null) { + throw new IllegalArgumentException("Produto não pode ser nulo."); + } + this.produto = produto; + } + + public Pedido getPedido() { + return pedido; + } + + public void setPedido(Pedido pedido) { + if (pedido == null) { + throw new IllegalArgumentException("Pedido não pode ser nulo."); + } + this.pedido = pedido; + } + + public BigDecimal getPrecoUnitario() { + return precoUnitario; + } + + public void setPrecoUnitario(BigDecimal precoUnitario) { + if (precoUnitario == null) { + throw new IllegalArgumentException("Preço unitário não pode ser nulo."); + } + this.precoUnitario = precoUnitario; + } + + public int getQuantidade() { + return quantidade; + } + + public void setQuantidade(int quantidade) { + this.quantidade = quantidade; + } + + public BigDecimal getDesconto() { + return desconto; + } + + public void setDesconto(BigDecimal desconto) { + this.desconto = desconto != null ? desconto : BigDecimal.ZERO; + } + + public TipoDesconto getTipoDesconto() { + return tipoDesconto; + } + + public void setTipoDesconto(TipoDesconto tipoDesconto) { + if (tipoDesconto == null) { + throw new IllegalArgumentException("Tipo de desconto não pode ser nulo."); + } + this.tipoDesconto = tipoDesconto; + } + + // Método para obter o nome do produto + public String getNomeProduto() { + return produto != null ? produto.getNome() : "Produto não definido"; + } + + // Métodos adicionais + public BigDecimal calcularValorTotal() { + BigDecimal total = precoUnitario.multiply(BigDecimal.valueOf(quantidade)); + BigDecimal valorDesconto = total.multiply(BigDecimal.valueOf(tipoDesconto.getPercentual())); + return total.subtract(valorDesconto); + } + + @Override + public String toString() { + return "ItemPedido{" + + "id=" + id + + ", produto=" + (produto != null ? produto.getNome() : "Produto não definido") + + ", quantidade=" + quantidade + + ", precoUnitario=" + precoUnitario + + ", desconto=" + desconto + + ", tipoDesconto=" + tipoDesconto + + '}'; + } +} diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/JsonCreator.java b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/JsonCreator.java new file mode 100644 index 00000000..7efcf2da --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/JsonCreator.java @@ -0,0 +1,4 @@ +package br.com.alura.comex.model; + +public @interface JsonCreator { +} diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Pedido.java b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Pedido.java new file mode 100644 index 00000000..c523f8df --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Pedido.java @@ -0,0 +1,175 @@ +package br.com.alura.comex.model; + +import javax.persistence.*; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; + +@Entity +@Table(name = "pedidos") +public class Pedido { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne + @JoinColumn(name = "cliente_id", nullable = false) + private Cliente cliente; + + @OneToMany(mappedBy = "pedido", cascade = CascadeType.ALL, orphanRemoval = true) + private List itensPedidos = new ArrayList<>(); + + @Column(nullable = false, precision = 10, scale = 2) + private BigDecimal preco; + + @Column(nullable = false) + private int quantidade; + + @Column(nullable = false) + private LocalDate data; + + @Enumerated(EnumType.STRING) + @Column(nullable = false) + private TipoDesconto tipoDesconto; + + // Construtores + public Pedido() { + } + + public Pedido(Cliente cliente, LocalDate data, TipoDesconto tipoDesconto) { + if (cliente == null) { + throw new IllegalArgumentException("Cliente não pode ser nulo."); + } + this.cliente = cliente; + + if (data == null) { + throw new IllegalArgumentException("Data não pode ser nula."); + } + this.data = data; + + if (tipoDesconto == null) { + throw new IllegalArgumentException("Tipo de desconto não pode ser nulo."); + } + this.tipoDesconto = tipoDesconto; + + this.preco = BigDecimal.ZERO; + this.quantidade = 0; + } + + public Pedido(Cliente cliente, BigDecimal multiply, int quantidade, LocalDate now, TipoDesconto tipoDesconto, List itensPedido) { + } + + // Método de criação do pedido + public static Pedido createPedido(Cliente cliente, LocalDate data, TipoDesconto tipoDesconto) { + return new Pedido(cliente, data, tipoDesconto); + } + + public static Pedido createPedido(String categoria, String produto, String cliente, BigDecimal preco, int quantidade, LocalDate data) { + return null; + } + + // Getters e Setters + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Cliente getCliente() { + return cliente; + } + + public void setCliente(Cliente cliente) { + this.cliente = cliente; + } + + public BigDecimal getPreco() { + return preco; + } + + public void setPreco(BigDecimal preco) { + this.preco = preco; + } + + public int getQuantidade() { + return quantidade; + } + + public void setQuantidade(int quantidade) { + this.quantidade = quantidade; + } + + public LocalDate getData() { + return data; + } + + public void setData(LocalDate data) { + this.data = data; + } + + public TipoDesconto getTipoDesconto() { + return tipoDesconto; + } + + public void setTipoDesconto(TipoDesconto tipoDesconto) { + this.tipoDesconto = tipoDesconto; + } + + public List getItensPedidos() { + return itensPedidos; + } + + public void setItensPedidos(List itensPedidos) { + this.itensPedidos = itensPedidos; + } + + public void adicionarItem(ItemPedido item) { + item.setPedido(this); + this.itensPedidos.add(item); + atualizarPrecoEQuantidade(); + } + + private void atualizarPrecoEQuantidade() { + this.preco = BigDecimal.ZERO; + this.quantidade = 0; + for (ItemPedido item : itensPedidos) { + this.preco = this.preco.add(item.calcularValorTotal()); + this.quantidade += item.getQuantidade(); + } + } + + @Override + public String toString() { + return "Pedido{" + + "id=" + id + + ", cliente=" + (cliente != null ? cliente.getNome() : "N/D") + + ", preço=" + preco + + ", quantidade=" + quantidade + + ", data=" + data + + ", tipoDesconto=" + tipoDesconto + + ", valor total=" + getValorTotal() + + '}'; + } + + public BigDecimal getValorTotal() { + BigDecimal total = BigDecimal.ZERO; + for (ItemPedido item : itensPedidos) { + if (item.getPrecoUnitario() == null || item.getTipoDesconto() == null) { + throw new IllegalStateException("Preço ou tipo de desconto não pode ser nulo para calcular o valor total."); + } + total = total.add(item.calcularValorTotal()); + } + return total; + } + + public boolean isMaisCaroQue(Pedido pedido2) { + return this.getValorTotal().compareTo(pedido2.getValorTotal()) > 0; + } + + public boolean isMaisBaratoQue(Pedido pedido2) { + return this.getValorTotal().compareTo(pedido2.getValorTotal()) < 0; + } +} diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Produto.java b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Produto.java new file mode 100644 index 00000000..096db867 --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Produto.java @@ -0,0 +1,161 @@ +package br.com.alura.comex.model; + +import javax.persistence.*; +import java.math.BigDecimal; +import java.util.List; +import java.util.Objects; + +@Entity +@Table(name = "produto") +public class Produto { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "nome", length = 220, nullable = false) + private String nome; + + @Column(name = "descricao", length = 220, nullable = false) + private String descricao; + + @Column(name = "preco_unitario", nullable = false) + private BigDecimal precoUnitario; + + @Column(name = "quantidade", nullable = false) + private int quantidade; + + @ManyToOne + @JoinColumn(name = "categoria_id", referencedColumnName = "id", nullable = false, foreignKey = @ForeignKey(name = "fk_categoria_produto")) + private Categoria categoria; + + @OneToMany(mappedBy = "produto", cascade = CascadeType.ALL, fetch = FetchType.LAZY) + private List itensPedido; + + // Construtor vazio para JPA + public Produto() { + } + + // Construtor principal + public Produto(String nome, String descricao, BigDecimal precoUnitario, int quantidade, Categoria categoria) { + setNome(nome); + setDescricao(descricao); + setPrecoUnitario(precoUnitario); + setQuantidade(quantidade); + setCategoria(categoria); + } + + // Getters e Setters + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getNome() { + return nome; + } + + public void setNome(String nome) { + if (nome == null || nome.trim().isEmpty()) { + throw new IllegalArgumentException("O nome do produto é obrigatório e não pode ser vazio."); + } + this.nome = nome; + } + + public String getDescricao() { + return descricao; + } + + public void setDescricao(String descricao) { + if (descricao == null || descricao.trim().isEmpty()) { + throw new IllegalArgumentException("A descrição do produto é obrigatória e não pode ser vazia."); + } + this.descricao = descricao; + } + + public BigDecimal getPrecoUnitario() { + return precoUnitario; + } + + public void setPrecoUnitario(BigDecimal precoUnitario) { + if (precoUnitario == null || precoUnitario.compareTo(BigDecimal.ZERO) <= 0) { + throw new IllegalArgumentException("O preço unitário deve ser positivo e não nulo."); + } + this.precoUnitario = precoUnitario; + } + + public int getQuantidade() { + return quantidade; + } + + public void setQuantidade(int quantidade) { + if (quantidade < 0) { + throw new IllegalArgumentException("A quantidade não pode ser negativa."); + } + this.quantidade = quantidade; + } + + public Categoria getCategoria() { + return categoria; + } + + public void setCategoria(Categoria categoria) { + if (categoria == null) { + throw new IllegalArgumentException("A categoria não pode ser nula."); + } + this.categoria = categoria; + } + + public List getItensPedido() { + return itensPedido; + } + + public void setItensPedido(List itensPedido) { + this.itensPedido = itensPedido; + } + + // Override equals, hashCode e toString + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Produto produto = (Produto) o; + return quantidade == produto.quantidade && + Objects.equals(id, produto.id) && + Objects.equals(nome, produto.nome) && + Objects.equals(descricao, produto.descricao) && + Objects.equals(precoUnitario, produto.precoUnitario) && + Objects.equals(categoria, produto.categoria) && + Objects.equals(itensPedido, produto.itensPedido); + } + + @Override + public int hashCode() { + return Objects.hash(id, nome, descricao, precoUnitario, quantidade, categoria, itensPedido); + } + + @Override + public String toString() { + return "Produto{" + + "id=" + id + + ", nome='" + nome + '\'' + + ", descricao='" + descricao + '\'' + + ", precoUnitario=" + precoUnitario + + ", quantidade=" + quantidade + + ", categoria=" + categoria + + ", itensPedido=" + itensPedido + + '}'; + } + + public void imprimirDetalhes() { + System.out.println("Produto: " + nome); + System.out.println("Descrição: " + descricao); + System.out.println("Preço Unitário: R$ " + precoUnitario); + System.out.println("Quantidade em Estoque: " + quantidade); + System.out.println("Categoria: " + categoria); + System.out.println("Itens do Pedido: " + itensPedido); + } +} diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/RelatorioCliente.java b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/RelatorioCliente.java new file mode 100644 index 00000000..4171a2f9 --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/RelatorioCliente.java @@ -0,0 +1,35 @@ +package br.com.alura.comex.model; + +import java.sql.Connection; +import java.util.List; + +public class RelatorioCliente { + private String nomeCliente; + private int quantidadePedidos; + private double montanteGasto; + + public RelatorioCliente(String nomeCliente, int quantidadePedidos, double montanteGasto) { + this.nomeCliente = nomeCliente; + this.quantidadePedidos = quantidadePedidos; + this.montanteGasto = montanteGasto; + } + + public RelatorioCliente(Connection connection) { + } + + public String getNomeCliente() { + return nomeCliente; + } + + public int getQuantidadePedidos() { + return quantidadePedidos; + } + + public double getMontanteGasto() { + return montanteGasto; + } + + public List gerarRelatorioCliente() { + return List.of(); + } +} diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/TipoDesconto.java b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/TipoDesconto.java new file mode 100644 index 00000000..17b8983e --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/TipoDesconto.java @@ -0,0 +1,26 @@ +package br.com.alura.comex.model; + +import java.math.BigDecimal; + +public enum TipoDesconto { + FIDELIDADE("Desconto de Fidelidade", 0.10), // 10% de desconto + PROMOCIONAL("Desconto Promocional", 0.15), // 15% de desconto + NENHUM("Sem Desconto", 0.00); // Sem desconto + + private final String descricao; + private final double percentual; + + TipoDesconto(String descricao, double percentual) { + this.descricao = descricao; + this.percentual = percentual; + } + + public double getPercentual() { + return percentual; + } + + @Override + public String toString() { + return this.descricao + " (" + (percentual * 100) + "%)"; + } +} diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/ConsultaCep.java b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/ConsultaCep.java new file mode 100644 index 00000000..063cb281 --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/ConsultaCep.java @@ -0,0 +1,39 @@ +package br.com.alura.comex.testes; + +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.net.http.HttpClient.Version; + +import br.com.alura.comex.model.Endereco; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class ConsultaCep { + + private static final String BASE_URL = "https://viacep.com.br/ws/"; + + public Endereco consultaCep(String cep) { + try { + HttpClient client = HttpClient.newBuilder() + .version(Version.HTTP_2) + .build(); + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(BASE_URL + cep + "/json/")) + .GET() + .build(); + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + + if (response.statusCode() == 200) { + ObjectMapper mapper = new ObjectMapper(); + return mapper.readValue(response.body(), Endereco.class); + } else { + System.err.println("Erro na consulta do CEP: " + response.statusCode()); + return null; + } + } catch (Exception e) { + System.err.println("Erro ao consultar CEP: " + e.getMessage()); + return null; + } + } +} diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/OrdenacaoPedido.java b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/OrdenacaoPedido.java new file mode 100644 index 00000000..24c4cdda --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/OrdenacaoPedido.java @@ -0,0 +1,66 @@ +package br.com.alura.comex.testes; + +import br.com.alura.comex.model.Cliente; +import br.com.alura.comex.model.Pedido; +import br.com.alura.comex.model.Produto; +import br.com.alura.comex.model.ItemPedido; +import br.com.alura.comex.model.TipoDesconto; +import br.com.alura.comex.model.Categoria; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +public class OrdenacaoPedido { + public static void main(String... args) { + List pedidos = new ArrayList<>(); + Cliente clienteJoao = new Cliente("João Silva", "123.456.789-00", "joao@gmail.com", "Engenheiro", "9988776655", null); + Cliente clienteMaria = new Cliente("Maria Fernanda", "987.654.321-00", "maria@gmail.com", "Advogada", "9966554433", null); + Cliente clienteCarlos = new Cliente("Carlos Eduardo", "321.654.987-00", "carlos@gmail.com", "Médico", "9944221100", null); + Cliente clienteAna = new Cliente("Ana Paula", "321.654.987-00", "ana@gmail.com", "Designer", "9944221100", null); + Cliente clientePaulo = new Cliente("Paulo Henrique", "321.654.987-00", "paulo@gmail.com", "Fotógrafo", "9944221100", null); + + // Criar categorias + Categoria categoria1 = new Categoria("Eletrônicos"); + Categoria categoria2 = new Categoria("Móveis"); + + // Criar produtos + Produto produto1 = new Produto("Notebook", "Notebook Dell", new BigDecimal("3000.0"), 10, categoria1); + Produto produto2 = new Produto("Cadeira", "Cadeira de escritório", new BigDecimal("500.0"), 20, categoria2); + + // Adicionando pedidos com itens do pedido + pedidos.add(criarPedido(clienteJoao, produto1, 2, new BigDecimal("1200.00"))); + pedidos.add(criarPedido(clienteMaria, produto2, 1, new BigDecimal("300.00"))); + pedidos.add(criarPedido(clienteCarlos, produto1, 3, new BigDecimal("450.00"))); + pedidos.add(criarPedido(clienteAna, produto2, 1, new BigDecimal("850.00"))); + pedidos.add(criarPedido(clientePaulo, produto1, 2, new BigDecimal("1250.00"))); + + // Ordenando por maior valor total + Collections.sort(pedidos, Comparator.comparing(Pedido::getValorTotal).reversed()); + System.out.println("\nPedidos ordenados por maior valor total:"); + for (Pedido pedido : pedidos) { + System.out.println("Pedido ID: " + pedido.getId() + ", Valor Total: " + pedido.getValorTotal()); + } + + // Ordenando por menor valor total + Collections.sort(pedidos, Comparator.comparing(Pedido::getValorTotal)); + System.out.println("\nPedidos ordenados por menor valor total:"); + for (Pedido pedido : pedidos) { + System.out.println("Pedido ID: " + pedido.getId() + ", Valor Total: " + pedido.getValorTotal()); + } + } + + private static Pedido criarPedido(Cliente cliente, Produto produto, int quantidade, BigDecimal preco) { + List itensPedido = new ArrayList<>(); + TipoDesconto tipoDesconto = TipoDesconto.NENHUM; // Assumindo que não há desconto se não especificado + itensPedido.add(new ItemPedido(produto, quantidade, preco, tipoDesconto, null)); // O pedido será setado depois + Pedido pedido = new Pedido(cliente, preco.multiply(BigDecimal.valueOf(quantidade)), quantidade, LocalDate.now(), tipoDesconto, itensPedido); + for (ItemPedido item : itensPedido) { + item.setPedido(pedido); + } + return pedido; + } +} diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/TestaPedidoDao.java b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/TestaPedidoDao.java new file mode 100644 index 00000000..62c74f6c --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/TestaPedidoDao.java @@ -0,0 +1,32 @@ +package br.com.alura.comex.testes; + +import br.com.alura.comex.dao.CategoriaDao; +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; +import java.util.List; + +public class TestaPedidoDao { + + public static void main(String[] args) { + EntityManagerFactory emf = Persistence.createEntityManagerFactory("oracle"); + EntityManager em = emf.createEntityManager(); + + CategoriaDao categoriaDao = new CategoriaDao(em); + + List relatorio = categoriaDao.relatorioDeVendasPorCategoria(); + System.out.println("-------------------------------------------------------------------------"); + System.out.printf("%-30s %-20s %-15s %n", "Categoria", "Produtos Vendidos", "Montante Vendido"); + System.out.println("-------------------------------------------------------------------------"); + relatorio.forEach(linha -> { + String nomeCategoria = (String) linha[0]; + Long quantidadeProdutos = (Long) linha[1]; + Double montanteVendido = (Double) linha[2]; + System.out.printf("%-30s %-20d %-15.2f %n", nomeCategoria, quantidadeProdutos, montanteVendido); + }); + System.out.println("-------------------------------------------------------------------------"); + + em.close(); + emf.close(); + } +} \ No newline at end of file diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/TestaPedidoOrdenado.java b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/TestaPedidoOrdenado.java new file mode 100644 index 00000000..f8cba581 --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/TestaPedidoOrdenado.java @@ -0,0 +1,68 @@ +import br.com.alura.comex.model.*; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +public class TestaPedidoOrdenado { + + public static void main(String[] args) { + // Criar categorias + Categoria categoria1 = new Categoria("Eletrônicos"); + Categoria categoria2 = new Categoria("Móveis"); + + // Criar clientes + Cliente cliente1 = new Cliente("Fulano", "123.456.789-00", "fulano@gmail.com", "Desenvolvedor", "123456789", new Endereco("Rua A", "123", "Bairro X", "Cidade Y", "12345-678")); + Cliente cliente2 = new Cliente("Ciclano", "987.654.321-00", "ciclano@gmail.com", "Analista", "987654321", new Endereco("Rua B", "456", "Bairro Y", "Cidade Z", "98765-432")); + + // Criar produtos + Produto produto1 = new Produto("Notebook", "Notebook Dell", new BigDecimal("3000.0"), 10, categoria1); + Produto produto2 = new Produto("Cadeira", "Cadeira de escritório", new BigDecimal("500.0"), 20, categoria2); + + // Criar pedidos com variações de valores e produtos, associando a cada cliente + Pedido pedido1 = criarPedido(cliente1, produto1, 2, TipoDesconto.NENHUM); + Pedido pedido2 = criarPedido(cliente2, produto2, 3, TipoDesconto.PROMOCIONAL); + Pedido pedido3 = criarPedido(cliente1, produto1, 1, TipoDesconto.FIDELIDADE); + Pedido pedido4 = criarPedido(cliente2, produto2, 5, TipoDesconto.PROMOCIONAL); + Pedido pedido5 = criarPedido(cliente1, produto1, 1, TipoDesconto.NENHUM); + + // Atribuir os pedidos criados a uma lista + List pedidos = new ArrayList<>(List.of(pedido1, pedido2, pedido3, pedido4, pedido5)); + + // Ordenar a lista de pedidos pelo maior valor total + Pedido pedidoMaiorValor = pedidos.stream() + .max(Comparator.comparing(Pedido::getValorTotal)) + .orElse(null); + + System.out.println("Pedido com maior valor total:"); + if (pedidoMaiorValor != null) { + System.out.println(pedidoMaiorValor); + } else { + System.out.println("Nenhum pedido encontrado."); + } + + // Ordenar a lista de pedidos pelo menor valor total + Pedido pedidoMenorValor = pedidos.stream() + .min(Comparator.comparing(Pedido::getValorTotal)) + .orElse(null); + + System.out.println("\nPedido com menor valor total:"); + if (pedidoMenorValor != null) { + System.out.println(pedidoMenorValor); + } else { + System.out.println("Nenhum pedido encontrado."); + } + } + + private static Pedido criarPedido(Cliente cliente, Produto produto, int quantidade, TipoDesconto tipoDesconto) { + List itensPedido = new ArrayList<>(); + itensPedido.add(new ItemPedido(produto, quantidade, produto.getPrecoUnitario(), tipoDesconto, null)); // O pedido será setado depois + Pedido pedido = new Pedido(cliente, produto.getPrecoUnitario().multiply(BigDecimal.valueOf(quantidade)), quantidade, LocalDate.now(), tipoDesconto, itensPedido); + for (ItemPedido item : itensPedido) { + item.setPedido(pedido); + } + return pedido; + } +} diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/TesteCep.java b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/TesteCep.java new file mode 100644 index 00000000..88bcb5c9 --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/TesteCep.java @@ -0,0 +1,14 @@ +package br.com.alura.comex.testes; + +import br.com.alura.comex.model.Endereco; + +public class TesteCep { + public static void main(String[] args) { + ConsultaCep service = new ConsultaCep(); + Endereco endereco = service.consultaCep("12237600"); + if (endereco != null) { + System.out.println(endereco); + } + } +} + diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/TesteProduto.java b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/TesteProduto.java new file mode 100644 index 00000000..aa419455 --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/TesteProduto.java @@ -0,0 +1,64 @@ +package br.com.alura.comex.testes; + +import java.math.BigDecimal; +import java.util.Scanner; + +public class TesteProduto { + + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + + try { + // Lendo o nome do produto + System.out.print("Por favor, insira o nome do produto: "); + String nome = scanner.nextLine(); + + // Lendo a descrição do produto + System.out.print("Por favor, insira a descrição do produto: "); + String descricao = scanner.nextLine(); + + // Lendo o preço unitário do produto + BigDecimal precoUnitario = lerPrecoUnitario(scanner); + scanner.nextLine(); // Consumindo a quebra de linha após o preço + + // Lendo a quantidade do produto + int quantidade = lerQuantidade(scanner); + scanner.nextLine(); // Consumindo a quebra de linha após a quantidade + + // Lendo a categoria do produto + System.out.print("Por favor, insira a categoria do produto: "); + String categoria = scanner.nextLine(); + + // Aqui você poderia criar um objeto Produto e fazer algo com ele + System.out.println("Produto criado: " + nome + ", " + descricao + ", " + precoUnitario + ", " + quantidade + ", " + categoria); + + } finally { + scanner.close(); + } + } + + private static BigDecimal lerPrecoUnitario(Scanner scanner) { + while (true) { + try { + System.out.print("Por favor, insira o preço unitário do produto: "); + return scanner.nextBigDecimal(); + } catch (java.util.InputMismatchException e) { + System.out.println("Entrada inválida. Por favor, insira um número válido para o preço."); + scanner.nextLine(); // Limpa o buffer do scanner completamente + } + } + } + + private static int lerQuantidade(Scanner scanner) { + while (true) { + try { + System.out.print("Por favor, insira a quantidade do produto: "); + return scanner.nextInt(); + } catch (java.util.InputMismatchException e) { + System.out.println("Entrada inválida. Por favor, insira um número inteiro válido para a quantidade."); + scanner.nextLine(); // Limpa o buffer do scanner completamente + } + } + } +} + diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/resources/META-INF/persistence.xml b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/resources/META-INF/persistence.xml new file mode 100644 index 00000000..502d04c5 --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/resources/META-INF/persistence.xml @@ -0,0 +1,39 @@ + + + + + org.hibernate.jpa.HibernatePersistenceProvider + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/resources/pedidos.csv b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/resources/pedidos.csv new file mode 100644 index 00000000..21e55498 --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/main/resources/pedidos.csv @@ -0,0 +1,17 @@ +CATEGORIA,PRODUTO,PRECO,QUANTIDADE,DATA,CLIENTE +INFORMÁTICA,Notebook Samsung,3523.00,1,01/01/2022,ANA +MÓVEIS,Sofá 3 lugares,2500.00,1,05/01/2022,ANA +LIVROS,Clean Architecture,102.90,2,08/01/2022,ANA +MÓVEIS,Mesa de jantar 6 lugares,3678.98,1,06/01/2022,ELI +CELULARES,iPhone 13 Pro,9176.00,6,13/01/2022,ANA +INFORMÁTICA,"Monitor Dell 27""",1889.00,3,04/01/2022,DANI +LIVROS,Implementing Domain-Driven Design,144.07,3,10/01/2022,GABI +AUTOMOTIVA,Jogo de pneus,1276.79,1,15/01/2022,BIA +LIVROS,Clean Code,95.17,1,09/01/2022,BIA +CELULARES,Galaxy S22 Ultra,8549.10,5,14/01/2022,DANI +INFORMÁTICA,Macbook Pro 16,31752.00,1,03/01/2022,CAIO +LIVROS,Refactoring Improving the Design of Existing Code,173.90,1,12/01/2022,DANI +MÓVEIS,Cama queen size,3100.00,2,07/01/2022,DANI +AUTOMOTIVA,Central multimidia,711.18,1,16/01/2022,CAIO +LIVROS,Building Microservices,300.28,2,11/01/2022,CAIO +INFORMÁTICA,Galaxy Tab S8,5939.10,4,02/01/2022,BIA \ No newline at end of file diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/test/java/br/com/alura/comex/dao/CategoriaDaoTest.java b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/test/java/br/com/alura/comex/dao/CategoriaDaoTest.java new file mode 100644 index 00000000..de5ae50f --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/test/java/br/com/alura/comex/dao/CategoriaDaoTest.java @@ -0,0 +1,28 @@ +package br.com.alura.comex.dao; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class CategoriaDaoTest { + + @Test + void buscarPorId() { + } + + @Test + void cadastrar() { + } + + @Test + void listaTodas() { + } + + @Test + void relatorioDeVendasPorCategoria() { + } + + @Test + void buscarPorNome() { + } +} \ No newline at end of file diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/test/java/br/com/alura/comex/model/EstoqueTest.java b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/test/java/br/com/alura/comex/model/EstoqueTest.java new file mode 100644 index 00000000..e976a1b4 --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/test/java/br/com/alura/comex/model/EstoqueTest.java @@ -0,0 +1,35 @@ +package br.com.alura.comex.model; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; +class EstoqueTest { + + @Test + void adicionarProduto() { + } + + @Test + void removerProduto() { + } + + @Test + void consultarQuantidade() { + } + + @Test + void getId() { + } + + @Test + void setId() { + } + + @Test + void getProdutos() { + } + + @Test + void setProdutos() { + } +} \ No newline at end of file diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/test/java/br/com/alura/comex/model/PedidoTest.java b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/test/java/br/com/alura/comex/model/PedidoTest.java new file mode 100644 index 00000000..4d485fa5 --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/test/java/br/com/alura/comex/model/PedidoTest.java @@ -0,0 +1,76 @@ +package br.com.alura.comex.model; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class PedidoTest { + + @Test + void getId() { + } + + @Test + void setId() { + } + + @Test + void getCliente() { + } + + @Test + void setCliente() { + } + + @Test + void getPreco() { + } + + @Test + void setPreco() { + } + + @Test + void getQuantidade() { + } + + @Test + void setQuantidade() { + } + + @Test + void getData() { + } + + @Test + void setData() { + } + + @Test + void getTipoDesconto() { + } + + @Test + void setTipoDesconto() { + } + + @Test + void getValorTotal() { + } + + @Test + void testToString() { + } + + @Test + void isMaisCaroQue() { + } + + @Test + void isMaisBaratoQue() { + } + + @Test + void getItensPedido() { + } +} \ No newline at end of file diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/test/resources/pedidos.csv b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/test/resources/pedidos.csv new file mode 100644 index 00000000..21e55498 --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/src/test/resources/pedidos.csv @@ -0,0 +1,17 @@ +CATEGORIA,PRODUTO,PRECO,QUANTIDADE,DATA,CLIENTE +INFORMÁTICA,Notebook Samsung,3523.00,1,01/01/2022,ANA +MÓVEIS,Sofá 3 lugares,2500.00,1,05/01/2022,ANA +LIVROS,Clean Architecture,102.90,2,08/01/2022,ANA +MÓVEIS,Mesa de jantar 6 lugares,3678.98,1,06/01/2022,ELI +CELULARES,iPhone 13 Pro,9176.00,6,13/01/2022,ANA +INFORMÁTICA,"Monitor Dell 27""",1889.00,3,04/01/2022,DANI +LIVROS,Implementing Domain-Driven Design,144.07,3,10/01/2022,GABI +AUTOMOTIVA,Jogo de pneus,1276.79,1,15/01/2022,BIA +LIVROS,Clean Code,95.17,1,09/01/2022,BIA +CELULARES,Galaxy S22 Ultra,8549.10,5,14/01/2022,DANI +INFORMÁTICA,Macbook Pro 16,31752.00,1,03/01/2022,CAIO +LIVROS,Refactoring Improving the Design of Existing Code,173.90,1,12/01/2022,DANI +MÓVEIS,Cama queen size,3100.00,2,07/01/2022,DANI +AUTOMOTIVA,Central multimidia,711.18,1,16/01/2022,CAIO +LIVROS,Building Microservices,300.28,2,11/01/2022,CAIO +INFORMÁTICA,Galaxy Tab S8,5939.10,4,02/01/2022,BIA \ No newline at end of file diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/DeleteCliente.class b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/DeleteCliente.class new file mode 100644 index 0000000000000000000000000000000000000000..7793b7f471d7152746e586e329275b01f0240b86 GIT binary patch literal 3205 zcmai0TXz%J75VA{9b3IpkQuENf%SYIc|nDt?+fo&#k!ge}+rIYG(6p~Km zZk}^ehh%s_Fm{^g7vjX{bir}O;hRm|f&qm!bJdD%`P1IKS5fG!*_EjVPBD`sLukSv zG6wdTxK&K(2nld;TfuNDhfC#PsSSH^yMcWsK7;)Y6wNP@XeAosRY}zDRSG#?W{Ug? z$Rcf(hLZTK!sdyOPJ8KvkKRn%tI4UPZEN1D1inS<22&Wq0Rsn39KxOCMQBMQ4$UbG zYLPMSZbnw-t`B#c_?$!|>3hZEoMj(RVnktgUKh2^^ysvg9vw-~dyyIG6IGp_*A;!t z;!xCqWF-# zQaFnHO?(lvWCv+FI$y_v@VK1EDi^T_O+18$X(+`6=yJPi4M9Y|Wa7&rnxN=#`BBN- zoCzBQPlO42w0Sdmu&%$XcD7o7$u#Df&J$t%r7-4g%XPIcBwR4z;Fv;-BP6)Uwo$iS zjo6lgMo}uBtlUte2@j|jktXVKcf=_$yO%Q}n--T&nDB*(@z5m!4NO#Vl8lhNN#Mc~ z9Fwg@6H8$U+C{IzuH22Un)n(XXGDBm@}yd0{bSNx`tS`CPY6%eGJHpC9G!HFOS1Q* ziKhf7!B$ps$d*lb+Qc&=o^UFYW$nt+qIBD*qeh6q!#BsD$#_1TVYlNs`>R{aWFbJwCb;SBaK$vvH1O?KFvYJ}i^TMbT_ zt;U#}sJXC7)hUF{juLdIMw-TGiQ$%CphsOz>}H;IiIlwN^-;S^iPj=Lu`jgXYS)cI zs%9{+DqaE2LehAj5xb``Axq^bDYswd@quP=4Gm=I5b@eWW{g|qFt-N&*ubdi1>bv2 zGH>8CgF3E*1#f=J@~slt<1=EZyjS&YeZ&dL(!hs7sbSLkCBAUv*84BO8fO;WeC#W_KyP zg||g!m@=YuSRotljjv!-1oz9=gu;h7noWqmNAo`jmh{xel{-SBl%@m z_rG=FZ|9(A&!BJ?$Fp(KahFl*CM)X!cDp@1l1! zmK)y^yW05itOBF*oJ`C7__oLvvav`v#I4uujVX&O`$;pnLoGEzcPeF|H{Bq#WM4y zXY)OF99yW9#yjNH8EnJ*l>R%m<74c=Klupy7oR=<=EJ82gQ}eml^bvet+-X~!ENdg z_Nr0rQxjZ&nCl+LCpf;u$H^h-=Y=23w>2JjNeo94_qmr z<5PKqtuwI6K=*m + + + + org.hibernate.jpa.HibernatePersistenceProvider + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/TestaPedidoDao.class b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/TestaPedidoDao.class new file mode 100644 index 0000000000000000000000000000000000000000..1059e2578e7f52c7b7d140afdcd5c6a9bc20fe2e GIT binary patch literal 2830 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 E1MK5QSO5S3 literal 0 HcmV?d00001 diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/ComexApplication.class b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/ComexApplication.class new file mode 100644 index 0000000000000000000000000000000000000000..b0cd588616e35e1a18053060711246ee55959fb3 GIT binary patch literal 740 zcma)4O;6iE5PcgG970-XC=~i}sH#dK2lmD#6sbhwb7eF6DY?*T z5LiAi)`UZWrQz-@LRa8T;$`Xzsq)GzKIv;YVflVO&rPa=akhsZRwMNLc!b9SBj+<& z&b_hOnOB9ra{f{#&ILKGjg3qyqZGOvwJMip14yjuofGuKUPJe{TGfE7{o4B`Am7k_d8=doSRbMZTueuFnFO1 zJ!EURsP7s1mCp!nV}Y9{@j-`kcY30juAn^y_NK1#sXjK`;O0Zd_n0k#ozImGrqDA} z8h*94F4PktfWw7k)niaqaKu{8mcARx5zVK;+8D19(Yo;0g5ZTAxkfihT9EFHenR}H z-RmUT4RrB@WdAk*18mT31y8X_Ae_8kgHhZd8r@*!>wP}&CTNc$tTr&Z*upciZ`0o) Sc1g9cQ_JUgL7L0H1pWcJjlX*U literal 0 HcmV?d00001 diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/ProcessadorDeCsv.class b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/ProcessadorDeCsv.class new file mode 100644 index 0000000000000000000000000000000000000000..be0bfae418cb06462492ad038e478a55f78dcc34 GIT binary patch literal 2888 zcma)8+jA3D9R5z5^rY#wKxvT$kraxw+*ZOxO+1bPHwj+*wfw!_T3 z<^m3Jt)(upQDFVJXIO60FbfsW4BphVQFQaFU<|9gop%F+n>0L%%>r#xX8G{EO_FgU zhJFFDEsm|&Cb3<^4j79lthyp{u42QYGJZ9f_9( z)`Sy6364~p0O0xY7*5c@e(!9>KIbOhdMDxh@wJ;M1l-zhnt8V;*juk?conZPk*e4P zo@{`8gDh%{)^GYaj$@aEIVUC7kIa#}Xe@#42R+YCnEW62Y%fu(J_%~fOq4v=QsuJg zCCqBbJrWe)#s(w}*QVxOZ%_@C&j~~ZSXcy>1vTk#r8usgy>Fsk$F4=h3{tFdvsdm+C;HB!Tn{el^+tB)hIWCzho4THs6Wq-TF^Qtb^_MC58 zXNJsDO+w3ult1O>hpF76Vj-rxcrLsQ9OAi5yGwPnBiN|uL7sP#;L`*$hZa63*fRJl z_#54F4dRz@c#_Xx7+8iWKDFuu*f`BrE6$)mBV63HAChx`+goNKvs#b6&@|S(B{z$c*Kq2$YVUaP z8X|QCKVp>0UBRDt9nA<}IgK@Zt|We4Onenq^KTvddhswe^KAzn!EUVQ6|e^bJY+K1 zh+`Z*g-s~(!cj&aE}$QmSOCAkHeAMbd`k|#$4+`n;wS8)x81mfJt6cz@XEFuKG!;= zWFMh-Q6lIAP&muJ7(JYV$G2Ac8KHe2arR_T!8u+gi%8=QOq0SgEzWRWJN@_KO}xcR zVHDrtZM;KzJMb0W#e2+qHNM1oyw7}laSJ>gAEw8oPOYN8~bR!!7!@zlkN)!i1mUF2u!$;5*{z#nCt zB7%u0H`$q;nfLl;ru*^v_730xt0iQREg)A$9uo|+_o63wBy@+LhxfAW7$)|WR_>4? zyHRfyQDj&>8#QnLabh-+NoH!RH8`pNNeMSQ$~~IUSMp8CtVM{wIY^J#y;>T8S;=u;$np5 z7xFQci8~eD?)S0z9_@oBn&zUb__&MGrAcjDo+v-=^55lb`xgJFoVf9B8(7CAU9x{N zVE&rPPEo|kGxGV(SFo2sxlGoVfdZz=K fqGpHGDpe~)n5TE)8Z5ygah3+mW%#O>T>-uTo2sXt literal 0 HcmV?d00001 diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/controller/CategoriaController.class b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/controller/CategoriaController.class new file mode 100644 index 0000000000000000000000000000000000000000..c9c9677f9c0c85ac8255afc3debab49b458f6a18 GIT binary patch literal 1644 zcmb7E>rNCg6#mKr1M3Kg0-~a;pxo5)ep~O0sL7%P2*&uUyIYsaOuKeEDDg#n4gDdB zCO&`dOhTQ9Du(IzPuS*5fMr!q%>4+8j?C#G*a1RYXpyqgT&eA zqaOndBN1O0C9SI5zLIv0Rq$yRsIK5w##~==SIO1an!wiQr2pPPF zqYo8%lx20*!%>Da6%$l-6!0)H+^xjNAksAv1|@DqT^q^s7{M`@qhSvx7{)U+YFxMR zb6n?f962|g@=?HPhTbZ#@z@$}7$&F687B6S7N^O-afZto(5hC}=r9zfO-eaz$rw6I z6aYhiSt{`&i7LXZ@JdLM!LqLMaFtU~v~LMJ?V6;_U(Isr-%Le@p1*MsoucH;@$IxZ zx^_pkYRPa=>5ZMBi7ei|$zbrQSJHA&dKu1UY3;27`8Tj2?3%7Ea>FBGg`q%4ml9=V zBvxfCDGQI3(w19EJ;-pYtW7I+YLFtOp-NC8$VM3-~rRSQ76O5!(gcXt*9_ z=-Qwbq8#UgZBJ>ltP@ie^U`Ji=yqz_#k%M+^nbjuZL7NoA8T!0XEoAL(wmqj0jF_>-cR>+fXa_F>>u9d7Z;0 zveLx}09>ZgN3bh2uD$__ag7XJCus+6G*4YTH)(&1Mh~rT(|CYKw9C`#G3GFj(LYCg B#i;-Q literal 0 HcmV?d00001 diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/controller/ComexService.class b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/controller/ComexService.class new file mode 100644 index 0000000000000000000000000000000000000000..3b89a9e706d855f00010484e39d6817c64773c85 GIT binary patch literal 3064 zcmbVOYj@OC6y2GYrZWWkkU}e!M_XW~MWP@m4xmtqR0b%vR#AN1Np9OfCK>Xm6d(L0 zT}#Rm*YXFr{7o+RP12cAX3D}3Np5cL+54P*&bc>#|NHze02lG3gaUeW^cvWOJ`IES z#kw$E;jNmt>-VJTFOpY< zUxJR3g50fPs$5f`kIbeFLMM!*XGwF;i=1fVrtrk7462poBKBafjsXLM7}7A^fx+^< zDDYiZ2Ij1yT$I7OV@VAqtHrBfvev=$MdzwI-q3KQ%en<=JGP(1FpQG&Yrla57}Zd0 zZhg`)(T%2MPL?;jOSKUAb{wTNV=2vB1`gpc!)dm@?GR2IpsK_^YG4ABOjan|brEPd zR_^3s!?&fol_$zx!Z400)8k2=I!KaQq){aXWmI%b8<@dK4ToQ0ph);6EBP#EU?`; zjWaslGjJB?H0({Pyv46UU-5%EVXd(&(rQhedl^VcHii$BWaoDlIZIHYnU1P~3reuv z^*FRdu;kl*sKjUT#?0MQ&l8sbI)(Mr(NOGbkty}ZG)dcjKflqK< z!yc}^6ALz-Eo`<7TX|kFe`??cYHWKE#lm$Si(oE{{D(1@?8}5`1I|~LHT2H1gqYTv zDm{2f}yn#wv_H`CXKIr>YAB!Z8h&eD>-^I?dTmH z*s2#+r^}vb`Olb&i_WUY3GSu-Sll78*outt5 zvxY-EFXefW>V~5vE$|%a;hp~w92L~DojiH2^4Skf{gH6~Cf^$9P1aYYpFx}c6Z+km zXDB{}!SS#f?|X_7j>pva;8TqMmO$O&eLrDGcPXlsSJwKzr&c>#E~|O`ZEI#((Umaag6b8^v9G)h4@}kbRBw8CgDz zaT2}XMo+^yLG*GCIUmM7eA7n0mmq(OlNs`9e$qJCuLRn}hre=MfXYH&GCz}m8tIzM z-S3h$-*ZlM#2MMd#qBs|SDZR=td2P2o4B+c=S)`|d$6Edf@rGz=95ANh8UMp>?2-t z(I)1%D>uOso6IRU)XK>aR1!MmK;`|8A literal 0 HcmV?d00001 diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/controller/ComexServiceImpl.class b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/controller/ComexServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..d622ddc3083d9e26423365efde3dd3c9caf97e01 GIT binary patch literal 478 zcmb7BO-lnY5Ph?Dw{@+yR`g!*pcT5_tGyHjVJkwV_w07Ck^LyyY^guXliVeJZblyaZF#LP{n|zfK8k2G% ztvazT__odyHuoyYMCrw4s8Xo}Nrk!WN>#T%8jTJkk#r5W zF=m-|(i8|K%%m@+K&ekYTlR*^4TYG63I&xKs!%O3IociB?Ia>Gr)#GXy(SWk8Ht1y zjkK71%$Pv1Y3jIyHlpC$7vfo>F7O%Yv@VSja#il+{F4u?~bs;Rkr3w~ms7C{_;W?M~&*CAV^hk~|>BC%rWq4dh{H<|Zz0=s^xHYN!Gq|s;BX!eA#9QpERrH0FKg+Nh87ETH*$jLAV<+#&f#v)C2hv}M8r=gH~tkQ5L zT9_G#6^6AyxW#e1B8gb%{9O_0ano&3v07m9>i&Bjz0RSMQ>XqQeJeKr%K(sW(Nm9|~4VFNZ2`Lyi-^2htZ z9T@_B8G4&EY?c`?7>zjzvj|(UO~G~zJ8-qY)bpeiYHlUkdQ1X?S#q=7y-8-JZSrT6 zj4M+^rwpp#il*i3FPHLlYp}3OpoH@IVY*J;=t4IAjFWu_I^+YOaCK8VHp^A4hq*ofTZbLUX>spMj z4x_`##z38(A>^8@!?u&s?NrREQ*cKn1A47M)844rBORgQ-2xNZqK@mDDLoZ8bdyuW z*1cpZVe?)YneP**8W}I^x?Sg5V`t3tmHdE)56U=Gt;8~Vd=KMqFFvf{PN})-I~$w}y{PvRPeCy0@T*twdA2C%I3>CupZO{VWQ4{{y0Ot2~_dA2t~0`W_?ZxOFOiz-A+B$v}H!NuDYgGJHVB_{JM(uUWYB$fWUAUuqW>xLB>WU@x zTkFmlt*lyFv31LmO3n_>arM@^%4&aL+y1#V3vQ^`x@}423~8#LYxsqfSBV?RXt$XN z;d%U0!LKy@8oy!QJG0T^^7x7mGf79@H*_TflQ4#`J_U*Fk zm%ZLUG`x&|(n^W+p@)!6$I)3W)${nbl=c-OCR@Trd5YlKZqPPqVz?w!utA3OZRljW?iNY!r3os2Cb`R3Km-)4zoscoh8r7ULw8LKR6c0vZI6@ z)yRnVqls#ST*n!Rov9=5;&OEn{g}T02(>#YH)^i5BqYb5eZ;Plpka8F^Fjsu7m`uJ zw@LD3#Agwx2MYN6AAUvn6nqA&PCy*xOCJ8qUpWolV*HQ4T6zIa<5hkY;x(M%DsIld z3i(g~aYtC`Lt#txNsJO`J%#a`j$y(HOzDGu3^V&sa}2Y?^Luegcu^luUZ=2p(+RAo z?L||4pe*ndE&2UDPGXB-(^be9Lx6;LdY^oW3LHZRX&x;L^r5Rh zSQdN|8zq5j%7P~m&*yY=cz0RAd*^<-{3NawsF6e0=bPu>D|q}Uy*CM~ zgofLBhAXNXFOts7r1L74i+rpQg=nJG3q&z46%(;g%tXDI!yAnSSS*%eiCD=_ ztc`2ebL|$c-OjmA&N-Y*aqdRW9pv0?oVy(>JrrL-q}Jgm(axZ!CijUv@(NJas0fH4 zg5)+s6bOa0M6^&T1>->6DnderOtCmXs}&^SHl~j5K zXb<1T2x_VB#YgYND2cRtJcNoP;d?pJ+K2mBhaccueIWd4`3P2pALg?cpREdit`EJv zIC%;OHdWWumIcaW(0`snQ)LVjiht8u7y6@s{wHXooL*c9x^gu`8+FGj~ZS%ntv^GtK=+ss?o}WvT~abWEHswRskB=+fN-+zK$>a}I_&g4Sol zOh%I79G{_575+&te)bTDvWrA&fS3fe^z;CV$8%|ju!{JUw)4s8!ni&>_XJ*OsSf|H z7k_B2p-=xZSbM?*2(XVoItQZ|?_tUgzM kfd3~km8MSnsobMPNy6oQ_}6hXOM2O?ONk?$V|k+d|1Phy@&Et; literal 0 HcmV?d00001 diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/dao/CadastrarProdutoPedido.class b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/dao/CadastrarProdutoPedido.class new file mode 100644 index 0000000000000000000000000000000000000000..b000c3c724a981231c991fdee8b0fab703d15a74 GIT binary patch literal 18685 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 E2S4_?>Hq)$ literal 0 HcmV?d00001 diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/dao/CategoriaDao.class b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/dao/CategoriaDao.class new file mode 100644 index 0000000000000000000000000000000000000000..3eac5b5ae9c038f450c5c9e650aa09957166fb80 GIT binary patch literal 3535 zcma)9ZC4w|6@Erw7Uad)BG|F(;KgqNfl=Bt#Esmfv4DhB0%8GaUYcf*CV0(iN7-Gu zrf+#^`j)oe`w#jx$!XJrKjh?de?Wgu(r0!TX)$WUIh@tb?44(xd+&4a4FCT6;gv9_f#Vi7`o;9ZuGps!1T=42!=6YA#dX(Y=JA= zL8+lzCFyknY2MU>Qd8#bydLIBoW>ao1smgdOyJVD;0g@B>-tTBXQyKdiFXxGhG97~k+@r) zIXX3hvp8qraU17x;ZTU`dvt`p4d@O7HIXcJb!k0t{iq%VO18=c#`&U+Com~+t|fO> zMf(jIz2-)D`4&dfk3xZ))75Wx{17?9yZ%l&4+m2gF59?*s{-S3{ti2P6ftXI&c+R+q$~d`Etxd} zC$`m&>zn;cHlD(F4c9~*wb)BcjH5G;wp}=FQw~0#92o+c)KQcLdQQ&&N2xdf+ zE*VBe;Cy|lx>VV48qV^awVKnd3a4Q_Ub3-_mjq5WD3nOO+EKxtK&20U20qbkzl?0` zwN*0)VJcSeiiIEBsG`Q$98E>fSYVX?-%(-5i>fS4fx6kc_Bd0h>W1{T$k&Y1$-(HZ%d)=K zuc{wykY)Cinu_k~=DG}IOGPXIs$#nnHe|4_gBA9!g{&&7nuR~p5BiZ#N#vZ%)u%Il z$BP9<*n^T5%?KP1ic6X@i~<>$rf{4!CT@ZuN;~7>x-{ez<#sJ5*Dw5;PC?_*dc?x5 z$#xpzyhmlq4NXq0;jTLzr0(_vDsc92l2|G!%0d#FuI;Vk`1L&LjMUv7Uq+pP{@pxM zF~^2^B2b=;cvR{|wWWMI!;E(uMX&podJOxh*bo}+3TBmpkB^l2Fo>g`mgO-;GiFL= zQD$fqG73tu81%aC1P!(9nld=kwdR>WZ+2!PZfhMG#k3QBhhszdMIOJzuPpr9w3FXZ zd_9t`e_!vaQi7ixlgm7Xv}ucf%N9Utn1H@4{idhFt5vOcJMHX|o)XPaKeW*Fz&_@E z!kcYyDMUqjUY$LsJd6*RrQ30_I&B>|D~ryJOsnTbNBayxQ$FX2VSFU;cqOePpRKAJ zwfO7D0+UNYpdG25Zng0(E!EiO_q_6$rcAfB6B+qC{OjU`G!n2^d|w6eVWC0`e`1*( ziF3d3S@<(4{C`uPyGg7u#oJ(x_ZwESxexNq;`<3~a=gXSGJnnYeDPlp#o2$t`i!F- zUgPr=j}&m#AlHpx6hGnUY+{Yq@dig+7o!Ti$@dd%iTp9}Lwp+er}-<)Cj;L@Hdk6; zjL2tVR68+BQ3c+@PibKQn&e{)GclRJ`0Mpp27r!qGFepyDlxqju`w~co#e5eV52g);9#= zKM%teMlIg5goTBP19#t{iGYh*>aHfJ$;(t6>)VCVeJl=OA1@136AxEoM`lg96Au!J z6nV{`CI7jMM5a=1;|%gW>~bTIt4yMknHJxC&g7u^*6xy6BC=7;cueBeLcK@g(JYs! z$!AcYhenx+hQ`xv6X^E{6(CIgTj0p}mlHiCBUJF_+0%Be8`K;kbof10M?}K`+&2LD kIUex$0`sv)gZJa-hw<~b@$+~11Hb3_?T`2bf5G|x0wErb5dZ)H literal 0 HcmV?d00001 diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/dao/ClienteAlteraBd.class b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/dao/ClienteAlteraBd.class new file mode 100644 index 0000000000000000000000000000000000000000..f572f1c1cee77ccb40ed16559b29c318ac20ff1b GIT binary patch literal 1852 zcma)6+in|G6kW%$J+?EskQ+@}TIcTAO$<#7rD>pP>Xd?=hB}1H+wu6wnKGV<#^Vt9 z6Ziq1D?zJ(1dm935~@(wu^nd$HbJsx_8G6WFKh3!|NQ%x-vDglvlJp2Fc38nLtJ3= zsXUf>N4mBAS{O zw;fx#f!cBc<;(k3fgv94;M9Vf;8kJb;h5R>Ji}j9)8(OS5ho)`^25t(BpATQ*#8OAPjT-x|iT5-%;d_o#k=EA+ z-WQlTM?YzDbn2>0N?=3aa>4h#wB#>nO2__A`e`q1wFfhW+t}12&#}&ilP(9oO(8-# z?;rZ!H?ra=)-15l2LIRKYFKoetrZw4+OFDd)+@^2*Dfe}(X*s;Abne(J0GLLq1_P3 z^y+ty+r-*NODZ_@s(aFxb;UbIcCuTho}FHi(~ zGCJA{%=P!xSqy{^2I0H9*mBxS*3hjZYp5Ks|0Q|UkuKhl&avb|G1Q6WG;La`ve)!2 zwPS0&C;qXC*7VR|mRl^s{l|XjJw_`^JBAPW^&U?=Y(3&cvrN!xeG`8Lq1vTveMCXB*38%rW12>|p^1TrQFb zUFuEBlp*^gJfg>kWPglLT9Q<{mG=6>Ei?dxsc?d8&h;*zUJ-8#opHbzqfKLqy1M3Hng_@ literal 0 HcmV?d00001 diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/dao/ClienteDao.class b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/dao/ClienteDao.class new file mode 100644 index 0000000000000000000000000000000000000000..453f7b7badd355cad3b858edf018264c307bf83b GIT binary patch literal 4905 zcma)Ad4Chv6+KTD9$AdBBeRqxc+3*KB4`ODh){wov&lBGUDJ?mV`(shr5SfLa&gi% zP4^{T(l+UyZgg)*6N23~P1isA0opIqU+H;oM)Js(fgdoMdGqdl_ndp~eQ)^J|CZkb z@EHD)L<}t&;yN~N|Lq&rnZ~D=-G}x>3f!0&ZNlkE*%eIx4^ct zIcH^Er(pV*Z2v0nD!%FX6@jC@`Fp``2#wBdXEu|BfgTNebnL}Gfi9J~#sCDgc^OX0 zVT4fzLKl70lFx^996+zYrdi9M@=T{<7JS>K$${R0k!ER&Ow4RVKL#`m>KKw5+Phv- zA~pgWW~^D;k?W^*9KvB4YaotQvDT8qSo`q~9Y^FEt<+lC_EQkprQui&z7lTkdcm5P z2&BQII*v<&gy)t@GiG5fiK957Q~FeNl88sGN`(Rx*c_q_G!inDVtJgB8GKyep=Jz5 zBomrQNLd}j$Pr}O@}%zu(;A?NX*iTZ3wEUt$EhUF;kX?!#X!WeJyI`f*45lUO zOVX&pf1Q_BoJ!y_bv>EO=dx2q!5EnsA2q_tHwx12dvv@P?-STqU^)2K6IIJw6v#H= zF~UVqoz0XtwK#7Tl@lWT089-tItpNU?^-LlmB|9_%=3g*sh0dan~y-Mmg=f+m(p^K zrK;hIgiLbxg#oU-jWQfEkbo_aUI)B!>1=KyXA}-PY>7tx+=ZNRT;3)y$Cf1TQf#EB zBnn4|i+KUPV)++M&n#QMW#SMaWM(=G_dEQ?P*bV7xjHdBBpFMEYoDXSDn10nP*-tZ;I161ab)ICESQ6%xTXe}>B1FgA5c`T? z1hzINixnDrKC((&C+ePw}ha`?dC7kA(v~@>ss~dcq2si-2e_ls&7-^rs^8 z8#-RFM~5!5W~nr3`&K4_UlYV>S?I>R>lx>UjiLI6#3Ls+LeDI^#|@FdZzj9{*0*@rm{1$-YTMfaJ8CNj zTXCc1vcQ9~$&zQ+@MV1({2L~_qC)#4kEHv>{si8Xr|#O^+7!i$+LU@lALn!5Ip;VQ zg~lVXRnhPl_L4O+XqH_Ke-qe!_o+Nk1X4f`x4Rfm!|d+z%Yk=E-fzGnN1x`?2!G}K zWd9ow{R6KSY^E&geICS3gA{Ec&LL@vIB{Q{$dOXw4j&kW^Y419jO0D~D= z#=|O@8`wU^(MQzi&@E(^@lN&PCYMZN5NV!cTNFS2d!IiFnLp(B1JCN#8bv=C9UH2rSB`bx#@Qu| z#qbi6^8N-oSBA;P5+-7xNuYr4WxOk7WasfXhXV<0k1GwlJHp90CRTCsFgZC!P9EXs z&7;Wj%V!)XIV;1{{Rv#==ryXS#>o^jD>WdsIalXoj+{KNG-fJJT9gI`5x+y4r3T`m z0y^)o;_3r24V@ZdPf{7%8kO-CR$owsF6AbRyhp-MJ(+4>!c#4T|9*jdpnXfh8<2$< zXgjF=EX#11O3ta+gWB&2Bkp4PeHCA0#9ybC>;b{Z3%vUVM`HLU@4kf>=~1?V=lLsJ zL0ScIH4Gwkjg?mdgDHm*$<{Ey-ta*clIjgXNLy95&r?trSZa9|*C<6dra}vPM7mC9 zn#8`uiQ@AnLgy!^cMb#zhnFV0qNnXGXMYp literal 0 HcmV?d00001 diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/dao/EnderecoDao.class b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/dao/EnderecoDao.class new file mode 100644 index 0000000000000000000000000000000000000000..938e136c053b1eca394e69ceac88a211eb9b6eca GIT binary patch literal 2015 zcma)+-%cAx6vn?XhBam(ggqxC4TB*J0U0lGa_kVu+1;7Jrr;$L5 zfuxC6v>S1Q2AB68YtINbcmT0JJ5wo z2D(jLMvuTq6MKQKvI=&6=~kr`*q$peIhDOIO3aXv`p|FSii!7dRbcF*NHHIQlwEzy zI7ceft*jQe53)c2C=mnz#{qf9ce!2YSD8 z6F2prHfmb20|S!+y>Dx?bZn_ZO{#6PCUV*~<$I1(lGaxSW&{S`T0gH*-HM8wQkdoX zlJ9#N>1C?YIg)AV$dJNaf#K7PWKffi{q5PLv`+U-+}E16`Ksa_sT39jhEBcI zvE|h4Gav%v_4w~DzkV_?Zk2>?-$O zZ{Gby9;po#9C-U%(w7w#u;-b7UGq?$bM~k(87DeJR8~MRm;RXUQ7suDRWF>yqc(P4 zO8?nTpd*MMm7D+Tpzs*)1njL1dDu{)Jt`BMydl0oddI8zmRh#8dfl;mU{?1dMtOfE zc=J$MeS>h6RD{ooMIm5ocHG)_9DM zIHO;}~z*8*IOmF`eos;}-=YD{3f=+>rnG^I1e2;bx2H5Xhm_EU^L^wJ@ zMt}=r0xxlWvu^ucXgekFGp0Z5$>(3A@arpvNn;LoFu^Q!wsRrfW&Z6$FZwZns~F>Z z27_G7&~ga#xJKJyrZ<8uYV(MGIVLzyn`NwoyxS4mHde6~##zC~_=HI7wC_jq4F(MK zePLkYjlMP~{$|jI0IRehWF)|!4FT4g2{4zyr|$-zkAdfqkHBX`)yJ8`B*CYMJdJT; z=ZKx>Gt1{L3M~080^N?FXJgQ75%gLF{qQ{Kor|G2Bj`UG(5ua$KTI?!b}`1BCDUoK z>&)|HzDMT!WPZS6FCxp{n_-Fbq?{+y0_(EEyiN<9k1?-C%&QUe;(5%^FJ^wmawo9$ EFK3Lmf&c&j literal 0 HcmV?d00001 diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/dao/GeralPedidoClienteProduto$ClienteDao.class b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/dao/GeralPedidoClienteProduto$ClienteDao.class new file mode 100644 index 0000000000000000000000000000000000000000..385f0d12e9d0ce2deccc3468bbdbec4d278ccd42 GIT binary patch literal 1645 zcmb7EZBx@&6n;($gq8rch^~rS1f?ymVclKd3hb^G)R}@Pwcl^kJ0(ttcH z1qTyw2*p?8jc@}I_S|QkSJKlQebo1WWb_^G)ON)_pBi?8jP$ zo^&@t?d$z55sIEv^$CebGGNF^KjDIn ziw-WCToz738t@^Ec4W^F4av(6uHY)c&T=8lR#M!-dep0J12ga7n!y<3UiE!Fjzz-x z-Hql(qgD3Gn=hVim9q|&JsUR&V$UX^wV}?8@~)owM`gla9s$~O+S>|NxvgiOLPL(l$wzzg0@h;xo64|GyH_L zQ+jP;W!);1c1 zl_3-QzdMNFJPkvs(gBp5Lg9ERVV)PoIPW@(AKn%~v1nEuYjWV!@eAv3^X(;{IXv literal 0 HcmV?d00001 diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/dao/GeralPedidoClienteProduto$PedidoDao.class b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/dao/GeralPedidoClienteProduto$PedidoDao.class new file mode 100644 index 0000000000000000000000000000000000000000..6231221ba547776ea46090866bf390729962033a GIT binary patch literal 1636 zcmb7ETTc^F5dLNhEQJMXQM^l0uou+D`=x-F3TjdirS|=_J*jK9yX5RyBX9mBO*94{ z`~m(buFd>*%)##j1j`UhH{%>#}$68gpuSs zw#^De$ zZ^T>S`XXq%&l_)KQ*-oXFYxp#Ayp{W4edz>Q^*i3*&)nTjmJB8N2Y5TkB%0a_146z~JP@VNkdaQ{q>WP!PMcgV z9E8;8Ll|zzwig(ZXC0iwEWz&OLO51PaQo{~F4hgqoP+ZQV}x7P@$@L>2{YSk)wN13 zx073c`FtbSZBTB<#zoG0Kw~;#OZslt%-|Os6j36KH6YcLEj|AIuvH6jj2l1a)Gv0V3j+#Q%!dA#o z>20qa2pua<^5$Q)9+=u6@T(kgY&(oqQ?7faQs)lb8dpr`38R}b(oe%k+o%wh1`z(| z?jbnOfi@G(j0PGk^!@Do8`2H;rAK-6O4EV zcYBC!J}uVeOP?^Yha-eN94DCD;vUXeiPY2Q2>VR37-F{tW^s{UexARDgw0Gh+;28{ z+(Vfm4ToV~=?VTamU{RrNdmb*cGhL` z%o&tfxY9XJ2&fu2*qv;VQ8&y>6hqodqOoOcYWSbw&yae=JMyF3^@|g zXZSpUFHC%?b6GkMY3L0@ye)dRt4V%k;yP|HB%)jxuI57A;d+$wEe*41;-5dd!iGx7M zV}{Cb^oEkQ+ba(RuQ=TI%j3G!JU$ZLFbK8f0Ujpsory9w7#7a9<%$n;88LC-O3aQiS ziba~#Q#7;<`lGQ2q|jbTHh2lG~!k?k|FBAIlpr;SIHQBce}-Cw z|CY$>j7y{V#o~J`E&TEx`H0Ea27VrL8KE*y2?HBMWs|6EVF{10Mr0n7bx@qrM>?g5 z4k6+>ek2xAaWt{#^kb+~s6jh6iJGqC6^)!(%PgPZ-UJosKErQhHV6mQMeR}v(aeE+ dgtim<>{5`uaJP?xa6Lqm))e^~IHaDl{{Vh(^I`x1 literal 0 HcmV?d00001 diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/dao/GeralPedidoClienteProduto.class b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/dao/GeralPedidoClienteProduto.class new file mode 100644 index 0000000000000000000000000000000000000000..9c90fb7106d632651cad5754fd7e7b40c58938d8 GIT binary patch literal 653 zcmbVKOH0E*5dNmGv}v`qwLU5cf(P|r#G_R&6-B7Ep!B{;7TvPV!X^>_mM6i3KfoU) zPGX@a4|Nx2=9``O&e!+HCx8p=xG13LpwvJa6+&w&UWBJb^yJ<9QyCt(`3W^=H z3H@bL?$3L?62`$g;cWQ;`NVSnjsFxdpEU;{G;X6v+JP2vEO~I?SisHf&Sx;=Y%H(dMBq=1~5R1A4uC(NhC33 zz%((85rIdw=w+*_f|^qcm1iq!skIk)#151URo)AoaC2UIvaEtxX@`EWDR6wU(6U?% z1IH_8ry|l;jh&>kLrCEP18Ec6@u0x|yB+ByCa}GOM*?G$T@7cGcnCWUJZxeVj|d!C z3oP5OSkkQrQt#Adt0aAEu2K!0ih4?x{94X+lozU+z^--2E1h!PCgr>nZsfg^3Y6^& zJRT!)kFXoSSoP3xtpc&m8rUr`6#*C#ZQrx&K|p(!4E>5@Tc@IBjt&s@Bz9qsPWWDd z#N^!6N}9E>&%|RGV{)Z!t19z;wvm$i(YVE>^}1(=j_+AH->cOtDqw;pu;0MDOiW@* zV5H@#c3;3)_k+B&Hv}^6M(^}lt97jL<;|)pMM?_{am*#SI7D^1+SCQ36& zT}!hjp2iu0ZM1*NE6sVtp~B*eM#fwcXYoM;1rzgF5O^R;el%ek<;eVBV&|yEb%BRi zj%^?{IM{DXc*ejv6GbeuaU&gDonz&)*}RZSIt`O&+qA}$ty!~M)iA~tfhQN(!!wzQ zS~9mZ8?E_@blhmS6!_~-t#v$eAvV)KEj}ghE^l+U^5R<)Q#z; zSwCvxW16*}thwsCCVj%hCpBq+q{yZwu9>hk(Il~9Ui$ijGO?~d4DmzLkpZxeo`?s^ z?W>WK2Qv$|Z?O>@hn!!jx>1Ijg#1zz3$u9y7ff7)8|!S1r3uFHj=j)iW1c+t2C61L zrQO=sRU$6hf?p0eBkKW!@=!AoYUx1+wV>xmM7?Cs&c61 z*rKe*g5xP_SX05WTysfD7kpc~D>88Oxj{^X8xF_vp-%C=(-hCr2rI(V7294~&8v$w zG+^JE_^G(~S_7NaVf%GXUw1I3SU5(ba0DLfE+CLBvT*xX>?eye0tj8sX{b}D1YhfU(F@m*i{rGtj zzrZgI{K~|y@ft0*rnBQ+@-Hf@5XDOgd8fFBhz{F(t1nG>LbDpPy=*Cwy1An08T{w4w%)p-n_S~D5V=u-R`{-N`UvfYKeD|QA zzn|gB;wrfIO}`Csjhh}k&tLr+e8OMhuNgDov-liOgZMnYKrSu(AM}zFIGHwXV6brD zCbkL8AH0Db3xCC~)x_I)bS80VG;s?V;3md%M*c!6s_-%Ky!B}O#N+w5h$Lfc;>UB?(pew~uvAcb)Kj|TYf&o>RE48G)qfo~=8 z9e(Q*RHxzL1E1^~iql**WU1-2l|FJ4kM}a*Ck6gYS`6t3Ie;-rjWe9FHfU3Lm5!jP z`c-bf8;N}{mDJ@##oENb>AgdTuH$@h zHNoZC;%Xn4j~7?_xya(G!KHMEzic%5o$IK?BHRVB6nFJlkh{x~P^(1tvlKK;JNY+; zhmqs@G!ZEhlQJKEm$`qQNzjRjYwt>w4jxJSA%4WLdhuhPdhiqcl&em{&q#Y6zrmaM P9VtmtevdyA#nJx*D(4zy literal 0 HcmV?d00001 diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/dao/PedidoDao.class b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/dao/PedidoDao.class new file mode 100644 index 0000000000000000000000000000000000000000..4872fb7ccc1f5201fdc7b4287e1fc4117a330566 GIT binary patch literal 3093 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 I&3YU9KXLDar2qf` literal 0 HcmV?d00001 diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/dao/TodosProdutosCadastradosBd.class b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/dao/TodosProdutosCadastradosBd.class new file mode 100644 index 0000000000000000000000000000000000000000..53eb79098aa8e79348fedcc07ab8452e89e1beac GIT binary patch literal 3394 zcmb7G`BxiN6#iZaObF9L(?S=uO&1g>kU|&RQmZYCqG2haC|0eHWC&A}44q7Bao_iS z->r2)f6?kuZ1w2zoc`vYjppku<0C9P~sW(u}c zZ^p@3N?Nf|D`n+}Z7Wr9tbDgj$-HArk`AT>mKiz6bY=!*PNof8U}IeAJQO^n6w|g`?9qk(#8i@MBqthDd1fpf^$XY2Q6Z83M5Wz|ft8~<( zL14pWR0`B2Z9_W7p@L!02y{2OMtZ;`9NWyLyB1NpGcup=YA)l*=*+Z{a)or&U=7x4 zSf}GETrF_*#U?B;6Q#7_j2QVs#)%UYfk=}lK2~tdOia-T%X&t~vSl)3gb~F?4V!dq z#ukBVE*3t#0I$G0&$|+s`()Cwl(YNFI9txQa<}Q_wYW}0la6Mz2wZ!yA?2Meo$H9XkY;Gc~0>Vq_#S zF)iBXgR%gB^O#DiT{^B;g;SZ#Sb0NvzpEO1(WPOZ&iZ26EGntQ4D&n7O0o(JX}y<0 zro|*Ra}LwWkXc6cCe~Hk|NVt=5ZxMjbo8Q+<|^D{rJ@D2X{9KWqwaDs9t+_XfzD{j zZ=^SVVD$W(BmG0sp5Ey2$WYJW(V;{MOEiRA8LP&&o%v{E+xBhh+37wzN}u5n;sSyG zo)88Ff`jZAAq+DLJw`rho9AcGe{O{^BA^f3#`#$*dYGN3J%mw#@S%caQ%K1auZ#&) zce6UvjEz*D-=Sk1cd{B>2Pezt@R3Co>oqsOWG}#pIeZuH)^LxGqqvv3;9@x+c!7}V zFgutS0u3c)+3(XSVFF1FDIErAO=Lkrk%hsSlKDa7Bol#+^-gtTN{5MK1SaQ_R~2P1 zYR62Ej6fryPF)0bd*>u+9oy6ife(jKi<}M%(@amclYTbe`8MLpj9ctuip|!M2QAUa zrlKNHs@!jRiuHt!`xUEBRxfNxX{m!59S`6^<~t7k( z&8*D0x*yi@2p;u1-a?RFRQkhs98YL?QpZzxT405XqicG9j^S71Lp#CYV+;}HhNgbM zM=s`Ybv&!%IXv$fJ)b!2PPFTilVhHb5?+L@;U$4hm*-~qx;c3SYU5_k7%XHb40}{g zWJrm`t)$G15fiodi9u(|%nNKUXUNi{w2N2|7|xWH8kV-q8caS4syyzEto2JzBf?c` z4F{EP(ZMBe?ki_#$*k?#Ps^$kW;!RGf=$176~jMYLsuvyn3X1*RYTL_()Dw(nN1)l z?KE9pS>~9DFyp4ajLfIM-h|hptGi0xO)b3U<=yGgT^XxbzoVyDBnlkC3f_<46h0%CMISuMX;OUbKBSPa`fMRPu@g5_qzb^9 zAFwBK;~WmC^=5x9?)&SienViqB63?|JQx{Bj8{g665~~oLy2)Ml1Pk)B8L-mxc&B` zjFxjaBHRE-LC6N_ds^TR)D9?)`+RAwbI4L2m*bSkr9hcnPEsnDhtA?Lissuhb9lj( zKl|@@MHLFjpc~dcCJhKnh#!%4XdxI|(SugR(T+*PIIFgC)^u<kY{{b!lc^Uu! literal 0 HcmV?d00001 diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/model/Categoria$Status.class b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/model/Categoria$Status.class new file mode 100644 index 0000000000000000000000000000000000000000..9ab16b184391d62bf4cabbafb41821ffdc93590f GIT binary patch literal 1293 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 Hy`}6wu%;Xc literal 0 HcmV?d00001 diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/model/Endereco.class b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/model/Endereco.class new file mode 100644 index 0000000000000000000000000000000000000000..654bb6ba1777b20d0870bdc243f8c8787f2e71bc GIT binary patch literal 4556 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 literal 0 HcmV?d00001 diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/model/Pedido.class b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/model/Pedido.class new file mode 100644 index 0000000000000000000000000000000000000000..3ef2c17432d1e6359f1f6b46be9126d9b10fe660 GIT binary patch literal 7676 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Й`UVk&$f)j8ouIdzDa zSS`v+lpxkqcmhxIUo02pT?kjVJ&x0h(QNY3XvJ3Nqu?nVCMP+(hIheIBaVLhcr3|x zX`q+-+~QM^80D_Kp=*LHBwkg`{((1zPvTQ0FwHH-w5=qjr|}GVOu{s`7}EeT?I?pu zr@jD_=uF|$U^bhir=`W121{c43_e>5)6!y0=MmHSWiaXF8DJ6{@(V0>mB6(8AublW z>aLQQp2g=TVLB#AIr_A=-G#(7R0fmI)&VB*DTUADxe}Nb6zgesNlee<3zIO>pB5DB z$ss1U3??0b0VeI^{KQoP)1qQb>5`bfh!;v>T2zc_FEL$Q29vH)0VbU>zl0Y9vW0OM zD#mn42~0X;eVHPC1z%;{i?44bv3&gbwM-{lZNs+`+vR1jNfB2CX|slf=4Q?WXr=0C zhF|04OZa+#dV9dIxxH-+olF^__9wBn0y{X|Fs_>>KTTgr{#P+sU(JeoO#zPPd>&}V z%lO7P*Oz@4=0|f*iFglCOi6ID!r~}QpTs7G9(R>o<_z4xFWEP;h~AV(+lpg-jH2aO zfLjVB`>EG3$H11qvjQu86T<=Kt4LCD!wSi#yyiZK2DyzPegM@?wgBX{oYw+gi>SCg zPr-q23yn={?-uItR+j$TS>$gi@P`!zD418b8~D}{a#SqYsNlfBcR1w7?EugdlvrxR z1~wQyQhMv~xxj+H>H@i|yj7g(|$0 z#P4E*c{eM`JWE2(hugX2YR0F-Q?*Nf>M5) zQ;mwIv+~aV3ePM2a7tcxl;QR8f558>KO)Bp{Mc`vrJ4Q-$3G;?t}66aIqv{{r)oT+aXi literal 0 HcmV?d00001 diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/model/Produto.class b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/model/Produto.class new file mode 100644 index 0000000000000000000000000000000000000000..bfdd676415e947b242eee05e4bb1651475afb45b GIT binary patch literal 6452 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 E0L`>Lf&c&j literal 0 HcmV?d00001 diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/model/RelatorioCliente.class b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/model/RelatorioCliente.class new file mode 100644 index 0000000000000000000000000000000000000000..b3dfd409390b806c4a066481f91c43b54a90056c GIT binary patch literal 1234 zcmb7DT~AX%5Ix)WQu_t8w0sFFezrxqzVqP&L_<;##PGgt*RtgHZn)hVf0T)uNHjk9 z1N>3Ov$v&S;X%{n?##}dIcH|4zkdJt31Ab?vq&JBMk)^v69Utx^1bu}8Fu{F%~RE~ z0uviL)OJfCS*;ysa0{6$d3$h+UUa%3}s)fkM}WmO1K` z>{-L;P7bq}OJhEd1uP0o#sqz<1HYkrY$Rdc36!d}0rM!ZE-+WUu4Z?qb}W$EW;X&; z4IQfeez&Qjx3U@VrqnPk863+UA@hsQBLDW~zk*+VDqfoD%qxdC8E%Q4Y=j4!L z#S99V#pn3zi@No>ha3i?Jkz6n*M$E-eW8mc*!K+xLJ|}yPP^U2U9hGs_D_5|oq3Wk` L{b$6i#g_jEO5y8Z literal 0 HcmV?d00001 diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/model/TipoDesconto.class b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/model/TipoDesconto.class new file mode 100644 index 0000000000000000000000000000000000000000..c5c7b1d1626809085934621c9d3b71f49108d3a4 GIT binary patch literal 2185 zcma)6ZBrXn6n-vw*(EG*TP!cu8Zop~#{(bcqfZKSipod{<%PkmA ztH7;}%jK8&w$O5#!YZtqdrn!j4afGJUNFQpB#>lCEmX^uTD3f1t}tA#oyoo^0aOjW z5}P@!ctw=QYFr(qKBGxRno z@2+WZhe1E>N2*R~xP;48jXmKS!uC4cVqoRu+y)hwmQMSMh7WL+VYJ0}Mai)Z?maNQ z9r|i}-1gd3zAmwpqcpYn{8ML<=F~Hg6H~ z(30?WoaPF5>FNoWVvl<}CLO7apbp9eYW=~*ahoP(g!-dlZrj}JxCGIyohYXa{oBG@ zi8Mznn=8{J^qiokZ$62z(xfqCSYfM@2?5=T6iv4E%o(ZA7Kui~=}>>Iko{hY5MvnOp_HxRAg49O?X6 z{5dke9D(YH(|14V4WN%G3=;|IAWgP%3|4&v`6cNFGD$cN>2x@bPl@zrv?u9$iFS>4 z50)stWz^|cW}y(WO5}e<<|kj_I05H;e*vLH=#OCqpNGaXQ~;S0os82GU^4`1jOH%sxZE%zEG;$a<2psvrXu)5I|z frfwB$q}PLWJfKr0i!W$@jc@2C=QW1`f${$USef`N literal 0 HcmV?d00001 diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/testes/ConsultaCep.class b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/testes/ConsultaCep.class new file mode 100644 index 0000000000000000000000000000000000000000..f92aaa880187b0d636c41959f202df48e468221b GIT binary patch literal 3330 zcmb7HSz8lV7=91igg912P;tSisNgnM+ggb$5rq~M0kPJ$_9QvNKr$0&CaB$4Yxlji zyWQ@s7b^C7`gqx=Kg#x<$v_hwsJ-Bv%sJose#`mz>&~q|0PMl9aa5sNLyeAF)Cn|< z%SmbEq%~?BO^>ULCs4QBv`lZWKy`b^NE|WLYl!QZ2VG!kKyE3|81uY>(ZeN`GnGZQ zxTVf@70p~$IRb6%9euNrwuMy5dOUyy8X9ygM591rR)!JfxTbBsl6Ph(F*0BUj=aN2Sv^F`d=TQ59%fAl?eG``HSdJ9}wP_z4ffaKglZ>Mkt288h zv{wtX+>6MdI$KmO;a(RhC%m44xRF6$tD_C;1eWCGgi6^~MtUbqZ;ZcOPg4M`fqL%DGTvICh~^ zLsG|X>=D=yWu{voj;gK8&R*z|RyM~J5{TJnN-zp+oJGUEd{h_1J{|jUK%mA|7PCc` z`Fl4u$%q^sR1tEcK`IdvofHmg=+Y17JveWhO(3d)J22i3mHJ{|oyLO;_4PM~QTrLsOX**hb$vjk+I zI+c^IJDpbL#?<2poYe57j#GH5(yR+~Jx@TC!_L=S5@y=Q0PD!3%}VBzjSzUoufx-% zXzz_IE{U{;jE*d5=As}Dl~M$>f-f`2PS_mbM#qST(P`Ge_U`i;Rq)t4<2VCT$2cY! z#Zl$;E7z5y)Kdw3So@89Bi3r5nspI4d+a~THT?cj%y}}U3QYK}14G@Xj}P_#K0P9@$=d3G>l18(#ow2;#O)q=Nin4Qi?6;Gc9$bm`^KbSf+C{x3SO8 z$lQo@O#eGPtntQ73f$0lU&bZ{=4HxlkIIOSC|Q*WMmcr)AgKkm^!<+-@EJ4Vqq!`i zhD#4BsWfN0*)NYE3)>v&Voq4~d|e_5!%`OzgfL9d%KV^|Y6d}IaV5YP3ezBOn?v&M z(p?}j4EbJ4oIm8T7qIZdI5qSuZ_LgPNJr)sy9HwwAF_*1MjbN!;5L+{)K)+LdDLaw zp6fZXP~vqL)Zv3TKEy{FKKASB6V4hzsRYVRYto)jM#%HO2+V+Kw|c4Fvk6M z8p9Xt&fSh%N);wduh+yJK-%~>t4%JPSD;If!F?>dS<38 zz5Ef=@I42E*&>cZsO7F*xOmtQZt1v!HM?ID_H$I zdQRTJW1Y1vwf_0z0=IFr@z`|?-Nv!2*Ki`FzJ;fO>v&dN?dRd<>lnL*TzC?=ENS%_ zq)`m^8ty}}o2asxz$~VPOE{=4<&@Kcog8xxVg=vYmE>MU4-=HIhJLTb zMV60`MGrLIH{*G{KoA!~;YGYety|EGm+=bm*ol336|bR&d<*e9-Uw{E6rxA0@MaK> zi4YX>OHt-`x_k9!lp z->0}wgZ1-Z{SsgCW;>m3;lLCZhG C^{9pb literal 0 HcmV?d00001 diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/testes/OrdenacaoPedido.class b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/testes/OrdenacaoPedido.class new file mode 100644 index 0000000000000000000000000000000000000000..a895d5fb92d1613a06e933b47f8b584bd8794ff5 GIT binary patch literal 5748 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 literal 0 HcmV?d00001 diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/testes/TestaPedidoDao.class b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/testes/TestaPedidoDao.class new file mode 100644 index 0000000000000000000000000000000000000000..f61e8c1310a6be6af2a69992e29372f0dccfdcce GIT binary patch literal 2799 zcmb_eTUQfT6#fn*41@?6B#Kv5uzd6+Y^&p!L|?Qidyzy5vt2Y^fXF@-j?8%U&)M2A4% zUHL$oj&w`rt<}5A3IsZ4Y}XDh3$%}pEq9`m675OLQ7NR*Z6KY-9`pzt36DNBE6Ve2 zKTxiv%*D-TfrFN(WT39OfgNnjOIMbZcU@Y6_BI4&M)RAV3xQ|5rQBE~YPQ(wbgmnH z*lQq@MnComoZ1;kt78KFEg}*)Il8OkoPjJAS3T3xWm7s;PliwGp;?sLoMo0J?b&ip z>J$cWAjEc1U^ve4842aamcs*w(m0GGMATD`BtEvDQ_IRNN`Fy%4eJ7#TBK$*upKi` z)N@@ph9LvT(>Q^XP30_Xuqb6#QCC^iff#OEn~TIcAmU1vbDbCwxH%njw;;jQoyK$0XQyWYQ+IEZc*{?N$ebaX#^fzNIyOo6Tj9-TNVuy@hZ z#cH7ap%5^;sQpfyBM$T04Wt{Wx;PB&LK-jPCDJ*HV68O??`+{^+z~Zin$3yiGVG^U z(zu8mElSH$6~cV1sX}X2*9vUynzP#Vt7YYpxtDO+z^iFo!D|9N5kie>5}Y;dU6aeV$Q&|G_Hq@d~BB{5J*~%_Ep$BJa)60D^UX)c(Wc-G!XLIEg6_^ z(wx)PRY!H=mOys1MnzWY?1ic6HCD;MTLPmkS|v~9k&7y<75haXF{_J8pf_*3 zYN1+QRo;@M3$i`0E$J*vHWuG&!bGrc`vT+n=XJp9B+Akz-Lj)wYg?Z=%iNb(y`rjxedzN zKFzosnT_@h3mnlu;##d76yC40Z|$Nis(NcT@@%k@VfL159bW7EW^*x3sg^3}s%NR| zcF3syX6{Xe?rHq0)`1^*vJz+R_jVvip^66vK1t&t__;c<8L90)(D#&?k09X*xmN$C zbrY}6x4*Yex7wlD!42sa9pw+_wZ2!a03 zbew`6s9YaD+cvKoRVP|sq_BuD(^x~P4<$1Drt2zi){(xid;{N-+&l1V1%-j{1&%&j zmBTj14ae!UjYAk{2dRe+-rwe%$yIPojz5O@nGbC!@E&dhU0C8h9V_4+EJw22c$Zq? z;eV)?PkPjFR$wqF+r18k21oMu>IXdV2$+JjzXv6sIE z84U9;=L+`W2LBY6a0u_?2v%_v>-_YG$()Y^#tPo!TL&!Mp$^-P_Yd$P6U);6NBEe2 z4r3mYrxVnQVTdI~N)#nYK{Mz}g{7p45Rso~GQrgxZ=e1XH}c~NE^o|_C%NPo!ju+b z2u>4$2?8(~<-ZAhHi|C`1N+f~1I%I&Q#csKJ|3H9E;d~l7{y)OqvIY{*Fl-F4^Y#E jX6)^#P^S&|;c*R1=u`G7KF3%1nvxVH-{3p^fWiL&Ya{dF literal 0 HcmV?d00001 diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/testes/TesteCep.class b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/testes/TesteCep.class new file mode 100644 index 0000000000000000000000000000000000000000..a287564ea1a0d0d3a0402dce254cd2126fe5b07a GIT binary patch literal 959 zcmaJ=U2hUW6g^X*vn-2Lu&Avcr5_er?9!Up2hXuA7oe>^+;h*J`Ss`94*)N*Z(;!{j z9W2k$?|dRc0kMw8RK)TW-iz#G!j36}6hYI(UEJfiZ(#+i45bN$`85oDsCW1wfm|m! zm8YpCdC0JyKy@a`iB^X6U`V%!JVU|pLU}X}dQzQ;o=={l6S>0g3gzkf%$bf)y%ED^ zk_tDVn}i(*k0_R_?-PXVQe3D3p_LNCRN_dgbI&Cv+yBXSt+$lWkh2~zY$R>E(I|#| zCl>C9wir(8<9NzYNl`Ow;&?W;R(yHnVdH_GJ=&Ors8y6KgbDv;PX#X_mzXHVH&;{;V$v+12mh?=F#b zc8lf(takk;%&%CgU!bfZQ_zrQf&(3NgWdwclwi{FvL-3krZCvT6Ix?XY#UWdTcCIi dJCtUZ{5i1SSmEFtb?lKNLwAl0qbhV=jlXx<=imSU literal 0 HcmV?d00001 diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/testes/TesteProduto.class b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/br/com/alura/comex/testes/TesteProduto.class new file mode 100644 index 0000000000000000000000000000000000000000..669f2103dab643df8aa8f2dd0c94fc0748676079 GIT binary patch literal 2754 zcmbVOTUQfT6#fpk32{ULLC{J^3znOt_Tq)0ZAGbRK~WHD)z-u02qTj@ab|+L`bYZe z>Vq$Rs6JqqU8{ZIt^cEcqxL&9L4rxIYbA4Td-neJw=ZXY`{U&=0M6lI7ENfj&|;$% zZ36r6%MF?HWw4sNx^iE+u|V6D7kKe`f#%_nB?}pW&P1pZdwy=gl|i7wc4V=~f^B0j zI(BJUcpSy5B+%pq0zI?Io1V@Uf^sEZh(jey`7A8#H}*RP`i2{dj4T-o-8K%Ohd^|N zxOSAyhhDI)EQ5mrL-RUx?#T@ujyqlud7*T)6X=q1irOiMx>$+zq?1KI4p}&C<1HK! z=-$RwqfVf;Y?RYl6<9(IfqTJfeq_l&f7^zGqXL;gJ&I?&KnWZe9!cG(mCoQDf$@4| z(kZIQ4ZW?WTi@$901n}}g?DWXV?^NiN|p*N22O^a78t9-uMJwh3bG{QwcG`7^`dgUlJpsmA&l7=#|eSGRCTQ)gV-y|B0cME zsHc!YPGGc=Z?25hst!GRSwnpnlkcRB_wj+i!IE58(>kE!vKOy$7R59e3CISV*Yle0 zyy--tUa&z-ObUEt=yJVCGT~hq5S{ z;~QH~e1>SksYh8UIl&b&h>z<1z|l%{W#t z6~gwwJorN3`hSJR0#n|b@M^732((OVlYje6fnBMTR#dnsSA6bt&1zTrOH6aKu5Px( zYaSD5c=q3w48z+}lBPrT4&Q2!I7>V??Za40B2!z}0_|x5yOM>rm!#GfUT@>{6v*z7 zDkVXaFJXWK)aRQRE?1HX@uA1>o7&>cP(1an0edvPLal{lYr&gkU zZMdJsI(!QyQ~e}-aEDK3v0hiXw7I4YVMe;K4j&7ASKA7zf~nHWGAQ~g8l2U7y;9EC z$ERjz*Ncmf%c_BRE#>JIxZNic?y4%LrSC6zvC3yq7C2IEy$;*BEb?j*<2644yI?NK zXiY$=ip*pu4d1Ij>F!1-Hyr5Ipag=?#iH#L#0b3W^_?+b`$5C)>9en}ujFTqJ z@oA3D^9rAKDuAn)=c*moaGg?oSxiwP!@bhaux>s_`wN!fb98m}ZlZ5&69aQ*ajd$y zGWHV&CtJ+^GN+@bT9c^}nW&0PwsAFnqQ9l5wZH8p-UBxAA*D_~g*|DRNx${$GaBE6 z+i+>vg-XWe1oR9#6M%d8q0x;F^l|N=i=Ovj487FX&u)GQc^tts22da?w=syjlyEtE z9DN*5oW9Kd+=q);z#{Dp;WTb=)=WJov4mx^c#4u=;wHH)(Arl#Z8KEh7IlIMS8xYk zle%xX>PFKmnrO0c*P>!!L1q%*t%CC4=L;|KlvI4n(L`#%Ff&PJMmI6_W5VkN(!tfh z^3zwpCqXfvRG$!)3E82<{ul!?&fOFAe}X>eaF~9ZF!oYw2TzLR%mjBJ!G{E&Wo%ni zWk@BaI~=m+k~jOD@4|F3#WeFng6Z>r#&nvP&d~B%+MgtjJTXoEFHFt2M>I`X#Tv&9 S{qXqLc#z-~2oYlg{eJ>4%f-h4 literal 0 HcmV?d00001 diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/pedidos.csv b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/pedidos.csv new file mode 100644 index 00000000..21e55498 --- /dev/null +++ b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/classes/pedidos.csv @@ -0,0 +1,17 @@ +CATEGORIA,PRODUTO,PRECO,QUANTIDADE,DATA,CLIENTE +INFORMÁTICA,Notebook Samsung,3523.00,1,01/01/2022,ANA +MÓVEIS,Sofá 3 lugares,2500.00,1,05/01/2022,ANA +LIVROS,Clean Architecture,102.90,2,08/01/2022,ANA +MÓVEIS,Mesa de jantar 6 lugares,3678.98,1,06/01/2022,ELI +CELULARES,iPhone 13 Pro,9176.00,6,13/01/2022,ANA +INFORMÁTICA,"Monitor Dell 27""",1889.00,3,04/01/2022,DANI +LIVROS,Implementing Domain-Driven Design,144.07,3,10/01/2022,GABI +AUTOMOTIVA,Jogo de pneus,1276.79,1,15/01/2022,BIA +LIVROS,Clean Code,95.17,1,09/01/2022,BIA +CELULARES,Galaxy S22 Ultra,8549.10,5,14/01/2022,DANI +INFORMÁTICA,Macbook Pro 16,31752.00,1,03/01/2022,CAIO +LIVROS,Refactoring Improving the Design of Existing Code,173.90,1,12/01/2022,DANI +MÓVEIS,Cama queen size,3100.00,2,07/01/2022,DANI +AUTOMOTIVA,Central multimidia,711.18,1,16/01/2022,CAIO +LIVROS,Building Microservices,300.28,2,11/01/2022,CAIO +INFORMÁTICA,Galaxy Tab S8,5939.10,4,02/01/2022,BIA \ No newline at end of file diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/test-classes/br/com/alura/comex/dao/CategoriaDaoTest.class b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/test-classes/br/com/alura/comex/dao/CategoriaDaoTest.class new file mode 100644 index 0000000000000000000000000000000000000000..73597ce50047bfdac044c480c318617ebf068759 GIT binary patch literal 810 zcma)(-AV#M6vxk~Y59?+l|%*Il?BZM^Z}s+fmoDye|8;gWZjY3+32;p3cBb4dZ_3> zB@%S8E$sQ4^Z)Ifvmc*t??iM#?K0&kU!p>lR;VbbG36(g5yumG8%$N`1QpM9tlg!c z{849AqE$hMft8_|Nsdy>K2pze%tm(Esfn?gdu)a(fws^!V{T2a$4;9V)V;p3 z6FE&W3+!AwWhKwG^cMwaE#xsL&axF$j&$O9XiyNeZ&kz&Q<w2pc2;ZpCVo?o^Sy~5?=Vq@hgcJ1UV|h`eTBm0$crQ zfUhAVTE}VbTYQ4d_x%x8ehI}wSVyDBHsFaivLW?MNHZJK%7nDCA?-}aW;SFu1A73*4%Mn*aa+ literal 0 HcmV?d00001 diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/test-classes/br/com/alura/comex/model/EstoqueTest.class b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/test-classes/br/com/alura/comex/model/EstoqueTest.class new file mode 100644 index 0000000000000000000000000000000000000000..cda15dd39b85b0b5de83806d4f780b3e53a9b600 GIT binary patch literal 952 zcma)(+e*Vg5Qb;d*4DJPwbg1xL`1{`xDVg~L==SJvGjhEEOkqgt()EAYk4Jj;REds0gkI%Zz8K!)IW`tAQ6ta@M8N( zAk}~l4UU3#Bs5o)jRdtuB$}xQ!;l&?J4y})_%6OincZ> zK)-|;Kpl1OxA_P&Tlc5YpKB!3#s(HzY!f}evKvx&LRxM}%L!?_Asr`V#SPhTLRQ_7 TEhnVohU_>X1lI5md9eNifh&i~ literal 0 HcmV?d00001 diff --git a/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/test-classes/br/com/alura/comex/model/PedidoTest.class b/Semana 8_Wander Carvalho/SEMANA 8_WANDER CARVALHO/target/test-classes/br/com/alura/comex/model/PedidoTest.class new file mode 100644 index 0000000000000000000000000000000000000000..37002010b90af7b236f26ab6bc07888da9e309c1 GIT binary patch literal 1771 zcma*n%We}f6b9hqG;KnfbV>@8(n1RnDo_b8SgD&#Bj<8Z9)a-lj!b60|y1pOnm%oyd>l zsZN8SrDw*P@IuhSgNLIAH3jv?UZ!p)RbF}(NBXmzxlHHsNM|Na%;mj0*?hpRM-WRku(cv%?v~g0}U}kz`3IptwwJxY& zoQ1VDaDF1EC3cT?Zi4nw&5exPi$qZoEl~a3XdAG%7J|PgO=OO|PMx48;upgXqQ|Ae zV>1;G*g@*@yn+0I3QAA|nQD|EHZ*g0po`Sm05C!B??`k Date: Wed, 15 May 2024 11:31:13 -0300 Subject: [PATCH 11/17] Create oi --- Semana 9_Wander Carvalho/oi | 1 + 1 file changed, 1 insertion(+) create mode 100644 Semana 9_Wander Carvalho/oi diff --git a/Semana 9_Wander Carvalho/oi b/Semana 9_Wander Carvalho/oi new file mode 100644 index 00000000..c09fc3cf --- /dev/null +++ b/Semana 9_Wander Carvalho/oi @@ -0,0 +1 @@ +oi From 3dc91c9ec646c03f2c26b5ba00e051310e7ed657 Mon Sep 17 00:00:00 2001 From: Wander Carvalho <138515773+Wander-samix@users.noreply.github.com> Date: Wed, 15 May 2024 11:31:45 -0300 Subject: [PATCH 12/17] Add files via upload --- Semana 9_Wander Carvalho/image.png | Bin 0 -> 204882 bytes Semana 9_Wander Carvalho/index.html | 61 ++++++++++++++++++++++++++++ Semana 9_Wander Carvalho/style.css | 41 +++++++++++++++++++ 3 files changed, 102 insertions(+) create mode 100644 Semana 9_Wander Carvalho/image.png create mode 100644 Semana 9_Wander Carvalho/index.html create mode 100644 Semana 9_Wander Carvalho/style.css diff --git a/Semana 9_Wander Carvalho/image.png b/Semana 9_Wander Carvalho/image.png new file mode 100644 index 0000000000000000000000000000000000000000..20d00e813c7f4207d9982ba29ab20f3b108ea143 GIT binary patch literal 204882 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 z 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 + + + + + Comex + + + + +
+
+

Home

+

Esta é a página inicial do projeto Comex. Aqui você encontra uma diversidade de produtos, entre eles, eletrônicos, eletrodomesticos e utilidades em geral”

+
+
+

Sobre Nós

+

Comex é uma empresa dedicada a fornecer soluções de comércio exterior. Nosso objetivo é facilitar a importação e exportação para empresas de todos os tamanhos.

+
+
+

Nossos Serviços

+
    +
  • Consultoria em Comércio Exterior
  • +
  • Despacho Aduaneiro
  • +
  • Logística Internacional
  • +
  • Compliance e Regulamentação
  • +
+
+
+

Contato

+
+ + +
+ + +
+ + +
+ +
+
+
+
+

© 2024 Comex. Todos os direitos reservados.

+

Endereço: Rua Teste, 123, Cidade, Estado, CEP 00000-000

+

Telefone: (00) 1234-5678

+
+ + diff --git a/Semana 9_Wander Carvalho/style.css b/Semana 9_Wander Carvalho/style.css new file mode 100644 index 00000000..4d4cf086 --- /dev/null +++ b/Semana 9_Wander Carvalho/style.css @@ -0,0 +1,41 @@ +body { + font-family: Arial, sans-serif; + margin: 0; + padding: 0; +} + +header { + background-color: #333; + color: white; + padding: 10px 0; + text-align: center; +} + +header nav ul { + list-style-type: none; + padding: 0; +} + +header nav ul li { + display: inline; + margin: 0 15px; +} + +header nav ul li a { + color: white; + text-decoration: none; +} + +main { + padding: 20px; +} + +footer { + background-color: #333; + color: white; + text-align: center; + padding: 10px 0; + position: fixed; + width: 100%; + bottom: 0; +} From bdcf71a2be32625b895b24309c333b3927100c51 Mon Sep 17 00:00:00 2001 From: Wander Carvalho <138515773+Wander-samix@users.noreply.github.com> Date: Wed, 22 May 2024 10:49:09 -0300 Subject: [PATCH 13/17] =?UTF-8?q?Create=20ol=C3=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "SEMANA 10_WANDER CARVALHO/ol\303\241" | 1 + 1 file changed, 1 insertion(+) create mode 100644 "SEMANA 10_WANDER CARVALHO/ol\303\241" diff --git "a/SEMANA 10_WANDER CARVALHO/ol\303\241" "b/SEMANA 10_WANDER CARVALHO/ol\303\241" new file mode 100644 index 00000000..b30aa6de --- /dev/null +++ "b/SEMANA 10_WANDER CARVALHO/ol\303\241" @@ -0,0 +1 @@ +olá From 6ad453031dc4740cf84dba2a0f58d4fd8734364d Mon Sep 17 00:00:00 2001 From: Wander Carvalho <138515773+Wander-samix@users.noreply.github.com> Date: Wed, 22 May 2024 10:54:23 -0300 Subject: [PATCH 14/17] Add files via upload --- .../SEMANA 10_WANDER CARVALHO.rar | Bin 0 -> 224469 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 SEMANA 10_WANDER CARVALHO/SEMANA 10_WANDER CARVALHO.rar diff --git a/SEMANA 10_WANDER CARVALHO/SEMANA 10_WANDER CARVALHO.rar b/SEMANA 10_WANDER CARVALHO/SEMANA 10_WANDER CARVALHO.rar new file mode 100644 index 0000000000000000000000000000000000000000..0ca5ed1f673727dd21b2bf8fc9cff5dc040f42d0 GIT binary patch literal 224469 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
@;q}f_9dXFVqh^y}@Y_AS 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

jf@R6|GR$tbaU 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%0D1o?Z25o^LxASdDXU9ul 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 oO8Sh_l>Twjs|_8wL7xX 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

nHj6 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�ODT*n>iOhxD{E3Q1 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 Qfi-#Pp{W834+r)C0J+`%^#A|> literal 0 HcmV?d00001 From 9f2c43a4bf3374d0ba4a172a17896bd7797ecf58 Mon Sep 17 00:00:00 2001 From: Wander Carvalho <138515773+Wander-samix@users.noreply.github.com> Date: Wed, 22 May 2024 10:56:00 -0300 Subject: [PATCH 15/17] Add files via upload --- SEMANA 10_WANDER CARVALHO/README.md | 13 + SEMANA 10_WANDER CARVALHO/pom.xml | 86 +++ .../br/com/alura/comex/ComexApplication.java | 12 + .../main/java/br/com/alura/comex/Main.java | 81 ++ .../br/com/alura/comex/ProcessadorDeCsv.java | 56 ++ .../comex/controller/BemVindoController.java | 13 + .../comex/controller/CategoriaController.java | 188 +++++ .../alura/comex/controller/ComexService.java | 53 ++ .../comex/controller/ComexServiceImpl.java | 9 + .../com/alura/comex/dao/CadastrarCliente.java | 133 ++++ .../comex/dao/CadastrarProdutoPedido.java | 690 ++++++++++++++++++ .../br/com/alura/comex/dao/CategoriaDao.java | 66 ++ .../com/alura/comex/dao/ClienteAlteraBd.java | 47 ++ .../br/com/alura/comex/dao/ClienteDao.java | 93 +++ .../br/com/alura/comex/dao/DeleteCliente.java | 59 ++ .../br/com/alura/comex/dao/EnderecoDao.java | 70 ++ .../comex/dao/GeralPedidoClienteProduto.java | 71 ++ .../alura/comex/dao/ImprimeDadosClientes.java | 38 + .../br/com/alura/comex/dao/PedidoDao.java | 51 ++ .../br/com/alura/comex/dao/ProdutoDao.java | 74 ++ .../com/alura/comex/dao/TestaPedidoDao.java | 33 + .../comex/dao/TodosProdutosCadastradosBd.java | 58 ++ .../br/com/alura/comex/model/Categoria.java | 46 ++ .../br/com/alura/comex/model/Cliente.java | 104 +++ .../br/com/alura/comex/model/Endereco.java | 89 +++ .../br/com/alura/comex/model/Estoque.java | 48 ++ .../br/com/alura/comex/model/ItemPedido.java | 97 +++ .../br/com/alura/comex/model/JsonCreator.java | 4 + .../java/br/com/alura/comex/model/Pedido.java | 102 +++ .../br/com/alura/comex/model/Produto.java | 114 +++ .../alura/comex/model/RelatorioCliente.java | 25 + .../com/alura/comex/model/TipoDesconto.java | 26 + .../comex/repository/CategoriaRepository.java | 30 + .../comex/repository/ClienteRepository.java | 28 + .../comex/repository/EnderecoRepository.java | 10 + .../repository/ItemPedidoRepository.java | 24 + .../repository/PageRequest/PageRequest.java | 4 + .../comex/repository/PedidoRepository.java | 14 + .../comex/repository/ProdutoRepository.java | 19 + .../comex/service/CadastrarProdutoPedido.java | 351 +++++++++ .../alura/comex/service/DataBaseService.java | 103 +++ .../alura/comex/service/EnderecoService.java | 18 + .../comex/service/ImprimeDadosClientes.java | 38 + .../service/TodosProdutosCadastradosBd.java | 58 ++ .../com/alura/comex/testes/ConsultaCep.java | 39 + .../alura/comex/testes/OrdenacaoPedido.java | 66 ++ .../alura/comex/testes/TestaPedidoDao.java | 201 +++++ .../comex/testes/TestaPedidoOrdenado.java | 68 ++ .../br/com/alura/comex/testes/TesteCep.java | 14 + .../com/alura/comex/testes/TesteProduto.java | 64 ++ .../main/resources/META-INF/persistence.xml | 39 + .../src/main/resources/application.properties | 9 + .../src/main/resources/pedidos.csv | 17 + .../com/alura/comex/dao/CategoriaDaoTest.java | 28 + .../br/com/alura/comex/model/EstoqueTest.java | 35 + .../br/com/alura/comex/model/PedidoTest.java | 76 ++ .../src/test/resources/pedidos.csv | 17 + 57 files changed, 4019 insertions(+) create mode 100644 SEMANA 10_WANDER CARVALHO/README.md create mode 100644 SEMANA 10_WANDER CARVALHO/pom.xml create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/ComexApplication.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/Main.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/ProcessadorDeCsv.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/BemVindoController.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/CategoriaController.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/ComexService.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/ComexServiceImpl.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/CadastrarCliente.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/CadastrarProdutoPedido.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/CategoriaDao.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/ClienteAlteraBd.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/ClienteDao.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/DeleteCliente.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/EnderecoDao.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/GeralPedidoClienteProduto.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/ImprimeDadosClientes.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/PedidoDao.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/ProdutoDao.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/TestaPedidoDao.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/TodosProdutosCadastradosBd.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Categoria.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Cliente.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Endereco.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Estoque.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/ItemPedido.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/JsonCreator.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Pedido.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Produto.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/RelatorioCliente.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/TipoDesconto.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/CategoriaRepository.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/ClienteRepository.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/EnderecoRepository.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/ItemPedidoRepository.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/PageRequest/PageRequest.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/PedidoRepository.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/ProdutoRepository.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/service/CadastrarProdutoPedido.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/service/DataBaseService.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/service/EnderecoService.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/service/ImprimeDadosClientes.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/service/TodosProdutosCadastradosBd.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/ConsultaCep.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/OrdenacaoPedido.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/TestaPedidoDao.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/TestaPedidoOrdenado.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/TesteCep.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/TesteProduto.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/resources/META-INF/persistence.xml create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/resources/application.properties create mode 100644 SEMANA 10_WANDER CARVALHO/src/main/resources/pedidos.csv create mode 100644 SEMANA 10_WANDER CARVALHO/src/test/java/br/com/alura/comex/dao/CategoriaDaoTest.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/test/java/br/com/alura/comex/model/EstoqueTest.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/test/java/br/com/alura/comex/model/PedidoTest.java create mode 100644 SEMANA 10_WANDER CARVALHO/src/test/resources/pedidos.csv diff --git a/SEMANA 10_WANDER CARVALHO/README.md b/SEMANA 10_WANDER CARVALHO/README.md new file mode 100644 index 00000000..cb743333 --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/README.md @@ -0,0 +1,13 @@ +# Comex + +## Informações gerais dos pedidos em _pedidos.csv_ +- Campos: **CATEGORIA, PRODUTO, PREÇO, QUANTIDADE, DATA, CLIENTE** + + +### RELATÓRIO DE VALORES TOTAIS +- TOTAL DE PEDIDOS REALIZADOS: 16 +- TOTAL DE PRODUTOS VENDIDOS: 35 +- TOTAL DE CATEGORIAS: 5 +- MONTANTE DE VENDAS: R$ 178.374,49 +- PEDIDO MAIS BARATO: R$ 95,17 (Clean Code) +- PEDIDO MAIS CARO: R$ 55.056,00 (iPhone 13 Pro) diff --git a/SEMANA 10_WANDER CARVALHO/pom.xml b/SEMANA 10_WANDER CARVALHO/pom.xml new file mode 100644 index 00000000..ec2f9c32 --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/pom.xml @@ -0,0 +1,86 @@ + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 3.1.1 + + + + br.com.alura + comex + 0.0.1-SNAPSHOT + comex + Demo project for Spring Boot + + + 17 + 17 + 17 + + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.boot + spring-boot-starter-validation + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + + com.fasterxml.jackson.core + jackson-databind + + + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + + + + + com.google.code.gson + gson + + + + + com.oracle.database.jdbc + ojdbc8 + 23.3.0.23.09 + + + + + org.junit.jupiter + junit-jupiter + 5.8.2 + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/ComexApplication.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/ComexApplication.java new file mode 100644 index 00000000..df7dcab0 --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/ComexApplication.java @@ -0,0 +1,12 @@ +package br.com.alura.comex; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ComexApplication { + + public static void main(String[] args) { + SpringApplication.run(ComexApplication.class, args); + } +} diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/Main.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/Main.java new file mode 100644 index 00000000..0cd05711 --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/Main.java @@ -0,0 +1,81 @@ +//package br.com.alura.comex; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.net.URISyntaxException; +import java.text.NumberFormat; +import java.util.Arrays; +import java.util.Locale; + +//public class Main { +// +// private static final Logger logger = LoggerFactory.getLogger(Main.class); +// +// public static void main(String[] args) throws IOException, URISyntaxException { +// Pedido[] pedidos = ProcessadorDeCsv.processaArquivo("pedidos.csv"); +// +// int totalDeProdutosVendidos = 0; +// int totalDePedidosRealizados = 0; +// BigDecimal montanteDeVendas = BigDecimal.ZERO; +// Pedido pedidoMaisBarato = null; +// Pedido pedidoMaisCaro = null; +// +// String[] categoriasProcessadas = new String[10]; +// int totalDeCategorias = 0; +// +// for (int i = 0; i < pedidos.length; i++) { +// Pedido pedidoAtual = pedidos[i]; +// +// if (pedidoAtual == null) { +// break; +// } +// +// if (pedidoMaisBarato == null || pedidoAtual.getPreco().multiply(new BigDecimal(pedidoAtual.getQuantidade())).compareTo(pedidoMaisBarato.getPreco().multiply(new BigDecimal(pedidoMaisBarato.getQuantidade()))) < 0) { +// pedidoMaisBarato = pedidoAtual; +// } +// +// if (pedidoMaisCaro == null || pedidoAtual.getPreco().multiply(new BigDecimal(pedidoAtual.getQuantidade())).compareTo(pedidoMaisCaro.getPreco().multiply(new BigDecimal(pedidoMaisCaro.getQuantidade()))) > 0) { +// pedidoMaisCaro = pedidoAtual; +// } +// +// montanteDeVendas = montanteDeVendas.add(pedidoAtual.getPreco().multiply(new BigDecimal(pedidoAtual.getQuantidade()))); +// totalDeProdutosVendidos += pedidoAtual.getQuantidade(); +// totalDePedidosRealizados++; +// +// boolean jahProcessouCategoria = false; +// for (int j = 0; j < categoriasProcessadas.length; j++) { +// if (pedidoAtual.getCategoria().equalsIgnoreCase(categoriasProcessadas[j])) { +// jahProcessouCategoria = true; +// } +// } +// +// if (!jahProcessouCategoria) { +// totalDeCategorias++; +// +// if (categoriasProcessadas[categoriasProcessadas.length - 1] != null) { +// categoriasProcessadas = Arrays.copyOf(categoriasProcessadas, categoriasProcessadas.length * 2); +// } else { +// for (int k = 0; k < categoriasProcessadas.length; k++) { +// if (categoriasProcessadas[k] == null) { +// categoriasProcessadas[k] = pedidoAtual.getCategoria(); +// break; +// } +// } +// } +// } +// } +// +// logger.info("##### RELATÓRIO DE VALORES TOTAIS #####"); +// logger.info("TOTAL DE PEDIDOS REALIZADOS: {}", totalDePedidosRealizados); +// logger.info("TOTAL DE PRODUTOS VENDIDOS: {}", totalDeProdutosVendidos); +// logger.info("TOTAL DE CATEGORIAS: {}", totalDeCategorias); +// logger.info("MONTANTE DE VENDAS: {}", NumberFormat.getCurrencyInstance(new Locale("pt", "BR")).format(montanteDeVendas.setScale(2, RoundingMode.HALF_DOWN))); +// logger.info("PEDIDO MAIS BARATO: {} ({})", NumberFormat.getCurrencyInstance(new Locale("pt", "BR")).format(pedidoMaisBarato.getPreco().multiply(new BigDecimal(pedidoMaisBarato.getQuantidade())).setScale(2, RoundingMode.HALF_DOWN)), pedidoMaisBarato.getProduto()); +// logger.info("PEDIDO MAIS CARO: {} ({})\n", NumberFormat.getCurrencyInstance(new Locale("pt", "BR")).format(pedidoMaisCaro.getPreco().multiply(new BigDecimal(pedidoMaisCaro.getQuantidade())).setScale(2, RoundingMode.HALF_DOWN)), pedidoMaisCaro.getProduto()); +// logger.info("### FIM DO RELATÓRIO ###"); +// } +//} \ No newline at end of file diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/ProcessadorDeCsv.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/ProcessadorDeCsv.java new file mode 100644 index 00000000..ea0b3676 --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/ProcessadorDeCsv.java @@ -0,0 +1,56 @@ +package br.com.alura.comex; + +import br.com.alura.comex.model.Pedido; + +import java.io.IOException; +import java.math.BigDecimal; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.Path; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.Arrays; +import java.util.Scanner; + +public class ProcessadorDeCsv { + + public static Pedido[] processaArquivo(String nomeDoArquivo) { + try { + URL recursoCSV = ClassLoader.getSystemResource(nomeDoArquivo); + Path caminhoDoArquivo = caminhoDoArquivo = Path.of(recursoCSV.toURI()); + + Scanner leitorDeLinhas = new Scanner(caminhoDoArquivo); + + leitorDeLinhas.nextLine(); + + Pedido[] pedidos = new Pedido[10]; + + int quantidadeDeRegistros = 0; + while (leitorDeLinhas.hasNextLine()) { + String linha = leitorDeLinhas.nextLine(); + String[] registro = linha.split(","); + + String categoria = registro[0]; + String produto = registro[1]; + BigDecimal preco = new BigDecimal(registro[2]); + int quantidade = Integer.parseInt(registro[3]); + LocalDate data = LocalDate.parse(registro[4], DateTimeFormatter.ofPattern("dd/MM/yyyy")); + String cliente = registro[5]; + + Pedido pedido = Pedido.createPedido(categoria, produto, cliente, preco, quantidade, data); + pedidos[quantidadeDeRegistros] = pedido; + + quantidadeDeRegistros++; + if (pedidos[pedidos.length - 1] != null) { + pedidos = Arrays.copyOf(pedidos, pedidos.length * 2); + } + } + + return pedidos; + } catch (URISyntaxException e) { + throw new RuntimeException(String.format("Arquivo {} não localizado!", nomeDoArquivo)); + } catch (IOException e) { + throw new RuntimeException("Erro ao abrir Scanner para processar arquivo!"); + } + } +} \ No newline at end of file diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/BemVindoController.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/BemVindoController.java new file mode 100644 index 00000000..57c36ad5 --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/BemVindoController.java @@ -0,0 +1,13 @@ +package br.com.alura.comex.controller; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class BemVindoController { + @RequestMapping ("/api/bemvindo") + public String bemvindo(){ + return "Bem-vindo ao sistema Comex, será que funciona"; + } + +} diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/CategoriaController.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/CategoriaController.java new file mode 100644 index 00000000..11ecfc5e --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/CategoriaController.java @@ -0,0 +1,188 @@ +package br.com.alura.comex.controller; + +import br.com.alura.comex.repository.CategoriaRepository; +import br.com.alura.comex.model.Categoria; +import org.springframework.data.domain.Example; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.data.repository.query.FluentQuery; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.Optional; +import java.util.function.Function; + +@RestController +public class CategoriaController { + + @RequestMapping("/categoria") + public void cadastra(String nomeDaCategoria) { + System.out.println("Estou cadastrando uma nova categoria: " + nomeDaCategoria); + Categoria novaCategoria = new Categoria(nomeDaCategoria); + CategoriaRepository categoria = new CategoriaRepository() { + @Override + public Categoria findByNome(String nome) { + return null; + } + + @Override + public List relatorioDeVendasPorCategoria() { + return List.of(); + } + + @Override + public void flush() { + + } + + @Override + public S saveAndFlush(S entity) { + return null; + } + + @Override + public List saveAllAndFlush(Iterable entities) { + return List.of(); + } + + @Override + public void deleteAllInBatch(Iterable entities) { + + } + + @Override + public void deleteAllByIdInBatch(Iterable longs) { + + } + + @Override + public void deleteAllInBatch() { + + } + + @Override + public Categoria getOne(Long aLong) { + return null; + } + + @Override + public Categoria getById(Long aLong) { + return null; + } + + @Override + public Categoria getReferenceById(Long aLong) { + return null; + } + + @Override + public List findAll(Example example) { + return List.of(); + } + + @Override + public List findAll(Example example, Sort sort) { + return List.of(); + } + + @Override + public List saveAll(Iterable entities) { + return List.of(); + } + + @Override + public List findAll() { + return List.of(); + } + + @Override + public List findAllById(Iterable longs) { + return List.of(); + } + + @Override + public S save(S entity) { + return null; + } + + @Override + public Optional findById(Long aLong) { + return Optional.empty(); + } + + @Override + public boolean existsById(Long aLong) { + return false; + } + + @Override + public long count() { + return 0; + } + + @Override + public void deleteById(Long aLong) { + + } + + @Override + public void delete(Categoria entity) { + + } + + @Override + public void deleteAllById(Iterable longs) { + + } + + @Override + public void deleteAll(Iterable entities) { + + } + + @Override + public void deleteAll() { + + } + + @Override + public List findAll(Sort sort) { + return List.of(); + } + + @Override + public Page findAll(Pageable pageable) { + return null; + } + + @Override + public Optional findOne(Example example) { + return Optional.empty(); + } + + @Override + public Page findAll(Example example, Pageable pageable) { + return null; + } + + @Override + public long count(Example example) { + return 0; + } + + @Override + public boolean exists(Example example) { + return false; + } + + @Override + public R findBy(Example example, Function, R> queryFunction) { + return null; + } + }; + CategoriaRepository.cadastrar(novaCategoria); + } + +} \ No newline at end of file diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/ComexService.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/ComexService.java new file mode 100644 index 00000000..9108a639 --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/ComexService.java @@ -0,0 +1,53 @@ +package br.com.alura.comex.controller; + +import br.com.alura.comex.dao.ClienteDao; +import br.com.alura.comex.dao.PedidoDao; +import br.com.alura.comex.dao.ProdutoDao; +import br.com.alura.comex.model.Cliente; +import br.com.alura.comex.model.Pedido; +import br.com.alura.comex.model.Produto; +import javax.persistence.EntityManager; +import java.util.List; + +import javax.persistence.EntityManager; +import java.util.List; + +public class ComexService { + private ClienteDao clienteDao; + private PedidoDao pedidoDao; + private ProdutoDao produtoDao; + + public ComexService(EntityManager em) { + this.clienteDao = new ClienteDao(em); + this.pedidoDao = new PedidoDao(em); + this.produtoDao = new ProdutoDao(em); + } + + public void cadastrarCliente(Cliente cliente) { + clienteDao.salvar(cliente); + } + + public void cadastrarPedido(Pedido pedido) { + pedidoDao.salvar(pedido); + // Correção: Usando o método correto para obter os itens do pedido + pedido.getItensPedidos().forEach(item -> { + produtoDao.atualizarEstoque(item.getProduto(), -item.getQuantidade()); + }); + } + + public void cadastrarProduto(Produto produto) { + produtoDao.salvar(produto); + } + + public List listarClientes() { + return clienteDao.buscarTodos(); + } + + public List listarPedidos() { + return pedidoDao.buscarTodos(); + } + + public List listarProdutos() { + return produtoDao.buscarTodos(); + } +} diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/ComexServiceImpl.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/ComexServiceImpl.java new file mode 100644 index 00000000..0e590937 --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/ComexServiceImpl.java @@ -0,0 +1,9 @@ +package br.com.alura.comex.controller; + +import javax.persistence.EntityManager; + +public class ComexServiceImpl extends ComexService { + public ComexServiceImpl(EntityManager em) { + super(em); + } +} diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/CadastrarCliente.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/CadastrarCliente.java new file mode 100644 index 00000000..b6f378b2 --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/CadastrarCliente.java @@ -0,0 +1,133 @@ +package br.com.alura.comex.dao; + +import br.com.alura.comex.model.Cliente; +import br.com.alura.comex.model.Endereco; +import br.com.alura.comex.testes.ConsultaCep; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; +import java.util.Scanner; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.LoggerContext; + +import static javax.persistence.Persistence.createEntityManagerFactory; + +public class CadastrarCliente { + + private static Scanner scanner; + private static final Logger logger = LoggerFactory.getLogger(CadastrarCliente.class); + + public static void main(String[] args) { + EntityManagerFactory factory = createEntityManagerFactory("oracle"); + EntityManager entityManager = factory.createEntityManager(); + setScanner(new Scanner(System.in)); + + try { + setLoggingLevel(Level.ERROR); // Reduz o nível de log antes da interação com o usuário + + System.out.println("Digite 'sair' a qualquer momento para terminar o programa."); + String cep = getRequiredInput("Por favor, insira o CEP para consulta:"); + Endereco endereco = new ConsultaCep().consultaCep(cep); + + if (endereco == null) { + logger.error("Não foi possível encontrar o endereço para o CEP fornecido."); + return; + } + + Cliente cliente = getClienteData(endereco); + if (cliente != null) { + logger.info("Informações do cliente antes da persistência: {}", cliente); + logger.info("Informações do endereço antes da persistência: {}", endereco); + + entityManager.getTransaction().begin(); + entityManager.persist(endereco); + cliente.setEndereco(endereco); + entityManager.persist(cliente); + entityManager.getTransaction().commit(); + logger.info("Cliente cadastrado com sucesso: {}", cliente); + } else { + logger.error("Falha ao criar dados do cliente. Cliente retornou nulo."); + } + } catch (Exception e) { + logger.error("Ocorreu uma exceção: ", e); + if (entityManager.getTransaction().isActive()) { + entityManager.getTransaction().rollback(); + } + } finally { + getScanner().close(); + if (entityManager.isOpen()) { + entityManager.close(); + } + if (factory.isOpen()) { + factory.close(); + } + setLoggingLevel(Level.DEBUG); // Restaura o nível de log após a interação + } + } + + private static Cliente getClienteData(Endereco endereco) { + String nomeCliente = getRequiredInput("Por favor, insira o nome do cliente:"); + if (nomeCliente.isEmpty()) { + logger.error("O nome do cliente é obrigatório e não foi fornecido."); + return null; + } + String cpf = getRequiredInput("Por favor, insira o CPF do cliente:"); + String email = getEmailInput(); + String profissao = getRequiredInput("Por favor, insira a profissão do cliente:"); + String telefone = getRequiredInput("Por favor, insira o telefone do cliente:"); + endereco.setNumero(getRequiredInput("Por favor, insira o número do imóvel:")); + endereco.setComplemento(getInput("Por favor, insira o complemento do imóvel (opcional):")); + + return new Cliente(nomeCliente, cpf, email, profissao, telefone, endereco); + } + + private static String getRequiredInput(String prompt) { + System.out.println(prompt); + String input = getScanner().nextLine(); + if ("sair".equalsIgnoreCase(input)) { + System.out.println("Programa encerrado."); + System.exit(0); + } + if (input.trim().isEmpty()) { + System.out.println("Este campo é obrigatório. Por favor, forneça um valor."); + return getRequiredInput(prompt); + } + return input; + } + + private static String getInput(String prompt) { + System.out.println(prompt); + return getScanner().nextLine(); + } + + private static String getEmailInput() { + String email = getRequiredInput("Por favor, insira o email do cliente:"); + if (!isValidEmail(email)) { + System.out.println("Email inválido. Por favor, insira um email válido."); + return getEmailInput(); + } + return email; + } + + private static boolean isValidEmail(String email) { + return email.matches("^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(\\[?)(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}(\\]?)$"); + } + + private static void setLoggingLevel(Level newLevel) { + LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); + ch.qos.logback.classic.Logger rootLogger = loggerContext.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME); + rootLogger.setLevel(newLevel); + } + + public static Scanner getScanner() { + return scanner; + } + + public static void setScanner(Scanner scanner) { + CadastrarCliente.scanner = scanner; + } +} diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/CadastrarProdutoPedido.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/CadastrarProdutoPedido.java new file mode 100644 index 00000000..771afb45 --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/CadastrarProdutoPedido.java @@ -0,0 +1,690 @@ +//package br.com.alura.comex.dao; +// +//import br.com.alura.comex.model.*; +//import br.com.alura.comex.testes.ConsultaCep; +//import javax.persistence.EntityManager; +//import javax.persistence.EntityManagerFactory; +//import javax.persistence.NoResultException; +//import javax.persistence.TypedQuery; +//import javax.persistence.Query; +//import java.math.BigDecimal; +//import java.time.LocalDate; +//import java.util.List; +//import java.util.Scanner; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +//import ch.qos.logback.classic.Level; +//import ch.qos.logback.classic.LoggerContext; +//import static javax.persistence.Persistence.createEntityManagerFactory; +// +//public class CadastrarProdutoPedido { +// +// private static Scanner scanner; +// private static final Logger logger = LoggerFactory.getLogger(CadastrarProdutoPedido.class); +// +// public static void main(String[] args) { +// EntityManagerFactory factory = createEntityManagerFactory("oracle"); +// EntityManager entityManager = factory.createEntityManager(); +// setScanner(new Scanner(System.in)); +// +// try { +// setLoggingLevel(Level.ERROR); // Reduz o nível de log antes da interação com o usuário +// +// System.out.println("Digite 'sair' a qualquer momento para terminar o programa."); +// +// boolean running = true; +// while (running) { +// System.out.println("Selecione uma opção:"); +// System.out.println("1. Cadastrar nova compra"); +// System.out.println("2. Consultar compras de um cliente específico"); +// System.out.println("3. Consultar compras de todos os clientes"); +// System.out.println("4. Exibir o cliente mais fiel"); +// System.out.println("5. Sair"); +// String option = getRequiredInput("Opção:"); +// +// switch (option) { +// case "1": +// cadastrarNovaCompra(entityManager); +// break; +// case "2": +// consultarComprasCliente(entityManager); +// break; +// case "3": +// consultarComprasTodosClientes(entityManager); +// break; +// case "4": +// exibirClienteMaisFiel(entityManager); +// break; +// case "5": +// running = false; +// break; +// default: +// System.out.println("Opção inválida. Por favor, tente novamente."); +// } +// } +// } catch (Exception e) { +// logger.error("Ocorreu uma exceção: ", e); +// if (entityManager.getTransaction().isActive()) { +// entityManager.getTransaction().rollback(); +// } +// } finally { +// getScanner().close(); +// if (entityManager.isOpen()) { +// entityManager.close(); +// } +// if (factory.isOpen()) { +// factory.close(); +// } +// setLoggingLevel(Level.DEBUG); // Restaura o nível de log após a interação +// } +// } +// +// private static void cadastrarNovaCompra(EntityManager entityManager) { +// try { +// listarClientesCadastrados(entityManager); +// String cpf = getRequiredInput("Por favor, insira o CPF do cliente:"); +// Cliente cliente = buscarClientePorCpf(entityManager, cpf); +// Categoria categoria = getCategoriaData(entityManager); +// Produto produto = getProdutoData(categoria); +// Pedido pedido = getPedidoData(entityManager, cliente, cpf); +// if (pedido != null && produto != null) { +// ItemPedido itemPedido = new ItemPedido(produto, 2, produto.getPrecoUnitario(), TipoDesconto.NENHUM, pedido); +// entityManager.getTransaction().begin(); +// entityManager.persist(itemPedido); +// pedido.adicionarItem(itemPedido); +// entityManager.merge(pedido); +// entityManager.getTransaction().commit(); +// logger.info("Item do pedido cadastrado com sucesso: {}", itemPedido); +// } +// gerarRelatorio(entityManager); +// } catch (Exception e) { +// logger.error("Ocorreu uma exceção: ", e); +// if (entityManager.getTransaction().isActive()) { +// entityManager.getTransaction().rollback(); +// } +// } +// } +// +// private static void listarClientesCadastrados(EntityManager entityManager) { +// List clientes = entityManager.createQuery("SELECT c FROM Cliente c", Cliente.class).getResultList(); +// System.out.println("Clientes já cadastrados:"); +// clientes.stream().forEach(cliente -> System.out.println(cliente.getCpf() + " - " + cliente.getNome())); +// System.out.println("-------------------------------------------------"); +// } +// +// private static Categoria getCategoriaData(EntityManager entityManager) { +// String nomeCategoria = getRequiredInput("Por favor, insira o nome da categoria:"); +// Categoria categoria = new Categoria(nomeCategoria); +// entityManager.getTransaction().begin(); +// entityManager.persist(categoria); +// entityManager.getTransaction().commit(); +// return categoria; +// } +// +// private static Produto getProdutoData(Categoria categoria) { +// String nomeProduto = getRequiredInput("Por favor, insira o nome do produto:"); +// String descricao = getRequiredInput("Por favor, insira a descrição do produto:"); +// BigDecimal precoUnitario = new BigDecimal(getRequiredInput("Por favor, insira o preço unitário do produto:")); +// int quantidade = Integer.parseInt(getRequiredInput("Por favor, insira a quantidade do produto:")); +// return new Produto(nomeProduto, descricao, precoUnitario, quantidade, categoria); +// } +// +// private static Pedido getPedidoData(EntityManager entityManager, Cliente cliente, String cpf) { +// if (cliente == null) { +// System.out.println("Cliente não encontrado. Iniciando cadastro..."); +// String cep = getRequiredInput("Por favor, insira o CEP para consulta:"); +// Endereco endereco = new ConsultaCep().consultaCep(cep); +// if (endereco == null) { +// logger.error("Não foi possível encontrar o endereço para o CEP fornecido."); +// return null; +// } +// endereco.setNumero(getRequiredInput("Por favor, insira o número do imóvel:")); +// endereco.setComplemento(getInput("Por favor, insira o complemento do imóvel (opcional):")); +// cliente = getClienteData(endereco, cpf); +// if (cliente != null) { +// entityManager.getTransaction().begin(); +// entityManager.persist(endereco); +// cliente.setEndereco(endereco); +// entityManager.persist(cliente); +// entityManager.getTransaction().commit(); +// } else { +// logger.error("Falha ao criar dados do cliente. Cliente retornou nulo."); +// return null; +// } +// } +// LocalDate data = LocalDate.now(); +// TipoDesconto tipoDesconto = TipoDesconto.NENHUM; +// return new Pedido(cliente, data, tipoDesconto); +// } +// +// private static Cliente buscarClientePorCpf(EntityManager entityManager, String cpf) { +// try { +// TypedQuery query = entityManager.createQuery("SELECT c FROM Cliente c WHERE c.cpf = :cpf", Cliente.class); +// query.setParameter("cpf", cpf); +// return query.getSingleResult(); +// } catch (NoResultException e) { +// return null; +// } +// } +// +// private static Cliente getClienteData(Endereco endereco, String cpf) { +// String nomeCliente = getRequiredInput("Por favor, insira o nome do cliente:"); +// String email = getEmailInput(); +// String profissao = getRequiredInput("Por favor, insira a profissão do cliente:"); +// String telefone = getRequiredInput("Por favor, insira o telefone do cliente:"); +// return new Cliente(nomeCliente, cpf, email, profissao, telefone, endereco); +// } +// +// private static void consultarComprasCliente(EntityManager entityManager) { +// String cpf = getRequiredInput("Por favor, insira o CPF do cliente:"); +// Cliente cliente = buscarClientePorCpf(entityManager, cpf); +// if (cliente == null) { +// System.out.println("Cliente não encontrado."); +// return; +// } +// List pedidos = entityManager.createQuery("SELECT p FROM Pedido p WHERE p.cliente = :cliente", Pedido.class) +// .setParameter("cliente", cliente) +// .getResultList(); +// +// pedidos.stream().forEach(pedido -> { +// System.out.println("-------------------------------------------------------------------------"); +// System.out.println("Histórico de compras do cliente " + cliente.getNome() + " (" + cliente.getCpf() + "):"); +// System.out.println("-------------------------------------------------------------------------"); +// System.out.printf("Pedido ID: %-5d | Data: %-10s | Total: %-10.2f\n", pedido.getId(), pedido.getData(), pedido.getValorTotal()); +// System.out.println("Itens do Pedido:"); +// System.out.println("Produto Quantidade Valor Montante Vendido "); +// pedido.getItensPedidos().stream().forEach(item -> System.out.printf("%-30s %-10d %-15.2f %-15.2f\n", +// item.getNomeProduto(), item.getQuantidade(), item.getPrecoUnitario(), item.calcularValorTotal())); +// }); +// System.out.println("-------------------------------------------------------------------------"); +// } +// +// private static void consultarComprasTodosClientes(EntityManager entityManager) { +// List clientes = entityManager.createQuery("SELECT c FROM Cliente c", Cliente.class).getResultList(); +// System.out.println("-------------------------------------------------------------------------"); +// System.out.println("Relatório de compras de todos os clientes:"); +// clientes.stream().forEach(cliente -> { +// System.out.println("-------------------------------------------------------------------------"); +// System.out.println("Cliente: " + cliente.getNome()); +// List pedidos = entityManager.createQuery("SELECT p FROM Pedido p WHERE p.cliente = :cliente", Pedido.class) +// .setParameter("cliente", cliente) +// .getResultList(); +// pedidos.stream().forEach(pedido -> { +// System.out.println("Pedido ID: " + pedido.getId() + " | Data: " + pedido.getData() + " | Total: " + pedido.getValorTotal()); +// System.out.println("Itens do Pedido:"); +// System.out.println("Produto Quantidade Valor Montante Vendido "); +// pedido.getItensPedidos().stream().forEach(item -> System.out.printf("%-30s %-10d %-15.2f %-15.2f\n", +// item.getNomeProduto(), item.getQuantidade(), item.getPrecoUnitario(), item.calcularValorTotal())); +// }); +// System.out.println("-------------------------------------------------------------------------"); +// }); +// } +// +// private static void exibirClienteMaisFiel(EntityManager entityManager) { +// try { +// Query query = entityManager.createQuery( +// "SELECT c.id, COUNT(p.id) AS totalPedidos " + +// "FROM Pedido p " + +// "JOIN p.cliente c " + +// "GROUP BY c.id " + +// "ORDER BY totalPedidos DESC" +// ); +// query.setMaxResults(1); +// Object[] resultado = (Object[]) query.getSingleResult(); +// Long clienteId = (Long) resultado[0]; +// Long totalPedidos = (Long) resultado[1]; +// Cliente cliente = entityManager.find(Cliente.class, clienteId); +// System.out.println("-------------------------------------------------------------------------"); +// System.out.println("Cliente mais fiel:"); +// System.out.printf("%-30s %-20s\n", "Cliente", "Total de Pedidos"); +// System.out.printf("%-30s %-20d\n", cliente.getNome(), totalPedidos); +// System.out.println("-------------------------------------------------------------------------"); +// } catch (NoResultException e) { +// System.out.println("Nenhum cliente encontrado."); +// } +// } +// +// private static void gerarRelatorio(EntityManager entityManager) { +// List resultados = entityManager.createQuery( +// "SELECT c.nome, COUNT(ip), SUM(ip.quantidade * ip.precoUnitario) " + +// "FROM ItemPedido ip " + +// "JOIN ip.produto p " + +// "JOIN p.categoria c " + +// "GROUP BY c.nome", Object[].class) +// .getResultList(); +// System.out.println("-------------------------------------------------------------------------"); +// System.out.println("Categoria Produtos Vendidos Montante Vendido "); +// resultados.stream().forEach(resultado -> { +// String nomeCategoria = (String) resultado[0]; +// Long produtosVendidos = (Long) resultado[1]; +// BigDecimal montanteVendido = (BigDecimal) resultado[2]; +// System.out.printf("%-30s %-20s %-20s\n", nomeCategoria, produtosVendidos, montanteVendido); +// }); +// System.out.println("-------------------------------------------------------------------------"); +// } +// +// private static String getRequiredInput(String prompt) { +// System.out.println(prompt); +// String input = getScanner().nextLine(); +// if ("sair".equalsIgnoreCase(input)) { +// System.out.println("Programa encerrado."); +// System.exit(0); +// } +// if (input.trim().isEmpty()) { +// System.out.println("Este campo é obrigatório. Por favor, forneça um valor."); +// return getRequiredInput(prompt); +// } +// return input; +// } +// +// private static String getInput(String prompt) { +// System.out.println(prompt); +// return getScanner().nextLine(); +// } +// +// private static String getEmailInput() { +// String email = getRequiredInput("Por favor, insira o email do cliente:"); +// if (!isValidEmail(email)) { +// System.out.println("Email inválido. Por favor, insira um email válido."); +// return getEmailInput(); +// } +// return email; +// } +// +// private static boolean isValidEmail(String email) { +// return email.matches("[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}"); +// } +// +// private static Scanner getScanner() { +// return scanner; +// } +// +// private static void setScanner(Scanner scanner) { +// CadastrarProdutoPedido.scanner = scanner; +// } +// +// private static void setLoggingLevel(Level level) { +// LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); +// loggerContext.getLogger("org.hibernate").setLevel(level); +// loggerContext.getLogger("org.springframework").setLevel(level); +// } +//} + +package br.com.alura.comex.dao; + +import br.com.alura.comex.model.*; +import br.com.alura.comex.testes.ConsultaCep; +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.NoResultException; +import javax.persistence.TypedQuery; +import javax.persistence.Query; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.YearMonth; +import java.time.format.DateTimeFormatter; +import java.util.List; +import java.util.Scanner; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.LoggerContext; +import static javax.persistence.Persistence.createEntityManagerFactory; + +public class CadastrarProdutoPedido { + + private static Scanner scanner; + private static final Logger logger = LoggerFactory.getLogger(CadastrarProdutoPedido.class); + + public static void main(String[] args) { + EntityManagerFactory factory = createEntityManagerFactory("oracle"); + EntityManager entityManager = factory.createEntityManager(); + setScanner(new Scanner(System.in)); + + try { + setLoggingLevel(Level.ERROR); // Reduz o nível de log antes da interação com o usuário + + System.out.println("Digite 'sair' a qualquer momento para terminar o programa."); + + boolean running = true; + while (running) { + System.out.println("Selecione uma opção:"); + System.out.println("1. Cadastrar nova compra"); + System.out.println("2. Consultar compras de um cliente específico"); + System.out.println("3. Consultar compras de todos os clientes"); + System.out.println("4. Exibir o cliente mais fiel"); + System.out.println("5. Relatório de total de clientes ativos e total vendido no mês"); + System.out.println("6. Sair"); + String option = getRequiredInput("Opção:"); + + switch (option) { + case "1": + cadastrarNovaCompra(entityManager); + break; + case "2": + consultarComprasCliente(entityManager); + break; + case "3": + consultarComprasTodosClientes(entityManager); + break; + case "4": + exibirClienteMaisFiel(entityManager); + break; + case "5": + gerarRelatorioClientesAtivosEVendas(entityManager); + break; + case "6": + running = false; + break; + default: + System.out.println("Opção inválida. Por favor, tente novamente."); + } + } + } catch (Exception e) { + logger.error("Ocorreu uma exceção: ", e); + if (entityManager.getTransaction().isActive()) { + entityManager.getTransaction().rollback(); + } + } finally { + getScanner().close(); + if (entityManager.isOpen()) { + entityManager.close(); + } + if (factory.isOpen()) { + factory.close(); + } + setLoggingLevel(Level.DEBUG); // Restaura o nível de log após a interação + } + } + + private static void cadastrarNovaCompra(EntityManager entityManager) { + try { + listarClientesCadastrados(entityManager); + String cpf = getRequiredInput("Por favor, insira o CPF do cliente:"); + Cliente cliente = buscarClientePorCpf(entityManager, cpf); + Categoria categoria = getCategoriaData(entityManager); + Produto produto = getProdutoData(categoria); + + // Persistir o produto antes de criar o ItemPedido + entityManager.getTransaction().begin(); + entityManager.persist(produto); + entityManager.getTransaction().commit(); + + Pedido pedido = getPedidoData(entityManager, cliente, cpf); + + // Persistir o pedido antes de criar o ItemPedido + entityManager.getTransaction().begin(); + entityManager.persist(pedido); + entityManager.getTransaction().commit(); + + if (pedido != null && produto != null) { + int quantidadeItens = Integer.parseInt(getRequiredInput("Por favor, insira a quantidade de itens para o pedido:")); + ItemPedido itemPedido = new ItemPedido(produto, quantidadeItens, produto.getPrecoUnitario(), TipoDesconto.NENHUM, pedido); + entityManager.getTransaction().begin(); + entityManager.persist(itemPedido); + pedido.adicionarItem(itemPedido); + entityManager.merge(pedido); + entityManager.getTransaction().commit(); + logger.info("Item do pedido cadastrado com sucesso: {}", itemPedido); + } + gerarRelatorio(entityManager); + } catch (Exception e) { + logger.error("Ocorreu uma exceção: ", e); + if (entityManager.getTransaction().isActive()) { + entityManager.getTransaction().rollback(); + } + } + } + + private static void listarClientesCadastrados(EntityManager entityManager) { + List clientes = entityManager.createQuery("SELECT c FROM Cliente c", Cliente.class).getResultList(); + System.out.println("-------------------------------------------------"); + System.out.println(" RELATÓRIO DE CLIENTES "); + System.out.println("-------------------------------------------------"); + System.out.printf("%-5s %-20s %-15s %-30s %-20s %-15s\n", "ID", "Nome", "CPF", "Email", "Profissão", "Telefone"); + System.out.println("-------------------------------------------------"); + clientes.forEach(cliente -> { + System.out.printf("%-5d %-20s %-15s %-30s %-20s %-15s\n", + cliente.getId(), + cliente.getNome(), + cliente.getCpf(), + cliente.getEmail(), + cliente.getProfissao(), + cliente.getTelefone()); + }); + System.out.println("-------------------------------------------------"); + } + + private static Categoria getCategoriaData(EntityManager entityManager) { + String nomeCategoria = getRequiredInput("Por favor, insira o nome da categoria:"); + Categoria categoria = new Categoria(nomeCategoria); + entityManager.getTransaction().begin(); + entityManager.persist(categoria); + entityManager.getTransaction().commit(); + return categoria; + } + + private static Produto getProdutoData(Categoria categoria) { + String nomeProduto = getRequiredInput("Por favor, insira o nome do produto:"); + String descricao = getRequiredInput("Por favor, insira a descrição do produto:"); + BigDecimal precoUnitario = new BigDecimal(getRequiredInput("Por favor, insira o preço unitário do produto:")); + int quantidade = Integer.parseInt(getRequiredInput("Por favor, insira a quantidade do produto:")); + return new Produto(nomeProduto, descricao, precoUnitario, quantidade, categoria); + } + + private static Pedido getPedidoData(EntityManager entityManager, Cliente cliente, String cpf) { + if (cliente == null) { + System.out.println("Cliente não encontrado. Iniciando cadastro..."); + String cep = getRequiredInput("Por favor, insira o CEP para consulta:"); + Endereco endereco = new ConsultaCep().consultaCep(cep); + if (endereco == null) { + logger.error("Não foi possível encontrar o endereço para o CEP fornecido."); + return null; + } + endereco.setNumero(getRequiredInput("Por favor, insira o número do imóvel:")); + endereco.setComplemento(getInput("Por favor, insira o complemento do imóvel (opcional):")); + cliente = getClienteData(endereco, cpf); + if (cliente != null) { + entityManager.getTransaction().begin(); + entityManager.persist(endereco); + cliente.setEndereco(endereco); + entityManager.persist(cliente); + entityManager.getTransaction().commit(); + } else { + logger.error("Falha ao criar dados do cliente. Cliente retornou nulo."); + return null; + } + } + LocalDate data = LocalDate.now(); + TipoDesconto tipoDesconto = TipoDesconto.NENHUM; + return new Pedido(cliente, data, tipoDesconto); + } + + private static Cliente buscarClientePorCpf(EntityManager entityManager, String cpf) { + try { + TypedQuery query = entityManager.createQuery("SELECT c FROM Cliente c WHERE c.cpf = :cpf", Cliente.class); + query.setParameter("cpf", cpf); + return query.getSingleResult(); + } catch (NoResultException e) { + return null; + } + } + + private static Cliente getClienteData(Endereco endereco, String cpf) { + String nomeCliente = getRequiredInput("Por favor, insira o nome do cliente:"); + String email = getEmailInput(); + String profissao = getRequiredInput("Por favor, insira a profissão do cliente:"); + String telefone = getRequiredInput("Por favor, insira o telefone do cliente:"); + return new Cliente(nomeCliente, cpf, email, profissao, telefone, endereco); + } + + private static void consultarComprasCliente(EntityManager entityManager) { + String cpf = getRequiredInput("Por favor, insira o CPF do cliente:"); + Cliente cliente = buscarClientePorCpf(entityManager, cpf); + if (cliente == null) { + System.out.println("Cliente não encontrado."); + return; + } + exibirDetalhesCliente(cliente); + exibirPedidosCliente(entityManager, cliente); + } + + private static void consultarComprasTodosClientes(EntityManager entityManager) { + List clientes = entityManager.createQuery("SELECT c FROM Cliente c", Cliente.class).getResultList(); + System.out.println("-------------------------------------------------"); + System.out.println(" RELATÓRIO DE COMPRAS DE TODOS OS CLIENTES "); + System.out.println("-------------------------------------------------"); + + if (clientes.isEmpty()) { + System.out.println("Nenhum cliente encontrado."); + } else { + clientes.forEach(cliente -> { + exibirDetalhesCliente(cliente); + exibirPedidosCliente(entityManager, cliente); + System.out.println("-------------------------------------------------"); + }); + } + } + private static void exibirClienteMaisFiel(EntityManager entityManager) { + try { + Query query = entityManager.createQuery( + "SELECT c.id, COUNT(p.id) AS totalPedidos " + + "FROM Pedido p " + + "JOIN p.cliente c " + + "GROUP BY c.id " + + "ORDER BY totalPedidos DESC" + ); + query.setMaxResults(1); + Object[] resultado = (Object[]) query.getSingleResult(); + Long clienteId = (Long) resultado[0]; + Long totalPedidos = (Long) resultado[1]; + Cliente cliente = entityManager.find(Cliente.class, clienteId); + System.out.println("-------------------------------------------------------------------------"); + System.out.println("Cliente mais fiel:"); + System.out.printf("%-30s %-20s\n", "Cliente", "Total de Pedidos"); + System.out.printf("%-30s %-20d\n", cliente.getNome(), totalPedidos); + System.out.println("-------------------------------------------------------------------------"); + } catch (NoResultException e) { + System.out.println("Nenhum cliente encontrado."); + } + } + + private static void gerarRelatorio(EntityManager entityManager) { + List clientes = entityManager.createQuery("SELECT c FROM Cliente c", Cliente.class).getResultList(); + clientes.forEach(cliente -> { + exibirDetalhesCliente(cliente); + exibirPedidosCliente(entityManager, cliente); + }); + } + + private static void gerarRelatorioClientesAtivosEVendas(EntityManager entityManager) { + YearMonth currentMonth = YearMonth.now(); + LocalDate startDate = currentMonth.atDay(1); + LocalDate endDate = currentMonth.atEndOfMonth(); + + // Total de clientes ativos (clientes com pelo menos um pedido no mês) + TypedQuery queryClientesAtivos = entityManager.createQuery( + "SELECT COUNT(DISTINCT p.cliente.id) FROM Pedido p WHERE p.data BETWEEN :startDate AND :endDate", + Long.class); + queryClientesAtivos.setParameter("startDate", startDate); + queryClientesAtivos.setParameter("endDate", endDate); + Long totalClientesAtivos = queryClientesAtivos.getSingleResult(); + + // Total vendido no mês + TypedQuery queryTotalVendas = entityManager.createQuery( + "SELECT SUM(ip.precoUnitario * ip.quantidade) FROM ItemPedido ip WHERE ip.pedido.data BETWEEN :startDate AND :endDate", + BigDecimal.class); + queryTotalVendas.setParameter("startDate", startDate); + queryTotalVendas.setParameter("endDate", endDate); + BigDecimal totalVendas = queryTotalVendas.getSingleResult(); + + System.out.println("-------------------------------------------------"); + System.out.println(" RELATÓRIO DE CLIENTES ATIVOS E TOTAL VENDIDO NO MÊS "); + System.out.println("-------------------------------------------------"); + System.out.printf("Total de clientes ativos no mês: %d\n", totalClientesAtivos); + System.out.printf("Total vendido no mês: R$ %.2f\n", totalVendas); + System.out.println("-------------------------------------------------"); + } + + private static void exibirDetalhesCliente(Cliente cliente) { + System.out.println("-------------------------------------------------------------------------"); + System.out.println("Cliente #" + cliente.getId() + ":"); + System.out.println("Nome: " + cliente.getNome()); + System.out.println("CPF: " + cliente.getCpf()); + System.out.println("Email: " + cliente.getEmail()); + System.out.println("Profissão: " + cliente.getProfissao()); + System.out.println("Telefone: " + cliente.getTelefone()); + Endereco endereco = cliente.getEndereco(); + if (endereco != null) { + System.out.println("Endereço: " + endereco.getLogradouro() + ", Número: " + endereco.getNumero() + ", Complemento: " + endereco.getComplemento() + ", CEP: " + endereco.getCep()); + } + } + + private static void exibirPedidosCliente(EntityManager entityManager, Cliente cliente) { + List pedidos = entityManager.createQuery("SELECT p FROM Pedido p WHERE p.cliente = :cliente", Pedido.class) + .setParameter("cliente", cliente) + .getResultList(); + + if (pedidos.isEmpty()) { + System.out.println("Nenhum pedido encontrado para este cliente."); + } else { + System.out.println("-------------------------------------------------------------------------"); + System.out.println("Pedidos do Cliente:"); + pedidos.forEach(pedido -> { + System.out.println("Pedido ID: " + pedido.getId() + " | Data: " + pedido.getData() + " | Total: " + pedido.getValorTotal()); + System.out.println("Itens do Pedido:"); + System.out.printf("%-30s %-10s %-15s %-15s\n", "Produto", "Quantidade", "Preço Unitário", "Valor Total"); + pedido.getItensPedidos().forEach(item -> System.out.printf("%-30s %-10d %-15.2f %-15.2f\n", + item.getNomeProduto(), item.getQuantidade(), item.getPrecoUnitario(), item.calcularValorTotal())); + System.out.println("-------------------------------------------------------------------------"); + }); + System.out.println("-------------------------------------------------------------------------"); + } + } + + private static String getRequiredInput(String prompt) { + System.out.println(prompt); + String input = getScanner().nextLine(); + if ("sair".equalsIgnoreCase(input)) { + System.out.println("Programa encerrado."); + System.exit(0); + } + if (input.trim().isEmpty()) { + System.out.println("Este campo é obrigatório. Por favor, forneça um valor."); + return getRequiredInput(prompt); + } + return input; + } + + private static String getInput(String prompt) { + System.out.println(prompt); + return getScanner().nextLine(); + } + + private static String getEmailInput() { + String email = getRequiredInput("Por favor, insira o email do cliente:"); + if (!isValidEmail(email)) { + System.out.println("Email inválido. Por favor, insira um email válido."); + return getEmailInput(); + } + return email; + } + + private static boolean isValidEmail(String email) { + return email.matches("[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}"); + } + + private static Scanner getScanner() { + return scanner; + } + + private static void setScanner(Scanner scanner) { + CadastrarProdutoPedido.scanner = scanner; + } + + private static void setLoggingLevel(Level level) { + LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); + loggerContext.getLogger("org.hibernate").setLevel(level); + loggerContext.getLogger("org.springframework").setLevel(level); + } +} diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/CategoriaDao.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/CategoriaDao.java new file mode 100644 index 00000000..05f1f0d0 --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/CategoriaDao.java @@ -0,0 +1,66 @@ +package br.com.alura.comex.dao; + +import br.com.alura.comex.model.Categoria; +import javax.persistence.EntityManager; +import javax.persistence.EntityTransaction; +import java.util.List; + +public class CategoriaDao { + private EntityManager em; + + public CategoriaDao(EntityManager em) { + this.em = em; + } + + public CategoriaDao() { + + } + + // Busca uma categoria por ID + public Categoria buscarPorId(Long id) { + Categoria categoria = em.find(Categoria.class, id); + System.out.println("Buscar por ID - Categoria encontrada: " + categoria); + return categoria; + } + + // Cadastra uma nova categoria + public void cadastrar(Categoria categoria) { + EntityTransaction et = em.getTransaction(); + try { + et.begin(); + em.persist(categoria); + et.commit(); + System.out.println("Cadastrando Categoria: " + categoria); + } catch (Exception e) { + et.rollback(); + System.out.println("Erro ao cadastrar categoria: " + e.getMessage()); + } + } + + // Lista todas as categorias + public List listaTodas() { + List categorias = em.createQuery("SELECT c FROM Categoria c", Categoria.class).getResultList(); + System.out.println("Listando todas as Categorias: " + categorias); + return categorias; + } + public List relatorioDeVendasPorCategoria() { + return em.createQuery( + "SELECT c.nome, COUNT(p.id), SUM(ip.quantidade * ip.precoUnitario) " + + "FROM Categoria c " + + "JOIN c.produtos p " + + "JOIN p.itensPedido ip " + + "GROUP BY c.nome", Object[].class) + .getResultList(); + + } + + public Categoria buscarPorNome(String nomeDaCategoria) { + return null; + } + + + +} + + + diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/ClienteAlteraBd.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/ClienteAlteraBd.java new file mode 100644 index 00000000..35bb0feb --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/ClienteAlteraBd.java @@ -0,0 +1,47 @@ +package br.com.alura.comex.dao; + +import br.com.alura.comex.model.Cliente; +import br.com.alura.comex.model.Endereco; + +import javax.persistence.EntityManager; +import javax.persistence.EntityTransaction; + +public class ClienteAlteraBd { + + private final EntityManager entityManager; + + public ClienteAlteraBd(EntityManager entityManager) { + this.entityManager = entityManager; + } + + public void atualizar(Cliente cliente) { + EntityTransaction transaction = entityManager.getTransaction(); + + try { + if (!transaction.isActive()) { + transaction.begin(); + } + + // Verifica se o endereço do cliente já está persistido + if (cliente.getEndereco().getId() == null) { + // Se o endereço não está persistido, salva-o primeiro + Endereco endereco = cliente.getEndereco(); + entityManager.persist(endereco); + } + + entityManager.merge(cliente); + transaction.commit(); + } catch (Exception e) { + if (transaction.isActive()) { + transaction.rollback(); + } + throw new RuntimeException("Erro ao atualizar o cliente", e); + } + } + + public void salvar(Cliente cliente) { + } + + public void excluir(Cliente cliente) { + } +} \ No newline at end of file diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/ClienteDao.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/ClienteDao.java new file mode 100644 index 00000000..b39307d4 --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/ClienteDao.java @@ -0,0 +1,93 @@ +package br.com.alura.comex.dao; + +import br.com.alura.comex.model.Cliente; +import javax.persistence.EntityManager; +import javax.persistence.EntityTransaction; +import java.util.Collections; +import java.util.List; + +public class ClienteDao { + private final EntityManager em; + + public ClienteDao(EntityManager em) { + this.em = em; + } + + // Busca um cliente por seu ID no banco de dados + public Cliente buscaPorId(Long id) { + Cliente cliente = em.find(Cliente.class, id); + System.out.println("Busca por ID - Cliente encontrado: " + cliente); + return cliente; + } + + // Cadastra um novo cliente no banco de dados + public void cadastra(Cliente cliente) { + EntityTransaction et = em.getTransaction(); + try { + et.begin(); + em.persist(cliente); + et.commit(); + System.out.println("Cadastrando Cliente: " + cliente); + } catch (Exception e) { + et.rollback(); + System.out.println("Erro ao cadastrar cliente: " + e.getMessage()); + } + } + + // Atualiza os dados de um cliente existente no banco de dados + public void atualiza(Cliente cliente) { + EntityTransaction et = em.getTransaction(); + try { + et.begin(); + em.merge(cliente); + et.commit(); + System.out.println("Atualizando Cliente: " + cliente); + } catch (Exception e) { + et.rollback(); + System.out.println("Erro ao atualizar cliente: " + e.getMessage()); + } + } + + // Remove um cliente do banco de dados + public void remove(long cliente) { + EntityTransaction et = em.getTransaction(); + try { + et.begin(); + em.remove(em.contains(cliente) ? cliente : em.merge(cliente)); + et.commit(); + System.out.println("Removendo Cliente: " + cliente); + } catch (Exception e) { + et.rollback(); + System.out.println("Erro ao remover cliente: " + e.getMessage()); + } + } + + // Lista todos os clientes cadastrados no banco de dados + public List listaTodos() { + List clientes = em.createQuery("SELECT c FROM Cliente c", Cliente.class).getResultList(); + System.out.println("Listando todos os Clientes: " + clientes); + return clientes; + } + + // Lista clientes por nome, usando uma busca parcial + public List listaPorNome(String nome) { + List clientes = em.createQuery("SELECT c FROM Cliente c WHERE c.nome LIKE :nome", Cliente.class) + .setParameter("nome", "%" + nome + "%") + .getResultList(); + System.out.println("Listando Clientes por nome (" + nome + "): " + clientes); + return clientes; + } + + public void salvar(Cliente cliente) { + } + + public List buscarTodos() { + List clientes = em.createQuery("SELECT c FROM Cliente c", Cliente.class).getResultList(); + return clientes != null ? clientes : Collections.emptyList(); // Garante que nunca retorne null + } + + public void deletarCliente(Long clienteId) { + } +} + + diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/DeleteCliente.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/DeleteCliente.java new file mode 100644 index 00000000..db05fe64 --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/DeleteCliente.java @@ -0,0 +1,59 @@ +import br.com.alura.comex.dao.ClienteDao; +import br.com.alura.comex.model.Cliente; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; +import java.util.List; +import java.util.Scanner; + +public class DeleteCliente { + public static void main(String[] args) { + EntityManagerFactory emf = Persistence.createEntityManagerFactory("oracle"); + EntityManager em = emf.createEntityManager(); + ClienteDao clienteDao = new ClienteDao(em); + + try { + // Verifica se a transação já está ativa antes de começar uma nova + if (!em.getTransaction().isActive()) { + em.getTransaction().begin(); + } + + List clientes = clienteDao.buscarTodos(); + if (clientes.isEmpty()) { + System.out.println("Não há clientes cadastrados."); + // Certifique-se de fechar a transação se não houver clientes + if (em.getTransaction().isActive()) { + em.getTransaction().rollback(); + } + } else { + System.out.println("Selecione o ID do cliente que deseja deletar:"); + for (Cliente cliente : clientes) { + System.out.printf("ID: %d, Nome: %s, CPF: %s\n", cliente.getId(), cliente.getNome(), cliente.getCpf()); + } + + Scanner scanner = new Scanner(System.in); + System.out.print("Digite o ID do cliente: "); + long clienteId = scanner.nextLong(); + scanner.close(); + + clienteDao.remove(clienteId); // Assume que este método não faz commit ou rollback internamente + + // Verifica se a transação ainda pode ser commitada + if (em.getTransaction().isActive() && !em.getTransaction().getRollbackOnly()) { + em.getTransaction().commit(); + } else { + em.getTransaction().rollback(); + } + } + } catch (Exception e) { + if (em.getTransaction().isActive()) { + em.getTransaction().rollback(); + } + e.printStackTrace(); + } finally { + if (em.isOpen()) em.close(); + if (emf.isOpen()) emf.close(); + } + } +} diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/EnderecoDao.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/EnderecoDao.java new file mode 100644 index 00000000..67957397 --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/EnderecoDao.java @@ -0,0 +1,70 @@ +package br.com.alura.comex.dao; + +import br.com.alura.comex.model.Endereco; + +import javax.persistence.EntityManager; +import javax.persistence.EntityTransaction; + +public class EnderecoDao { + + private final EntityManager entityManager; + + public EnderecoDao(EntityManager entityManager) { + this.entityManager = entityManager; + } + + public void salvar(Endereco endereco) { + EntityTransaction transaction = entityManager.getTransaction(); + + try { + if (!transaction.isActive()) { + transaction.begin(); + } + + entityManager.persist(endereco); + entityManager.flush(); // Sincroniza as alterações com o banco de dados + transaction.commit(); + } catch (Exception e) { + if (transaction.isActive()) { + transaction.rollback(); + } + throw new RuntimeException("Erro ao salvar o endereço", e); + } + } + + public void atualizar(Endereco endereco) { + EntityTransaction transaction = entityManager.getTransaction(); + + try { + if (!transaction.isActive()) { + transaction.begin(); + } + + entityManager.merge(endereco); + transaction.commit(); + } catch (Exception e) { + if (transaction.isActive()) { + transaction.rollback(); + } + throw new RuntimeException("Erro ao atualizar o endereço", e); + } + } + + public void excluir(Endereco endereco) { + EntityTransaction transaction = entityManager.getTransaction(); + + try { + if (!transaction.isActive()) { + transaction.begin(); + } + + entityManager.remove(endereco); + transaction.commit(); + } catch (Exception e) { + if (transaction.isActive()) { + transaction.rollback(); + } + throw new RuntimeException("Erro ao excluir o endereço", e); + } + } +} diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/GeralPedidoClienteProduto.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/GeralPedidoClienteProduto.java new file mode 100644 index 00000000..44db5a3e --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/GeralPedidoClienteProduto.java @@ -0,0 +1,71 @@ +package br.com.alura.comex.dao; +import br.com.alura.comex.model.Cliente; +import br.com.alura.comex.model.Pedido; +import br.com.alura.comex.model.Produto; + +import javax.persistence.EntityManager; +import java.util.List; + +public class GeralPedidoClienteProduto { + + public class ClienteDao { + private EntityManager em; + public ClienteDao(EntityManager em) { + this.em = em; + } + + public void salvar(Cliente cliente) { + em.getTransaction().begin(); + em.persist(cliente); + em.getTransaction().commit(); + } + + public List buscarTodos() { + return em.createQuery("SELECT c FROM Cliente c", Cliente.class).getResultList(); + } + } + + + + public class PedidoDao { + private EntityManager em; + public PedidoDao(EntityManager em) { + this.em = em; + } + + public void salvar(Pedido pedido) { + em.getTransaction().begin(); + em.persist(pedido); + em.getTransaction().commit(); + } + + public List buscarTodos() { + return em.createQuery("SELECT p FROM Pedido p", Pedido.class).getResultList(); + } + } + + public class ProdutoDao { + private EntityManager em; + public ProdutoDao(EntityManager em) { + this.em = em; + } + + public void salvar(Produto produto) { + em.getTransaction().begin(); + em.persist(produto); + em.getTransaction().commit(); + } + + public void atualizarEstoque(Produto produto, int quantidade) { + em.getTransaction().begin(); + produto.setQuantidade(produto.getQuantidade() + quantidade); + em.merge(produto); + em.getTransaction().commit(); + } + + public List buscarTodos() { + return em.createQuery("SELECT p FROM Produto p", Produto.class).getResultList(); + } + } + +} \ No newline at end of file diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/ImprimeDadosClientes.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/ImprimeDadosClientes.java new file mode 100644 index 00000000..d96b4995 --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/ImprimeDadosClientes.java @@ -0,0 +1,38 @@ +package br.com.alura.comex.dao; + +import br.com.alura.comex.model.Cliente; +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +public class ImprimeDadosClientes { + + public static void main(String[] args) { + // Certifique-se de que o nome da unidade de persistência corresponde à sua configuração em persistence.xml + EntityManagerFactory factory = Persistence.createEntityManagerFactory("oracle"); + EntityManager entityManager = factory.createEntityManager(); + + try { + List clientes = findAllClientesWithEndereco(entityManager); + AtomicInteger counter = new AtomicInteger(1); + + clientes.forEach(cliente -> { + System.out.printf("Cliente #%d:\n", counter.getAndIncrement()); + System.out.printf("Nome: %s\nCPF: %s\nEmail: %s\nProfissão: %s\nTelefone: %s\n", + cliente.getNome(), cliente.getCpf(), cliente.getEmail(), cliente.getProfissao(), cliente.getTelefone()); + System.out.printf("Endereço: %s, Número: %s, Complemento: %s, CEP: %s\n\n", + cliente.getEndereco().getLogradouro(), cliente.getEndereco().getNumero(), + cliente.getEndereco().getComplemento(), cliente.getEndereco().getCep()); + }); + } finally { + entityManager.close(); + } + } + + private static List findAllClientesWithEndereco(EntityManager em) { + return em.createQuery("SELECT c FROM Cliente c JOIN FETCH c.endereco", Cliente.class) + .getResultList(); + } +} diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/PedidoDao.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/PedidoDao.java new file mode 100644 index 00000000..90550c2b --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/PedidoDao.java @@ -0,0 +1,51 @@ +package br.com.alura.comex.dao; + +import br.com.alura.comex.model.Pedido; +import javax.persistence.EntityManager; +import javax.persistence.EntityTransaction; +import java.util.List; + +public class PedidoDao { + private final EntityManager em; + + public PedidoDao(EntityManager em) { + this.em = em; + } + + // Busca um pedido por ID + public Pedido buscaPorId(Long id) { + Pedido pedido = em.find(Pedido.class, id); + System.out.println("Busca por ID - Pedido encontrado: " + pedido); + return pedido; + } + + // Cadastra um novo pedido + public void cadastra(Pedido pedido) { + EntityTransaction et = em.getTransaction(); + try { + et.begin(); + em.persist(pedido); + et.commit(); + System.out.println("Cadastrando Pedido: " + pedido); + } catch (Exception e) { + et.rollback(); + System.out.println("Erro ao cadastrar pedido: " + e.getMessage()); + } + } + + // Lista todos os pedidos + public List listaTodos() { + List pedidos = em.createQuery("SELECT p FROM Pedido p", Pedido.class).getResultList(); + System.out.println("Listando todos os Pedidos: " + pedidos); + return pedidos; + } + + public void salvar(Pedido pedido) { + + } + + public List buscarTodos() { + return List.of(); + } + +} diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/ProdutoDao.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/ProdutoDao.java new file mode 100644 index 00000000..6a602983 --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/ProdutoDao.java @@ -0,0 +1,74 @@ +package br.com.alura.comex.dao; + +import br.com.alura.comex.model.Produto; +import javax.persistence.EntityManager; +import javax.persistence.EntityTransaction; +import java.util.List; + +public class ProdutoDao { + private final EntityManager em; + + public ProdutoDao(EntityManager em) { + this.em = em; + } + + public Produto buscaPorId(Long id) { + return em.find(Produto.class, id); + } + + public void cadastra(Produto produto) { + EntityTransaction et = em.getTransaction(); + try { + et.begin(); + em.persist(produto); + et.commit(); + } catch (Exception e) { + if (et.isActive()) { + et.rollback(); + } + throw new RuntimeException("Erro ao cadastrar produto", e); + } + } + + public List listaTodos() { + return em.createQuery("SELECT p FROM Produto p", Produto.class).getResultList(); + } + + public List listaIndisponiveis() { + return em.createQuery("SELECT p FROM Produto p WHERE p.quantidade = 0", Produto.class).getResultList(); + } + + /** + * Atualiza a quantidade em estoque de um produto específico. + * + * @param produtoId O ID do produto a ser atualizado. + * @param novaQuantidade A nova quantidade do produto. + */ + public void atualizarEstoque(Long produtoId, int novaQuantidade) { + EntityTransaction et = em.getTransaction(); + try { + et.begin(); + Produto produto = em.find(Produto.class, produtoId); + if (produto != null) { + produto.setQuantidade(novaQuantidade); + em.merge(produto); + System.out.println("Estoque atualizado - Produto: " + produto.getNome() + ", Quantidade: " + novaQuantidade); + } else { + System.out.println("Produto não encontrado para atualização de estoque."); + } + et.commit(); + } catch (Exception e) { + if (et.isActive()) { + et.rollback(); + } + throw new RuntimeException("Erro ao atualizar o estoque do produto", e); + } + } + + public void salvar(Produto produto) { + } + + public List buscarTodos() { + return List.of(); + } +} diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/TestaPedidoDao.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/TestaPedidoDao.java new file mode 100644 index 00000000..95a0f202 --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/TestaPedidoDao.java @@ -0,0 +1,33 @@ +import br.com.alura.comex.model.RelatorioCliente; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.util.List; + +import static java.sql.DriverManager.getConnection; +import static oracle.jdbc.util.OracleEnvironment.SID; + +public class TestaPedidoDao { + + public static void main(String[] args) { + String url = "jdbc:oracle:thin:@localhost:1521"; + String usuario = "system"; + String senha = "12345678"; + + try (Connection connection = DriverManager.getConnection(url, usuario, senha)) { + RelatorioCliente relatorioClienteDao = new RelatorioCliente(connection); + List relatorioClientes = relatorioClienteDao.gerarRelatorioCliente(); + + System.out.println("Relatório dos Três Clientes que Mais Gastaram:"); + for (RelatorioCliente relatorioCliente : relatorioClientes) { + System.out.println("Nome do Cliente: " + relatorioCliente.getNomeCliente()); + System.out.println("Quantidade de Pedidos: " + relatorioCliente.getQuantidadePedidos()); + System.out.println("Montante Gasto: " + relatorioCliente.getMontanteGasto()); + System.out.println(); + } + } catch (SQLException e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/TodosProdutosCadastradosBd.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/TodosProdutosCadastradosBd.java new file mode 100644 index 00000000..e8c9ed34 --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/dao/TodosProdutosCadastradosBd.java @@ -0,0 +1,58 @@ +package br.com.alura.comex.dao; + +import br.com.alura.comex.model.Produto; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.TypedQuery; +import java.util.List; +import static javax.persistence.Persistence.createEntityManagerFactory; + +public class TodosProdutosCadastradosBd { + + private EntityManager entityManager; + + public TodosProdutosCadastradosBd(EntityManager entityManager) { + this.entityManager = entityManager; + } + + public List listarTodos() { + TypedQuery query = entityManager.createQuery("SELECT p FROM Produto p", Produto.class); + return query.getResultList(); + } + + public static void main(String[] args) { + EntityManagerFactory factory = createEntityManagerFactory("oracle"); + EntityManager entityManager = factory.createEntityManager(); + + TodosProdutosCadastradosBd produtoDAO = new TodosProdutosCadastradosBd(entityManager); + + List produtos = produtoDAO.listarTodos(); + + // Gerar relatório + gerarRelatorio(produtos); + + entityManager.close(); + factory.close(); + } + + private static void gerarRelatorio(List produtos) { + System.out.println("-------------------------------------------------"); + System.out.println(" RELATÓRIO DE PRODUTOS "); + System.out.println("-------------------------------------------------"); + System.out.printf("%-5s %-30s %-20s %-10s %-10s %-10s\n", "ID", "Nome", "Descrição", "Preço Unit.", "Quantidade", "Categoria"); + System.out.println("-------------------------------------------------"); + + for (Produto produto : produtos) { + System.out.printf("%-5d %-30s %-20s %-10.2f %-10d %-10s\n", + produto.getId(), + produto.getNome(), + produto.getDescricao(), + produto.getPrecoUnitario(), + produto.getQuantidade(), + produto.getCategoria().getNome()); + } + + System.out.println("-------------------------------------------------"); + } +} diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Categoria.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Categoria.java new file mode 100644 index 00000000..01f78e0c --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Categoria.java @@ -0,0 +1,46 @@ +package br.com.alura.comex.model; + +import jakarta.persistence.*; +import java.util.List; + +@Entity +@Table(name = "categoria") +public class Categoria { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private String nome; + + @Enumerated(EnumType.STRING) + @Column(nullable = false, columnDefinition = "VARCHAR(10) default 'ATIVA'") + private Status status = Status.ATIVA; + + @OneToMany(mappedBy = "categoria", cascade = CascadeType.ALL, fetch = FetchType.LAZY) + private List produtos; + + public Categoria() {} + + public Categoria(String nomeDaCategoria) { + this.nome = nomeDaCategoria; + } + + // Getters and Setters + 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 Status getStatus() { return status; } + public void setStatus(Status status) { this.status = status; } + + public List getProdutos() { return produtos; } + public void setProdutos(List produtos) { this.produtos = produtos; } + + public enum Status { + ATIVA, INATIVA + } +} diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Cliente.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Cliente.java new file mode 100644 index 00000000..6e3f9499 --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Cliente.java @@ -0,0 +1,104 @@ +package br.com.alura.comex.model; + +import jakarta.persistence.*; +import java.time.LocalDate; +import java.util.List; + +@Entity +@Table(name = "cliente") +public class Cliente { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "nome", length = 120, nullable = false) + private String nome; + + @Column(name = "cpf", length = 13, unique = true, nullable = false) + private String cpf; + + @Column(name = "email", length = 50) + private String email; + + @Column(name = "profissao", length = 20, nullable = false) + private String profissao; + + @Column(name = "telefone", length = 20, nullable = false) + private String telefone; + + @Column(name = "ativo", nullable = false) + private boolean ativo; + + @Column(name = "data_cadastro", nullable = false) + private LocalDate dataCadastro; + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "endereco_id", nullable = false) + private Endereco endereco; + + @OneToMany(mappedBy = "cliente", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY) + private List pedidos; + + public Cliente() {} + + public Cliente(String nome, String cpf, String email, String profissao, String telefone, Endereco endereco, boolean ativo, LocalDate dataCadastro) { + this.nome = nome; + this.cpf = cpf; + this.email = email; + this.profissao = profissao; + this.telefone = telefone; + this.endereco = endereco; + this.ativo = ativo; + this.dataCadastro = dataCadastro; + } + + public Cliente(String joãoSilva, String s, String mail, String engenheiro, String number, Object o) { + } + + // Getters and setters + 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 getCpf() { return cpf; } + public void setCpf(String cpf) { this.cpf = cpf; } + + public String getEmail() { return email; } + public void setEmail(String email) { this.email = email; } + + public String getProfissao() { return profissao; } + public void setProfissao(String profissao) { this.profissao = profissao; } + + public String getTelefone() { return telefone; } + public void setTelefone(String telefone) { this.telefone = telefone; } + + public boolean isAtivo() { return ativo; } + public void setAtivo(boolean ativo) { this.ativo = ativo; } + + public LocalDate getDataCadastro() { return dataCadastro; } + public void setDataCadastro(LocalDate dataCadastro) { this.dataCadastro = dataCadastro; } + + public Endereco getEndereco() { return endereco; } + public void setEndereco(Endereco endereco) { this.endereco = endereco; } + + public List getPedidos() { return pedidos; } + public void setPedidos(List pedidos) { this.pedidos = pedidos; } + + @Override + public String toString() { + return "Cliente{" + + "id=" + id + + ", nome='" + nome + '\'' + + ", cpf='" + cpf + '\'' + + ", email='" + email + '\'' + + ", profissao='" + profissao + '\'' + + ", telefone='" + telefone + '\'' + + ", ativo=" + ativo + + ", dataCadastro=" + dataCadastro + + ", endereco=" + endereco + + '}'; + } +} diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Endereco.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Endereco.java new file mode 100644 index 00000000..f5fc5be9 --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Endereco.java @@ -0,0 +1,89 @@ +package br.com.alura.comex.model; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import jakarta.persistence.*; + +@Entity +@Table(name = "endereco") +@JsonIgnoreProperties(ignoreUnknown = true) +public class Endereco { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "cep", length = 120, nullable = false) + private String cep; + + @Column(name = "logradouro", length = 120) + private String logradouro; + + @Column(name = "complemento", length = 120) + private String complemento; + + @Column(name = "bairro", length = 120) + private String bairro; + + @Column(name = "localidade", length = 120) + private String localidade; + + @Column(name = "uf", length = 2) + private String uf; + + @Column(name = "numero", length = 20) + private String numero; + + public Endereco() {} + + public Endereco(String cep, String logradouro, String complemento, String bairro, String localidade, String uf, String numero) { + this.cep = cep; + this.logradouro = logradouro; + this.complemento = complemento; + this.bairro = bairro; + this.localidade = localidade; + this.uf = uf; + this.numero = numero; + } + + public Endereco(String ruaA, String number, String bairroX, String cidadeY, String s) { + } + + // Getters e setters + public Long getId() { return id; } + public void setId(Long id) { this.id = id; } + + public String getCep() { return cep; } + public void setCep(String cep) { this.cep = cep; } + + public String getLogradouro() { return logradouro; } + public void setLogradouro(String logradouro) { this.logradouro = logradouro; } + + public String getComplemento() { return complemento; } + public void setComplemento(String complemento) { this.complemento = complemento; } + + public String getBairro() { return bairro; } + public void setBairro(String bairro) { this.bairro = bairro; } + + public String getLocalidade() { return localidade; } + public void setLocalidade(String localidade) { this.localidade = localidade; } + + public String getUf() { return uf; } + public void setUf(String uf) { this.uf = uf; } + + public String getNumero() { return numero; } + public void setNumero(String numero) { this.numero = numero; } + + @Override + public String toString() { + return "Endereco{" + + "id=" + id + + ", cep='" + cep + '\'' + + ", logradouro='" + logradouro + '\'' + + ", complemento='" + complemento + '\'' + + ", bairro='" + bairro + '\'' + + ", localidade='" + localidade + '\'' + + ", uf='" + uf + '\'' + + ", numero='" + numero + '\'' + + '}'; + } +} diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Estoque.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Estoque.java new file mode 100644 index 00000000..4593366b --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Estoque.java @@ -0,0 +1,48 @@ +package br.com.alura.comex.model; + +import jakarta.persistence.*; +import org.springframework.context.annotation.Configuration; + +import java.util.HashMap; +import java.util.Map; + +@Configuration +@Entity +@Table(name = "estoque") +public class Estoque { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ElementCollection(fetch = FetchType.LAZY) + @CollectionTable(name = "estoque_itens", joinColumns = @JoinColumn(name = "estoque_id")) + @MapKeyColumn(name = "produto_id") + @Column(name = "quantidade") + private Map produtos = new HashMap<>(); + + public Estoque() {} + + public void adicionarProduto(Long produtoId, int quantidade) { + this.produtos.merge(produtoId, quantidade, Integer::sum); + } + + public boolean removerProduto(Long produtoId, int quantidade) { + Integer atual = produtos.get(produtoId); + if (atual == null || atual < quantidade) { + return false; + } + produtos.put(produtoId, atual - quantidade); + return true; + } + + public int consultarQuantidade(Long produtoId) { + return produtos.getOrDefault(produtoId, 0); + } + + // Getters and Setters + public Long getId() { return id; } + public void setId(Long id) { this.id = id; } + + public Map getProdutos() { return produtos; } + public void setProdutos(Map produtos) { this.produtos = produtos; } +} diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/ItemPedido.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/ItemPedido.java new file mode 100644 index 00000000..3d165adc --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/ItemPedido.java @@ -0,0 +1,97 @@ +package br.com.alura.comex.model; + +import java.math.BigDecimal; + +import br.com.alura.comex.ComexApplication; +import jakarta.persistence.*; + +@Entity +@Table(name = "item_pedido") +public class ItemPedido extends ComexApplication { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "produto_id", nullable = false) + private Produto produto; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "pedido_id", nullable = false) + private Pedido pedido; + + @Column(name = "preco_unitario", nullable = false, precision = 10, scale = 2) + private BigDecimal precoUnitario; + + @Column(nullable = false) + private int quantidade; + + @Column(nullable = false, precision = 10, scale = 2) + private BigDecimal desconto; + + @Enumerated(EnumType.STRING) + @Column(nullable = false) + private TipoDesconto tipoDesconto; + + public ItemPedido() { + this.precoUnitario = BigDecimal.ZERO; + this.desconto = BigDecimal.ZERO; + this.tipoDesconto = TipoDesconto.NENHUM; + } + + public ItemPedido(Produto produto, int quantidade, BigDecimal precoUnitario, TipoDesconto tipoDesconto, Pedido pedido) { + if (produto == null) throw new IllegalArgumentException("Produto não pode ser nulo."); + if (pedido == null) throw new IllegalArgumentException("Pedido não pode ser nulo."); + this.produto = produto; + this.quantidade = quantidade; + this.precoUnitario = precoUnitario != null ? precoUnitario : BigDecimal.ZERO; + this.desconto = BigDecimal.ZERO; + this.tipoDesconto = tipoDesconto != null ? tipoDesconto : TipoDesconto.NENHUM; + this.pedido = pedido; + } + + // Getters e Setters + public Long getId() { return id; } + public void setId(Long id) { this.id = id; } + + public Produto getProduto() { return produto; } + public void setProduto(Produto produto) { this.produto = produto; } + + public Pedido getPedido() { return pedido; } + public void setPedido(Pedido pedido) { this.pedido = pedido; } + + public BigDecimal getPrecoUnitario() { return precoUnitario; } + public void setPrecoUnitario(BigDecimal precoUnitario) { this.precoUnitario = precoUnitario; } + + public int getQuantidade() { return quantidade; } + public void setQuantidade(int quantidade) { this.quantidade = quantidade; } + + public BigDecimal getDesconto() { return desconto; } + public void setDesconto(BigDecimal desconto) { this.desconto = desconto; } + + public TipoDesconto getTipoDesconto() { return tipoDesconto; } + public void setTipoDesconto(TipoDesconto tipoDesconto) { this.tipoDesconto = tipoDesconto; } + + public String getNomeProduto() { + return produto != null ? produto.getNome() : "Produto não definido"; + } + + public BigDecimal calcularValorTotal() { + BigDecimal total = precoUnitario.multiply(BigDecimal.valueOf(quantidade)); + BigDecimal valorDesconto = total.multiply(BigDecimal.valueOf(tipoDesconto.getPercentual())); + return total.subtract(valorDesconto); + } + + @Override + public String toString() { + return "ItemPedido{" + + "id=" + id + + ", produto=" + (produto != null ? produto.getNome() : "Produto não definido") + + ", quantidade=" + quantidade + + ", precoUnitario=" + precoUnitario + + ", desconto=" + desconto + + ", tipoDesconto=" + tipoDesconto + + '}'; + } +} diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/JsonCreator.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/JsonCreator.java new file mode 100644 index 00000000..7efcf2da --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/JsonCreator.java @@ -0,0 +1,4 @@ +package br.com.alura.comex.model; + +public @interface JsonCreator { +} diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Pedido.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Pedido.java new file mode 100644 index 00000000..049cef2f --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Pedido.java @@ -0,0 +1,102 @@ +package br.com.alura.comex.model; + +import jakarta.persistence.*; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; + +@Entity +@Table(name = "pedidos") +public class Pedido { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne + @JoinColumn(name = "cliente_id", nullable = false) + private Cliente cliente; + + @OneToMany(mappedBy = "pedido", cascade = CascadeType.ALL, orphanRemoval = true) + private List itensPedidos = new ArrayList<>(); + + @Column(nullable = false, precision = 10, scale = 2) + private BigDecimal preco; + + @Column(nullable = false) + private int quantidade; + + @Column(nullable = false) + private LocalDate data; + + @Enumerated(EnumType.STRING) + @Column(name = "tipo_desconto", nullable = false) + private TipoDesconto tipoDesconto = TipoDesconto.NENHUM; // Valor padrão + + public Pedido() {} + + public Pedido(Cliente cliente, LocalDate data, TipoDesconto tipoDesconto) { + if (cliente == null) throw new IllegalArgumentException("Cliente não pode ser nulo."); + if (data == null) throw new IllegalArgumentException("Data não pode ser nula."); + if (tipoDesconto == null) throw new IllegalArgumentException("Tipo de desconto não pode ser nulo."); + this.cliente = cliente; + this.data = data; + this.tipoDesconto = tipoDesconto; + this.preco = BigDecimal.ZERO; + this.quantidade = 0; + } + + // Getters e Setters + + public void adicionarItem(ItemPedido item) { + item.setPedido(this); + this.itensPedidos.add(item); + atualizarPrecoEQuantidade(); + } + + private void atualizarPrecoEQuantidade() { + this.preco = BigDecimal.ZERO; + this.quantidade = 0; + for (ItemPedido item : itensPedidos) { + this.preco = this.preco.add(item.calcularValorTotal()); + this.quantidade += item.getQuantidade(); + } + } + + public BigDecimal getValorTotal() { + BigDecimal total = BigDecimal.ZERO; + for (ItemPedido item : itensPedidos) { + if (item.getPrecoUnitario() == null || item.getTipoDesconto() == null) { + throw new IllegalStateException("Preço ou tipo de desconto não pode ser nulo para calcular o valor total."); + } + total = total.add(item.calcularValorTotal()); + } + return total; + } + + @Override + public String toString() { + return "Pedido{" + + "id=" + id + + ", cliente=" + (cliente != null ? cliente.getNome() : "N/D") + + ", preço=" + preco + + ", quantidade=" + quantidade + + ", data=" + data + + ", tipoDesconto=" + tipoDesconto + + ", valor total=" + getValorTotal() + + '}'; + } + + public String getId() { + return ""; + } + + public String getData() { + return ""; + } + + public Iterable getItensPedidos() { + return null; + } +} diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Produto.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Produto.java new file mode 100644 index 00000000..8b99ff06 --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Produto.java @@ -0,0 +1,114 @@ +package br.com.alura.comex.model; + +import jakarta.persistence.*; +import java.math.BigDecimal; +import java.util.List; +import java.util.Objects; + +@Entity +@Table(name = "produto") +public class Produto { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "nome", length = 220, nullable = false) + private String nome; + + @Column(name = "descricao", length = 220, nullable = false) + private String descricao; + + @Column(name = "preco_unitario", nullable = false) + private BigDecimal precoUnitario; + + @Column(name = "quantidade", nullable = false) + private int quantidade; + + @ManyToOne + @JoinColumn(name = "categoria_id", referencedColumnName = "id", nullable = false, foreignKey = @ForeignKey(name = "fk_categoria_produto")) + private Categoria categoria; + + @OneToMany(mappedBy = "produto", cascade = CascadeType.ALL, fetch = FetchType.LAZY) + private List itensPedido; + + // Construtor vazio para JPA + public Produto() {} + + // Construtor principal + public Produto(String nome, String descricao, BigDecimal precoUnitario, int quantidade, Categoria categoria) { + setNome(nome); + setDescricao(descricao); + setPrecoUnitario(precoUnitario); + setQuantidade(quantidade); + setCategoria(categoria); + } + + // Getters e Setters + 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 getDescricao() { return descricao; } + public void setDescricao(String descricao) { this.descricao = descricao; } + + public BigDecimal getPrecoUnitario() { return precoUnitario; } + public void setPrecoUnitario(BigDecimal precoUnitario) { this.precoUnitario = precoUnitario; } + + public int getQuantidade() { return quantidade; } + public void setQuantidade(int quantidade) { this.quantidade = quantidade; } + + public Categoria getCategoria() { return categoria; } + public void setCategoria(Categoria categoria) { this.categoria = categoria; } + + public List getItensPedido() { return itensPedido; } + public void setItensPedido(List itensPedido) { this.itensPedido = itensPedido; } + + // Override equals, hashCode e toString + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Produto produto = (Produto) o; + return quantidade == produto.quantidade && + Objects.equals(id, produto.id) && + Objects.equals(nome, produto.nome) && + Objects.equals(descricao, produto.descricao) && + Objects.equals(precoUnitario, produto.precoUnitario) && + Objects.equals(categoria, produto.categoria) && + Objects.equals(itensPedido, produto.itensPedido); + } + + @Override + public int hashCode() { + return Objects.hash(id, nome, descricao, precoUnitario, quantidade, categoria, itensPedido); + } + + @Override + public String toString() { + return "Produto{" + + "id=" + id + + ", nome='" + nome + '\'' + + ", descricao='" + descricao + '\'' + + ", precoUnitario=" + precoUnitario + + ", quantidade=" + quantidade + + ", categoria=" + categoria + + ", itensPedido=" + itensPedido + + '}'; + } + + public void imprimirDetalhes() { + System.out.println("Produto: " + nome); + System.out.println("Descrição: " + descricao); + System.out.println("Preço Unitário: R$ " + precoUnitario); + System.out.println("Quantidade em Estoque: " + quantidade); + System.out.println("Categoria: " + categoria); + System.out.println("Itens do Pedido: " + itensPedido); + } + + public Long longValue() { + return id != null ? id.longValue() : null; + } +} diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/RelatorioCliente.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/RelatorioCliente.java new file mode 100644 index 00000000..4f63f199 --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/RelatorioCliente.java @@ -0,0 +1,25 @@ +package br.com.alura.comex.model; + +public class RelatorioCliente { + private String nomeCliente; + private int quantidadePedidos; + private double montanteGasto; + + public RelatorioCliente(String nomeCliente, int quantidadePedidos, double montanteGasto) { + this.nomeCliente = nomeCliente; + this.quantidadePedidos = quantidadePedidos; + this.montanteGasto = montanteGasto; + } + + public String getNomeCliente() { + return nomeCliente; + } + + public int getQuantidadePedidos() { + return quantidadePedidos; + } + + public double getMontanteGasto() { + return montanteGasto; + } +} diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/TipoDesconto.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/TipoDesconto.java new file mode 100644 index 00000000..17b8983e --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/model/TipoDesconto.java @@ -0,0 +1,26 @@ +package br.com.alura.comex.model; + +import java.math.BigDecimal; + +public enum TipoDesconto { + FIDELIDADE("Desconto de Fidelidade", 0.10), // 10% de desconto + PROMOCIONAL("Desconto Promocional", 0.15), // 15% de desconto + NENHUM("Sem Desconto", 0.00); // Sem desconto + + private final String descricao; + private final double percentual; + + TipoDesconto(String descricao, double percentual) { + this.descricao = descricao; + this.percentual = percentual; + } + + public double getPercentual() { + return percentual; + } + + @Override + public String toString() { + return this.descricao + " (" + (percentual * 100) + "%)"; + } +} diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/CategoriaRepository.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/CategoriaRepository.java new file mode 100644 index 00000000..793e3903 --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/CategoriaRepository.java @@ -0,0 +1,30 @@ +package br.com.alura.comex.repository; + +import br.com.alura.comex.model.Categoria; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface CategoriaRepository extends JpaRepository { + static void cadastrar(Categoria novaCategoria) { + + } + + // Busca uma categoria por ID - já fornecido pelo JpaRepository + + // Lista todas as categorias - já fornecido pelo JpaRepository + + // Busca uma categoria por nome + Categoria findByNome(String nome); + + // Relatório de vendas por categoria + @Query("SELECT c.nome, COUNT(p.id), SUM(ip.quantidade * ip.precoUnitario) " + + "FROM Categoria c " + + "JOIN c.produtos p " + + "JOIN p.itensPedido ip " + + "GROUP BY c.nome") + List relatorioDeVendasPorCategoria(); +} diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/ClienteRepository.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/ClienteRepository.java new file mode 100644 index 00000000..39704b15 --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/ClienteRepository.java @@ -0,0 +1,28 @@ +package br.com.alura.comex.repository; + +import br.com.alura.comex.model.Cliente; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.time.LocalDate; +import java.util.List; + +public interface ClienteRepository extends JpaRepository { + Cliente findByCpf(String cpf); + + @Query("SELECT c FROM Cliente c LEFT JOIN FETCH c.pedidos WHERE c.cpf = :cpf") + Cliente findByCpfWithPedidos(@Param("cpf") String cpf); + + @Query("SELECT DISTINCT c FROM Cliente c LEFT JOIN FETCH c.pedidos") + List findAllWithPedidos(); + + @Query("SELECT c.id, COUNT(p) as totalPedidos FROM Cliente c JOIN c.pedidos p GROUP BY c.id ORDER BY totalPedidos DESC") + List findClienteMaisFiel(Pageable pageable); + + @Query("SELECT COUNT(DISTINCT p.cliente) FROM Pedido p WHERE p.data BETWEEN :startDate AND :endDate") + Long countClientesAtivos(@Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate); +} + diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/EnderecoRepository.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/EnderecoRepository.java new file mode 100644 index 00000000..74fb1d34 --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/EnderecoRepository.java @@ -0,0 +1,10 @@ +package br.com.alura.comex.repository; + +import br.com.alura.comex.model.Endereco; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface EnderecoRepository extends JpaRepository { + // Remover ou corrigir o método 'atualizar' se estiver presente +} diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/ItemPedidoRepository.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/ItemPedidoRepository.java new file mode 100644 index 00000000..dc497443 --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/ItemPedidoRepository.java @@ -0,0 +1,24 @@ +package br.com.alura.comex.repository; + +import br.com.alura.comex.model.Cliente; +import br.com.alura.comex.model.ItemPedido; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.math.BigDecimal; +import java.time.LocalDate; + +public interface ItemPedidoRepository extends JpaRepository { + + @Query("SELECT COALESCE(SUM(i.precoUnitario * i.quantidade), 0) FROM ItemPedido i JOIN i.pedido p WHERE p.data BETWEEN :startDate AND :endDate") + BigDecimal totalVendasNoMes(@Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate); + + Cliente getProduto(); + + Object getQuantidade(); + + Object getPrecoUnitario(); + + Object calcularValorTotal(); +} diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/PageRequest/PageRequest.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/PageRequest/PageRequest.java new file mode 100644 index 00000000..bf11c8e5 --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/PageRequest/PageRequest.java @@ -0,0 +1,4 @@ +package br.com.alura.comex.repository.PageRequest; + +public interface PageRequest { +} diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/PedidoRepository.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/PedidoRepository.java new file mode 100644 index 00000000..b683f36a --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/PedidoRepository.java @@ -0,0 +1,14 @@ +package br.com.alura.comex.repository; + +import br.com.alura.comex.model.Pedido; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.List; + +public interface PedidoRepository extends JpaRepository { + + @Query("SELECT DISTINCT p FROM Pedido p LEFT JOIN FETCH p.itensPedidos WHERE p.cliente.id = :clienteId") + List findByClienteIdWithItensPedidos(@Param("clienteId") Long clienteId); +} diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/ProdutoRepository.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/ProdutoRepository.java new file mode 100644 index 00000000..5be7cf60 --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/ProdutoRepository.java @@ -0,0 +1,19 @@ +package br.com.alura.comex.repository; + +import br.com.alura.comex.model.Produto; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Repository +public interface ProdutoRepository extends JpaRepository { + + @Modifying + @Transactional + @Query("UPDATE Produto p SET p.quantidade = p.quantidade - :quantidade WHERE p.id = :produtoId") + void atualizarEstoque(Long produtoId, int quantidade); +} diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/service/CadastrarProdutoPedido.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/service/CadastrarProdutoPedido.java new file mode 100644 index 00000000..9f69ecbf --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/service/CadastrarProdutoPedido.java @@ -0,0 +1,351 @@ +package br.com.alura.comex.service; + +import br.com.alura.comex.model.*; +import br.com.alura.comex.repository.*; +import br.com.alura.comex.testes.ConsultaCep; +import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.LoggerContext; +import jakarta.persistence.NoResultException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.YearMonth; +import java.util.List; +import java.util.Scanner; + +@Service +public class CadastrarProdutoPedido implements CommandLineRunner { + + private static Scanner scanner; + private static final Logger logger = LoggerFactory.getLogger(CadastrarProdutoPedido.class); + + @Autowired + private ClienteRepository clienteRepository; + @Autowired + private CategoriaRepository categoriaRepository; + @Autowired + private ProdutoRepository produtoRepository; + @Autowired + private PedidoRepository pedidoRepository; + @Autowired + private ItemPedidoRepository itemPedidoRepository; + @Autowired + private EnderecoRepository enderecoRepository; + + @Override + public void run(String... args) { + setScanner(new Scanner(System.in)); + setLoggingLevel(Level.ERROR); // Reduz o nível de log antes da interação com o usuário + + System.out.println("Digite 'sair' a qualquer momento para terminar o programa."); + + boolean running = true; + while (running) { + System.out.println("Selecione uma opção:"); + System.out.println("1. Cadastrar nova compra"); + System.out.println("2. Consultar compras de um cliente específico"); + System.out.println("3. Consultar compras de todos os clientes"); + System.out.println("4. Exibir o cliente mais fiel"); + System.out.println("5. Relatório de total de clientes ativos e total vendido no mês"); + System.out.println("6. Sair"); + String option = getRequiredInput("Opção:"); + + switch (option) { + case "1": + cadastrarNovaCompra(); + break; + case "2": + consultarComprasCliente(); + break; + case "3": + consultarComprasTodosClientes(); + break; + case "4": + exibirClienteMaisFiel(); + break; + case "5": + gerarRelatorioClientesAtivosEVendas(); + break; + case "6": + running = false; + break; + default: + System.out.println("Opção inválida. Por favor, tente novamente."); + } + } + getScanner().close(); + setLoggingLevel(Level.DEBUG); // Restaura o nível de log após a interação + } + + private void cadastrarNovaCompra() { + try { + listarClientesCadastrados(); + String cpf = getRequiredInput("Por favor, insira o CPF do cliente:"); + Cliente cliente = clienteRepository.findByCpf(cpf); + if (cliente == null) { + System.out.println("Cliente não encontrado. Iniciando cadastro..."); + String cep = getRequiredInput("Por favor, insira o CEP para consulta:"); + Endereco endereco = new ConsultaCep().consultaCep(cep); + if (endereco == null) { + logger.error("Não foi possível encontrar o endereço para o CEP fornecido."); + return; + } + endereco.setNumero(getRequiredInput("Por favor, insira o número do imóvel:")); + endereco.setComplemento(getInput("Por favor, insira o complemento do imóvel (opcional):")); + + // Salva o endereço antes de criar o cliente + endereco = enderecoRepository.save(endereco); + + cliente = getClienteData(endereco, cpf); + if (cliente != null) { + cliente.setEndereco(endereco); + clienteRepository.save(cliente); + } else { + logger.error("Falha ao criar dados do cliente. Cliente retornou nulo."); + return; + } + } + + Categoria categoria = getCategoriaData(); + Produto produto = getProdutoData(categoria); + produtoRepository.save(produto); + + // Certifique-se de que tipoDesconto seja inicializado corretamente + TipoDesconto tipoDesconto = TipoDesconto.NENHUM; + Pedido pedido = new Pedido(cliente, LocalDate.now(), tipoDesconto); + pedidoRepository.save(pedido); // Salva o pedido com o cliente atribuído + + int quantidadeItens = Integer.parseInt(getRequiredInput("Por favor, insira a quantidade de itens:")); + BigDecimal precoUnitario = produto.getPrecoUnitario(); + + // Verifique se o precoUnitario está definido corretamente + if (precoUnitario == null) { + logger.error("O preço unitário do produto está nulo."); + return; + } + + // Log para verificar os valores antes de criar o itemPedido + logger.info("Criando itemPedido: produto={}, quantidade={}, precoUnitario={}", produto.getNome(), quantidadeItens, precoUnitario); + + ItemPedido itemPedido = new ItemPedido(produto, quantidadeItens, precoUnitario, TipoDesconto.NENHUM, pedido); + + // Garantir que o preço unitário está sendo definido + itemPedido.setPrecoUnitario(precoUnitario); + + // Log para verificar os valores antes de salvar + logger.info("Salvando itemPedido: produto={}, quantidade={}, precoUnitario={}", produto.getNome(), quantidadeItens, precoUnitario); + + itemPedidoRepository.save(itemPedido); + pedido.adicionarItem(itemPedido); // Adiciona o item ao pedido + pedidoRepository.save(pedido); // Atualiza o pedido com o item adicionado + + logger.info("Item do pedido cadastrado com sucesso: {}", itemPedido); + gerarRelatorio(); + } catch (Exception e) { + logger.error("Ocorreu uma exceção: ", e); + } + } + + + private void listarClientesCadastrados() { + List clientes = clienteRepository.findAll(); + System.out.println("-------------------------------------------------"); + System.out.println(" RELATÓRIO DE CLIENTES "); + System.out.println("-------------------------------------------------"); + System.out.printf("%-5s %-20s %-15s %-30s %-20s %-15s\n", "ID", "Nome", "CPF", "Email", "Profissão", "Telefone"); + System.out.println("-------------------------------------------------"); + clientes.forEach(cliente -> { + System.out.printf("%-5d %-20s %-15s %-30s %-20s %-15s\n", + cliente.getId(), + cliente.getNome(), + cliente.getCpf(), + cliente.getEmail(), + cliente.getProfissao(), + cliente.getTelefone()); + }); + System.out.println("-------------------------------------------------"); + } + + private Categoria getCategoriaData() { + String nomeCategoria = getRequiredInput("Por favor, insira o nome da categoria:"); + Categoria categoria = new Categoria(nomeCategoria); + categoriaRepository.save(categoria); + return categoria; + } + + private Produto getProdutoData(Categoria categoria) { + String nomeProduto = getRequiredInput("Por favor, insira o nome do produto:"); + String descricao = getRequiredInput("Por favor, insira a descrição do produto:"); + BigDecimal precoUnitario = new BigDecimal(getRequiredInput("Por favor, insira o preço unitário do produto:")); + int quantidade = Integer.parseInt(getRequiredInput("Por favor, insira a quantidade do produto:")); + return new Produto(nomeProduto, descricao, precoUnitario, quantidade, categoria); + } + + private Cliente getClienteData(Endereco endereco, String cpf) { + String nomeCliente = getRequiredInput("Por favor, insira o nome do cliente:"); + String email = getEmailInput(); + String profissao = getRequiredInput("Por favor, insira a profissão do cliente:"); + String telefone = getRequiredInput("Por favor, insira o telefone do cliente:"); + return new Cliente(nomeCliente, cpf, email, profissao, telefone, endereco, true, LocalDate.now()); + } + + private void consultarComprasCliente() { + String cpf = getRequiredInput("Por favor, insira o CPF do cliente:"); + Cliente cliente = clienteRepository.findByCpfWithPedidos(cpf); + if (cliente == null) { + System.out.println("Cliente não encontrado."); + return; + } + exibirDetalhesCliente(cliente); + exibirPedidosCliente(cliente); + } + + private void consultarComprasTodosClientes() { + List clientes = clienteRepository.findAllWithPedidos(); + if (clientes.isEmpty()) { + System.out.println("Nenhum cliente encontrado."); + } else { + clientes.forEach(cliente -> { + exibirDetalhesCliente(cliente); + exibirPedidosCliente(cliente); + System.out.println("-------------------------------------------------"); + }); + } + } + + private void exibirClienteMaisFiel() { + try { + List resultado = clienteRepository.findClienteMaisFiel(PageRequest.of(0, 1)); + if (!resultado.isEmpty()) { + Object[] clienteInfo = resultado.get(0); + Long clienteId = (Long) clienteInfo[0]; + Long totalPedidos = (Long) clienteInfo[1]; + Cliente cliente = clienteRepository.findById(clienteId).orElseThrow(); + System.out.println("-------------------------------------------------------------------------"); + System.out.println("Cliente mais fiel:"); + System.out.printf("%-30s %-20s\n", "Cliente", "Total de Pedidos"); + System.out.printf("%-30s %-20d\n", cliente.getNome(), totalPedidos); + System.out.println("-------------------------------------------------------------------------"); + } else { + System.out.println("Nenhum cliente encontrado."); + } + } catch (NoResultException e) { + System.out.println("Nenhum cliente encontrado."); + } + } + + private void gerarRelatorio() { + List clientes = clienteRepository.findAll(); + clientes.forEach(this::exibirDetalhesCliente); + clientes.forEach(this::exibirPedidosCliente); + } + + private void gerarRelatorioClientesAtivosEVendas() { + YearMonth currentMonth = YearMonth.now(); + LocalDate startDate = currentMonth.atDay(1); + LocalDate endDate = currentMonth.atEndOfMonth(); + + // Total de clientes ativos (clientes com pelo menos um pedido no mês) + Long totalClientesAtivos = clienteRepository.countClientesAtivos(startDate, endDate); + + // Total vendido no mês + BigDecimal totalVendas = itemPedidoRepository.totalVendasNoMes(startDate, endDate); + + System.out.println("-------------------------------------------------"); + System.out.println(" RELATÓRIO DE CLIENTES ATIVOS E TOTAL VENDIDO NO MÊS "); + System.out.println("-------------------------------------------------"); + System.out.printf("Total de clientes ativos no mês: %d\n", totalClientesAtivos); + System.out.printf("Total vendido no mês: R$ %.2f\n", totalVendas); + System.out.println("-------------------------------------------------"); + } + + private void exibirDetalhesCliente(Cliente cliente) { + System.out.println("-------------------------------------------------------------------------"); + System.out.println("Cliente #" + cliente.getId() + ":"); + System.out.println("Nome: " + cliente.getNome()); + System.out.println("CPF: " + cliente.getCpf()); + System.out.println("Email: " + cliente.getEmail()); + System.out.println("Profissão: " + cliente.getProfissao()); + System.out.println("Telefone: " + cliente.getTelefone()); + Endereco endereco = cliente.getEndereco(); + if (endereco != null) { + System.out.println("Endereço: " + endereco.getLogradouro() + ", Número: " + endereco.getNumero() + ", Complemento: " + endereco.getComplemento() + ", CEP: " + endereco.getCep()); + } + } + + private void exibirPedidosCliente(Cliente cliente) { + List pedidos = pedidoRepository.findByClienteIdWithItensPedidos(cliente.getId()); + + if (pedidos.isEmpty()) { + System.out.println("Nenhum pedido encontrado para este cliente."); + } else { + System.out.println("-------------------------------------------------------------------------"); + System.out.println("Pedidos do Cliente:"); + pedidos.forEach(pedido -> { + System.out.println("Pedido ID: " + pedido.getId() + " | Data: " + pedido.getData() + " | Total: " + pedido.getValorTotal()); + System.out.println("Itens do Pedido:"); + System.out.printf("%-30s %-10s %-15s %-15s\n", "Produto", "Quantidade", "Preço Unitário", "Valor Total"); + pedido.getItensPedidos().forEach(item -> { + System.out.printf("%-30s %-10d %-15.2f %-15.2f\n", + item.getNomeProduto(), item.getQuantidade(), item.getPrecoUnitario(), item.calcularValorTotal()); + }); + System.out.println("-------------------------------------------------------------------------"); + }); + + } + } + + + + private static String getRequiredInput(String prompt) { + System.out.println(prompt); + String input = getScanner().nextLine(); + if ("sair".equalsIgnoreCase(input)) { + System.out.println("Programa encerrado."); + System.exit(0); + } + if (input.trim().isEmpty()) { + System.out.println("Este campo é obrigatório. Por favor, forneça um valor."); + return getRequiredInput(prompt); + } + return input; + } + + private static String getInput(String prompt) { + System.out.println(prompt); + return getScanner().nextLine(); + } + + private static String getEmailInput() { + String email = getRequiredInput("Por favor, insira o email do cliente:"); + if (!isValidEmail(email)) { + System.out.println("Email inválido. Por favor, insira um email válido."); + return getEmailInput(); + } + return email; + } + + private static boolean isValidEmail(String email) { + return email.matches("[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}"); + } + + private static Scanner getScanner() { + return scanner; + } + + private static void setScanner(Scanner scanner) { + CadastrarProdutoPedido.scanner = scanner; + } + + private static void setLoggingLevel(Level level) { + LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); + loggerContext.getLogger("org.hibernate").setLevel(level); + loggerContext.getLogger("org.springframework").setLevel(level); + } +} diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/service/DataBaseService.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/service/DataBaseService.java new file mode 100644 index 00000000..4440e0b6 --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/service/DataBaseService.java @@ -0,0 +1,103 @@ +package br.com.alura.comex.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; + +import jakarta.annotation.PostConstruct; + +@Service +public class DataBaseService { + + @Autowired + private JdbcTemplate jdbcTemplate; + + @PostConstruct + public void initializeDatabase() { + try { + addColumns(); + removeForeignKeyConstraints(); + addForeignKeyConstraints(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void addColumns() { + // Verificar se a coluna tipo_desconto já existe antes de adicionar + Integer columnCount = jdbcTemplate.queryForObject( + "SELECT COUNT(*) FROM user_tab_columns WHERE table_name = 'PEDIDOS' AND column_name = 'TIPO_DESCONTO'", + Integer.class + ); + + if (columnCount != null && columnCount == 0) { + // Adicionar coluna tipo_desconto em pedidos + jdbcTemplate.execute("ALTER TABLE pedidos ADD tipo_desconto varchar2(255 char)"); + + // Atualizar valores NULL para 'NENHUM' + jdbcTemplate.execute("UPDATE pedidos SET tipo_desconto = 'NENHUM' WHERE tipo_desconto IS NULL"); + + // Modificar a coluna para NOT NULL + jdbcTemplate.execute("ALTER TABLE pedidos MODIFY tipo_desconto NOT NULL"); + } else { + System.out.println("Coluna tipo_desconto já existe na tabela pedidos."); + } + } + + private void removeForeignKeyConstraints() { + // Remover constraint de chave estrangeira existente, se houver + try { + jdbcTemplate.execute("ALTER TABLE pedidos DROP CONSTRAINT FK6wgk5emlhdcthucnnmi4dpl33"); + } catch (Exception e) { + System.out.println("Constraint FK6wgk5emlhdcthucnnmi4dpl33 não encontrada ou não pode ser removida: " + e.getMessage()); + } + + try { + jdbcTemplate.execute("ALTER TABLE produto DROP CONSTRAINT fk_categoria_produto"); + } catch (Exception e) { + System.out.println("Constraint fk_categoria_produto não encontrada ou não pode ser removida: " + e.getMessage()); + } + } + + private void addForeignKeyConstraints() { + // Verificar e adicionar constraints de chave estrangeira + + // Verifica se a chave primária existe na tabela cliente + Integer clienteCount = jdbcTemplate.queryForObject( + "SELECT COUNT(*) FROM cliente", + Integer.class + ); + + if (clienteCount != null && clienteCount > 0) { + // Adicionar constraint de chave estrangeira em pedidos + try { + jdbcTemplate.execute( + "ALTER TABLE pedidos ADD CONSTRAINT FK6wgk5emlhdcthucnnmi4dpl33 FOREIGN KEY (cliente_id) REFERENCES cliente(id)" + ); + } catch (Exception e) { + System.out.println("Erro ao adicionar constraint FK6wgk5emlhdcthucnnmi4dpl33: " + e.getMessage()); + } + } else { + System.out.println("Tabela cliente não contém registros, constraint FK6wgk5emlhdcthucnnmi4dpl33 não pode ser adicionada."); + } + + // Verifica se a chave primária existe na tabela categoria + Integer categoriaCount = jdbcTemplate.queryForObject( + "SELECT COUNT(*) FROM categoria", + Integer.class + ); + + if (categoriaCount != null && categoriaCount > 0) { + // Adicionar constraint de chave estrangeira em produto + try { + jdbcTemplate.execute( + "ALTER TABLE produto ADD CONSTRAINT fk_categoria_produto FOREIGN KEY (categoria_id) REFERENCES categoria(id)" + ); + } catch (Exception e) { + System.out.println("Erro ao adicionar constraint fk_categoria_produto: " + e.getMessage()); + } + } else { + System.out.println("Tabela categoria não contém registros, constraint fk_categoria_produto não pode ser adicionada."); + } + } +} diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/service/EnderecoService.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/service/EnderecoService.java new file mode 100644 index 00000000..e3087674 --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/service/EnderecoService.java @@ -0,0 +1,18 @@ +package br.com.alura.comex.service; + +import br.com.alura.comex.model.Endereco; +import br.com.alura.comex.repository.EnderecoRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class EnderecoService { + + private final EnderecoRepository enderecoRepository; + + @Autowired + public EnderecoService(EnderecoRepository enderecoRepository) { + this.enderecoRepository = enderecoRepository; + } + +} diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/service/ImprimeDadosClientes.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/service/ImprimeDadosClientes.java new file mode 100644 index 00000000..cd25e3ec --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/service/ImprimeDadosClientes.java @@ -0,0 +1,38 @@ +package br.com.alura.comex.service; + +import br.com.alura.comex.model.Cliente; +import jakarta.persistence.EntityManager; +import jakarta.persistence.EntityManagerFactory; +import jakarta.persistence.Persistence; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +public class ImprimeDadosClientes { + + public static void main(String[] args) { + // Certifique-se de que o nome da unidade de persistência corresponde à sua configuração em persistence.xml + EntityManagerFactory factory = Persistence.createEntityManagerFactory("oracle"); + EntityManager entityManager = factory.createEntityManager(); + + try { + List clientes = findAllClientesWithEndereco(entityManager); + AtomicInteger counter = new AtomicInteger(1); + + clientes.forEach(cliente -> { + System.out.printf("Cliente #%d:\n", counter.getAndIncrement()); + System.out.printf("Nome: %s\nCPF: %s\nEmail: %s\nProfissão: %s\nTelefone: %s\n", + cliente.getNome(), cliente.getCpf(), cliente.getEmail(), cliente.getProfissao(), cliente.getTelefone()); + System.out.printf("Endereço: %s, Número: %s, Complemento: %s, CEP: %s\n\n", + cliente.getEndereco().getLogradouro(), cliente.getEndereco().getNumero(), + cliente.getEndereco().getComplemento(), cliente.getEndereco().getCep()); + }); + } finally { + entityManager.close(); + } + } + + private static List findAllClientesWithEndereco(EntityManager em) { + return em.createQuery("SELECT c FROM Cliente c JOIN FETCH c.endereco", Cliente.class) + .getResultList(); + } +} diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/service/TodosProdutosCadastradosBd.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/service/TodosProdutosCadastradosBd.java new file mode 100644 index 00000000..2592c03c --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/service/TodosProdutosCadastradosBd.java @@ -0,0 +1,58 @@ +package br.com.alura.comex.service; + +import br.com.alura.comex.model.Produto; + +import jakarta.persistence.EntityManager; +import jakarta.persistence.EntityManagerFactory; +import jakarta.persistence.TypedQuery; +import java.util.List; +import static jakarta.persistence.Persistence.createEntityManagerFactory; + +public class TodosProdutosCadastradosBd { + + private EntityManager entityManager; + + public TodosProdutosCadastradosBd(EntityManager entityManager) { + this.entityManager = entityManager; + } + + public List listarTodos() { + TypedQuery query = entityManager.createQuery("SELECT p FROM Produto p", Produto.class); + return query.getResultList(); + } + + public static void main(String[] args) { + EntityManagerFactory factory = createEntityManagerFactory("oracle"); + EntityManager entityManager = factory.createEntityManager(); + + TodosProdutosCadastradosBd produtoRepository = new TodosProdutosCadastradosBd(entityManager); + + List produtos = produtoRepository.listarTodos(); + + // Gerar relatório + gerarRelatorio(produtos); + + entityManager.close(); + factory.close(); + } + + private static void gerarRelatorio(List produtos) { + System.out.println("-------------------------------------------------"); + System.out.println(" RELATÓRIO DE PRODUTOS "); + System.out.println("-------------------------------------------------"); + System.out.printf("%-5s %-30s %-20s %-10s %-10s %-10s\n", "ID", "Nome", "Descrição", "Preço Unit.", "Quantidade", "Categoria"); + System.out.println("-------------------------------------------------"); + + for (Produto produto : produtos) { + System.out.printf("%-5d %-30s %-20s %-10.2f %-10d %-10s\n", + produto.getId(), + produto.getNome(), + produto.getDescricao(), + produto.getPrecoUnitario(), + produto.getQuantidade(), + produto.getCategoria().getNome()); + } + + System.out.println("-------------------------------------------------"); + } +} diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/ConsultaCep.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/ConsultaCep.java new file mode 100644 index 00000000..063cb281 --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/ConsultaCep.java @@ -0,0 +1,39 @@ +package br.com.alura.comex.testes; + +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.net.http.HttpClient.Version; + +import br.com.alura.comex.model.Endereco; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class ConsultaCep { + + private static final String BASE_URL = "https://viacep.com.br/ws/"; + + public Endereco consultaCep(String cep) { + try { + HttpClient client = HttpClient.newBuilder() + .version(Version.HTTP_2) + .build(); + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(BASE_URL + cep + "/json/")) + .GET() + .build(); + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + + if (response.statusCode() == 200) { + ObjectMapper mapper = new ObjectMapper(); + return mapper.readValue(response.body(), Endereco.class); + } else { + System.err.println("Erro na consulta do CEP: " + response.statusCode()); + return null; + } + } catch (Exception e) { + System.err.println("Erro ao consultar CEP: " + e.getMessage()); + return null; + } + } +} diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/OrdenacaoPedido.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/OrdenacaoPedido.java new file mode 100644 index 00000000..24c4cdda --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/OrdenacaoPedido.java @@ -0,0 +1,66 @@ +package br.com.alura.comex.testes; + +import br.com.alura.comex.model.Cliente; +import br.com.alura.comex.model.Pedido; +import br.com.alura.comex.model.Produto; +import br.com.alura.comex.model.ItemPedido; +import br.com.alura.comex.model.TipoDesconto; +import br.com.alura.comex.model.Categoria; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +public class OrdenacaoPedido { + public static void main(String... args) { + List pedidos = new ArrayList<>(); + Cliente clienteJoao = new Cliente("João Silva", "123.456.789-00", "joao@gmail.com", "Engenheiro", "9988776655", null); + Cliente clienteMaria = new Cliente("Maria Fernanda", "987.654.321-00", "maria@gmail.com", "Advogada", "9966554433", null); + Cliente clienteCarlos = new Cliente("Carlos Eduardo", "321.654.987-00", "carlos@gmail.com", "Médico", "9944221100", null); + Cliente clienteAna = new Cliente("Ana Paula", "321.654.987-00", "ana@gmail.com", "Designer", "9944221100", null); + Cliente clientePaulo = new Cliente("Paulo Henrique", "321.654.987-00", "paulo@gmail.com", "Fotógrafo", "9944221100", null); + + // Criar categorias + Categoria categoria1 = new Categoria("Eletrônicos"); + Categoria categoria2 = new Categoria("Móveis"); + + // Criar produtos + Produto produto1 = new Produto("Notebook", "Notebook Dell", new BigDecimal("3000.0"), 10, categoria1); + Produto produto2 = new Produto("Cadeira", "Cadeira de escritório", new BigDecimal("500.0"), 20, categoria2); + + // Adicionando pedidos com itens do pedido + pedidos.add(criarPedido(clienteJoao, produto1, 2, new BigDecimal("1200.00"))); + pedidos.add(criarPedido(clienteMaria, produto2, 1, new BigDecimal("300.00"))); + pedidos.add(criarPedido(clienteCarlos, produto1, 3, new BigDecimal("450.00"))); + pedidos.add(criarPedido(clienteAna, produto2, 1, new BigDecimal("850.00"))); + pedidos.add(criarPedido(clientePaulo, produto1, 2, new BigDecimal("1250.00"))); + + // Ordenando por maior valor total + Collections.sort(pedidos, Comparator.comparing(Pedido::getValorTotal).reversed()); + System.out.println("\nPedidos ordenados por maior valor total:"); + for (Pedido pedido : pedidos) { + System.out.println("Pedido ID: " + pedido.getId() + ", Valor Total: " + pedido.getValorTotal()); + } + + // Ordenando por menor valor total + Collections.sort(pedidos, Comparator.comparing(Pedido::getValorTotal)); + System.out.println("\nPedidos ordenados por menor valor total:"); + for (Pedido pedido : pedidos) { + System.out.println("Pedido ID: " + pedido.getId() + ", Valor Total: " + pedido.getValorTotal()); + } + } + + private static Pedido criarPedido(Cliente cliente, Produto produto, int quantidade, BigDecimal preco) { + List itensPedido = new ArrayList<>(); + TipoDesconto tipoDesconto = TipoDesconto.NENHUM; // Assumindo que não há desconto se não especificado + itensPedido.add(new ItemPedido(produto, quantidade, preco, tipoDesconto, null)); // O pedido será setado depois + Pedido pedido = new Pedido(cliente, preco.multiply(BigDecimal.valueOf(quantidade)), quantidade, LocalDate.now(), tipoDesconto, itensPedido); + for (ItemPedido item : itensPedido) { + item.setPedido(pedido); + } + return pedido; + } +} diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/TestaPedidoDao.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/TestaPedidoDao.java new file mode 100644 index 00000000..8bcc3cad --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/TestaPedidoDao.java @@ -0,0 +1,201 @@ +package br.com.alura.comex.testes; + +import br.com.alura.comex.model.Categoria; +import br.com.alura.comex.repository.CategoriaRepository; +import jakarta.persistence.EntityManager; +import jakarta.persistence.EntityManagerFactory; +import jakarta.persistence.Persistence; +import org.springframework.data.domain.Example; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.data.repository.query.FluentQuery; + +import java.util.List; +import java.util.Optional; +import java.util.function.Function; + +public class TestaPedidoDao { + + public static void main(String[] args) { + EntityManagerFactory emf = Persistence.createEntityManagerFactory("oracle"); + EntityManager em = emf.createEntityManager(); + + CategoriaRepository categoriaRepository = new CategoriaRepository() { + @Override + public List findAll(Sort sort) { + return List.of(); + } + + @Override + public Page findAll(Pageable pageable) { + return null; + } + + @Override + public S save(S entity) { + return null; + } + + @Override + public List saveAll(Iterable entities) { + return List.of(); + } + + @Override + public Optional findById(Long aLong) { + return Optional.empty(); + } + + @Override + public boolean existsById(Long aLong) { + return false; + } + + @Override + public List findAll() { + return List.of(); + } + + @Override + public List findAllById(Iterable longs) { + return List.of(); + } + + @Override + public long count() { + return 0; + } + + @Override + public void deleteById(Long aLong) { + + } + + @Override + public void delete(Categoria entity) { + + } + + @Override + public void deleteAllById(Iterable longs) { + + } + + @Override + public void deleteAll(Iterable entities) { + + } + + @Override + public void deleteAll() { + + } + + @Override + public void flush() { + + } + + @Override + public S saveAndFlush(S entity) { + return null; + } + + @Override + public List saveAllAndFlush(Iterable entities) { + return List.of(); + } + + @Override + public void deleteAllInBatch(Iterable entities) { + + } + + @Override + public void deleteAllByIdInBatch(Iterable longs) { + + } + + @Override + public void deleteAllInBatch() { + + } + + @Override + public Categoria getOne(Long aLong) { + return null; + } + + @Override + public Categoria getById(Long aLong) { + return null; + } + + @Override + public Categoria getReferenceById(Long aLong) { + return null; + } + + @Override + public Optional findOne(Example example) { + return Optional.empty(); + } + + @Override + public List findAll(Example example) { + return List.of(); + } + + @Override + public List findAll(Example example, Sort sort) { + return List.of(); + } + + @Override + public Page findAll(Example example, Pageable pageable) { + return null; + } + + @Override + public long count(Example example) { + return 0; + } + + @Override + public boolean exists(Example example) { + return false; + } + + @Override + public R findBy(Example example, Function, R> queryFunction) { + return null; + } + + @Override + public Categoria findByNome(String nome) { + return null; + } + + @Override + public List relatorioDeVendasPorCategoria() { + return List.of(); + } + }; + + List relatorio = categoriaRepository.relatorioDeVendasPorCategoria(); + System.out.println("-------------------------------------------------------------------------"); + System.out.printf("%-30s %-20s %-15s %n", "Categoria", "Produtos Vendidos", "Montante Vendido"); + System.out.println("-------------------------------------------------------------------------"); + relatorio.forEach(linha -> { + String nomeCategoria = (String) linha[0]; + Long quantidadeProdutos = (Long) linha[1]; + Double montanteVendido = (Double) linha[2]; + System.out.printf("%-30s %-20d %-15.2f %n", nomeCategoria, quantidadeProdutos, montanteVendido); + }); + System.out.println("-------------------------------------------------------------------------"); + + em.close(); + emf.close(); + } +} \ No newline at end of file diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/TestaPedidoOrdenado.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/TestaPedidoOrdenado.java new file mode 100644 index 00000000..f8cba581 --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/TestaPedidoOrdenado.java @@ -0,0 +1,68 @@ +import br.com.alura.comex.model.*; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +public class TestaPedidoOrdenado { + + public static void main(String[] args) { + // Criar categorias + Categoria categoria1 = new Categoria("Eletrônicos"); + Categoria categoria2 = new Categoria("Móveis"); + + // Criar clientes + Cliente cliente1 = new Cliente("Fulano", "123.456.789-00", "fulano@gmail.com", "Desenvolvedor", "123456789", new Endereco("Rua A", "123", "Bairro X", "Cidade Y", "12345-678")); + Cliente cliente2 = new Cliente("Ciclano", "987.654.321-00", "ciclano@gmail.com", "Analista", "987654321", new Endereco("Rua B", "456", "Bairro Y", "Cidade Z", "98765-432")); + + // Criar produtos + Produto produto1 = new Produto("Notebook", "Notebook Dell", new BigDecimal("3000.0"), 10, categoria1); + Produto produto2 = new Produto("Cadeira", "Cadeira de escritório", new BigDecimal("500.0"), 20, categoria2); + + // Criar pedidos com variações de valores e produtos, associando a cada cliente + Pedido pedido1 = criarPedido(cliente1, produto1, 2, TipoDesconto.NENHUM); + Pedido pedido2 = criarPedido(cliente2, produto2, 3, TipoDesconto.PROMOCIONAL); + Pedido pedido3 = criarPedido(cliente1, produto1, 1, TipoDesconto.FIDELIDADE); + Pedido pedido4 = criarPedido(cliente2, produto2, 5, TipoDesconto.PROMOCIONAL); + Pedido pedido5 = criarPedido(cliente1, produto1, 1, TipoDesconto.NENHUM); + + // Atribuir os pedidos criados a uma lista + List pedidos = new ArrayList<>(List.of(pedido1, pedido2, pedido3, pedido4, pedido5)); + + // Ordenar a lista de pedidos pelo maior valor total + Pedido pedidoMaiorValor = pedidos.stream() + .max(Comparator.comparing(Pedido::getValorTotal)) + .orElse(null); + + System.out.println("Pedido com maior valor total:"); + if (pedidoMaiorValor != null) { + System.out.println(pedidoMaiorValor); + } else { + System.out.println("Nenhum pedido encontrado."); + } + + // Ordenar a lista de pedidos pelo menor valor total + Pedido pedidoMenorValor = pedidos.stream() + .min(Comparator.comparing(Pedido::getValorTotal)) + .orElse(null); + + System.out.println("\nPedido com menor valor total:"); + if (pedidoMenorValor != null) { + System.out.println(pedidoMenorValor); + } else { + System.out.println("Nenhum pedido encontrado."); + } + } + + private static Pedido criarPedido(Cliente cliente, Produto produto, int quantidade, TipoDesconto tipoDesconto) { + List itensPedido = new ArrayList<>(); + itensPedido.add(new ItemPedido(produto, quantidade, produto.getPrecoUnitario(), tipoDesconto, null)); // O pedido será setado depois + Pedido pedido = new Pedido(cliente, produto.getPrecoUnitario().multiply(BigDecimal.valueOf(quantidade)), quantidade, LocalDate.now(), tipoDesconto, itensPedido); + for (ItemPedido item : itensPedido) { + item.setPedido(pedido); + } + return pedido; + } +} diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/TesteCep.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/TesteCep.java new file mode 100644 index 00000000..88bcb5c9 --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/TesteCep.java @@ -0,0 +1,14 @@ +package br.com.alura.comex.testes; + +import br.com.alura.comex.model.Endereco; + +public class TesteCep { + public static void main(String[] args) { + ConsultaCep service = new ConsultaCep(); + Endereco endereco = service.consultaCep("12237600"); + if (endereco != null) { + System.out.println(endereco); + } + } +} + diff --git a/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/TesteProduto.java b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/TesteProduto.java new file mode 100644 index 00000000..aa419455 --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/java/br/com/alura/comex/testes/TesteProduto.java @@ -0,0 +1,64 @@ +package br.com.alura.comex.testes; + +import java.math.BigDecimal; +import java.util.Scanner; + +public class TesteProduto { + + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + + try { + // Lendo o nome do produto + System.out.print("Por favor, insira o nome do produto: "); + String nome = scanner.nextLine(); + + // Lendo a descrição do produto + System.out.print("Por favor, insira a descrição do produto: "); + String descricao = scanner.nextLine(); + + // Lendo o preço unitário do produto + BigDecimal precoUnitario = lerPrecoUnitario(scanner); + scanner.nextLine(); // Consumindo a quebra de linha após o preço + + // Lendo a quantidade do produto + int quantidade = lerQuantidade(scanner); + scanner.nextLine(); // Consumindo a quebra de linha após a quantidade + + // Lendo a categoria do produto + System.out.print("Por favor, insira a categoria do produto: "); + String categoria = scanner.nextLine(); + + // Aqui você poderia criar um objeto Produto e fazer algo com ele + System.out.println("Produto criado: " + nome + ", " + descricao + ", " + precoUnitario + ", " + quantidade + ", " + categoria); + + } finally { + scanner.close(); + } + } + + private static BigDecimal lerPrecoUnitario(Scanner scanner) { + while (true) { + try { + System.out.print("Por favor, insira o preço unitário do produto: "); + return scanner.nextBigDecimal(); + } catch (java.util.InputMismatchException e) { + System.out.println("Entrada inválida. Por favor, insira um número válido para o preço."); + scanner.nextLine(); // Limpa o buffer do scanner completamente + } + } + } + + private static int lerQuantidade(Scanner scanner) { + while (true) { + try { + System.out.print("Por favor, insira a quantidade do produto: "); + return scanner.nextInt(); + } catch (java.util.InputMismatchException e) { + System.out.println("Entrada inválida. Por favor, insira um número inteiro válido para a quantidade."); + scanner.nextLine(); // Limpa o buffer do scanner completamente + } + } + } +} + diff --git a/SEMANA 10_WANDER CARVALHO/src/main/resources/META-INF/persistence.xml b/SEMANA 10_WANDER CARVALHO/src/main/resources/META-INF/persistence.xml new file mode 100644 index 00000000..502d04c5 --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/resources/META-INF/persistence.xml @@ -0,0 +1,39 @@ + + + + + org.hibernate.jpa.HibernatePersistenceProvider + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SEMANA 10_WANDER CARVALHO/src/main/resources/application.properties b/SEMANA 10_WANDER CARVALHO/src/main/resources/application.properties new file mode 100644 index 00000000..28ede3a8 --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/resources/application.properties @@ -0,0 +1,9 @@ +spring.datasource.url=jdbc:oracle:thin:@localhost:1521:xe +spring.datasource.username=system +spring.datasource.password=12345678 +spring.datasource.driver-class-name=oracle.jdbc.OracleDriver + +spring.jpa.hibernate.ddl-auto=update +spring.jpa.show-sql=true +spring.jpa.format-sql=true +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.Oracle12cDialect diff --git a/SEMANA 10_WANDER CARVALHO/src/main/resources/pedidos.csv b/SEMANA 10_WANDER CARVALHO/src/main/resources/pedidos.csv new file mode 100644 index 00000000..21e55498 --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/main/resources/pedidos.csv @@ -0,0 +1,17 @@ +CATEGORIA,PRODUTO,PRECO,QUANTIDADE,DATA,CLIENTE +INFORMÁTICA,Notebook Samsung,3523.00,1,01/01/2022,ANA +MÓVEIS,Sofá 3 lugares,2500.00,1,05/01/2022,ANA +LIVROS,Clean Architecture,102.90,2,08/01/2022,ANA +MÓVEIS,Mesa de jantar 6 lugares,3678.98,1,06/01/2022,ELI +CELULARES,iPhone 13 Pro,9176.00,6,13/01/2022,ANA +INFORMÁTICA,"Monitor Dell 27""",1889.00,3,04/01/2022,DANI +LIVROS,Implementing Domain-Driven Design,144.07,3,10/01/2022,GABI +AUTOMOTIVA,Jogo de pneus,1276.79,1,15/01/2022,BIA +LIVROS,Clean Code,95.17,1,09/01/2022,BIA +CELULARES,Galaxy S22 Ultra,8549.10,5,14/01/2022,DANI +INFORMÁTICA,Macbook Pro 16,31752.00,1,03/01/2022,CAIO +LIVROS,Refactoring Improving the Design of Existing Code,173.90,1,12/01/2022,DANI +MÓVEIS,Cama queen size,3100.00,2,07/01/2022,DANI +AUTOMOTIVA,Central multimidia,711.18,1,16/01/2022,CAIO +LIVROS,Building Microservices,300.28,2,11/01/2022,CAIO +INFORMÁTICA,Galaxy Tab S8,5939.10,4,02/01/2022,BIA \ No newline at end of file diff --git a/SEMANA 10_WANDER CARVALHO/src/test/java/br/com/alura/comex/dao/CategoriaDaoTest.java b/SEMANA 10_WANDER CARVALHO/src/test/java/br/com/alura/comex/dao/CategoriaDaoTest.java new file mode 100644 index 00000000..de5ae50f --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/test/java/br/com/alura/comex/dao/CategoriaDaoTest.java @@ -0,0 +1,28 @@ +package br.com.alura.comex.dao; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class CategoriaDaoTest { + + @Test + void buscarPorId() { + } + + @Test + void cadastrar() { + } + + @Test + void listaTodas() { + } + + @Test + void relatorioDeVendasPorCategoria() { + } + + @Test + void buscarPorNome() { + } +} \ No newline at end of file diff --git a/SEMANA 10_WANDER CARVALHO/src/test/java/br/com/alura/comex/model/EstoqueTest.java b/SEMANA 10_WANDER CARVALHO/src/test/java/br/com/alura/comex/model/EstoqueTest.java new file mode 100644 index 00000000..e976a1b4 --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/test/java/br/com/alura/comex/model/EstoqueTest.java @@ -0,0 +1,35 @@ +package br.com.alura.comex.model; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; +class EstoqueTest { + + @Test + void adicionarProduto() { + } + + @Test + void removerProduto() { + } + + @Test + void consultarQuantidade() { + } + + @Test + void getId() { + } + + @Test + void setId() { + } + + @Test + void getProdutos() { + } + + @Test + void setProdutos() { + } +} \ No newline at end of file diff --git a/SEMANA 10_WANDER CARVALHO/src/test/java/br/com/alura/comex/model/PedidoTest.java b/SEMANA 10_WANDER CARVALHO/src/test/java/br/com/alura/comex/model/PedidoTest.java new file mode 100644 index 00000000..4d485fa5 --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/test/java/br/com/alura/comex/model/PedidoTest.java @@ -0,0 +1,76 @@ +package br.com.alura.comex.model; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class PedidoTest { + + @Test + void getId() { + } + + @Test + void setId() { + } + + @Test + void getCliente() { + } + + @Test + void setCliente() { + } + + @Test + void getPreco() { + } + + @Test + void setPreco() { + } + + @Test + void getQuantidade() { + } + + @Test + void setQuantidade() { + } + + @Test + void getData() { + } + + @Test + void setData() { + } + + @Test + void getTipoDesconto() { + } + + @Test + void setTipoDesconto() { + } + + @Test + void getValorTotal() { + } + + @Test + void testToString() { + } + + @Test + void isMaisCaroQue() { + } + + @Test + void isMaisBaratoQue() { + } + + @Test + void getItensPedido() { + } +} \ No newline at end of file diff --git a/SEMANA 10_WANDER CARVALHO/src/test/resources/pedidos.csv b/SEMANA 10_WANDER CARVALHO/src/test/resources/pedidos.csv new file mode 100644 index 00000000..21e55498 --- /dev/null +++ b/SEMANA 10_WANDER CARVALHO/src/test/resources/pedidos.csv @@ -0,0 +1,17 @@ +CATEGORIA,PRODUTO,PRECO,QUANTIDADE,DATA,CLIENTE +INFORMÁTICA,Notebook Samsung,3523.00,1,01/01/2022,ANA +MÓVEIS,Sofá 3 lugares,2500.00,1,05/01/2022,ANA +LIVROS,Clean Architecture,102.90,2,08/01/2022,ANA +MÓVEIS,Mesa de jantar 6 lugares,3678.98,1,06/01/2022,ELI +CELULARES,iPhone 13 Pro,9176.00,6,13/01/2022,ANA +INFORMÁTICA,"Monitor Dell 27""",1889.00,3,04/01/2022,DANI +LIVROS,Implementing Domain-Driven Design,144.07,3,10/01/2022,GABI +AUTOMOTIVA,Jogo de pneus,1276.79,1,15/01/2022,BIA +LIVROS,Clean Code,95.17,1,09/01/2022,BIA +CELULARES,Galaxy S22 Ultra,8549.10,5,14/01/2022,DANI +INFORMÁTICA,Macbook Pro 16,31752.00,1,03/01/2022,CAIO +LIVROS,Refactoring Improving the Design of Existing Code,173.90,1,12/01/2022,DANI +MÓVEIS,Cama queen size,3100.00,2,07/01/2022,DANI +AUTOMOTIVA,Central multimidia,711.18,1,16/01/2022,CAIO +LIVROS,Building Microservices,300.28,2,11/01/2022,CAIO +INFORMÁTICA,Galaxy Tab S8,5939.10,4,02/01/2022,BIA \ No newline at end of file From 767bc031cc1af8b11561d46e118e1c5b06b4c9c8 Mon Sep 17 00:00:00 2001 From: Wander Carvalho <138515773+Wander-samix@users.noreply.github.com> Date: Wed, 29 May 2024 11:31:29 -0300 Subject: [PATCH 16/17] Create OI --- SEMANA11-WANDERCARVALHO/OI | 1 + 1 file changed, 1 insertion(+) create mode 100644 SEMANA11-WANDERCARVALHO/OI diff --git a/SEMANA11-WANDERCARVALHO/OI b/SEMANA11-WANDERCARVALHO/OI new file mode 100644 index 00000000..faeb595b --- /dev/null +++ b/SEMANA11-WANDERCARVALHO/OI @@ -0,0 +1 @@ +OI From 8da7bfd10d4ead01249bd3a4e32a64aebc868ff7 Mon Sep 17 00:00:00 2001 From: Wander Carvalho <138515773+Wander-samix@users.noreply.github.com> Date: Wed, 29 May 2024 11:33:44 -0300 Subject: [PATCH 17/17] Add files via upload --- .../SEMANA 11 - WANDER CARVALHO/README.md | 13 ++ .../SEMANA 11 - WANDER CARVALHO/pom.xml | 93 +++++++++++++ .../br/com/alura/comex/ComexApplication.java | 14 ++ .../comex/controller/BemVindoController.java | 14 ++ .../comex/controller/CategoriaController.java | 44 ++++++ .../comex/controller/ClienteController.java | 26 ++++ .../comex/controller/PedidoController.java | 25 ++++ .../comex/controller/ProdutoController.java | 53 +++++++ .../alura/comex/dto/CategoriaVendaDTO.java | 41 ++++++ .../br/com/alura/comex/dto/ClienteDTO.java | 122 +++++++++++++++++ .../com/alura/comex/dto/ClienteResumoDTO.java | 6 + .../alura/comex/dto/ItemDetalhaPedido.java | 66 +++++++++ .../br/com/alura/comex/dto/ItemPedidoDTO.java | 81 +++++++++++ .../br/com/alura/comex/dto/PedidoDTO.java | 58 ++++++++ .../br/com/alura/comex/dto/ProdutoDTO.java | 49 +++++++ .../alura/comex/integracao/TestaViaCep.java | 15 ++ .../comex/integracao/TestaViaCepService.java | 15 ++ .../comex/integracao/ViaCepResponse.java | 72 ++++++++++ .../alura/comex/integracao/ViaCepService.java | 64 +++++++++ .../br/com/alura/comex/model/Categoria.java | 58 ++++++++ .../br/com/alura/comex/model/Cliente.java | 129 ++++++++++++++++++ .../alura/comex/model/DadosNovaCategoria.java | 9 ++ .../alura/comex/model/DadosNovoProduto.java | 24 ++++ .../br/com/alura/comex/model/Endereco.java | 104 ++++++++++++++ .../com/alura/comex/model/ItemDePedido.java | 115 ++++++++++++++++ .../java/br/com/alura/comex/model/Pedido.java | 96 +++++++++++++ .../br/com/alura/comex/model/Produto.java | 109 +++++++++++++++ .../comex/model/StatusCategoriaEnum.java | 17 +++ .../comex/model/TipoDescontoItemPedido.java | 7 + .../alura/comex/model/TipoDescontoPedido.kt | 11 ++ .../comex/repository/CategoriaRepository.java | 11 ++ .../comex/repository/ClienteRepository.java | 7 + .../repository/ItemDePedidoRepository.java | 11 ++ .../comex/repository/PedidoRepository.java | 7 + .../comex/repository/ProdutoRepository.java | 7 + .../alura/comex/service/CategoriaService.java | 49 +++++++ .../alura/comex/service/ClienteService.java | 44 ++++++ .../alura/comex/service/PedidoService.java | 53 +++++++ .../alura/comex/service/ProdutoService.java | 28 ++++ .../src/main/resources/application.properties | 9 ++ .../src/main/resources/pedidos.csv | 17 +++ .../src/test/resources/pedidos.csv | 17 +++ .../classes/META-INF/comex.kotlin_module | Bin 0 -> 24 bytes .../target/classes/application.properties | 9 ++ .../br/com/alura/comex/ComexApplication.class | Bin 0 -> 740 bytes .../comex/controller/BemVindoController.class | Bin 0 -> 669 bytes .../controller/CategoriaController.class | Bin 0 -> 3280 bytes .../comex/controller/ClienteController.class | Bin 0 -> 1984 bytes .../comex/controller/PedidoController.class | Bin 0 -> 2810 bytes .../comex/controller/ProdutoController.class | Bin 0 -> 4279 bytes .../alura/comex/dto/CategoriaVendaDTO.class | Bin 0 -> 1371 bytes .../br/com/alura/comex/dto/ClienteDTO.class | Bin 0 -> 3343 bytes .../alura/comex/dto/ClienteResumoDTO.class | Bin 0 -> 469 bytes .../alura/comex/dto/ItemDetalhaPedido.class | Bin 0 -> 2409 bytes .../com/alura/comex/dto/ItemPedidoDTO.class | Bin 0 -> 2275 bytes .../comex/dto/PedidoDTO$ItemPedidoDTO.class | Bin 0 -> 1139 bytes .../br/com/alura/comex/dto/PedidoDTO.class | Bin 0 -> 1414 bytes .../br/com/alura/comex/dto/ProdutoDTO.class | Bin 0 -> 1661 bytes .../alura/comex/integracao/TestaViaCep.class | Bin 0 -> 898 bytes .../comex/integracao/TestaViaCepService.class | Bin 0 -> 1000 bytes .../comex/integracao/ViaCepResponse.class | Bin 0 -> 2351 bytes .../comex/integracao/ViaCepService.class | Bin 0 -> 3298 bytes .../br/com/alura/comex/model/Categoria.class | Bin 0 -> 2482 bytes .../br/com/alura/comex/model/Cliente.class | Bin 0 -> 4464 bytes .../comex/model/DadosNovaCategoria.class | Bin 0 -> 1926 bytes .../alura/comex/model/DadosNovoProduto.class | Bin 0 -> 4262 bytes .../br/com/alura/comex/model/Endereco.class | Bin 0 -> 3504 bytes .../com/alura/comex/model/ItemDePedido.class | Bin 0 -> 3820 bytes .../br/com/alura/comex/model/Pedido.class | Bin 0 -> 3583 bytes .../br/com/alura/comex/model/Produto.class | Bin 0 -> 3848 bytes .../comex/model/StatusCategoriaEnum.class | Bin 0 -> 1547 bytes .../comex/model/TipoDescontoItemPedido.class | Bin 0 -> 1306 bytes .../comex/model/TipoDescontoPedido.class | Bin 0 -> 1482 bytes .../repository/CategoriaRepository.class | Bin 0 -> 440 bytes .../comex/repository/ClienteRepository.class | Bin 0 -> 354 bytes .../repository/ItemDePedidoRepository.class | Bin 0 -> 607 bytes .../comex/repository/PedidoRepository.class | Bin 0 -> 351 bytes .../comex/repository/ProdutoRepository.class | Bin 0 -> 354 bytes .../comex/service/CategoriaService.class | Bin 0 -> 4801 bytes .../alura/comex/service/ClienteService.class | Bin 0 -> 2257 bytes .../alura/comex/service/PedidoService.class | Bin 0 -> 4268 bytes .../alura/comex/service/ProdutoService.class | Bin 0 -> 1772 bytes .../target/classes/pedidos.csv | 17 +++ .../target/test-classes/pedidos.csv | 17 +++ 84 files changed, 1853 insertions(+) create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/README.md create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/pom.xml create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/ComexApplication.java create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/BemVindoController.java create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/CategoriaController.java create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/ClienteController.java create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/PedidoController.java create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/ProdutoController.java create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/dto/CategoriaVendaDTO.java create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/dto/ClienteDTO.java create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/dto/ClienteResumoDTO.java create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/dto/ItemDetalhaPedido.java create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/dto/ItemPedidoDTO.java create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/dto/PedidoDTO.java create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/dto/ProdutoDTO.java create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/integracao/TestaViaCep.java create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/integracao/TestaViaCepService.java create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/integracao/ViaCepResponse.java create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/integracao/ViaCepService.java create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Categoria.java create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Cliente.java create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/model/DadosNovaCategoria.java create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/model/DadosNovoProduto.java create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Endereco.java create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/model/ItemDePedido.java create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Pedido.java create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Produto.java create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/model/StatusCategoriaEnum.java create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/model/TipoDescontoItemPedido.java create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/model/TipoDescontoPedido.kt create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/CategoriaRepository.java create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/ClienteRepository.java create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/ItemDePedidoRepository.java create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/PedidoRepository.java create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/ProdutoRepository.java create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/service/CategoriaService.java create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/service/ClienteService.java create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/service/PedidoService.java create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/service/ProdutoService.java create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/resources/application.properties create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/resources/pedidos.csv create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/test/resources/pedidos.csv create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/META-INF/comex.kotlin_module create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/application.properties create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/ComexApplication.class create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/controller/BemVindoController.class create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/controller/CategoriaController.class create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/controller/ClienteController.class create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/controller/PedidoController.class create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/controller/ProdutoController.class create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/dto/CategoriaVendaDTO.class create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/dto/ClienteDTO.class create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/dto/ClienteResumoDTO.class create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/dto/ItemDetalhaPedido.class create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/dto/ItemPedidoDTO.class create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/dto/PedidoDTO$ItemPedidoDTO.class create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/dto/PedidoDTO.class create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/dto/ProdutoDTO.class create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/integracao/TestaViaCep.class create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/integracao/TestaViaCepService.class create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/integracao/ViaCepResponse.class create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/integracao/ViaCepService.class create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/model/Categoria.class create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/model/Cliente.class create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/model/DadosNovaCategoria.class create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/model/DadosNovoProduto.class create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/model/Endereco.class create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/model/ItemDePedido.class create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/model/Pedido.class create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/model/Produto.class create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/model/StatusCategoriaEnum.class create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/model/TipoDescontoItemPedido.class create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/model/TipoDescontoPedido.class create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/repository/CategoriaRepository.class create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/repository/ClienteRepository.class create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/repository/ItemDePedidoRepository.class create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/repository/PedidoRepository.class create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/repository/ProdutoRepository.class create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/service/CategoriaService.class create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/service/ClienteService.class create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/service/PedidoService.class create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/service/ProdutoService.class create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/pedidos.csv create mode 100644 SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/test-classes/pedidos.csv diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/README.md b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/README.md new file mode 100644 index 00000000..cb743333 --- /dev/null +++ b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/README.md @@ -0,0 +1,13 @@ +# Comex + +## Informações gerais dos pedidos em _pedidos.csv_ +- Campos: **CATEGORIA, PRODUTO, PREÇO, QUANTIDADE, DATA, CLIENTE** + + +### RELATÓRIO DE VALORES TOTAIS +- TOTAL DE PEDIDOS REALIZADOS: 16 +- TOTAL DE PRODUTOS VENDIDOS: 35 +- TOTAL DE CATEGORIAS: 5 +- MONTANTE DE VENDAS: R$ 178.374,49 +- PEDIDO MAIS BARATO: R$ 95,17 (Clean Code) +- PEDIDO MAIS CARO: R$ 55.056,00 (iPhone 13 Pro) diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/pom.xml b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/pom.xml new file mode 100644 index 00000000..59baa8d3 --- /dev/null +++ b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/pom.xml @@ -0,0 +1,93 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 3.1.1 + + + + br.com.alura + comex + 0.0.1-SNAPSHOT + comex + Demo project for Spring Boot + + + 17 + 17 + 17 + 2.13.3 + 2.8.9 + 5.8.2 + + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.boot + spring-boot-starter-validation + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + ${jackson.version} + + + + + com.google.code.gson + gson + ${gson.version} + + + + + com.oracle.database.jdbc + ojdbc8 + 23.3.0.23.09 + + + + + org.junit.jupiter + junit-jupiter + ${junit.version} + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/ComexApplication.java b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/ComexApplication.java new file mode 100644 index 00000000..b593fbb6 --- /dev/null +++ b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/ComexApplication.java @@ -0,0 +1,14 @@ +package br.com.alura.comex; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ComexApplication { + + public static void main(String[] args) { + SpringApplication.run(ComexApplication.class, args); + } + +} + diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/BemVindoController.java b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/BemVindoController.java new file mode 100644 index 00000000..297bf14b --- /dev/null +++ b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/BemVindoController.java @@ -0,0 +1,14 @@ +package br.com.alura.comex.controller; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class BemVindoController { + + @RequestMapping("/comex/bemvindo") + public String bemvindo(){ + return "Bem vindo ao Comex, na Web!"; + } + +} diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/CategoriaController.java b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/CategoriaController.java new file mode 100644 index 00000000..05b7f90d --- /dev/null +++ b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/CategoriaController.java @@ -0,0 +1,44 @@ +package br.com.alura.comex.controller; + +import br.com.alura.comex.dto.CategoriaVendaDTO; +import br.com.alura.comex.model.Categoria; +import br.com.alura.comex.service.CategoriaService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Optional; + +@RestController +@RequestMapping("/api/categoria") +public class CategoriaController { + + @Autowired + private CategoriaService service; + + @PostMapping + public ResponseEntity cadastra(@RequestBody Categoria novaCategoria) { + if (novaCategoria.getNome() == null) { + return ResponseEntity.badRequest().body("Necessário o parâmetro 'nome'"); + } + + service.cadastro(novaCategoria); + return ResponseEntity.ok().build(); + } + + @GetMapping("/{id}") + public ResponseEntity buscaPorId(@PathVariable("id") Long categoriaId) { + Optional categoria = service.buscaPorId(categoriaId); + + if (categoria.isPresent()) return ResponseEntity.ok().body(categoria.get()); + + return ResponseEntity.notFound().build(); + } + + @GetMapping("/vendas") + public ResponseEntity> getVendasPorCategoria() { + List vendas = service.getVendasPorCategoria(); + return ResponseEntity.ok(vendas); + } +} diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/ClienteController.java b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/ClienteController.java new file mode 100644 index 00000000..73cc7508 --- /dev/null +++ b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/ClienteController.java @@ -0,0 +1,26 @@ +package br.com.alura.comex.controller; + +import br.com.alura.comex.dto.ClienteDTO; +import br.com.alura.comex.service.ClienteService; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/api/clientes") +public class ClienteController { + + @Autowired + private ClienteService clienteService; + + @PostMapping + public ResponseEntity cadastra(@RequestBody @Valid ClienteDTO clienteDTO) { + try { + clienteService.cadastra(clienteDTO); + return ResponseEntity.ok().build(); + } catch (IllegalArgumentException ex) { + return ResponseEntity.badRequest().body(ex.getMessage()); + } + } +} diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/PedidoController.java b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/PedidoController.java new file mode 100644 index 00000000..e5a4de6a --- /dev/null +++ b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/PedidoController.java @@ -0,0 +1,25 @@ +package br.com.alura.comex.controller; + +import br.com.alura.comex.dto.ItemDetalhaPedido; +import br.com.alura.comex.service.PedidoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.Optional; + +@RestController +@RequestMapping("/api/pedidos") +public class PedidoController { + + @Autowired + private PedidoService pedidoService; + + @GetMapping("/{id}") + public ResponseEntity buscaPedidoPorId(@PathVariable Long id) { + Optional pedidoOpt = pedidoService.buscaPedidoPorId(id); + + return pedidoOpt.map(ResponseEntity::ok) + .orElseGet(() -> ResponseEntity.notFound().build()); + } +} diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/ProdutoController.java b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/ProdutoController.java new file mode 100644 index 00000000..15bf3d73 --- /dev/null +++ b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/controller/ProdutoController.java @@ -0,0 +1,53 @@ +package br.com.alura.comex.controller; + +import br.com.alura.comex.dto.ProdutoDTO; +import br.com.alura.comex.model.DadosNovoProduto; +import br.com.alura.comex.model.Produto; +import br.com.alura.comex.service.CategoriaService; +import br.com.alura.comex.service.ProdutoService; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/produto") +public class ProdutoController { + + @Autowired + private CategoriaService categoriaService; + + @Autowired + private ProdutoService produtoService; + + @PostMapping + public ResponseEntity cadastra(@RequestBody @Valid DadosNovoProduto form, BindingResult result) { + if (result.hasFieldErrors()) { + return ResponseEntity.badRequest().body(result.getAllErrors()); + } + + try { + Produto novoProduto = form.toEntity(categoriaService); + produtoService.cadastra(novoProduto); + return ResponseEntity.ok().body(novoProduto); + } catch (IllegalArgumentException ex) { + return ResponseEntity.badRequest().body(ex.getMessage()); + } + } + + @GetMapping("/listaprodutos") + public ResponseEntity> listaProdutos( + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "5") int size) { + Page produtosPage = produtoService.listaPaginada(page, size); + Page produtosDTOPage = produtosPage.map(ProdutoDTO::new); + return ResponseEntity.ok(produtosDTOPage); + } +} diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/dto/CategoriaVendaDTO.java b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/dto/CategoriaVendaDTO.java new file mode 100644 index 00000000..01fc3129 --- /dev/null +++ b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/dto/CategoriaVendaDTO.java @@ -0,0 +1,41 @@ +package br.com.alura.comex.dto; + +import java.math.BigDecimal; + +public class CategoriaVendaDTO { + private String nomeCategoria; + private Long quantidadeVendida; + private BigDecimal montanteVendido; + + public CategoriaVendaDTO(String nomeCategoria, Long quantidadeVendida, BigDecimal montanteVendido) { + this.nomeCategoria = nomeCategoria; + this.quantidadeVendida = quantidadeVendida; + this.montanteVendido = montanteVendido; + } + + // Getters e setters + + public String getNomeCategoria() { + return nomeCategoria; + } + + public void setNomeCategoria(String nomeCategoria) { + this.nomeCategoria = nomeCategoria; + } + + public Long getQuantidadeVendida() { + return quantidadeVendida; + } + + public void setQuantidadeVendida(Long quantidadeVendida) { + this.quantidadeVendida = quantidadeVendida; + } + + public BigDecimal getMontanteVendido() { + return montanteVendido; + } + + public void setMontanteVendido(BigDecimal montanteVendido) { + this.montanteVendido = montanteVendido; + } +} diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/dto/ClienteDTO.java b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/dto/ClienteDTO.java new file mode 100644 index 00000000..3f13cd6f --- /dev/null +++ b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/dto/ClienteDTO.java @@ -0,0 +1,122 @@ +package br.com.alura.comex.dto; + +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Positive; + +public class ClienteDTO { + + @NotBlank(message = "O nome é obrigatório") + private String nome; + + @NotBlank(message = "O CPF é obrigatório") + private String cpf; + + @NotBlank(message = "O telefone é obrigatório") + private String telefone; + + @NotBlank(message = "O email é obrigatório") + @Email(message = "O email deve ser válido") + private String email; + + @NotBlank(message = "A rua é obrigatória") + private String rua; + + @NotNull(message = "O número é obrigatório") + @Positive(message = "O número deve ser positivo") + private Integer numero; + + private String complemento; + + @NotBlank(message = "O bairro é obrigatório") + private String bairro; + + @NotBlank(message = "A cidade é obrigatória") + private String cidade; + + @NotBlank(message = "O estado é obrigatório") + private String estado; + + // Getters e setters + + public String getNome() { + return nome; + } + + public void setNome(String nome) { + this.nome = nome; + } + + public String getCpf() { + return cpf; + } + + public void setCpf(String cpf) { + this.cpf = cpf; + } + + public String getTelefone() { + return telefone; + } + + public void setTelefone(String telefone) { + this.telefone = telefone; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getRua() { + return rua; + } + + public void setRua(String rua) { + this.rua = rua; + } + + public Integer getNumero() { + return numero; + } + + public void setNumero(Integer numero) { + this.numero = numero; + } + + public String getComplemento() { + return complemento; + } + + public void setComplemento(String complemento) { + this.complemento = complemento; + } + + public String getBairro() { + return bairro; + } + + public void setBairro(String bairro) { + this.bairro = bairro; + } + + public String getCidade() { + return cidade; + } + + public void setCidade(String cidade) { + this.cidade = cidade; + } + + public String getEstado() { + return estado; + } + + public void setEstado(String estado) { + this.estado = estado; + } +} diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/dto/ClienteResumoDTO.java b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/dto/ClienteResumoDTO.java new file mode 100644 index 00000000..85535995 --- /dev/null +++ b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/dto/ClienteResumoDTO.java @@ -0,0 +1,6 @@ +package br.com.alura.comex.dto; + +public class ClienteResumoDTO { + public ClienteResumoDTO(Long id, String nome) { + } +} diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/dto/ItemDetalhaPedido.java b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/dto/ItemDetalhaPedido.java new file mode 100644 index 00000000..9523edca --- /dev/null +++ b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/dto/ItemDetalhaPedido.java @@ -0,0 +1,66 @@ +package br.com.alura.comex.dto; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.List; + +public class ItemDetalhaPedido { + + private LocalDate data; + private BigDecimal valor; + private BigDecimal desconto; + private List produtos; + private ClienteResumoDTO cliente; + + public ItemDetalhaPedido(LocalDate data, BigDecimal valor, BigDecimal desconto, List produtos, ClienteResumoDTO cliente) { + this.data = data; + this.valor = valor; + this.desconto = desconto; + this.produtos = produtos; + this.cliente = cliente; + } + + // Getters e setters + + public LocalDate getData() { + return data; + } + + public void setData(LocalDate data) { + this.data = data; + } + + public BigDecimal getValor() { + return valor; + } + + public void setValor(BigDecimal valor) { + this.valor = valor; + } + + public BigDecimal getDesconto() { + return desconto; + } + + public void setDesconto(BigDecimal desconto) { + this.desconto = desconto; + } + + public List getProdutos() { + return produtos; + } + + public void setProdutos(List produtos) { + this.produtos = produtos; + } + + public ClienteResumoDTO getCliente() { + return cliente; + } + + public void setCliente(ClienteResumoDTO cliente) { + this.cliente = cliente; + } +} + + diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/dto/ItemPedidoDTO.java b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/dto/ItemPedidoDTO.java new file mode 100644 index 00000000..3eab629e --- /dev/null +++ b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/dto/ItemPedidoDTO.java @@ -0,0 +1,81 @@ +package br.com.alura.comex.dto; + +import java.math.BigDecimal; + +public class ItemPedidoDTO { + private Long id; + private String nome; + private String categoria; + private Long quantidade; + private BigDecimal precoUnitario; + private BigDecimal valor; + private BigDecimal desconto; + + public ItemPedidoDTO(Long id, String nome, String categoria, Long quantidade, BigDecimal precoUnitario, BigDecimal valor, BigDecimal desconto) { + this.id = id; + this.nome = nome; + this.categoria = categoria; + this.quantidade = quantidade; + this.precoUnitario = precoUnitario; + this.valor = valor; + this.desconto = desconto; + } + + // Getters e setters + + 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 getCategoria() { + return categoria; + } + + public void setCategoria(String categoria) { + this.categoria = categoria; + } + + public Long getQuantidade() { + return quantidade; + } + + public void setQuantidade(Long quantidade) { + this.quantidade = quantidade; + } + + public BigDecimal getPrecoUnitario() { + return precoUnitario; + } + + public void setPrecoUnitario(BigDecimal precoUnitario) { + this.precoUnitario = precoUnitario; + } + + public BigDecimal getValor() { + return valor; + } + + public void setValor(BigDecimal valor) { + this.valor = valor; + } + + public BigDecimal getDesconto() { + return desconto; + } + + public void setDesconto(BigDecimal desconto) { + this.desconto = desconto; + } +} diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/dto/PedidoDTO.java b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/dto/PedidoDTO.java new file mode 100644 index 00000000..d78a22be --- /dev/null +++ b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/dto/PedidoDTO.java @@ -0,0 +1,58 @@ +package br.com.alura.comex.dto; + +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Positive; + +import java.util.List; + +public class PedidoDTO { + + @NotNull + private Long clienteId; + + @NotNull + private List itens; + + public static class ItemPedidoDTO { + @NotNull + private Long produtoId; + + @NotNull + @Positive + private Long quantidade; + + // Getters e setters + public Long getProdutoId() { + return produtoId; + } + + public void setProdutoId(Long produtoId) { + this.produtoId = produtoId; + } + + public Long getQuantidade() { + return quantidade; + } + + public void setQuantidade(Long quantidade) { + this.quantidade = quantidade; + } + } + + // Getters e setters + public Long getClienteId() { + return clienteId; + } + + public void setClienteId(Long clienteId) { + this.clienteId = clienteId; + } + + public List getItens() { + return itens; + } + + public void setItens(List itens) { + this.itens = itens; + } +} diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/dto/ProdutoDTO.java b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/dto/ProdutoDTO.java new file mode 100644 index 00000000..f5b0dd34 --- /dev/null +++ b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/dto/ProdutoDTO.java @@ -0,0 +1,49 @@ +package br.com.alura.comex.dto; + +import br.com.alura.comex.model.Produto; + +import java.math.BigDecimal; + +public class ProdutoDTO { + + private String nome; + private BigDecimal preco; + private String descricao; + private Integer quantidadeEmEstoque; + private Long categoriaId; + private String categoriaNome; + + public ProdutoDTO(Produto produto) { + this.nome = produto.getNome(); + this.preco = produto.getPrecoUnitario(); + this.descricao = produto.getDescricao(); + this.quantidadeEmEstoque = produto.getQuantidade(); + this.categoriaId = produto.getCategoria().getId(); + this.categoriaNome = produto.getCategoria().getNome(); + } + + // Getters + public String getNome() { + return nome; + } + + public BigDecimal getPreco() { + return preco; + } + + public String getDescricao() { + return descricao; + } + + public Integer getQuantidadeEmEstoque() { + return quantidadeEmEstoque; + } + + public Long getCategoriaId() { + return categoriaId; + } + + public String getCategoriaNome() { + return categoriaNome; + } +} diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/integracao/TestaViaCep.java b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/integracao/TestaViaCep.java new file mode 100644 index 00000000..023cc687 --- /dev/null +++ b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/integracao/TestaViaCep.java @@ -0,0 +1,15 @@ +package br.com.alura.comex.integracao; + +public class TestaViaCep { + + public static void main(String[] args) { + + String cep = "09070100"; + + ViaCepResponse retorno = new ViaCepService().buscaPorCep(cep); + + System.out.println(retorno); + + } + +} diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/integracao/TestaViaCepService.java b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/integracao/TestaViaCepService.java new file mode 100644 index 00000000..fce73f68 --- /dev/null +++ b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/integracao/TestaViaCepService.java @@ -0,0 +1,15 @@ +package br.com.alura.comex.integracao; + +public class TestaViaCepService { + + public static void main(String[] args) { + + String cep = "09070100"; + + ViaCepService viaCepService = new ViaCepService(); + ViaCepResponse resposta = viaCepService.getEndereco(cep); + + System.out.println(resposta); + } + +} diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/integracao/ViaCepResponse.java b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/integracao/ViaCepResponse.java new file mode 100644 index 00000000..dcbeb9cb --- /dev/null +++ b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/integracao/ViaCepResponse.java @@ -0,0 +1,72 @@ +package br.com.alura.comex.integracao; + +public class ViaCepResponse { + + private String cep; + private String logradouro; + private String complemento; + private String bairro; + private String localidade; + private String uf; + + @Override + public String toString() { + return "ViaCepResponse{" + + "cep='" + cep + '\'' + + ", logradouro='" + logradouro + '\'' + + ", complemento='" + complemento + '\'' + + ", bairro='" + bairro + '\'' + + ", localidade='" + localidade + '\'' + + ", uf='" + uf + '\'' + + '}'; + } + + public String getCep() { + return cep; + } + + public void setCep(String cep) { + this.cep = cep; + } + + public String getLogradouro() { + return logradouro; + } + + public void setLogradouro(String logradouro) { + this.logradouro = logradouro; + } + + public String getComplemento() { + return complemento; + } + + public void setComplemento(String complemento) { + this.complemento = complemento; + } + + public String getBairro() { + return bairro; + } + + public void setBairro(String bairro) { + this.bairro = bairro; + } + + public String getLocalidade() { + return localidade; + } + + public void setLocalidade(String localidade) { + this.localidade = localidade; + } + + public String getUf() { + return uf; + } + + public void setUf(String uf) { + this.uf = uf; + } + +} diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/integracao/ViaCepService.java b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/integracao/ViaCepService.java new file mode 100644 index 00000000..ac58e20d --- /dev/null +++ b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/integracao/ViaCepService.java @@ -0,0 +1,64 @@ +package br.com.alura.comex.integracao; + +import com.google.gson.Gson; + +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; + +public class ViaCepService { + + public ViaCepResponse buscaPorCep(String cep) { + + URI endereco = URI.create("https://viacep.com.br/ws/" + cep + "/json/"); + + HttpRequest requisicao = HttpRequest + .newBuilder() + .uri(endereco) + .build(); + + try { + HttpResponse response = HttpClient + .newBuilder() + .build() + .send(requisicao, HttpResponse.BodyHandlers.ofString()); + + return new Gson().fromJson(response.body(), ViaCepResponse.class); + + } catch (Exception ex) { + System.out.println(ex.getMessage()); + } + return null; + } + + public ViaCepResponse getEndereco(String cep) { + + if (cep == null) return null; + + URI endereco = URI.create("https://viacep.com.br/ws/" + cep + "/json/"); + + System.out.println("URL do ViaCep: " + endereco); + + HttpRequest request = HttpRequest + .newBuilder() + .uri(endereco) + .build(); + try { + + HttpResponse response = HttpClient + .newBuilder() + .build() + .send(request, HttpResponse.BodyHandlers.ofString()); + + ViaCepResponse viaCepResponse = new Gson() + .fromJson(response.body(), ViaCepResponse.class); + + return viaCepResponse; + } catch (Exception exception) { + System.out.println(exception); + } + + return null; + } +} diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Categoria.java b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Categoria.java new file mode 100644 index 00000000..22e33e4f --- /dev/null +++ b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Categoria.java @@ -0,0 +1,58 @@ +package br.com.alura.comex.model; + +import jakarta.persistence.*; + +@Entity +@Table(name = "categoria") +public class Categoria { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "categoria_id") + private Long id; + @Column(name = "nome", length = 120) + private String nome; + @Column(name = "status") + @Enumerated(EnumType.STRING) + private StatusCategoriaEnum status = StatusCategoriaEnum.ATIVO; + + public Categoria(String nome) { + this.nome = nome; + } + + public Categoria() { + } + + @Override + public String toString() { + return "Categoria{" + + "id=" + id + + ", nome='" + nome + '\'' + + ", status=" + status + + '}'; + } + + 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 StatusCategoriaEnum getStatus() { + return status; + } + + public void setStatus(StatusCategoriaEnum status) { + this.status = status; + } +} diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Cliente.java b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Cliente.java new file mode 100644 index 00000000..16835822 --- /dev/null +++ b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Cliente.java @@ -0,0 +1,129 @@ +package br.com.alura.comex.model; + +import jakarta.persistence.*; + +import java.util.Collection; +import java.util.Objects; + +@Entity +@Table(name = "cliente") +public class Cliente { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + @Column(name = "nome", length = 120, nullable = false) + private String nome; + @Column(name = "cpf", length = 11, nullable = false) + private String cpf; + @Column(name = "email", length = 100, nullable = false) + private String email; + @Column(name = "profissao", length = 80, nullable = true) + private String profissao; + @Column(name = "telefone", length = 25, nullable = true) + private String telefone; + @Embedded + private Endereco endereco; + + public Cliente(String nome , String cpf, String email) { + this.nome = nome; + this.cpf = cpf; + this.email = email; + } + + public Cliente(String nome, String cpf, String email, String profissao, String telefone, Endereco endereco) { + this.nome = nome; + this.cpf = cpf; + this.email = email; + this.profissao = profissao; + this.telefone = telefone; + this.endereco = endereco; + } + + public Cliente() { + } + + @Override + public String toString() { + return "Cliente{" + + "nome='" + nome + '\'' + + ", cpf='" + cpf + '\'' + + ", email='" + email + '\'' + + ", profissao='" + profissao + '\'' + + ", telefone='" + telefone + '\'' + + ", endereco=" + endereco + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Cliente cliente = (Cliente) o; + return Objects.equals(cpf, cliente.cpf); + } + + @Override + public int hashCode() { + return Objects.hash(cpf); + } + + public String getNome() { + return nome; + } + + public void setNome(String nome) { + this.nome = nome; + } + + public String getCpf() { + return cpf; + } + + public void setCpf(String cpf) { + this.cpf = cpf; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getProfissao() { + return profissao; + } + + public void setProfissao(String profissao) { + this.profissao = profissao; + } + + public String getTelefone() { + return telefone; + } + + public void setTelefone(String telefone) { + this.telefone = telefone; + } + + public Endereco getEndereco() { + return endereco; + } + + public void setEndereco(Endereco endereco) { + this.endereco = endereco; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Collection getPedidos() { + return java.util.List.of(); + } +} diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/model/DadosNovaCategoria.java b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/model/DadosNovaCategoria.java new file mode 100644 index 00000000..70c3d0b7 --- /dev/null +++ b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/model/DadosNovaCategoria.java @@ -0,0 +1,9 @@ +package br.com.alura.comex.model; + +import org.hibernate.validator.constraints.Length; + +public record DadosNovaCategoria(@Length(min = 5) String nome) { + public Categoria toEntity() { + return new Categoria(nome); + } +} diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/model/DadosNovoProduto.java b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/model/DadosNovoProduto.java new file mode 100644 index 00000000..c800089f --- /dev/null +++ b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/model/DadosNovoProduto.java @@ -0,0 +1,24 @@ +package br.com.alura.comex.model; + +import br.com.alura.comex.service.CategoriaService; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Positive; +import org.hibernate.validator.constraints.Length; + +import java.math.BigDecimal; +import java.util.Optional; + +public record DadosNovoProduto(@NotNull @Length(min = 2) String nome, + String descricao, + @NotNull @Positive BigDecimal preco, + @NotNull Integer quantidadeEmEstoque, + @NotNull Long categoriaId) { + public Produto toEntity(CategoriaService categoriaService) throws IllegalArgumentException { + Optional optionalCategoria = categoriaService.buscaPorId(this.categoriaId); + + if (optionalCategoria.isEmpty()) + throw new IllegalArgumentException("O ID informado da categoria não existe, id: " + this.categoriaId); + + return new Produto(this.nome, this.descricao, this.preco, this.quantidadeEmEstoque, optionalCategoria.get()); + } +} diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Endereco.java b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Endereco.java new file mode 100644 index 00000000..f115ecf7 --- /dev/null +++ b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Endereco.java @@ -0,0 +1,104 @@ +package br.com.alura.comex.model; + +import jakarta.persistence.*; +import java.util.Objects; + +@Embeddable +public class Endereco { + @Column(name = "rua", length = 20) + private String rua; + @Column(name = "numero", length = 8) + private Integer numero; + @Column(length = 100) + private String complemento; + @Column(length = 80) + private String bairro; + @Column(length = 50) + private String cidade; + @Column(length = 20) + private String estado; + + public Endereco(String rua, Integer numero, String bairro, String cidade, String estado) { + this.rua = rua; + this.numero = numero; + this.bairro = bairro; + this.cidade = cidade; + this.estado = estado; + } + + public Endereco() { + } + + @Override + public String toString() { + return "Endereco{" + + "rua='" + rua + '\'' + + ", numero=" + numero + + ", complemento='" + complemento + '\'' + + ", bairro='" + bairro + '\'' + + ", cidade='" + cidade + '\'' + + ", estado='" + estado + '\'' + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Endereco endereco = (Endereco) o; + return Objects.equals(rua, endereco.rua) && Objects.equals(numero, endereco.numero) && Objects.equals(bairro, endereco.bairro) && Objects.equals(cidade, endereco.cidade) && Objects.equals(estado, endereco.estado); + } + + @Override + public int hashCode() { + return Objects.hash(rua, numero, bairro, cidade, estado); + } + + public String getRua() { + return rua; + } + + public void setRua(String rua) { + this.rua = rua; + } + + public Integer getNumero() { + return numero; + } + + public void setNumero(Integer numero) { + this.numero = numero; + } + + public String getComplemento() { + return complemento; + } + + public void setComplemento(String complemento) { + this.complemento = complemento; + } + + public String getBairro() { + return bairro; + } + + public void setBairro(String bairro) { + this.bairro = bairro; + } + + public String getCidade() { + return cidade; + } + + public void setCidade(String cidade) { + this.cidade = cidade; + } + + public String getEstado() { + return estado; + } + + public void setEstado(String estado) { + this.estado = estado; + } +} diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/model/ItemDePedido.java b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/model/ItemDePedido.java new file mode 100644 index 00000000..2d7abfb2 --- /dev/null +++ b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/model/ItemDePedido.java @@ -0,0 +1,115 @@ +package br.com.alura.comex.model; +import java.math.BigDecimal; + +import jakarta.persistence.*; + +@Entity +@Table(name = "item_pedido") +public class ItemDePedido { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id", nullable = false) + private Long id; + + @Column(name = "preco_unitario", scale = 2, nullable = false) + private BigDecimal precoUnitario; + + @Column(name = "quantidade", nullable = false) + private Long quantidade; + + @ManyToOne(optional = false, cascade = { CascadeType.ALL }) + private Pedido pedido; + + @ManyToOne(optional = false) + private Produto produto; + + @Column(name = "desconto", scale = 2, nullable = false) + private BigDecimal desconto; + + @Enumerated(EnumType.STRING) + @Column(name = "tipo_desconto", nullable = false) + private TipoDescontoItemPedido tipoDesconto; + + @Transient + private BigDecimal total = BigDecimal.ZERO; + + public ItemDePedido() { + } + + public ItemDePedido(Long quantidade, Produto produto) { + this.quantidade = quantidade; + this.produto = produto; + this.desconto = BigDecimal.ZERO; + this.tipoDesconto = TipoDescontoItemPedido.NENHUM; + this.precoUnitario = produto.getPrecoUnitario(); + } + + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public BigDecimal getPrecoUnitario() { + return precoUnitario; + } + + public void setPrecoUnitario(BigDecimal precoUnitario) { + this.precoUnitario = precoUnitario; + } + + public Long getQuantidade() { + return quantidade; + } + + public void setQuantidade(Long quantidade) { + this.quantidade = quantidade; + } + + public Pedido getPedido() { + return pedido; + } + + public void setPedido(Pedido pedido) { + this.pedido = pedido; + } + + public Produto getProduto() { + return produto; + } + + public void setProduto(Produto produto) { + this.produto = produto; + } + + public BigDecimal getDesconto() { + return desconto; + } + + public void setDesconto(BigDecimal desconto) { + this.desconto = desconto; + } + + public TipoDescontoItemPedido getTipoDesconto() { + return tipoDesconto; + } + + public void setTipoDesconto(TipoDescontoItemPedido tipoDesconto) { + this.tipoDesconto = tipoDesconto; + } + + public BigDecimal getTotal() { + return this.produto.getPrecoUnitario().multiply(new BigDecimal(this.quantidade)); + } + + public void setTotal(BigDecimal total) { + this.total = total; + } + +} + diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Pedido.java b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Pedido.java new file mode 100644 index 00000000..557ded90 --- /dev/null +++ b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Pedido.java @@ -0,0 +1,96 @@ +package br.com.alura.comex.model; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import jakarta.persistence.*; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; + +@Entity +@Table(name = "pedido") +public class Pedido { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id", nullable = false) + private Long id; + + @Column(name = "data", nullable = false) + private LocalDate data = LocalDate.now(); + + @JsonIgnore + @ManyToOne(optional = false) + private Cliente cliente; + + @Column(name = "desconto", nullable = false, scale = 2) + private BigDecimal desconto = BigDecimal.ZERO; + + @Column(name = "total", nullable = false, scale = 2) + private BigDecimal total = BigDecimal.ZERO; + + @Column(name = "tipo_desconto", nullable = false) + @Enumerated(EnumType.STRING) + private TipoDescontoPedido tipoDesconto = TipoDescontoPedido.NENHUM; + + @JsonIgnore + @OneToMany(mappedBy = "pedido", cascade = CascadeType.ALL) + private List itemPedidos = new ArrayList<>(); + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public LocalDate getData() { + return data; + } + + public void setData(LocalDate data) { + this.data = data; + } + + public Cliente getCliente() { + return cliente; + } + + public void setCliente(Cliente cliente) { + this.cliente = cliente; + } + + public BigDecimal getDesconto() { + return desconto; + } + + public void setDesconto(BigDecimal desconto) { + this.desconto = desconto; + } + + public BigDecimal getTotal() { + return total; + } + + public void setTotal(BigDecimal total) { + this.total = total; + } + + public TipoDescontoPedido getTipoDesconto() { + return tipoDesconto; + } + + public void setTipoDesconto(TipoDescontoPedido tipoDesconto) { + this.tipoDesconto = tipoDesconto; + } + + public List getItemPedidos() { + return itemPedidos; + } + + public void setItemPedidos(List itemPedidos) { + this.itemPedidos = itemPedidos; + } +} diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Produto.java b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Produto.java new file mode 100644 index 00000000..96de9afd --- /dev/null +++ b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/model/Produto.java @@ -0,0 +1,109 @@ +package br.com.alura.comex.model; + +import jakarta.persistence.*; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; + +import java.math.BigDecimal; +import java.util.Objects; + +@Entity +@Table(name = "produto") +public class Produto { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "nome", length = 120, nullable = false) + @NotBlank(message = "O nome é obrigatório e deve possuir pelo menos 2 caracteres") + @Size(min = 2, message = "O nome deve possuir pelo menos 2 caracteres") + private String nome; + + @Column(name = "descricao", length = 220, nullable = true) + private String descricao; + + @Column(name = "preco_unitario", nullable = false) + @NotNull(message = "O preço é obrigatório") + @Min(value = 0, message = "O preço deve ser positivo") + private BigDecimal precoUnitario; + + @Column(name = "quantidade", nullable = false) + @NotNull(message = "A quantidade em estoque é obrigatória") + @Min(value = 0, message = "A quantidade em estoque deve ser um número inteiro não negativo") + private Integer quantidade; + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "categoria_id", nullable = false) + @NotNull(message = "O ID da categoria é obrigatório") + private Categoria categoria; + + + + public Produto(String nome, String descricao, BigDecimal precoUnitario, Integer quantidade, Categoria categoria) { + this.nome = nome; + this.descricao = descricao; + this.precoUnitario = precoUnitario; + this.quantidade = quantidade; + this.categoria = categoria; + } + + public Produto() { + } + + public String getNome() { + return nome; + } + + public void setNome(String nome) { + this.nome = nome; + } + + public String getDescricao() { + return descricao; + } + + public void setDescricao(String descricao) { + this.descricao = descricao; + } + + public int getQuantidade() { + return quantidade; + } + + public void setQuantidade(int quantidade) { + if (quantidade > 50) return; // subir um erro, algo assim + this.quantidade = quantidade; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public BigDecimal getPrecoUnitario() { + return precoUnitario; + } + + public void setPrecoUnitario(BigDecimal precoUnitario) { + this.precoUnitario = precoUnitario; + } + + public void setQuantidade(Integer quantidade) { + this.quantidade = quantidade; + } + + public Categoria getCategoria() { + return categoria; + } + + public void setCategoria(Categoria categoria) { + this.categoria = categoria; + } + +} diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/model/StatusCategoriaEnum.java b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/model/StatusCategoriaEnum.java new file mode 100644 index 00000000..26309059 --- /dev/null +++ b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/model/StatusCategoriaEnum.java @@ -0,0 +1,17 @@ +package br.com.alura.comex.model; + +public enum StatusCategoriaEnum { + + ATIVO(Boolean.TRUE), + INATIVO(Boolean.FALSE); + + private Boolean status; + + StatusCategoriaEnum(Boolean status) { + this.status = status; + } + + public boolean getStatus() { + return status; + } +} diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/model/TipoDescontoItemPedido.java b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/model/TipoDescontoItemPedido.java new file mode 100644 index 00000000..f7e2c7f1 --- /dev/null +++ b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/model/TipoDescontoItemPedido.java @@ -0,0 +1,7 @@ +package br.com.alura.comex.model; + +public enum TipoDescontoItemPedido { + QUANTIDADE, + PROMOCAO, + NENHUM; +} diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/model/TipoDescontoPedido.kt b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/model/TipoDescontoPedido.kt new file mode 100644 index 00000000..c5fecba9 --- /dev/null +++ b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/model/TipoDescontoPedido.kt @@ -0,0 +1,11 @@ +package br.com.alura.comex.model + +import java.math.BigDecimal + +enum class TipoDescontoPedido { + + NENHUM, + FIDELIDADE, + QUANTIDADE; + +} \ No newline at end of file diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/CategoriaRepository.java b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/CategoriaRepository.java new file mode 100644 index 00000000..e1768b84 --- /dev/null +++ b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/CategoriaRepository.java @@ -0,0 +1,11 @@ +package br.com.alura.comex.repository; + +import br.com.alura.comex.model.Categoria; +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface CategoriaRepository extends CrudRepository { + + +} diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/ClienteRepository.java b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/ClienteRepository.java new file mode 100644 index 00000000..2d18be29 --- /dev/null +++ b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/ClienteRepository.java @@ -0,0 +1,7 @@ +package br.com.alura.comex.repository; + +import br.com.alura.comex.model.Cliente; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ClienteRepository extends JpaRepository { +} diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/ItemDePedidoRepository.java b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/ItemDePedidoRepository.java new file mode 100644 index 00000000..dd6a11e8 --- /dev/null +++ b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/ItemDePedidoRepository.java @@ -0,0 +1,11 @@ +package br.com.alura.comex.repository; + +import br.com.alura.comex.model.Categoria; +import br.com.alura.comex.model.ItemDePedido; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface ItemDePedidoRepository extends JpaRepository { + List findByProdutoCategoria(Categoria categoria); +} diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/PedidoRepository.java b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/PedidoRepository.java new file mode 100644 index 00000000..bce367f5 --- /dev/null +++ b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/PedidoRepository.java @@ -0,0 +1,7 @@ +package br.com.alura.comex.repository; + +import br.com.alura.comex.model.Pedido; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface PedidoRepository extends JpaRepository { +} \ No newline at end of file diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/ProdutoRepository.java b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/ProdutoRepository.java new file mode 100644 index 00000000..487ba2d5 --- /dev/null +++ b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/repository/ProdutoRepository.java @@ -0,0 +1,7 @@ +package br.com.alura.comex.repository; + +import br.com.alura.comex.model.Produto; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ProdutoRepository extends JpaRepository { +} diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/service/CategoriaService.java b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/service/CategoriaService.java new file mode 100644 index 00000000..1a152eb4 --- /dev/null +++ b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/service/CategoriaService.java @@ -0,0 +1,49 @@ +package br.com.alura.comex.service; + +import br.com.alura.comex.dto.CategoriaVendaDTO; +import br.com.alura.comex.model.Categoria; +import br.com.alura.comex.model.ItemDePedido; +import br.com.alura.comex.repository.CategoriaRepository; +import br.com.alura.comex.repository.ItemDePedidoRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +@Service +public class CategoriaService { + + @Autowired + private CategoriaRepository repository; + + @Autowired + private ItemDePedidoRepository itemDePedidoRepository; + + public void cadastro(Categoria novaCategoria) { + if (novaCategoria == null) return; + if (novaCategoria.getNome() == null) return; + + repository.save(novaCategoria); + } + + public Optional buscaPorId(Long categoriaId) { + return repository.findById(categoriaId); + } + + public List getVendasPorCategoria() { + List categorias = (List) repository.findAll(); + + return categorias.stream().map(categoria -> { + List itens = itemDePedidoRepository.findByProdutoCategoria(categoria); + Long quantidadeVendida = itens.stream().mapToLong(ItemDePedido::getQuantidade).sum(); + BigDecimal montanteVendido = itens.stream() + .map(item -> item.getPrecoUnitario().multiply(BigDecimal.valueOf(item.getQuantidade()))) + .reduce(BigDecimal.ZERO, BigDecimal::add); + + return new CategoriaVendaDTO(categoria.getNome(), quantidadeVendida, montanteVendido); + }).collect(Collectors.toList()); + } +} diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/service/ClienteService.java b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/service/ClienteService.java new file mode 100644 index 00000000..52fb7e09 --- /dev/null +++ b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/service/ClienteService.java @@ -0,0 +1,44 @@ +package br.com.alura.comex.service; + +import br.com.alura.comex.dto.ClienteDTO; +import br.com.alura.comex.model.Cliente; +import br.com.alura.comex.model.Endereco; +import br.com.alura.comex.repository.ClienteRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class ClienteService { + + @Autowired + private ClienteRepository repository; + + public void cadastra(ClienteDTO clienteDTO) { + Endereco endereco = new Endereco(); + endereco.setRua(clienteDTO.getRua()); + endereco.setNumero(clienteDTO.getNumero()); + endereco.setComplemento(clienteDTO.getComplemento()); + endereco.setBairro(clienteDTO.getBairro()); + endereco.setCidade(clienteDTO.getCidade()); + endereco.setEstado(clienteDTO.getEstado()); + + Cliente cliente = new Cliente(); + cliente.setNome(clienteDTO.getNome()); + cliente.setCpf(clienteDTO.getCpf()); + cliente.setTelefone(clienteDTO.getTelefone()); + cliente.setEmail(clienteDTO.getEmail()); + cliente.setEndereco(endereco); + + repository.save(cliente); + } + + public void deleta(Cliente cliente) { + repository.delete(cliente); + } + + public List listaTodos() { + return repository.findAll(); + } +} diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/service/PedidoService.java b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/service/PedidoService.java new file mode 100644 index 00000000..b6a7710c --- /dev/null +++ b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/service/PedidoService.java @@ -0,0 +1,53 @@ +package br.com.alura.comex.service; + +import br.com.alura.comex.dto.ClienteResumoDTO; +import br.com.alura.comex.dto.ItemPedidoDTO; +import br.com.alura.comex.dto.ItemDetalhaPedido; +import br.com.alura.comex.model.Pedido; +import br.com.alura.comex.repository.PedidoRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +@Service +public class PedidoService { + + @Autowired + private PedidoRepository pedidoRepository; + + public Optional buscaPedidoPorId(Long pedidoId) { + Optional pedidoOpt = pedidoRepository.findById(pedidoId); + + if (pedidoOpt.isPresent()) { + Pedido pedido = pedidoOpt.get(); + + List produtos = pedido.getItemPedidos().stream().map(item -> new ItemPedidoDTO( + item.getId(), + item.getProduto().getNome(), + item.getProduto().getCategoria().getNome(), + item.getQuantidade(), + item.getPrecoUnitario(), + item.getTotal(), + item.getDesconto() + )).collect(Collectors.toList()); + + br.com.alura.comex.dto.ClienteResumoDTO clienteDTO; + clienteDTO = new br.com.alura.comex.dto.ClienteResumoDTO(pedido.getCliente().getId(), pedido.getCliente().getNome()); + + ItemDetalhaPedido pedidoDetalhadoDTO = new ItemDetalhaPedido( + pedido.getData(), + pedido.getTotal(), + pedido.getDesconto(), + produtos, + (br.com.alura.comex.dto.ClienteResumoDTO) clienteDTO + ); + + return Optional.of(pedidoDetalhadoDTO); + } + + return Optional.empty(); + } +} diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/service/ProdutoService.java b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/service/ProdutoService.java new file mode 100644 index 00000000..0b44f40a --- /dev/null +++ b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/java/br/com/alura/comex/service/ProdutoService.java @@ -0,0 +1,28 @@ +package br.com.alura.comex.service; + +import br.com.alura.comex.model.Produto; +import br.com.alura.comex.repository.ProdutoRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.stereotype.Service; + +@Service +public class ProdutoService { + + @Autowired + private ProdutoRepository produtoRepository; + + public void cadastra(Produto novoProduto) { + if (novoProduto == null) return; + + produtoRepository.save(novoProduto); + } + + public Page listaPaginada(int page, int size) { + Pageable pageable = PageRequest.of(page, size, Sort.by("nome").ascending()); + return produtoRepository.findAll(pageable); + } +} diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/resources/application.properties b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/resources/application.properties new file mode 100644 index 00000000..c9f25806 --- /dev/null +++ b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/resources/application.properties @@ -0,0 +1,9 @@ +spring.datasource.url=jdbc:oracle:thin:@localhost:1521:xe +spring.datasource.username=system +spring.datasource.password=12345678 +spring.datasource.driver-class-name=oracle.jdbc.OracleDriver + +spring.jpa.hibernate.ddl-auto=update +spring.jpa.show-sql=true +spring.jpa.format-sql=true +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.Oracle12cDialect diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/resources/pedidos.csv b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/resources/pedidos.csv new file mode 100644 index 00000000..21e55498 --- /dev/null +++ b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/main/resources/pedidos.csv @@ -0,0 +1,17 @@ +CATEGORIA,PRODUTO,PRECO,QUANTIDADE,DATA,CLIENTE +INFORMÁTICA,Notebook Samsung,3523.00,1,01/01/2022,ANA +MÓVEIS,Sofá 3 lugares,2500.00,1,05/01/2022,ANA +LIVROS,Clean Architecture,102.90,2,08/01/2022,ANA +MÓVEIS,Mesa de jantar 6 lugares,3678.98,1,06/01/2022,ELI +CELULARES,iPhone 13 Pro,9176.00,6,13/01/2022,ANA +INFORMÁTICA,"Monitor Dell 27""",1889.00,3,04/01/2022,DANI +LIVROS,Implementing Domain-Driven Design,144.07,3,10/01/2022,GABI +AUTOMOTIVA,Jogo de pneus,1276.79,1,15/01/2022,BIA +LIVROS,Clean Code,95.17,1,09/01/2022,BIA +CELULARES,Galaxy S22 Ultra,8549.10,5,14/01/2022,DANI +INFORMÁTICA,Macbook Pro 16,31752.00,1,03/01/2022,CAIO +LIVROS,Refactoring Improving the Design of Existing Code,173.90,1,12/01/2022,DANI +MÓVEIS,Cama queen size,3100.00,2,07/01/2022,DANI +AUTOMOTIVA,Central multimidia,711.18,1,16/01/2022,CAIO +LIVROS,Building Microservices,300.28,2,11/01/2022,CAIO +INFORMÁTICA,Galaxy Tab S8,5939.10,4,02/01/2022,BIA \ No newline at end of file diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/test/resources/pedidos.csv b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/test/resources/pedidos.csv new file mode 100644 index 00000000..21e55498 --- /dev/null +++ b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/src/test/resources/pedidos.csv @@ -0,0 +1,17 @@ +CATEGORIA,PRODUTO,PRECO,QUANTIDADE,DATA,CLIENTE +INFORMÁTICA,Notebook Samsung,3523.00,1,01/01/2022,ANA +MÓVEIS,Sofá 3 lugares,2500.00,1,05/01/2022,ANA +LIVROS,Clean Architecture,102.90,2,08/01/2022,ANA +MÓVEIS,Mesa de jantar 6 lugares,3678.98,1,06/01/2022,ELI +CELULARES,iPhone 13 Pro,9176.00,6,13/01/2022,ANA +INFORMÁTICA,"Monitor Dell 27""",1889.00,3,04/01/2022,DANI +LIVROS,Implementing Domain-Driven Design,144.07,3,10/01/2022,GABI +AUTOMOTIVA,Jogo de pneus,1276.79,1,15/01/2022,BIA +LIVROS,Clean Code,95.17,1,09/01/2022,BIA +CELULARES,Galaxy S22 Ultra,8549.10,5,14/01/2022,DANI +INFORMÁTICA,Macbook Pro 16,31752.00,1,03/01/2022,CAIO +LIVROS,Refactoring Improving the Design of Existing Code,173.90,1,12/01/2022,DANI +MÓVEIS,Cama queen size,3100.00,2,07/01/2022,DANI +AUTOMOTIVA,Central multimidia,711.18,1,16/01/2022,CAIO +LIVROS,Building Microservices,300.28,2,11/01/2022,CAIO +INFORMÁTICA,Galaxy Tab S8,5939.10,4,02/01/2022,BIA \ No newline at end of file diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/META-INF/comex.kotlin_module b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/META-INF/comex.kotlin_module new file mode 100644 index 0000000000000000000000000000000000000000..1e9f2ca4d180a083a06174d407c30581ce729120 GIT binary patch literal 24 YcmZQzU|?ooU|b7eF6DY?*T z5LiAi)`UZWrQz-@LRa8T;$`Xzsq)GzKIv;YVflVO&rPa=akhsZRwMNLc!b9SBj+<& z&b_hOnOB9ra{f{#&ILKGjg3qyqZGOvwJMip14yjuofGuKUPJe{TGfE7{o4B`Am7k_d8=doSRbMZTueuFnFO1 zJ!EURsP7s1mCp!nV}Y9{@j-`kcY30juAn^y_NK1#sXjK`;O0Zd_n0k#ozImGrqDA} z8h*94F4PktfWw7k)niaqaKu{8mcARx5zVK;+8D19(Yo;0g5ZTAxkfihT9EFHenR}H z-RmUT4N7@JvVR+Z0XFEif~VLd5Ki8&!GP`{8r@*!>wP}&CTNc$tTr&Z*upciZ`0o) Sc1g9cQ_JUgL7L0H1pWcJ6~B4_ literal 0 HcmV?d00001 diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/controller/BemVindoController.class b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/controller/BemVindoController.class new file mode 100644 index 0000000000000000000000000000000000000000..6eb73f050f215709f77445b61c2023b0c6d4a2db GIT binary patch literal 669 zcmb7C$xg#C5Pj}KODS8~#Ul=VQEL4y~zJx**MGP@av_)6&Sm+i%joPy57>0J0R&Jjm zzr4~Yqs*{)D3hS8^tB0u3F;=1k86Pz!KI9rN~kbwMwT~C!bO}};lJb~S?#QeV`(|j z8=hVNNih`a=2|k0hf2$nEQzGO5K&B-T4^$%ZA+o32 literal 0 HcmV?d00001 diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/controller/CategoriaController.class b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/controller/CategoriaController.class new file mode 100644 index 0000000000000000000000000000000000000000..08908c572855409d5d14f4f83a910537d92a5031 GIT binary patch literal 3280 zcmb_fS#uOs6#njHnM~3d;s{|A2@sQz04;`1CZG_u=wva$pn%Gqp39`kO!v^;6HHnD z1OI@J`U|ki!r+51JXqy#vMj&b-Ls`yYg{VTbJuguch-CI+aEvw0^kbjgGiw#ja~zN z=oc7yBDbVjkxtoMEk> zWK}(Ly-jl?2x{i4@@uZ+tD8<>2ipRJMOj)^PwUDj%8O*(CFS^ax3qn|ZdXdm%MW0$ zz|kdTDc^tfooBma?pRHFufDIUz;nkY9Ri;m!YKBqalpVq91@uQ7lH(OixewxWva~t zk&W|RL(gaM29Bihrh%gv6F8e-f6H}nf}1^SBG zd&JPa(?j^Cfwys1M^4?hd=h8TD-~uiR zO)uq;Xx~LbtKn$w52&hJl;7C9sdk*Of#6(PC|Rooi%sXoZ692VpMX z(LQ6A99*q4QLAd*_U&RtU2~|J)W-A$E+yt_QAx))A4@B6y=_xA3CwHtz?zoeTB=uz%DXGco*pTT*6&?`NuL7Hy~0?#UI`4+y@d3qPNa&JbxT(Ge@%GmjqwUEaw&pODvG zCIhL5ti}VTYs5&K-eHNLm75os)zNWBH6V}C&WPNuHKOuz!u`2!{I8A8P;9-SalPtN zuXgvvwMTP2*R}g@t2XcTZSmP>jP;pc*`=>pYPx2#B7==aqEdd!riuHv!V=T8b*rcd z#JHPViMA>QZtKws>(!0B%XzJz-F+ebPm;8(wAs*OaLuiImbzu@;&h;y>8+>ujCSK+ z)xxCYVFMJj$SEwjj3$$YeNrp+vZk!rW?Kv!3y!0_`HJ*?#Ue7))+7mJJ6{JJV;hoU z14-ZMMug)6SN$A6;MmKN-6VfM`USK^p7~q-D5kLe2Hm+=e*Vvvd$3!*e;~8A2}T2 z-{DZqXv8WOL#9~88pYiWDMbz+bJ8cc3#{`?;a*d(Pq_Y+Us@}3pA*4W;z5k^8(!_< z-b9S)%;KpRc;{P;5F2NgBEUPCdx`fWpuHi`Y)CbR3}4$L7!N^?MVy)-C-4xTQCfyK zKF1f7^oWwQ#iAX_9j(9s#P7N_oNZ|FkeiVf#ZZeZNi2S)2M|6~s0~|qfya8&N14M- zoThkf_@VM6dqimV{{tVlkEQ0>bpQQ7ok^lez literal 0 HcmV?d00001 diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/controller/ClienteController.class b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/controller/ClienteController.class new file mode 100644 index 0000000000000000000000000000000000000000..8365e7a352c0a388a04690f8594bd53a774beb1c GIT binary patch literal 1984 zcmb_dTXP#V6#nGcaqVo{VA7NZO4>BEc2X)zDJ?h&ByI|sNqUJhe&I>Gt2%1dE2Gus z^1y#8GfZiD;0N%d7>+h>F0f@h3=h)Lk#ug~IY;{A&)Ap^@Wx~O7hml;OtjZOvUP${G8VGJGv_YDtpkBcZZ!mZ>1&9OB)ilpJK zNXgjB*6|L*`QT`;EzO<^B*Vf+j*jH$^sR!ykys-b zZq)NkhE~5d_i+13v(c$y5*N#u@^A?sFx=Fp%aguQare0qJ-M&VF5j`X&$ndK*Ks1( zVyo;SLqYE{+^;t_hLo6F)#2f4s-jSu<`|~&VHqEJxPp%v?*0cI3?<)bBW#CvqFKgO zhS`(!uTuuQB3d!sv`0x?I|yXoDjhpmW<6YYm{ffcZpj~0nb<03@QH^TxJlbxX*Xq( zh%V)Kl6*MP+O`hBEXsz5c`Ps#eF~ppsebC(QSCK{hOo(Sc`GISd$OYv)4l3Km5j0{O_v86+b;=+cC<>R#HOS3IVJwt6n2O{bS zqZ~ijEZQAK_U_~r*uV7!8G1ZaRpthgQ-!3kAP*SkPJ#NajMClepew2J8LsDf|F`yF z7;jq<>~4zwAoPh%X?Jw^RJi7_(hv-lw(7>hriS2p_P>U=IKNC@-^)c~U;5lvadL9Ik!q~z8(7k$MC1w&c( z*5g>3RwR-{5<7P4HN!RfE(-L~P&K*_gXk^dMu~n(v_O=89hz?w$B8ncrTJgMe$I|L z&F&Z^`dKz-7jOrk6UXQmxJ&0w_$T*`5uKU;1?7cT7=MlT-{3OC%gxugcIy@9-k@H< z%S_n>3C_@Ur@n?F&6DKkMcSPr{!(V@DxKFbjxTU8i(qD8luY1D+$TK`NRFI)R;Hb= zXkB7-0DMiOfaYKyOlmo5 literal 0 HcmV?d00001 diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/controller/PedidoController.class b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/controller/PedidoController.class new file mode 100644 index 0000000000000000000000000000000000000000..7bc0f3e2a09eae180e2a8b1bb3ef694597b0a193 GIT binary patch literal 2810 zcmbVOYj+bx7=EU=kg!0kP^`+;0;M1ef`|kVC={wGR08#aw@G%I4&Cg;-PvOG_@DF~ z4k{l!e)jmAJU)|6+q5j4NPDvHT;BUU?>qDNzt8>za2d-b3}CQ;ArHeC5hy>BE7A{T z)b#JxAE|~F7`db)ZLbInP99$k9%q+MT7EidS?)2~1UUG$h$>SG>zxDPbpe6;Sr@8b$>s`xRtR^)zY7%$a!; z&jtcVC#xHgR!!8b9M2X~t3&^8+iDZZurkUd?e?$-V*^l5K&rT_-x5&nxOR)8moAeh&w5kXo9G=ko%8YAM~- zD(?7m*uy)R5Gb1XW|*j3PVP*u^>wkX^&Tix3OFio%*0JUX~#NhF2=H@9-DaCU$VCC z-&0B3M2Wf?S#4KKID$zJ$1x?aEi!h-q!AN;k=g50!^CYR0~IINQyr34w&Nt;E#Q;~ zAEyP*znU5zWZfwgIMKf=6@l@4DdTFX1)b=6sIEnfNxG9y1TN%;R97-e{6*QYCSLXB zx`2NzwdS#oRY0{v($q}-Zk6YhT{6MEbU?I(3O%anW+ZJIGlk7pkNJN(axNDDk5%2T>nP|wdzRiD8wsn2 z{tvIPanjLY|0f;%EO2-;#@6H71h(^i+nSelX$?TMHXh1WJ&+SyyWs?jsZ=v*+)y*x zL2u92zJ1E|uouBRFG{uoyV3S(JHJBmMZZrey^$o(mu>B5K;r?IuNz|%8_RZf_{pvj z+$~`qpB8Y>Lk;(t$Bo{uqZPBP{Awq3O2}?K3T!82HfI0yVx=pT8MrN@AXLdj)tKe9 zUFj);nsr^UcV&~{ePaF9HZzkim+kG(U9;0N3~Sn|N*N1VuDI+nU%TXbn>y3?x$D(m zc=!?zS?Xq4;Bs#^)@A$c7iD}c@L;n4TJHNwU}WF2)2!XVTjG!cwUC;X#(yOHjndV<1< zr`R!f@)=$So?`Da>~r+cUpVp$IR-mgM=`|lZWJ+wz5L%t>MR`0v~(>{A3nrIS}OA4 zQ^6%#xlAtSN49c>D<5%XSdbC8%HII4b)wu!rtADoKZHnd12?%>a3RhB<&rxYj-Bs^ zNZnuYcO3fzCj^|Eq9^#hboMsa1~A*vJj&6>oPR>DOnVh`oR4w+4g+|A&+t`e^bNj4 U0|ED(%t>NfjTEtnB|O6Tf25c?kpKVy literal 0 HcmV?d00001 diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/controller/ProdutoController.class b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/controller/ProdutoController.class new file mode 100644 index 0000000000000000000000000000000000000000..6646b6cc47a94b76c6945c241fc89e058b359fb2 GIT binary patch literal 4279 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 literal 0 HcmV?d00001 diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/dto/ClienteResumoDTO.class b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/dto/ClienteResumoDTO.class new file mode 100644 index 0000000000000000000000000000000000000000..9a9ce6a6b6f5251925bd0c070b244719428765b5 GIT binary patch literal 469 zcma)3y-ve07(C~vp`p-HC^HO*mVrD#fu#tRKoPC7JBii0N@B@%Dqf2TiGc^;p%9;; zQY$9>N%r08v+rzwe!YJHxW;h^2W|kb1s@HD&VsLaRPbsRjnjq53`65eR?^%sxcxyA zV29y6)lsI(h!?fy7KxWAH!2zxQdCAfi)CG^+v%9$tRHUGkkXA+#*2h&Y57|8%v>%R2Jt_03>h4m)8)3zf5MP)Md_{0CgwU8 zwLb_mSNRjyyc9-gvJ5Ax)|t4IHe2uSeJ|}HI7L8jY6qk8(IgfUyC>$->R-Hpy%KP+ sOSAm|z@zffB6RZGggxvNqjt2>p{*7jpiA9{gqse@Ai=sE(d?l24VO@D4FCWD literal 0 HcmV?d00001 diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/dto/ItemDetalhaPedido.class b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/dto/ItemDetalhaPedido.class new file mode 100644 index 0000000000000000000000000000000000000000..fa03f5ff45278e3532cf4caee7b9023bcab4407f GIT binary patch literal 2409 zcmb_dU2hvz5IxuN+WByrZ#OQaq%E}0HqAnTwj`;MXoQ4h+K5(pzp<~9t=8UZeOVzGuL)D)WMk=F@(o(_hQ7Rh|?b#3T< zV@>bGSRGvIQ`7akp+dQEWR^?VJ|#+_2Nij;iZ4k*LE1u?@0#!xClqek<>vzT7>zr znOleal>bXR$*m~(R1$k&<}5}z*fIC_A>0A>PYvDH4%Y-`roTDb1RBc%B@=U!dT8L$M|}4FSmgl ztHG7cc79e;{&@nOC1bvQg_Iq1S`jL>YNS|MBLQ0yR_R0Fm&BiZ@we0Qdsx4UHJKWP z!zty=#Y>`1@HbMH6L{fwl-16RFW!sHAZ>=ieR7@stuC?@W7qxW%${-Bm*Ft#n6G_# z6!obAKaeekTUSi?1}b0uz|flVTA zkr~iRFmW4q_(k-XqlzVADa?0ekrGoRVOowQ;ppH)$~7eRb?orBkEq#l2qU3ESI`Me z32B0NX?_n)o|2ZwTihM@H&lP2P+}C2l_+n-920ye<;YbGmsaB3;w=m-aXlpS#9RKb zB!7oiw2@xs2RLAiDNf5-PIt-aUI8bmw~FgW zPEtF?>f~`+%W`saIenbZX)Vj?fSkMnPSW`?C+VfaCwQ2q`fl$wvz#90a7rfpQ-XYk z&(pa+CD^!!o0I8HdiaRk9v5&+Ud?0zE9~>mgsn_n67Ug~kMV?Ow!7O|)`vN)6~4e> eUU%cS_U^>B$o9(uw(?%am6X@OrN^^`<9`5gd*CSm literal 0 HcmV?d00001 diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/dto/ItemPedidoDTO.class b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/dto/ItemPedidoDTO.class new file mode 100644 index 0000000000000000000000000000000000000000..508cf6e3561dd89db484f6363c8ffca34304dd03 GIT binary patch literal 2275 zcma)+>uwuG6vzML*xoo<=jtRi=_SyTI-9gxD73U`Q$!-5A~b=PeBXFi&Q`V;Hk*o9 z;B7#{s)Q;YfQLf;pYhh&Ovi{1J9Fl8&iu}8|M~Z?zX3eP&J;?Ra8PzpK~-VyW$-HS zyFtI>9~{4o+L=Q2QQVKS9fgV3#!(HEs5zK&F%4JY#&PPmlb#=R&(c7o=vP0?68~uy z^$w#j4wJnX2MVP)r0M;0+xtnsvn{q}T+Culq1>mg!b0KB^DK??TMI50g6zcqD(>t>?YI|o zHN|BYS45@qD(EJu7`f(RO?D>3=(L^mGwT1=D!^$63hNy9KX(c`CWIZ$zPoY6aP1}` z!!^4f_oHWLz2hi-5gd1Q0F!pmJ)+05&Ns{1NqnlXzW;x+warX@A7v*=co?KXFUq2n zx|L3pJ!KLXS{nr)wMRTW9Ud;e7a?JFsQOH2w{bx^4;e2|eRyH1Xdpiq6E02czDqrq zR46R#JpEx*0!%!Qi|aX_A6~45OYca`M9_I^8@HP|mU&swCTaXgs)iypb8(uxd!x#k z=E3=D>UnaOwxh3Oov#a>a$7nCAF}>R>`sRxyNpsvnncfR13k0w^~_4wGs{=cELzU9 zU{YwOgpas-!+DbPmiHRU+Z@30wg#wsw+5K^n&kl+Ub8a5ir1_TuAIEaHXX4r)lH_GWNM9Jl87rEKQc+|6z*7==1rzeE7K=-rg@XeC)1rVOp^N%ljKt2 zQ)})TCevLj(_MS+8Ya_yGJP?INvd$fB(yO{QC6$6^q#^)E7Mhz={qaawwqM`x<@@2yMj*=LRk))Q2P2Z>8Ng3Sk;O;EZf2E1W#0P(X zKgxKf#nO@*Vm5p4+?g}yp1Jq_`u*c4falmO!9ymGnKH7-3Cx|!bLodN>iI{VQ`NNs zxo0}kc3&W~wcReFfMOn{GH#$Ou-l3KuIc+SOk?R*>Z2c6<2O~H1M{+Vw0>w+e-sH6 z&tem#)*J@RRliJDH&JiTkM2Wx_ zS>DUoO8;Dj#Jg=Oi4q%29ofWh7~4q0a8KajBu(qn*(BBWbyQ80Xsgc^xn>TGQ&z3( zNHx-aN5w5kX#%yn>B_JzW9{OL%^7>5sr707|LVm&<({(5%bL};oXEc|8dQy#WCAnq zN-_c2ZnN5Nlsz#)Q^vBdtcoe8LhiR?Wv-BCJTAR6Y1~z>w0qa=sEfOfU7*lViG6Jn zo5#Aq%5^WJ%)=;B@j)n)M7it}qk%_kzQ>vL_;I#q=NRQ6aFf2qzW_0hLFBm^xj?u9 zb_gB~P_yucC|b9dB?CvB_7)?bUbx+z?+{f9fJuMXv;$Y?%*yX4j&e2Cog|R z{xc89FE38Ld>;>pa+mk%-TQJoPrf04ncC?GmZ))gz_2hxU8Hx?Ts1hnL}dj7r)g=b xrpi@Kt5Y>CPuEnrs%e9oHvgf?)qkX^N=+H8(0Xj+>cFqzF@1@k0@kpB;vaY}-qipA literal 0 HcmV?d00001 diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/dto/PedidoDTO.class b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/dto/PedidoDTO.class new file mode 100644 index 0000000000000000000000000000000000000000..52f4923f76ba875e86232c3630206d0aad25116e GIT binary patch literal 1414 zcmbVMYflqF6g|^-OL+)_q9Tf@Eg-9jA2dZ01x-jwAwv3n+MSfa?XKCK68%@2U`+hr z5Aa7B&veT+B`A?JojZ?v&pr3tnf>+q$4>ySuwFt6={z!JWRVk?I+iEW@uc5z_FBiP zZ3J=~+Sg`NAYG|8izuL&N2!c4lm+g!LZ=;c9qIK#X=mz_rYQkcp zep#u@J4SVr!fTsMnAr+kVolbyuNu8>ONED$`~{}#L0fuF8EU&8Y-Y@nWsBU#v4)Dw zuCiT=@>msE|Gyi+2JHC03b#BNMT%mMk6aMk=iN{75vKU#W8!#?s~o60?F|0~2pYRe z*(ZWDuJ`A&|M1K*o-di>9DN;HL7QFq4)L`ge1oGsw(vJOmSYFZ;}%x}w{eH#Xz(fW zUwD|pFnI04;04^Jmkr*ewbkWTR=*)XOl`k6z*BO3)<>9&y$0zmHLHcdBE7O~0u4Vi z6f1@u7Icd7^PHYvz$sR2i69TKOa(2seS#(2#x1vWzp|Ly3vzq;7jCu-0uLDx%a&tb hW`}Gic@QUjM99ZnrBFeYHbbWstZ`QA&kA^g;vdhIEv^6n literal 0 HcmV?d00001 diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/dto/ProdutoDTO.class b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/dto/ProdutoDTO.class new file mode 100644 index 0000000000000000000000000000000000000000..2be4cabb3835e06e227d9055cc56d9a3ceaea085 GIT binary patch literal 1661 zcmah}?NZY~6g|sF17!=Pg@S?tMW9e6ieF#>6$)A{v<%4qC0$FHwtW#g^rGj{Zry8DdJjXIa{QneEmo&%}7$ROP+)>L~jY)XHk-{oN zpW$Vrz~QF!U8suOs|0_^@k$9Ey295-Z6@*W0veN%NaFKkhkjg;ffj$UsW`iXGWDObbhgStq;eXD94a@$k|4>V+<8@8y15K|;?2fYyi z`qI^;RfoDDuB9P&EsdOOsb{XGUXay5ea36TZ_w^DS>BkVe7wP1$}B_cZblo>h8{8csx)=7O#NE;hR_#UbU;N5xQAn|M+GH7!z05x zigA-X(oUZ6CDQ}qL%!Qip7tfbN7jd&Y$wn8l6SD|LtbeoCwe0Vl{C`=~T8S8c! zNPGYvg}4(Vnu>~&#huK3oOAEF;~zi2eh2Up{VED@TogT&u)@$dd(;#qBW#~<`AF0IW@mzEJPki)cYQ$9Yh$}yod|S-M zLLbRUR8fIr&8mk>s58_i^DN>cr74Hub!T|WKQ>yX(?NImKlr;Mo2fJtg97wP~ z3f9idGyaqrkalC;pmD4i;X{ssNy!~WS5t!77< z1GPWmnkT{tP4v~Vn(Iisk#_jT(gc0G2;9X@dad?X0JHCv>}|UFbTT?in=L;HJ$7r9zHBqEAmy#=} qqlPwC7tkAdIUeE>#T|NgkI^BzI?Cu`li+*gFEL60xwps`@Z=Z$`r3T} literal 0 HcmV?d00001 diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/integracao/TestaViaCepService.class b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/integracao/TestaViaCepService.class new file mode 100644 index 0000000000000000000000000000000000000000..18759c267db34e98ab30bb0aea80ef0d4e7fd91d GIT binary patch literal 1000 zcma)5+iuf95Ivhqoj49{6PmW%DYsmj*zkf-fCnmgN=rqmNT^R6XOwOg+hOBG@LBNC zN+9t8d=z3fL9|gST0hKsJ+tSWIph8H`}ROY=sbT@}XE*V31f+fj0d zhHcUl<&%vpk|yLGT*I*qO6w~4A80g;!VxvISVh4? z(ZO}B&Gpm%GKwkSHli_iwKii?k-N_{F_V!Dnl{$4VPVt34crtcPSwoU2v|dNVh}RO zdA&2gnw5@)+XCMIRUgnOmUGq!q;{en2`sl%NPFX;OZq@|2mGbbihMcfNUhBN@5fYp zq(%bIF0p5ksL4!$R4l(#KD@y14(FxrGj{QUH2de%&}dqilt6xRe%J!_OT^6?z`8Qp zjFFuYXk6*&zp?YAcPT!Kdizq#fMU|D-)=`^?bADDOk7`dqG4LVeca+ZV4ehoxdj~W z@XqB`@S3ikLVTU3?{YM0Ac=b%oml}xZ1FCO2YARJ=I|$8Q@m~#tkw@?Kb|7DyInhh zv-b@v^%IoN087jXSPYp(4mSV44mOaV5>#g(c!bAXlSBzmP-fB`-<}GpOtOj$YS`vn Qoh#CUOTh&VjtRJb0PqI-_5c6? literal 0 HcmV?d00001 diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/integracao/ViaCepResponse.class b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/integracao/ViaCepResponse.class new file mode 100644 index 0000000000000000000000000000000000000000..33ea22e27b198e6cbdd1a8c7278e74077db766fe GIT binary patch literal 2351 zcmcJQ(QX?>6o&tCVmom+PDq-xreM;NHgTH96ev*Kq%>}$A{nTf5-#9oY)_JH*1Oj3 zxS~QxJO+;e5(udmJOB@c_-EH%Z#HYBUi4!3%p9Nj_nULhjQ{!f)!zViuwOzBQ$z@Lax-bw|3#^>5nGRYwaH?%A%bcLk<4YKOC!!E6yF3m0GsY_qL)Z{T~z z{g#DAX@W+4_W|KucE#0>5mWCwz0B+IeY#>896Z!sc7HtG*ue+RA?>+YUX8 zEsuLUl)i1|L+7+UvB|yNdYy7K1ZK1s6+qzPMkYt$SZS7!X%2>i<&5Oi4%sO9yPHj@q|P3YX5d<+kZY^6z<`4zw@((ME##0`8XZIT}UWGcB_tur_X7+kN4k zs(O^ZsEhVxM|=KDfnSp;8U{w9kEPpnRIt|aywgFyalY~i&zXhKUiMW+`1gtU=)5+P zWgJR0rQ;mfS~X^HU*Lzc+y9AYa%WwvZ>^5cT{KS|xX2Nmv{CRV+tGY*WbDrZ)|alU z{H7y=Km|qY30yyywX9?m@lc@p|DkNdD08^VbDiU1F7VBph@+gjJwnUtBDB07Ld!cL zw7djp%V1k@oxmz*by`82-~0>WcMfutHnPS!g=>6UQ2^e@8fV-NZt%Uz@#A4!b@LAt z`ONWI;IqVMg-_)b-T{7NWKy-9P_4$Q>#^z>iK^+vmBiwFym$jOe!?K_(uR52y!j`J z;|-Z>o>w1tUJVsiqNt&Q*|5o?z$T;eyliO%Ze}vgrJ1f~GHqou&83;Hlj+6;CR5Rv zX+C7SmC3Y_W~yZ}ZD%trq?vA!X?p^b>8_Z`{GSLm(WoPmwOdLv-OgnCAe(6^&2)!M zpG;sfogOnShfKFKnO4$FcQctj%w}3iGwqORcLI|+burWBkm;jLrb?RWK_=73*-Vu* q(<3tNPhc`PK+JT7OjEeScaDkuly-(ce#U1PUvO69=mDB|gvx)#!mqyo literal 0 HcmV?d00001 diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/integracao/ViaCepService.class b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/integracao/ViaCepService.class new file mode 100644 index 0000000000000000000000000000000000000000..849fc1fa19e55de6fbd883a52fc0ad314dc5e3c3 GIT binary patch literal 3298 zcmbVOYgZFj6x|mB17Qk?FXF36QF+N&t=bZ#mI$H+MNp`ZS|{NW29lXLGePM4{eFMy z&#?V~VAtyMTi5E3s@;>Bkc0%5Hd*V=ojdoQbM`)ud;a6UJ7AcGJ19`y*)`q5Q*|op5f<2+))!^WG84KxW4QC2Ij(NH zj=<5*v4Wf_*EY;#w5xn63>7aZXjIXJW&t&K#+0shWAYO9CTyv@QlNcnX~E`b7%kYT zV3&&B*dq|xkTmbQ8Eurqq`aS%4&j7N`Cuq(q-LcpaHKOZ%M-MDZ%42#+JII>6zo&6 z9|r^uZz(;0f?Q>7L*P_kdEU%tRdz_li)a(5iF<|$9Nf-Kf^Wx53OYRSM+92S&5NZB zX%c%!MLGW0yzNAL44n$PJR758`MIhuzlkDk5UfAs8s2`P^++S`_K71=~ zj4C)Iuq$DuwWMVwQ&LMhmZ@Fj5XNa#H{dn&D~PHXz&U|^TT?)r<0OH?@`#I4k!oHq z$xxpj1#bxS#%;~hucxxM?#<+~W|*!_+Im8_v}r?+N#=kL%rh#c;sS=r@|U}p|gZh3e)Av3OFnf17Y%L?99F^2I{%U2v%rkN&ImSMTu z*J4=O1WScWSW-{ZlOwpQVglEgv`OiXOUKcZtOups1mz`+DO^`@L&Y>^^5&FE6i_mr z{1mb7u7K66ZUQ&G>UOJ8bvEU04q=hbJD$R~HwpAhXS8ct!8-yy&*GaYX)hTGq6@{W zSw5P^3{zgorsLASuE$ecX&JK;dTLs?4evcz47u|LbLIHhbLfZ)G{mz`LZ7f~Muoso zB{H5#Vm_iMvd#{oi}hfeq~gvhxxC@?(tzQ|YQ~O-wGd7L+0?*nmbOe-0*wU?yeoJt zY_q-_j=^9T*kAZsmhS?4N_kw#bcYLuFO_7XK;QH7TrczK#d!8m`?uPZm9-Oc#K=X8pYB0O^?6h>`-Uvb zbzED|_%=FCwfHcMkMOaAPrR7_l=nk{b;De;7NzEs?_csGdcw7A7N_5e<0aVW3-znF z(=ldQi`h(2T#Hkth{lqG*Xf1|+iw@`&nH#UQXnFxr&3dfE2DMzoEMhobEjX^NHv40 zkHxT$+3~>9gtp+->K2`l~g8j!O)0B3u%t_{yve6}|#TS!;@7Unv zh^lxQ6yIV@w4$R5eq_f{MsX$P6#Oi3X#1_~kbIhP7#vE_6xh3+qpk-xachIR zK{n685!!GJ&FCU!y(H*3SNhO{lN{L#@jrkw7{*!5uo<~U67C>MpAY7!9HoZ`NUcxh z3=u8i0lj|*byyBao!cOFE+Dm;H=j>x4`r>Ckm^gzlNv!)?Nd5qdseIQE|FB>J-p9n uBWE9w>CbZG7x;>6-L$Ed{`k7Ko@m>1&tBsBhUM#9KELPs5BLecAo3sawR0H& literal 0 HcmV?d00001 diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/model/Categoria.class b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/model/Categoria.class new file mode 100644 index 0000000000000000000000000000000000000000..e799323e37596940c312bf2a87cad82ae0ecb247 GIT binary patch literal 2482 zcmb7GYf~Fl7=8}qLNMF{xC9d>MGwq@P)%p*%~+qT1CP2v!krNW8fDx+{J zUC;ECv>UQeZWaadJ+JnpEnTLmS!WU@#fChk_pS4HXwYBn{M6SdKi%1{m22M%-0JD0 z%_Pq>R)G)uiiXHi)!Jcs ze^1~>JTqY?mg)plVzmm4RZLs%ciKnNtr?_LSBcXwth&M4T3|cW8bAhSFp1Do7q$-n>+@)*31{t>(Tu#QL@$YmjX{zq~C7z~S zu*&c(XhnfFn(W&;flvfr)6EbvG<2c9zIZ)t4QaUQblisAH8rK9k@Z#Gf&GeQhqbNF z>HKET?E0zD(4rb5(@z{n>9RcyDEG!v*c-+(l+$>wyY?FD;~%CMedCzllcT8v$W;y=WWg15F9uZYk@ z$*`=dsbp~oF9hyJ6#is3H^s`le$qA<#KOwF=f8KG;%By3*=A3dEW`7pm&QwhdtI=X zpk0nBjYIa-|BJF)0|IcHPwN0%c90`qPEeJ*_qqRw^E~&rCGOxZ@?75Y@G<514u^8% zobx>4#S|9GSmc_odw4s|U8pvJB_1wI+{X$sTqf}eZ&&H#Th1E6#PXjI%fBQ21|!S& z-yruJ4+l`-m_vf&B*!uSV@+Y40M>Y-9Z(VL_>{9=1<*d@I?3kbq&=lLYEN4f7o4*( zPhBUYj2V~-oy__UbR?7y9SA(Y=b^0)O6$Aa@*kMyPtPN7NgRIVX#iXM1?yHr4J_p% zOJCs2&{Bc3mP=|&SC#WIGpzss literal 0 HcmV?d00001 diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/model/Cliente.class b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/model/Cliente.class new file mode 100644 index 0000000000000000000000000000000000000000..dfcf45b4095574c2bc5901623c4e4602a13c7cfd GIT binary patch literal 4464 zcmb_fS##V}8a>zU#f!Yej!k+3A!PB=Hfi=5#z`13PSW5w0ec*hu*u!mwqjXoTI!Gx zATTWNyzvL1c*p}(#gL*3YM$m{e$*7_lWw<_wt7NQJV?6BcfWhS?cA&X{_p2s0i42@ zedt1W9vKT+yEcEC%OhL42h!dN^M>G`z(w| zKdZNG$CZ)&7RF?xw^sMpoglD%8GXpY0U7NHwX4^CPs`w6EF8qc9MoP_*LB5LIJ(#o z;ervG8=)r-S$GtO6&~8QxAeU4RqXJR6K=8Ed~hx4u-5a{SsQZ^c#>%#;l^O&+QjiSQ7C>D*-aZQxDET`XV*e)BBNkii#m`iMK zMy9Wb&RGkO;{=1eX$PAM<5O2tB+C+;CoDXPrxd!JDzhvhwdgYy`tb~&&Eq)>f5qPv z26yo-IstRA%U@>-H4Te^%fy^Q;q`_WI@@~H37j=ozvy{>Xon8trf`7UY}xhDF4c5B zpuF}fx>T-m*|F5Av)a>jJJi)xCbXtlPY_Cf>>yP1SHxS`i@U7LnTAM)y#S5;mY<)!3RP&kyTd|`V{SF2hq zd_EaQQ*m6=tnQ8@)2oCw&l*-3T68?U)S%A#ieQo|_A9o#YS$gCoFpI+vOu z1ELx}uft8hdeN@a_>fUi_~Z`){XNEXhSaKlv9~AmV}B^@Zzfs9fyPS;V@Z&$5>Qa& zm?X8CDTREcNq_^(p`o4t`lO-mNcp9}Qq>PGr+jW~aPY-4Uc&qpyi5^ZaQ2D} ziO51zgm<33A|oPlrYXWp&|Z--5jiU&=eQAXM0-UJh)B69!uydC$?^LNtr6H+yvpT^ z?794A_}yRp392}=gM4vz2Lr{&cQE_|$GdQz?{TgG?^+pZ>%}7Ÿ_ZI?J&jMw7= zF0w~W#zoQ+Pl#Xl%O#JldX4RYZVG@?;2_U8s(#&o`HtT_$0kz16bqRhj1~*o9gG(X zxg8XC;T>W4z#wLDgz%0M-Z8>EjskBik7AOosR-)1SbGcVL<{Of3+jY{N)&Prjf|U! zJS{GmkP9brks*cLeTIy2`T(DUe8ed6w|Mwzeigr2F=`jHT;^iu%|zHFk`yx76qd1K z6r77x@yc4f%jn!?aPDH5&nTa9K82qd5q!_paj;}#pp?*hsHJrp|1`e-m|wYCOc!Uq zMK*J1=06xL{)oqB_TnN1Gjv z6}H?vja6JCm`CWwH<%q=xJ(^c{(cOq$b(r$3GvnyTs6i%Pu&84DDw-tE_ciR%l9xN znjqQ;=u%1bG*HQUT zd?*qXQY!Ta^hZ@a<6WF}97oCrd-l%Ud(OS*-kE>@+xrK=Lu{5Xfk_VqA5)kXSa>aW zWe`f!4xXu|jamZJ546$ABZ0|sWqSri%y=mIn1wH}(ujhl?FKUJMbdq#KZ34psW8}- zEgL_zyK+M&s%;}J1qy}^0;lTxB+rvbn|95^34!IYU;~U2=CI&WJt=UeJc?7vo-gLMkrIVSLy!@20=5-w9(^?Of- zvB3KAP;%M*(s-?!Nv-lyVCh-UB)Y4%b*vkqS~JEbGSSwMV6|?ecF@rc6&W@p*p;Df z$;7($nK+50Hc1@Rm1!rP8e84fW|E0c30xjVeerf@7`c$@Fkjb3J?(W#@IsQ^wb?dh zxGmXw+Sz6y>1d{N>sa03SpKY%j&1!aBiU7niU_ehoY&xJsBBKa57Z=iD{!-18BaPG zFxI|E$B_Z;Pyg0|q04D6?C@M?M*^kiwih+kkJ?FcZgkXcJ1S1Xr`xu$Zf)WkvXhn^ z&rjoi3E$vb58wIt9?bCSetJ>b@*w5QLIh?SpHKwe=kJL&yY`I=Qpca9X@x4jUbps5 zZ>Kg|b#5mMbnV|%aWm389G-m0MkwPrzmZ+-SEC?#_MxkmsaC}7ynrX*ZyBSaKC+5E zJQ29DU-}WHcvu&>al%ntdAX4Z_dk)*<1{{M`Ze!^1D(Hgj|pJmBi&D^^$baA910Dqe9QUJ(KA zFo8_GfB;UyRm$N&16qCMog_yUG?gKaYx`oZ69tZoQ}#=I#r0yJ(8+ShgxsTpJNlaW T6j|a!PKoQdz+k zc2_3ht-QAI58yN37(URMx|vC5pfh~qH!%#)-Cap5A)93Aht=IZ_q;y$oO6%<`R_-6 z1MmudpT`)+Eo5wDF(FX6D-UGFm0q)QOVzdC5SX~^cuu$?Fut(3a{@V>u#mU$6l{UT zUB6P-t%`IzzBF&@ex;=w%B`%)h7LCMf!^|UqZ4X@jK^((;zr-ZcIZ1^vucz+ZDY!4 zJkd}=-FNCz8|q0LMNA81+djP!n2m*7GTf_NbDC?a?zE&EDL7?g7S9Mw-|I*(bQ-du z)?4dAsPA=Xbvk9W=7p-M{77ov#%X*(;HkPKQTvXpG2}vudqdO1Jf6jK7M{0J!Wn_3 z5n%_)KXB@*vf5R&9TNodyPcpex3q6mzql~0dod<-LdUJ#Y=@5a7*QTy!Z`~s*mx0N zCTJ0611tiT6Rfw|;e+U8?pRn9INQgz=DMmW-K&1H(^6ize!s3Fz5{H+S!_Wl_$}W!X-JG#XAD?w>m7lmfCRwXV+C%Jx_)+SOrL*4dChQ-?BgxR z8)rt32|PRK!0iX^K_?8N$2zg411EG26xF`_Ij2p(ETeX^xWjfBpWf7lHf(&9CyP?88-Pn@8Y^hNBRB(0>q~6xRaWQAtd6uTL zyg4#4j_P&H+9L}jsda)|==IuOi#$I{?no;FCw0;&dqvNl5$EMVlccrTK{%Ne38a@s z@LwL~N8GD=mZ~e%I=LOn`u+{sPL$<){gogOcCVy*qb^+=YLuz^5xm~gcVn_8FxTyc z!~MzVO1Ft_lcJshdX#d!hPHLbudC~hNwQPJ4d;SMQFesxtzWpNb!h6d9VbyRH32UV zjkbk*=KAn?N%Yg&@ecI9s>HFzH_CNc54F!6`a`;y62@5R>(XnuDmb^H^?s*ajSnP! z!=xw!f~L4fu)mYy??Rg*B`Q{>>ux)ts^-9}=EBWVZLQ>Z?`glqnWfZ_rCxrPynp;j zm(+bH2-R}QXVdHE2N<@1Lql;<;tm?_U^ z4>9)S(iDj{k+x()I2nn-ailQ_4l%n{|9a@UK&qQy=%PhXb_fuI4 z8Q@HKAPX2m9M(llm`_G&mM(I$)M`jvh{-H9n=h(0XzcJ=$kJ8w(Ust9AJ-VQ?(bXp zF2*Ay{tSz6z?G%)$C&#BU%avW3C{izGoNDNZ9{s5GVl-={{AU08iK`Vl23up40*ry z8D4&fZ~c`zG7(ZmuE0s0;Q1CXgEI`npjL|Q^iaEkw{ZuoV!VuZ@ICtaeRA17$`45S zAt^lNf8mV9VfI~qWw^f(A($0ZU<|E5l4y?gB3HrHDnG(y!1(mvr)MmXCGq1V2fy7B z;#YvbJeK%%)M><6zs%JfeXhLp2x~{l&&E7G7;>Z zYhb8b#LB7mH1;_e|G|#rvJkbdX`1 mOLM1bxW%0S9p-k99q#9NAHTpa@hkkA`=1|Q&enEwxvx9?^E literal 0 HcmV?d00001 diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/model/Endereco.class b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/model/Endereco.class new file mode 100644 index 0000000000000000000000000000000000000000..9959eb0b561fbeb08d578731ece7bb8d60ea0bee GIT binary patch literal 3504 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 literal 0 HcmV?d00001 diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/model/Pedido.class b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/model/Pedido.class new file mode 100644 index 0000000000000000000000000000000000000000..7f64c4d8321d4a31e7e5c58b275f5cdc0a20ceff GIT binary patch literal 3583 zcmb7``&Sc36vw}lkc3ANU!WAq!%BsquGOklD3+HP8v=!h6wJL)?apZcJAXdckaEj|NQ&s-vGYGem4?GX3&vE3Tc6pd-^L~ ztLau%Tie+)%C10q*0fA_P9QlswbhMIbY;+;MGvw9XOy^W)(x#-m-X6`?iv)d?AHS4 zCZ`G!%QIa#fxZk*W^oFq1x9xqt!&pdz1DJc`DVP)>UPDbY3oMCtk?n_72VYZ`eUq} zMSlhZS)9XpfwRhEU3Yi21+%(jl+C(cqlxY1jWvM*&qQch5q*-ykTlR)F`8xDa&3wE zX%-{$W6HH%z1D>>jAw8mi_dUTU^*7OWH#(2-%NWG>Ed$n!J}1yD}|5HQ)r)OaY;JN zx<~A0Fx3u!%Qb7-yyNKm1+(dPV-iUTe>saQxGKKG*)(@*#=K=QkgjQ4 zBsou#m%8KXTElRfL@}(gq2()7yBN8&VpxX51gmT@R}6}EHeETd?tego{!04|rIBA+ zE|&78Cj!HfJ{Ij-t8USDho#rK%TB9RtLa2fvRoifPv+_iowUxIdQIEY%P*U@rRl-W zw1=GMtCsCZhog~RR&{H?WUpBY$!^Gi$Sh4YSwhNFLZDZk_Vac&3XDZsTDDqsFDP`D zdL;uRFcK^3hatUL+Q=7I1iCiOs-?Rvhgx^2#o7-tV>bSP^USCv!^^3ex!7%TgC$$; zl@gtGz0oi#3p}edM^)IFvd$e>=zBbpc+p$-p_B840?%cUy+NR_U|L48Ro^k3k~|)P z)2ab&>5eJq{>Kh?*JP@V$8W{o1cO&K+&t6&bh~XG7Jxh%Z}H5e7o@|rsV!E_s^RY1 zm37@=&M-0PF+*!?hHP6Is(NqdedXirazZaj9XJYchD$-Gp z-69kd@>V4wT1P2^sI@5Ee9f{!M$E5!Wf*$kH&Xd5JI^}`mDaw}Qr|GO8 z-a!2SJ6GAWX}6rRao?16(Bp0Nsx0QXF1O64?8>SfimW?DHG^?pA_;cA44=Fn*!^yE zHi{&^;&_Miy9Q=3%io9u=9-kbw~cT3&U@V#KFQHvJ=I?2J>swSQFflD7C2w@RCx#c zi~UM9DGd*Ks!Mq+Q-e41yCNgUM0j2LB12U00q%PuD_nVCAdiP!;swd)w`545ptd*2 zH_5chvDm~K)}KNc_zoNBqb7fn_}rv`#W)C#mve6+a(^ImfZp71ICFqOZy4qK86WA;%e5jk1agrOyGMw@qKF? zrSDYkcWA%xB>`zvq5-)h%Betk8&4@E!RI*2V@>C#51<_)$v;6b9w}(b!hk2`Taebh zB=~_+DZz98SXRPR7@2Z5ln+&riDnR7pO)t4ThQSlW8S}$tx_MX-F~c zMlubDnI1+mnbAzcVWuLP)?%2vO7@vX6w@AFM#O0%%(M~7R6{)~P7`6KEiyfhVe(ps z&vZ#KS+ISxM{|5S%(NZBogYBpK1w7RlQ#QJtN!m7&h6h1e&zr lwT3kNSAk!A+ACb}9J+MS;w*tzs;S9F`!^l9B+<#SQ75gq8qFoB}35NRzgqLOvLQEjg0Rgnmc= zpq=S-rVq_Dw4FTkg|~h~zopZ)C0WRdJb@V`pL6zEd+oLN*+>8U_xf)lx=oF4N>E3J zl37YoT2O9B-BSxy)u$i-1f_53hVD!Y>KLC`@1joX%20Qf-l41@Wz#BXX04!B z8KD{gx1?r1f_v4{fi>uX)Kq7?a7VAqNlmY*RTpR=OM~>Tpzh}l)o}E(T87j9kkg{! z$cnUF$DvnSN7ks1OC?b z>ymdA=jNBzifc~t11HFF$rQ>ybvH3 z(#Vmaungt}W$nU}>D)nm?gB7VleVo^fO)&5aG5EGzbNLWrB_tv@OM;<82)Nh=)Wr zU2o?DA;Q(Ys2clgX3606q_(7^Z3~LGyvvJz)u!fW?#-_VQerV5n7R>^Z8m5U8+;@$ zl$7F}QdUtve(!iwY=?8!?4y3SYc~^ZW+6Mjr%WBEGfk}HfX$-y3hG{Q&X$!Xres!CzH;$j?%x_9^LQZ5H`0coo%zcj3ZN%I5XInsYqwZZSAMV!@bN8 z7Y26IU?4^g=9>k?T(j?Ehz+4(4^|(Bnt2bF!{a1+C_qFJ_r$8BYP*YS-488=twrSO zWD7IDfu?}Ni~V6%?i$18uywih)){J|L{kN8U`4Eleb}fmgAayXHnZDQBDiG)U53YF z+(w>cp?zcH$JxdXyI0MIrOCTGmq*r5^mQ)Uc5Qqfw~n)qS{R8vGOqGi&D6b%pDy4Y zPoRmU@x+CO)}F`c1V&fzzKZcRN!O`>34BW6$;(%%gWkvg4I7h_MY>5JJf#omBUpcI z(^>{f6pwD<^M!D`Ci*Ebz|U5b1b<%mz6bF3!TT6|n!!H@BEB_z|6{KI1pEKO zb3Nm^zC*JxnR`Ia3mQBSsaqmZPi$KJ;i;p`Bz7N3g zOGyi~NK2Ro^-_zAWf!!E1dx2P%TNW~k{-f-1tR`{cN%Xc|0jw3l>^G;uO3iO{@MZM z^25mkI+Y(z9njEA*d%Bb&vTT)^BN_Q!Y(AS7s~e24H~9NI*+uiVRhQWq(`)l5zyU4 z3-=dig{wnx#pkO}apg+7zc|1YJ;v{W6gCm)5)26@gy{J@0bi?lGWnZ$GiZv*A2H+) zTSDz5Q5?*Ms{lqm8$n;u6Ca=u0KB5iZ!q#gWPC2CxXn-LYgn=OX}sMscV&yZzYT}e zF2bN^6^N1c#o!=Q!VOZ;H?f?0qMT-8IeiD9EKDNTagPHk{SVQ3Y2*RF6tR(w0xPC99XC z3a&%J$02g*fLz*db-se*E~g4@$8gF;IX#W#q|;6ur(BfNGjQ5y!-@NwXzIkrNWgSA z4%W?ums9WjYywtm1Iz6#fc50BQY|Lbp=hXEv7s7d#&HUD9gouvIPJFK#GNDH#GN8R Ub@%z)yY0CKM5As1l zfzi?7*&pS&o0Or9yfmHUWKX{R_S>_&{qy(7ZvZc_89_i`s^q9;yQ*qt-O>0>|EN~& zece+ZYmPTQn@g zT@vVRrfPU@Dn-uzj*Jo9C2Y+*bb;=sASY7EQqqrZzn2ZM)7wEbY-9QM)B_CU4 z`2xX|@-B*Sj2smiX^s%udAqwRQOGHlH!Yytr0Ry~N->HUGd+|s%S_?5<$S@TdL&~W z3tT(z*lGf^DW%2gQSO({p&a#}Ks;|)`c}PK(w!ZxWYW&c4N{fXnnWO(x67JY)TpJ2 zw80#*v?>KiHs#$YkU-+K?jG3tZ#0K6uI^BJA@{(bMHuUxdU;hmg zJ;P0uouz*0p+ALCc7TT)pp_<+b^_d&Kw^-mlk7Iye~bmfKOt+BR=%WTNT=w$K>Q0? z0#E7L=6wqiz7Nlchw<~YvWJuu>2q{nKrlXV4gZ{WWFLhL7Rh=+cUU0viJ{c92zq22 zw1ya*o*X*EKzjN+hQE^S({<8U3Pdv6=_i9}d+8gKFL|l)8z&d^0(1oNG67`i9wE>& z-2tqSjvU76$?E55W%beYHw>TR-e(VUm22D!;%krkK@t*AM#Eq6Y1%f}TA?460{G&M|iaiI2dqfPVyGBq&`@ OGtkIt4eNvnVB;S!i&9zu literal 0 HcmV?d00001 diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/model/TipoDescontoItemPedido.class b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/model/TipoDescontoItemPedido.class new file mode 100644 index 0000000000000000000000000000000000000000..285fc1e46b400b4c4a806d28974392a882bb0dd9 GIT binary patch literal 1306 zcmb7DZBNrs6n^g7u3PP7RsnfCVt?4@AM}Lxz zM2JSiXMdFO+-}AZ@xz+5_ny<|Jm;L}p8NCH*B=00;JJ(lgWmLY(`)O7)AbF$vp(o; zuVp#dvcrasqf*ACVhCWfg7k(=2@43a_`%*GIpLFL=~Djr~- z%Mq5*VaR8)qYFZ*|HO+WI&_AyitSp}Zo6suyGGL?Px+FXvLj2+pjAB6a2kehbKU{D z=o)Rxq5UfuLvqUs4!zd4;S(mXd}>k*4sBYLv_%r8`>~0>;rT7wH5`U`-9B)Qpz9N_ zkjXY^w$@B%AaH3Y5kH2tksDbrQ2x5t^-b%Q&GnhS{GKfHfq9vuvznyaCcd2FR|cS! z<~>|##DQdr&ov<=@@Ftl_$*m-wDL#kA@K#*&Y^uGi(!Gj(eR%@_!Jfq3GsPad4!^| zg)>Z?gK>Q10{$U+)IJJJSSCxSS7KQD$e}ce5JIvXtpfd$7ZztuG4q+W|6`Kzh<6b( z#Usd3CoA+m4ny)ug-JVpv6f5WF)8 zUj9b0+8yB(cTXUM#+(=$a%kL>LPI%2`UDAHd7o1Y<3%J$=M+^uPYp%}Wj?`E!bR}x EH{BZ}2><{9 literal 0 HcmV?d00001 diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/model/TipoDescontoPedido.class b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/model/TipoDescontoPedido.class new file mode 100644 index 0000000000000000000000000000000000000000..89b1866d85d09b3c693ddf548a6d657f1fb95422 GIT binary patch literal 1482 zcmb7DTTdHD6#iz`d+~MwV=e_sY0{eDOTmVarmeX-*c7YABr#a3{Iu9xy0G4jyla$4 z`jQ{gr#`kIHBqZp7LWZ=RnM$l$rX9At(}>3<~z6Voca5o-~R%zi84dxtdnhe?X2l^ zJEk~Uud{8hWjWas`;}L;{HEsy-gB#Ew>%Y$VYhN&UYS|PbkDOTx7*&TjNl=^lV=$J zzXKH!24%~3?O=ytHaX-O<#E5F5UZ|XwY7A?mnHreFbQByj3{#Dv zRFBUttY(l`@galUbUc?znNFteBMi)ALB||EQZdb-hE*JY&ro;|%c&9TdNS-|-!XkZ zKa|0sb;C)CX~`Q{!UNI5hm?Dm59O8kk6xu(sve#m8CZrPDt|-`J17@Rm2$CAEE!1l z)hSZHI4x992I@>-{W*iS)pWv1(y*+PgQ$k2hKzv(;zEARFj=|u0s>`^tiWuUfk`9D z+gB332qu=OSU`QhB>ih!NI5#S))}^Y*M`pLxXxoSooljo_vY?LKG(b6(BhFe&-Jcz z?3t?ZyPp&u;}=|$=!?)N-~Fs8!pQ~`uI2EZG0fb5V{4ZI&GtUMK!%Bm?ON4t`^@T` zm}gEnuwK)2>So6l@<17_+2^hqbUOslYhJh0v<_^6o`2bO1G{b2ZQmw%!F9dB3~bN! z_tuFEnJSCy%?qvp+KJq7CpLlDf|x!+$b_U71Y%@yKw1tBQA{FEH^TL7hye5(%>IVO9zOm>7!zg*pA0Zb zvJ!FhI8VRBr#*0iVPRCGe}m5`mPnsEKCoJ*e1z4!@+bJWY3T+lwRGeL=~`O8!D=nt z52Rs@QtBsDMT881wLieWi)W>`$lYQk6xJi5kPd|nITTjkVe=NVf({naF+QMRj65z- z3DTfs3EvQg;~5TV-y`%BBJGO?q%xkC@nsob;cGe~U&a=;8(=qe`!oMZ1M*IK( literal 0 HcmV?d00001 diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/repository/CategoriaRepository.class b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/repository/CategoriaRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..a030ee206a1d2a7cfd1a80ffab8d8c13120edfc8 GIT binary patch literal 440 zcmb7B!AitH41Kfe)?F1m>Nf}udaVi~cq$0H;5}_)nYEpibgC}+Wgh$hKT4eSu&dIG zha`^#UfxSSKHuH}T;d?X$lxqjTS#N6?v+-EU#xN~oeQE%dqaUMQAe|NFTu9K;ewvX z*5oUDmoK;o3C0HJqLuAhb-sE~YWP|7(UuhG7p3;)hRt9yca^8mD;vCKe|gjF|C|@u zfT>1Gt~Y+tADc4qReF^gOy|;T!MCoCT8;+1pRVK?9M5_mT*LRSb9v3z-b+l}`$p3Gn?#!mbQB1&Q&VHcC{I>lbB<2c_3z5q2ij(-3E literal 0 HcmV?d00001 diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/repository/ClienteRepository.class b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/repository/ClienteRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..94011c0614c70958346a2fca465162847f1a7a92 GIT binary patch literal 354 zcmbV|zfJ-{5Ql$@;t4iXK890Ko!XdKm`hCL35H|b?6J3d8TLR6U(CV>@Sz9?iAsRV zV*X@`Z|0lt_2(CWJ6vVx8PHUzj5V=umA9R|kxCO6E=7H(2k#^#dHJ1WI5!woykznm zEIm&vDN}|EgK<<#i$-0rugbNoqRwf?iK%LMANthrAJAYhaW-&jRSZ6gLv&vJ3wv9f z5Ub-%{Et(nCm0^o9%U-s=-+o{qB!I57{nXVz8^j4aBu_ A6aWAK literal 0 HcmV?d00001 diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/repository/ItemDePedidoRepository.class b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/repository/ItemDePedidoRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..2be11643b3cc6d6fbad7eda9ed7054903120ce53 GIT binary patch literal 607 zcmbV~&rZWI491#HF;=&8Sgz1$ByfqVI=eid_I}3XWM4T^3^VWF(l;E6cMs=unRfY)-x{a4}H9?#Slm zV$v5jmE%ivl(1M-aIzo$f|#+PRL`%42ho(KayHeGEnVpO?#Ml{>0^!INJ<5rcrmv# zut|=t5>oKEl*Z}bU`^Y?a}V=A<7>DTMoT&MU(tqM#CbA>=nlA&n67Q=-@MmkTx{a7 o_R;TA!HSQz|0&AvI)HU(LC05Z1zmq^_-MhVk6E?_+tbd@4}ZzQf&c&j literal 0 HcmV?d00001 diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/repository/PedidoRepository.class b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/repository/PedidoRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..f486023fd004c1af3b7ec57379c6987648e659d8 GIT binary patch literal 351 zcmbV|KW@TM42ORY+6L&t!Zq;36kzO7MQQ~nFv;WTg(QwlQmE9Eb?59ePMp=s$Ik9aZ7Ew{iGI?%O?)DY%OJpm!7$|yri=?m zZ>!YCRe&dhiKwG(slIS)<=pN>H%4ED0Ju|3wXhNQ^FQse+RR1||0KtM$? z4^8pSeDm}B^$lQx#{ew@S}Mg-5a+e>zO(P7wvtWiML+0OC8@o<9VY=g2E&ZEOgWd1 zUY41SeSimpk*K3hrD^F_%7xvDt|?*9lvR8VomYGU8uS;bE7{j-4L+kwbQs-*9Y;6B z3Q27K?-ZV`illVmG&C42q}JHZ(!4q5>B|0je_f+$&~BpJ{1Ip&IOHDshdTHJ4C!)@ literal 0 HcmV?d00001 diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/service/CategoriaService.class b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/service/CategoriaService.class new file mode 100644 index 0000000000000000000000000000000000000000..17d10300787f2c501f66544c5239e56d5016e507 GIT binary patch literal 4801 zcmb7I30vIO6+LeltT4!7LTqB}#;H>rFvM2exUQ3-c3I*EIyS^$(xi3U$Be)-8fhYF zaA?zg-<$6HzVA*`Y?C%k*R*NcpVY7CNtzkWAo%D9XnF75?c8(kd*Y@4Zafd*b@)#X z8FXmK>gdESf&3M@Dh*pY%f`&&6|)ow>>9NkD>yCCF?3`hhg;C4A*Z7oy1?Cwo>6iu zhO}#*R8QuUM#U|gwlN_CbJ_JQDWENz!Ff&z>=`;zY#NvgJj+=wbm3O?Xvpih4ZQ** zDJp%_TeV7NQ|VkZAdvISs_R>U>#YggUrdp0E@+BhXb2U$u?KrK^y#<*`vi{v-x>t6 zzFcK+_Y5Usi@+-+!;OcO!TmZ8;1vS5ELl!@d~K>MFtoLFEwF53rW#nTBkj=PgF5cQ zD~YUa0i>TAvk|l}U5fEL&x_$yI@qX`m+v&b+6{ z(Z$zeOvAX22}}x{*q-C*O6XNY)>+Rj*8(?D-zQVK(AEZ8D4>8Ptpv{Mcmp05=niQ$ z<`-ROS>SLB;tjscyK1_HHPbrYh@wCji4jc;j3=SrN;riiN_ouqZk)%AhFKkt;6fTv znrlf)zs3S$bDYj$9v3w%=y()ws@GlEOQX27RrX19W=Y`oq3I+C)HLzP;Bi%EZx*;K z9f3ydUATm|YIvKDw}TyaPsrqo3@#hv*7BrTvMQ2IA^Z447iO5as4ulm(_RNk${xGV z7Ko2qj`Y@Ms_Z5#ije9{I+k&n<>8s-T8V9MDy4Bn23za1O;c5&9v$z+`?$MQYIb0S?fO^@Q2X*Y3+=e__pRMGX84Zo^jUh-tcyy|)@#-b@5-&m5WeXbd@Az+NLTU@nBmjW3% z!NY+-PtkJB^R>#N>CLNsiZB%2lC&2Hq*Km}v#(pN}`&u)*R;_3EWaM*W?T+0$T`!sKMN_**LB)5_mX*b_97qjw z;JCo-&S;Z{XS!9Us{s=aQQY5EA>H;wqY)^$*%4S871s&a9?WQj9DZQuI3-)u4kG1Q z>&!NhwrJb3Q)C$oTkv2S7@Hd>(a+7fHLqlzwN%~jZO|(|(jQYq<~ESpV|-SW=?3JG z5ih5{{J84|EO%LrYR~W4gJf!vRuyNMS;mJwz5b?`%bncZS^U~F}(>}`o8IF zc!@jzCXS?~Tf@t2AlonH=_uj`4iS(HKc6!E;nyusyzl4RF5W*7j`FzQHm2tICC=*y zxx(OG@ZLFm9pYLj@*!T;G^p^yyz0>cd;}lmo508LaT-&?rO+(UKk_27*GAT%sr&G= z*gbL+w`cIEQrH2duoqcg_tWwL?8cqghl8Q=KB}OCSh;%o1U^Y4pWiN|6;pTS!;u&7?l4mx}3!R&Le9#bhh+Mm6Sm8SFinS6eZ^WQH=Fo0pYKY~$y zKcB_1Fo+Y86Ae5s;#*ij^jJTxPvl1_%0+fSr0K<^*ve0l+Y#^3P|uFuhnf8t++y8nNq)?~c^ literal 0 HcmV?d00001 diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/service/ClienteService.class b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/service/ClienteService.class new file mode 100644 index 0000000000000000000000000000000000000000..d3a7e624863a0baf24107c636a70a0fa4dc46f6e GIT binary patch literal 2257 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 literal 0 HcmV?d00001 diff --git a/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/service/ProdutoService.class b/SEMANA11-WANDERCARVALHO/SEMANA 11 - WANDER CARVALHO/target/classes/br/com/alura/comex/service/ProdutoService.class new file mode 100644 index 0000000000000000000000000000000000000000..ef2afc0dea32828b364dc636bf47239ab048d75b GIT binary patch literal 1772 zcmb7FYi|=r6g{(c;yfJ41JVX)8=hU;g)OBITBm6P2q{uXqqs7v_%z;~n1S_T4g%)R^fKfnJ8;A`BOLx4gF#WJQaEwK1V z9?B?{Sv&f!^+?4|V0uGm+HDFH!b)=%Gng%5u8et<1u88Y#ikRvqcgSJ>$H^p-s=)r-Z8OEo6>4OA1)T%LruQgs7e@JN~D;HWg>HDrNHHI zRAh$|(pTkEuQUbbGjnK$H7Rgme2~CG!^!yZJ=q;fUA(8?WMZ@&Jz4l0U`%fwKl0x}8bav&7h)Si;8m zBy3XVT*LHitnO-mhAXePwQIhKueg}Jm(<5HNO34V1b{}2cQE!#&ymFKEVxo`QRq4Ct9lgh2rz- zFDTVsVj;kN4^-#_ouCC)7=9XySnUI@4uXb&49BPVjKH7wqr?=x;9yE{)zjU?m&EXN zDP

+

Bem-vindo ao Comex

+
+