diff --git a/pom.xml b/pom.xml index 934e6ee..af650ab 100644 --- a/pom.xml +++ b/pom.xml @@ -62,7 +62,7 @@ exec-maven-plugin 3.0.0 - br.ufpr.lpoo.controllers.Sistema + br.ufpr.lpoo.Sistema @@ -82,7 +82,7 @@ true - br.ufpr.lpoo.controllers.Sistema + br.ufpr.lpoo.Sistema false diff --git a/src/main/java/br/ufpr/lpoo/controllers/Sistema.java b/src/main/java/br/ufpr/lpoo/Sistema.java similarity index 55% rename from src/main/java/br/ufpr/lpoo/controllers/Sistema.java rename to src/main/java/br/ufpr/lpoo/Sistema.java index b54944f..2cce0b7 100644 --- a/src/main/java/br/ufpr/lpoo/controllers/Sistema.java +++ b/src/main/java/br/ufpr/lpoo/Sistema.java @@ -1,12 +1,11 @@ -package br.ufpr.lpoo.controllers; +package br.ufpr.lpoo; import br.ufpr.lpoo.models.*; +import br.ufpr.lpoo.utils.Imagens; import br.ufpr.lpoo.views.Home; import javax.swing.*; import java.awt.*; -import java.util.ArrayList; -import java.util.List; import java.util.Stack; /** @@ -16,8 +15,6 @@ public class Sistema { private static final JFrame frame = new JFrame("Banco TADS"); private static final Stack navegacao = new Stack<>(); - static final List clientes = new ArrayList<>(); - static final List contas = new ArrayList<>(); /** * Método que seta o conteúdo do frame para a tela que está no topo da pilha de navegação @@ -46,38 +43,6 @@ public static void goBack(){ navigate(); } - /** - * Método que cadastra um cliente na lista de clientes - * @param cliente - */ - public static void cadastrarCliente(Cliente cliente){ - clientes.add(cliente); - } - - /** - * Método que cadastra uma conta na lista de contas - * @param conta - */ - public static void cadastrarConta(Conta conta){ - contas.add(conta); - } - - /** - * Método que retorna a lista de clientes - * @return List - */ - public static List getClientes(){ - return clientes; - } - - /** - * Método que retorna a lista de contas - * @return List - */ - public static List getContas(){ - return contas; - } - /** * Método main que inicializa a aplicação * @@ -88,12 +53,11 @@ public static List getContas(){ * Define a operação padrão de fechamento da janela como EXIT_ON_CLOSE * Chama o método navigate() * Define a janela como visível - * Inicializa 3 clientes e os cadastra */ public static void main(String[] args){ Home home = new Home(); navegacao.push(home); - Dimension dimension = new Dimension(700,500); + Dimension dimension = new Dimension(800,550); Image image = Imagens.MAIN.image(); frame.setIconImage(image); frame.setMinimumSize(dimension); @@ -102,18 +66,5 @@ public static void main(String[] args){ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); navigate(); frame.setVisible(true); - - Endereco endereco1 = new Endereco("Rua A", "Prado Velho", "250", "Curitiba"); - Cliente c1 = new Cliente("Pedro", "Souza", endereco1, "948.312.270-80", "129711280"); - cadastrarCliente(c1); - - Endereco endereco2 = new Endereco("Rua B", "Cajuru", "1134", "Curitiba"); - Cliente c2 = new Cliente("Alisson", "Santos", endereco2, "885.434.710-87", "119264210"); - cadastrarCliente(c2); - - Endereco endereco3 = new Endereco("Rua C", "Jardim Amélia", "65", "Pinhais"); - Cliente c3 = new Cliente("Leonardo", "Salgado", endereco3, "632.872.080-71", "129321481"); - cadastrarCliente(c3); } - } diff --git a/src/main/java/br/ufpr/lpoo/controllers/ManipularContaController.java b/src/main/java/br/ufpr/lpoo/controllers/ManipularContaController.java new file mode 100644 index 0000000..885b045 --- /dev/null +++ b/src/main/java/br/ufpr/lpoo/controllers/ManipularContaController.java @@ -0,0 +1,81 @@ +package br.ufpr.lpoo.controllers; + +import br.ufpr.lpoo.models.Conta; +import br.ufpr.lpoo.models.ContaCorrente; +import br.ufpr.lpoo.models.connection.ContaDao; +import br.ufpr.lpoo.models.connection.DaoFactory; +import br.ufpr.lpoo.models.connection.DaoType; +import br.ufpr.lpoo.utils.Observer; +import br.ufpr.lpoo.views.ManipularConta; + +import java.beans.PropertyChangeEvent; + +import static br.ufpr.lpoo.models.connection.DaoType.MYSQL; + +public class ManipularContaController implements Observer { + + private Conta conta; + private final ManipularConta view; + private static final DaoType type = MYSQL; + + public ManipularContaController(ManipularConta view) { + this.view = view; + this.view.initUIComponents(); + this.view.setController(); + } + + public void buscarConta(String cpf) throws Exception { + this.conta = DaoFactory.getContaDao(type).getByCliente(cpf); + if (conta == null) { + throw new IllegalArgumentException("Conta não encontrada"); + } + this.view.loadConta(conta); + conta.addObserver(this); + } + + public void realizaSaque(double valor) throws Exception { + if (conta.saca(valor)) { + ContaDao contaDao = DaoFactory.getContaDao(type); + contaDao.update(conta); + } else { + throw new IllegalArgumentException(conta.getClass() == ContaCorrente.class ? "Saldo/limite insuficiente" : "O valor restante é inferior ao montante mínimo"); + } + } + + public void realizaDeposito(double valor) throws Exception { + if (conta.deposita(valor)) { + ContaDao contaDao = DaoFactory.getContaDao(type); + contaDao.update(conta); + } else { + throw new IllegalArgumentException("Depósito mínimo não atingido"); + } + } + + public void realizaInvestimento(){ + if (conta.getSaldo() > 0) { + conta.remunera(); + try { + ContaDao contaDao = DaoFactory.getContaDao(type); + contaDao.update(conta); + } catch (Exception ex) { + throw new RuntimeException( "Erro ao realizar investimento"); + } + } else { + throw new IllegalArgumentException( "Saldo insuficiente para investir"); + } + } + + + /** + * Método que atualiza o saldo da conta + * + * @param evt Evento de mudança de propriedade + * @see Observer + */ + @Override + public void propertyChange(PropertyChangeEvent evt) { + if (evt.getPropertyName().equals("saldo")) { + this.view.updateSaldo(this.conta.getSaldo()); + } + } +} diff --git a/src/main/java/br/ufpr/lpoo/controllers/ManterClienteController.java b/src/main/java/br/ufpr/lpoo/controllers/ManterClienteController.java new file mode 100644 index 0000000..0d2d40b --- /dev/null +++ b/src/main/java/br/ufpr/lpoo/controllers/ManterClienteController.java @@ -0,0 +1,136 @@ +package br.ufpr.lpoo.controllers; + +import br.ufpr.lpoo.models.Cliente; +import br.ufpr.lpoo.models.Endereco; +import br.ufpr.lpoo.models.connection.*; +import br.ufpr.lpoo.views.ManterCliente; +import br.ufpr.lpoo.views.ManterClienteTableModel; + +import java.util.List; + +import static br.ufpr.lpoo.models.connection.DaoType.MYSQL; + +public class ManterClienteController { + + private Cliente cliente; + private final ManterCliente view; + private final ManterClienteTableModel tabelaModel; + private static final DaoType type = MYSQL; + + public ManterClienteController(ManterCliente view){ + this.view = view; + this.tabelaModel = new ManterClienteTableModel(this.getClientes()); + this.view.initUIComponents(); + this.view.setController(this.tabelaModel); + } + + /** + * Método que retorna a lista de clientes + * @return List + */ + public List getClientes(){ + try { + ClienteDao clienteDao = DaoFactory.getClienteDao(type); + return clienteDao.readAll(); + } catch (Exception e){ + System.out.println(e); + } + return null; + } + + /** + * Método que retorna a lista de clientes filtrada pela query + * @param query Um trecho do nome, sobrenome, ou CPF inteiro + * @return List + */ + public List getClientes(String query){ + try { + ClienteDao clienteDao = DaoFactory.getClienteDao(type); + return clienteDao.search(query); + } catch (Exception e){ + System.out.println(e); + } + return null; + } + + public void buscarClientes(String query){ + + query = query.replaceAll("/[^a-zA-Z0-9]/g", ""); + + if (query.isEmpty()) { + this.tabelaModel.updateList(this.getClientes()); + throw new RuntimeException("Insira um CPF ou um segmento de nome para buscar"); + } + + List clientes = this.getClientes(query); + + if (clientes.isEmpty()) { + throw new RuntimeException("Nenhum cliente encontrado"); + } + + this.tabelaModel.updateList(clientes); + } + + /** + * Método que cadastra um cliente na lista de clientes + * @param cliente + */ + public void cadastrarCliente(Cliente cliente) throws Exception { + ClienteDao clienteDao = DaoFactory.getClienteDao(type); + clienteDao.create(cliente); + + this.tabelaModel.updateList(this.getClientes()); + } + + public void updateCliente(Cliente cliente) throws Exception { + + if (this.wasAddressEdited(cliente.getEndereco())) { + this.updateEndereco(cliente.getEndereco()); + } + + ClienteDao clienteDao = DaoFactory.getClienteDao(type); + clienteDao.update(cliente); + + this.tabelaModel.updateList(this.getClientes()); + } + + public void updateEndereco(Endereco endereco) throws Exception { + EnderecoDao enderecoDao = DaoFactory.getEnderecoDao(type); + enderecoDao.update(endereco); + } + + public void deleteCliente(String cpf) { + try { + ClienteDao clienteDao = DaoFactory.getClienteDao(type); + Cliente cliente = clienteDao.search(cpf).get(0); + if (cliente.getConta() != null) { + clienteDao.removeConta(cliente); + } + clienteDao.delete(cliente); + EnderecoDao enderecoDao = DaoFactory.getEnderecoDao(type); + enderecoDao.delete(cliente.getEndereco()); + } catch (ArrayIndexOutOfBoundsException e){ + throw new RuntimeException("Cliente não encontrado"); + } + catch (Exception e) { + throw new RuntimeException(e.getMessage()); + } + tabelaModel.updateList(this.getClientes()); + this.view.clearForm(); + } + + public void selectCliente(int index){ + if (index == -1) { + this.cliente = null; + this.view.clearForm(); + } + else { + this.cliente = this.tabelaModel.getClientAt(index); + this.view.loadCliente(this.cliente); + } + } + + public boolean wasAddressEdited(Endereco endereco) { + return !endereco.equals(cliente.getEndereco()); + } +} diff --git a/src/main/java/br/ufpr/lpoo/controllers/Mensagens.java b/src/main/java/br/ufpr/lpoo/controllers/MensagensController.java similarity index 57% rename from src/main/java/br/ufpr/lpoo/controllers/Mensagens.java rename to src/main/java/br/ufpr/lpoo/controllers/MensagensController.java index c5e47e9..7bfabe5 100644 --- a/src/main/java/br/ufpr/lpoo/controllers/Mensagens.java +++ b/src/main/java/br/ufpr/lpoo/controllers/MensagensController.java @@ -1,14 +1,17 @@ package br.ufpr.lpoo.controllers; -import javax.swing.*; +import br.ufpr.lpoo.utils.Imagens; +import br.ufpr.lpoo.views.dialog.ConfirmDialog; +import br.ufpr.lpoo.views.dialog.MessageDialog; + import java.awt.*; /** * Classe que contém métodos para exibir mensagens de erro, aviso, sucesso e confirmação - * Utiliza a classe JOptionPane para exibir as mensagens - * @see JOptionPane */ -public class Mensagens { +public class MensagensController { + + private static boolean response; /** * Exibe uma mensagem de erro @@ -16,7 +19,9 @@ public class Mensagens { * @param mensagem A mensagem a ser exibida */ public static void erro(Component origin, String mensagem){ - JOptionPane.showMessageDialog(origin, mensagem, "Erro", JOptionPane.ERROR_MESSAGE, Imagens.ERRO.icon()); + MessageDialog dialog = new MessageDialog(); + dialog.initDialog(origin, mensagem, "Erro", Imagens.ERRO.icon()); + dialog.open(); } /** @@ -25,7 +30,9 @@ public static void erro(Component origin, String mensagem){ * @param mensagem A mensagem a ser exibida */ public static void aviso(Component origin, String mensagem){ - JOptionPane.showMessageDialog(origin, mensagem, "Aviso", JOptionPane.WARNING_MESSAGE, Imagens.WARNING.icon()); + MessageDialog dialog = new MessageDialog(); + dialog.initDialog(origin, mensagem, "Aviso", Imagens.WARNING.icon()); + dialog.open(); } /** @@ -34,7 +41,9 @@ public static void aviso(Component origin, String mensagem){ * @param mensagem A mensagem a ser exibida */ public static void sucesso(Component origin, String mensagem){ - JOptionPane.showMessageDialog(origin, mensagem, "Sucesso", JOptionPane.INFORMATION_MESSAGE, Imagens.SUCCESS.icon()); + MessageDialog dialog = new MessageDialog(); + dialog.initDialog(origin, mensagem, "Sucesso", Imagens.SUCCESS.icon()); + dialog.open(); } /** @@ -43,7 +52,9 @@ public static void sucesso(Component origin, String mensagem){ * @param mensagem A mensagem a ser exibida */ public static void carregando(Component origin, String mensagem){ - JOptionPane.showMessageDialog(origin, mensagem, "Carregando", JOptionPane.INFORMATION_MESSAGE, Imagens.LOADING.icon()); + MessageDialog dialog = new MessageDialog(); + dialog.initDialog(origin, mensagem, "Carregando...", Imagens.LOADING.icon()); + dialog.open(); } /** @@ -53,6 +64,13 @@ public static void carregando(Component origin, String mensagem){ * @return true se o usuário confirmar a ação, false caso contrário */ public static boolean confirmar(Component origin, String mensagem){ - return JOptionPane.showConfirmDialog(origin, mensagem, "Confirmação", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION; + ConfirmDialog dialog = new ConfirmDialog(); + dialog.initDialog(origin, mensagem); + dialog.open(); + return response; + } + + public static void toogleResponse(boolean arg){ + response = arg; } } diff --git a/src/main/java/br/ufpr/lpoo/controllers/VincularClienteController.java b/src/main/java/br/ufpr/lpoo/controllers/VincularClienteController.java new file mode 100644 index 0000000..ea8565b --- /dev/null +++ b/src/main/java/br/ufpr/lpoo/controllers/VincularClienteController.java @@ -0,0 +1,98 @@ +package br.ufpr.lpoo.controllers; + +import br.ufpr.lpoo.models.Cliente; +import br.ufpr.lpoo.models.connection.ClienteDao; +import br.ufpr.lpoo.models.connection.DaoFactory; +import br.ufpr.lpoo.models.connection.DaoType; +import br.ufpr.lpoo.utils.FactoryConta; +import br.ufpr.lpoo.views.VincularCliente; +import br.ufpr.lpoo.views.VincularTableModel; + +import javax.swing.*; +import java.util.ArrayList; +import java.util.List; + +import static br.ufpr.lpoo.models.connection.DaoType.MYSQL; + +public class VincularClienteController { + + private final VincularCliente view; + private final VincularTableModel tabelaModel; + private static final DaoType type = MYSQL; + private String tipoSelecionado; + private Cliente clienteSelecionado; + + public VincularClienteController(VincularCliente view){ + this.view = view; + this.tabelaModel = new VincularTableModel(this.getClientes()); + this.view.initUIComponents(); + this.view.setController(this.tabelaModel); + } + + /** + * Método que retorna a lista de clientes + * @return List + */ + public List getClientes(){ + try { + ClienteDao clienteDao = DaoFactory.getClienteDao(type); + return clienteDao.readAll(); + } catch (Exception e){ + System.out.println(e); + } + return null; + } + + public void abrirConta(ArrayList campos) throws Exception { + FactoryConta factory = new FactoryConta(); + factory.abrirConta(this.tipoSelecionado, this.clienteSelecionado, campos); + + this.tabelaModel.updateList(this.getClientes()); + } + + public void deleteConta() throws Exception { + ClienteDao clienteDao = DaoFactory.getClienteDao(type); + clienteDao.removeConta(this.clienteSelecionado); + + this.tabelaModel.updateList(this.getClientes()); + } + + public Cliente getClienteSelecionado() { + return this.clienteSelecionado; + } + + public void selectTipo(String tipo){ + this.tipoSelecionado = tipo; + this.view.loadFormAbertura(tipo); + } + + public void selectCliente(int index){ + if (index == -1) return; + this.clienteSelecionado = this.tabelaModel.getClientAt(index); + this.view.switchForms(this.clienteSelecionado.getConta()); + } + + /** + * Valida se todos os campos necessários estão preenchidos corretamente e, se estiver, retorna um array com os valores dos campos. + * + * @param campos ArrayList de campos de texto a serem verificados. + * @return ArrayList com os valores dos campos. + * @throws NumberFormatException Se um dos campos não for um número válido. + * @throws IllegalArgumentException Se um dos campos estiver vazio. + */ + public ArrayList validaCampos(ArrayList campos) { + ArrayList valores = new ArrayList<>(); + for (JTextField campo : campos) { + if (!campo.isVisible()) continue; + if (campo.getText().isEmpty()) { + throw new IllegalArgumentException("Preencha todos os campos"); + } + try { + valores.add(Double.parseDouble(campo.getText())); + } catch (NumberFormatException e) { + throw new NumberFormatException("Valor '" + campo.getText() + "' inválido"); + } + } + return valores; + } +} diff --git a/src/main/java/br/ufpr/lpoo/models/Cliente.java b/src/main/java/br/ufpr/lpoo/models/Cliente.java index 15d11c4..99ba77c 100644 --- a/src/main/java/br/ufpr/lpoo/models/Cliente.java +++ b/src/main/java/br/ufpr/lpoo/models/Cliente.java @@ -1,5 +1,7 @@ package br.ufpr.lpoo.models; +import java.util.Objects; + /** * Esta classe representa um cliente no sistema. * Inclui informações como nome, sobrenome, endereço, CPF, RG e conta. @@ -25,7 +27,7 @@ public class Cliente { public Cliente(String nome, String sobrenome, Endereco endereco, String cpf, String rg) { cpf = cpf.replaceAll("[^0-9]", ""); if (!validaCpf(cpf)) { - throw new IllegalArgumentException("CPF inválido"); + throw new IllegalArgumentException("CPF inválido: "+cpf); } setNome(nome); setSobrenome(sobrenome); @@ -140,4 +142,17 @@ private boolean validaCpf(String cpf) { } return false; } + + @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); + } } \ No newline at end of file diff --git a/src/main/java/br/ufpr/lpoo/models/Conta.java b/src/main/java/br/ufpr/lpoo/models/Conta.java index 0e343b9..6f15842 100644 --- a/src/main/java/br/ufpr/lpoo/models/Conta.java +++ b/src/main/java/br/ufpr/lpoo/models/Conta.java @@ -1,6 +1,6 @@ package br.ufpr.lpoo.models; -import br.ufpr.lpoo.services.Observer; +import br.ufpr.lpoo.utils.Observer; import java.beans.PropertyChangeSupport; @@ -10,7 +10,6 @@ * Implementa a interface ContaI. */ public abstract class Conta implements ContaI { - private static int contador = 0; protected int numero; protected Cliente dono; protected double saldo; @@ -25,6 +24,9 @@ public abstract class Conta implements ContaI { * @param saldo O saldo inicial da conta. */ public Conta(int numero, Cliente dono, double saldo) { + if (saldo < 0) { + throw new IllegalArgumentException("O saldo deve ser maior que 0."); + } this.numero = numero; this.dono = dono; this.saldo = saldo; @@ -39,9 +41,7 @@ public Conta(int numero, Cliente dono, double saldo) { * @param saldo O saldo inicial da conta. */ public Conta(Cliente dono, double saldo) { - this.numero = ++contador; - this.dono = dono; - this.saldo = saldo; + this(-1, dono, saldo); } /** @@ -93,6 +93,10 @@ public int getNumero() { return this.numero; } + public void setNumero(int numero) { + this.numero = numero; + } + public double getSaldo() { return this.saldo; } diff --git a/src/main/java/br/ufpr/lpoo/models/ContaCorrente.java b/src/main/java/br/ufpr/lpoo/models/ContaCorrente.java index 9726d6c..2c30c9e 100644 --- a/src/main/java/br/ufpr/lpoo/models/ContaCorrente.java +++ b/src/main/java/br/ufpr/lpoo/models/ContaCorrente.java @@ -11,30 +11,27 @@ public class ContaCorrente extends Conta { /** * Construtor para a classe ContaCorrente. * Define os valores iniciais para as variáveis de instância. + * O número da conta é incrementado automaticamente. * - * @param numero O número da conta. * @param dono O proprietário da conta. * @param saldo O saldo inicial da conta. * @param limite O limite da conta. */ - public ContaCorrente(int numero, Cliente dono, double saldo, double limite) { - super(numero, dono, saldo); + public ContaCorrente(Cliente dono, double saldo, double limite) { + super(dono, saldo); + if (limite < 0) { + throw new IllegalArgumentException("Limite deve ser maior ou igual a 0."); + } this.depositoInicial = saldo; this.limite = limite; } - /** - * Construtor para a classe ContaCorrente. - * Define os valores iniciais para as variáveis de instância. - * O número da conta é incrementado automaticamente. - * - * @param dono O proprietário da conta. - * @param saldo O saldo inicial da conta. - * @param limite O limite da conta. - */ - public ContaCorrente(Cliente dono, double saldo, double limite) { + public ContaCorrente(Cliente dono, double saldo, double limite, double depositoInicial) { super(dono, saldo); - this.depositoInicial = saldo; + if (limite < 0) { + throw new IllegalArgumentException("Limite deve ser maior ou igual a 0."); + } + this.depositoInicial = depositoInicial; this.limite = limite; } diff --git a/src/main/java/br/ufpr/lpoo/models/ContaInvestimento.java b/src/main/java/br/ufpr/lpoo/models/ContaInvestimento.java index 9ed7676..e444547 100644 --- a/src/main/java/br/ufpr/lpoo/models/ContaInvestimento.java +++ b/src/main/java/br/ufpr/lpoo/models/ContaInvestimento.java @@ -12,33 +12,41 @@ public class ContaInvestimento extends Conta { /** * Construtor para a classe ContaInvestimento. * Define os valores iniciais para as variáveis de instância. + * O número da conta é incrementado automaticamente. * - * @param numero O número da conta. * @param dono O proprietário da conta. * @param saldo O saldo inicial da conta. * @param depositoMinimo O depósito mínimo da conta. * @param montanteMinimo O montante mínimo da conta. */ - public ContaInvestimento(int numero, Cliente dono, double saldo, double depositoMinimo, double montanteMinimo) { - super(numero, dono, saldo); + public ContaInvestimento(Cliente dono, double saldo, double depositoMinimo, double montanteMinimo) { + super(dono, saldo); + if (depositoMinimo <= 0 || montanteMinimo <= 0) { + throw new IllegalArgumentException("Depósito mínimo e montante mínimo devem ser maiores que 0."); + } + if (saldo < depositoMinimo) { + throw new IllegalArgumentException("Saldo inicial menor que o depósito mínimo."); + } + if (saldo < montanteMinimo) { + throw new IllegalArgumentException("Saldo inicial menor que o montante mínimo."); + } this.depositoInicial = saldo; this.depositoMinimo = depositoMinimo; this.montanteMinimo = montanteMinimo; } - /** - * Construtor para a classe ContaInvestimento. - * Define os valores iniciais para as variáveis de instância. - * O número da conta é incrementado automaticamente. - * - * @param dono O proprietário da conta. - * @param saldo O saldo inicial da conta. - * @param depositoMinimo O depósito mínimo da conta. - * @param montanteMinimo O montante mínimo da conta. - */ - public ContaInvestimento(Cliente dono, double saldo, double depositoMinimo, double montanteMinimo) { + public ContaInvestimento(Cliente dono, double saldo, double depositoMinimo, double montanteMinimo, double depositoInicial) { super(dono, saldo); - this.depositoInicial = saldo; + if (depositoMinimo <= 0 || montanteMinimo <= 0) { + throw new IllegalArgumentException("Depósito mínimo e montante mínimo devem ser maiores que 0."); + } + if (saldo < depositoMinimo) { + throw new IllegalArgumentException("Saldo inicial menor que o depósito mínimo."); + } + if (saldo < montanteMinimo) { + throw new IllegalArgumentException("Saldo inicial menor que o montante mínimo."); + } + this.depositoInicial = depositoInicial; this.depositoMinimo = depositoMinimo; this.montanteMinimo = montanteMinimo; } diff --git a/src/main/java/br/ufpr/lpoo/models/Endereco.java b/src/main/java/br/ufpr/lpoo/models/Endereco.java index 589dbe3..8cba13e 100644 --- a/src/main/java/br/ufpr/lpoo/models/Endereco.java +++ b/src/main/java/br/ufpr/lpoo/models/Endereco.java @@ -1,10 +1,13 @@ package br.ufpr.lpoo.models; +import java.util.Objects; + /** * Esta classe representa um Endereço no sistema. * Inclui informações como logradouro, bairro, número e cidade. */ public class Endereco { + private int id; public String logradouro; public String bairro; public int numero; @@ -29,6 +32,19 @@ public Endereco(String logradouro, String bairro, String numeroS, String cidade) this.cidade = cidade.toUpperCase(); } + public Endereco(int id, String logradouro, String bairro, String numeroS, String cidade) { + this(logradouro, bairro, numeroS, cidade); + this.id = id; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + public String getLogradouro() { return logradouro; } @@ -60,4 +76,17 @@ private boolean isNumeroValido(int numero) { return false; } } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Endereco endereco = (Endereco) o; + return id == endereco.id && numero == endereco.numero && Objects.equals(logradouro, endereco.logradouro) && Objects.equals(bairro, endereco.bairro) && Objects.equals(cidade, endereco.cidade); + } + + @Override + public int hashCode() { + return Objects.hash(id, logradouro, bairro, numero, cidade); + } } \ No newline at end of file diff --git a/src/main/java/br/ufpr/lpoo/models/connection/ClienteDao.java b/src/main/java/br/ufpr/lpoo/models/connection/ClienteDao.java new file mode 100644 index 0000000..7852e6d --- /dev/null +++ b/src/main/java/br/ufpr/lpoo/models/connection/ClienteDao.java @@ -0,0 +1,12 @@ +package br.ufpr.lpoo.models.connection; + +import br.ufpr.lpoo.models.Cliente; + +import java.util.List; + +public interface ClienteDao extends Dao{ + Cliente getByCpf(String cpf); + List search(String query) throws Exception; + void addConta(Cliente cliente) throws Exception; + void removeConta(Cliente cliente) throws Exception; +} diff --git a/src/main/java/br/ufpr/lpoo/models/connection/ConnectionFactory.java b/src/main/java/br/ufpr/lpoo/models/connection/ConnectionFactory.java new file mode 100644 index 0000000..42e0cbc --- /dev/null +++ b/src/main/java/br/ufpr/lpoo/models/connection/ConnectionFactory.java @@ -0,0 +1,29 @@ +package br.ufpr.lpoo.models.connection; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.util.Properties; + +public class ConnectionFactory { + private static Properties properties; + + private ConnectionFactory() { + } + + public static Connection getConnection() throws SQLException { + readProperties(); + return DriverManager.getConnection(properties.getProperty("mysql.database.url"), + properties.getProperty("mysql.database.username"), + properties.getProperty("mysql.database.password")); + } + + public static void readProperties() { + if (properties == null) { + properties = new Properties(); + properties.put("mysql.database.url", System.getenv("mysql_database_url")); + properties.put("mysql.database.username", System.getenv("mysql_database_username")); + properties.put("mysql.database.password", System.getenv("mysql_database_password")); + } + } +} diff --git a/src/main/java/br/ufpr/lpoo/models/connection/ContaCorrenteDao.java b/src/main/java/br/ufpr/lpoo/models/connection/ContaCorrenteDao.java new file mode 100644 index 0000000..6187328 --- /dev/null +++ b/src/main/java/br/ufpr/lpoo/models/connection/ContaCorrenteDao.java @@ -0,0 +1,4 @@ +package br.ufpr.lpoo.models.connection; + +public interface ContaCorrenteDao extends ContaDao{ +} diff --git a/src/main/java/br/ufpr/lpoo/models/connection/ContaDao.java b/src/main/java/br/ufpr/lpoo/models/connection/ContaDao.java new file mode 100644 index 0000000..6316124 --- /dev/null +++ b/src/main/java/br/ufpr/lpoo/models/connection/ContaDao.java @@ -0,0 +1,8 @@ +package br.ufpr.lpoo.models.connection; + +import br.ufpr.lpoo.models.Conta; + +public interface ContaDao extends Dao { + Conta getByNumero(String numero); + Conta getByCliente(String cpfCliente); +} \ No newline at end of file diff --git a/src/main/java/br/ufpr/lpoo/models/connection/ContaInvestimentoDao.java b/src/main/java/br/ufpr/lpoo/models/connection/ContaInvestimentoDao.java new file mode 100644 index 0000000..fc1db0d --- /dev/null +++ b/src/main/java/br/ufpr/lpoo/models/connection/ContaInvestimentoDao.java @@ -0,0 +1,4 @@ +package br.ufpr.lpoo.models.connection; + +public interface ContaInvestimentoDao extends ContaDao{ +} diff --git a/src/main/java/br/ufpr/lpoo/models/connection/Dao.java b/src/main/java/br/ufpr/lpoo/models/connection/Dao.java new file mode 100644 index 0000000..29c9eda --- /dev/null +++ b/src/main/java/br/ufpr/lpoo/models/connection/Dao.java @@ -0,0 +1,10 @@ +package br.ufpr.lpoo.models.connection; + +import java.util.List; + +public interface Dao { + void create(T object) throws Exception; + void update(T object) throws Exception; + void delete(T object) throws Exception; + List readAll() throws Exception; +} diff --git a/src/main/java/br/ufpr/lpoo/models/connection/DaoFactory.java b/src/main/java/br/ufpr/lpoo/models/connection/DaoFactory.java new file mode 100644 index 0000000..4528c81 --- /dev/null +++ b/src/main/java/br/ufpr/lpoo/models/connection/DaoFactory.java @@ -0,0 +1,34 @@ +package br.ufpr.lpoo.models.connection; + +import br.ufpr.lpoo.models.connection.mysql.*; + +import javax.naming.OperationNotSupportedException; + +public class DaoFactory { + + private DaoFactory(){} + + public static ClienteDao getClienteDao(DaoType type) throws OperationNotSupportedException { + return switch (type) { + case MYSQL -> new ClienteDaoMysql(); + case POSTGRES -> throw new OperationNotSupportedException("Postgres not implemented"); + case IN_MEMORY -> throw new OperationNotSupportedException("In memory not implemented"); + }; + } + + public static EnderecoDao getEnderecoDao(DaoType type) throws OperationNotSupportedException { + return switch (type) { + case MYSQL -> new EnderecoDaoMysql(); + case POSTGRES -> throw new OperationNotSupportedException("Postgres not implemented"); + case IN_MEMORY -> throw new OperationNotSupportedException("In memory not implemented"); + }; + } + + public static ContaDao getContaDao(DaoType type) throws OperationNotSupportedException { + return switch (type) { + case MYSQL -> new ContaDaoMysql(); + case POSTGRES -> throw new OperationNotSupportedException("Postgres not implemented"); + case IN_MEMORY -> throw new OperationNotSupportedException("In memory not implemented"); + }; + } +} diff --git a/src/main/java/br/ufpr/lpoo/models/connection/DaoType.java b/src/main/java/br/ufpr/lpoo/models/connection/DaoType.java new file mode 100644 index 0000000..ea4919c --- /dev/null +++ b/src/main/java/br/ufpr/lpoo/models/connection/DaoType.java @@ -0,0 +1,7 @@ +package br.ufpr.lpoo.models.connection; + +public enum DaoType { + MYSQL, + POSTGRES, + IN_MEMORY +} diff --git a/src/main/java/br/ufpr/lpoo/models/connection/EnderecoDao.java b/src/main/java/br/ufpr/lpoo/models/connection/EnderecoDao.java new file mode 100644 index 0000000..52d4a27 --- /dev/null +++ b/src/main/java/br/ufpr/lpoo/models/connection/EnderecoDao.java @@ -0,0 +1,7 @@ +package br.ufpr.lpoo.models.connection; + +import br.ufpr.lpoo.models.Endereco; + +public interface EnderecoDao extends Dao{ + Endereco getByClientId(int id); +} diff --git a/src/main/java/br/ufpr/lpoo/models/connection/mysql/ClienteDaoMysql.java b/src/main/java/br/ufpr/lpoo/models/connection/mysql/ClienteDaoMysql.java new file mode 100644 index 0000000..ce81eb9 --- /dev/null +++ b/src/main/java/br/ufpr/lpoo/models/connection/mysql/ClienteDaoMysql.java @@ -0,0 +1,158 @@ +package br.ufpr.lpoo.models.connection.mysql; + +import br.ufpr.lpoo.models.Cliente; +import br.ufpr.lpoo.models.Conta; +import br.ufpr.lpoo.models.Endereco; +import br.ufpr.lpoo.models.connection.ClienteDao; +import br.ufpr.lpoo.models.connection.ConnectionFactory; + +import java.sql.*; +import java.util.ArrayList; +import java.util.List; + +public class ClienteDaoMysql implements ClienteDao { + + @Override + public Cliente getByCpf(String cpf) { + try (Connection con = ConnectionFactory.getConnection(); + PreparedStatement sql = con.prepareStatement("SELECT * FROM cliente JOIN endereco ON endereco.id = cliente.idEndereco WHERE cpf = ?;")) { + sql.setString(1, cpf); + ResultSet list = sql.executeQuery(); + if (list.next()) { + Endereco e = new Endereco(list.getString("logradouro"), list.getString("bairro"), list.getString("numero"), list.getString("cidade")); + return new Cliente(list.getString("nome"), list.getString("sobrenome"), e, list.getString("cpf"), list.getString("rg")); + } + list.close(); + } catch (SQLException e) { + throw new RuntimeException(e); + } + return null; + } + + @Override + public List search(String query) throws Exception { + List clientes = new ArrayList<>(); + try (Connection con = ConnectionFactory.getConnection(); + PreparedStatement sql = con.prepareStatement("SELECT * FROM cliente JOIN endereco ON endereco.id = cliente.idEndereco WHERE cpf = ? OR nome LIKE '%" + query + "%' OR sobrenome LIKE '%" + query + "%';")) { + sql.setString(1, query); + ResultSet list = sql.executeQuery(); + while (list.next()) { + Endereco e = new Endereco(list.getInt("idEndereco"), list.getString("logradouro"), list.getString("bairro"), list.getString("numero"), list.getString("cidade")); + Cliente c = new Cliente(list.getString("nome"), list.getString("sobrenome"), e, list.getString("cpf"), list.getString("rg")); + if (list.getString("numeroConta") != null) { + Conta conta = new ContaDaoMysql().getByNumero(list.getString("numeroConta")); + if (conta != null) { + c.setConta(conta); + } + } + clientes.add(c); + } + list.close(); + } + return clientes; + } + + @Override + public void addConta(Cliente cliente) throws Exception { + try (Connection con = ConnectionFactory.getConnection(); + PreparedStatement sql = con.prepareStatement("UPDATE cliente SET numeroConta = ? WHERE cpf = ?")) { + sql.setInt(1, cliente.getConta().getNumero()); + sql.setString(2, cliente.getCpf()); + sql.executeUpdate(); + } + } + + @Override + public void removeConta(Cliente cliente) throws Exception { + try (Connection con = ConnectionFactory.getConnection()) { + con.setAutoCommit(false); + try (PreparedStatement sql = con.prepareStatement("UPDATE cliente SET numeroConta = NULL WHERE cpf = ?")) { + sql.setString(1, cliente.getCpf()); + sql.executeUpdate(); + } + con.commit(); + + switch (cliente.getConta().getClass().getSimpleName()) { + case "ContaCorrente" -> new ContaCorrenteDaoMysql().delete(cliente.getConta()); + case "ContaInvestimento" -> new ContaInvestimentoDaoMysql().delete(cliente.getConta()); + } + + cliente.setConta(null); + } + } + + @Override + public void create(Cliente cliente) throws Exception { + try (Connection con = ConnectionFactory.getConnection()) { + con.setAutoCommit(false); + + try (PreparedStatement sql = con.prepareStatement("INSERT INTO endereco (logradouro, bairro, numero, cidade) VALUES (?,?,?,?);", Statement.RETURN_GENERATED_KEYS)) { + sql.setString(1, cliente.getEndereco().getLogradouro()); + sql.setString(2, cliente.getEndereco().getBairro()); + sql.setInt(3, cliente.getEndereco().getNumero()); + sql.setString(4, cliente.getEndereco().getCidade()); + sql.executeUpdate(); + ResultSet rs = sql.getGeneratedKeys(); + if (rs.next()) { + cliente.getEndereco().setId(rs.getInt(1)); + } else { + throw new RuntimeException("Erro na criação de endereço"); + } + } + + try (PreparedStatement sql = con.prepareStatement("INSERT INTO cliente (cpf, nome, sobrenome, rg, idEndereco) VALUES (?,?,?,?,?);");) { + sql.setString(1, cliente.getCpf()); + sql.setString(2, cliente.getNome()); + sql.setString(3, cliente.getSobrenome()); + sql.setString(4, cliente.getRg()); + sql.setInt(5, cliente.getEndereco().getId()); + sql.executeUpdate(); + } + + con.commit(); + } + } + + @Override + public void update(Cliente cliente) throws Exception { + try (Connection con = ConnectionFactory.getConnection(); + PreparedStatement sql = con.prepareStatement("UPDATE cliente SET nome = ?, sobrenome = ?, rg = ? WHERE cpf = ?")) { + sql.setString(1, cliente.getNome()); + sql.setString(2, cliente.getSobrenome()); + sql.setString(3, cliente.getRg()); + sql.setString(4, cliente.getCpf()); + sql.executeUpdate(); + } + } + + @Override + public void delete(Cliente cliente) throws Exception { + try (Connection con = ConnectionFactory.getConnection(); + PreparedStatement sql = con.prepareStatement("DELETE FROM cliente WHERE cpf = ?")) { + sql.setString(1, cliente.getCpf()); + sql.executeUpdate(); + } + } + + @Override + public List readAll() throws Exception { + List clientes = new ArrayList<>(); + try (Connection con = ConnectionFactory.getConnection(); + PreparedStatement sql = con.prepareStatement("SELECT * FROM cliente JOIN endereco ON endereco.id = cliente.idEndereco;")) { + ResultSet list = sql.executeQuery(); + while (list.next()) { + Endereco e = new Endereco(list.getInt("idEndereco"), list.getString("logradouro"), list.getString("bairro"), list.getString("numero"), list.getString("cidade")); + Cliente c = new Cliente(list.getString("nome"), list.getString("sobrenome"), e, list.getString("cpf"), list.getString("rg")); + if (list.getString("numeroConta") != null) { + Conta conta = new ContaDaoMysql().getByNumero(list.getString("numeroConta")); + if (conta != null) { + c.setConta(conta); + } + } + clientes.add(c); + } + list.close(); + } + return clientes; + } +} diff --git a/src/main/java/br/ufpr/lpoo/models/connection/mysql/ContaCorrenteDaoMysql.java b/src/main/java/br/ufpr/lpoo/models/connection/mysql/ContaCorrenteDaoMysql.java new file mode 100644 index 0000000..05cce22 --- /dev/null +++ b/src/main/java/br/ufpr/lpoo/models/connection/mysql/ContaCorrenteDaoMysql.java @@ -0,0 +1,143 @@ +package br.ufpr.lpoo.models.connection.mysql; + +import br.ufpr.lpoo.models.Cliente; +import br.ufpr.lpoo.models.Conta; +import br.ufpr.lpoo.models.ContaCorrente; +import br.ufpr.lpoo.models.connection.ConnectionFactory; +import br.ufpr.lpoo.models.connection.ContaCorrenteDao; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.ArrayList; +import java.util.List; + +public class ContaCorrenteDaoMysql implements ContaCorrenteDao { + + @Override + public Conta getByNumero(String numero) { + try(Connection con = ConnectionFactory.getConnection(); + PreparedStatement sql = con.prepareStatement("SELECT * FROM conta INNER JOIN contacorrente ON conta.numero = contacorrente.numeroConta WHERE conta.numero = ?;")){ + sql.setInt(1, Integer.parseInt(numero)); + ResultSet rs = sql.executeQuery(); + if(rs.next()){ + Cliente dono = new ClienteDaoMysql().getByCpf(rs.getString("cpfCliente")); + ContaCorrente conta = new ContaCorrente(dono, rs.getDouble("saldo"), rs.getDouble("limite"), rs.getDouble("depositoInicial")); + conta.setNumero(rs.getInt("numero")); + return conta; + } + rs.close(); + } catch (Exception e) { + throw new RuntimeException(e); + } + return null; + } + + @Override + public Conta getByCliente(String cpfCliente) { + try(Connection con = ConnectionFactory.getConnection(); + PreparedStatement sql = con.prepareStatement("SELECT * FROM conta INNER JOIN contacorrente ON conta.numero = contacorrente.numeroConta WHERE conta.cpfCliente = ?;")){ + sql.setString(1, cpfCliente); + ResultSet rs = sql.executeQuery(); + if(rs.next()){ + Cliente dono = new ClienteDaoMysql().getByCpf(rs.getString("cpfCliente")); + ContaCorrente conta = new ContaCorrente(dono, rs.getDouble("saldo"), rs.getDouble("limite"), rs.getDouble("depositoInicial")); + conta.setNumero(rs.getInt("numero")); + return conta; + } + rs.close(); + } catch (Exception e) { + throw new RuntimeException(e); + } + return null; + } + + + @Override + public void create(Conta conta) throws Exception { + try(Connection con = ConnectionFactory.getConnection()) { + con.setAutoCommit(false); + + try(PreparedStatement sql = con.prepareStatement("INSERT INTO conta (cpfCliente, saldo) VALUES (?, ?);", PreparedStatement.RETURN_GENERATED_KEYS)){ + sql.setString(1, conta.getDono().getCpf()); + sql.setDouble(2, conta.getSaldo()); + sql.executeUpdate(); + ResultSet rs = sql.getGeneratedKeys(); + rs.next(); + conta.setNumero(rs.getInt(1)); + } + try(PreparedStatement sql = con.prepareStatement("INSERT INTO contacorrente (numeroConta, depositoInicial, limite) VALUES (?, ?, ?);")){ + sql.setInt(1, conta.getNumero()); + ContaCorrente contaCorrente = (ContaCorrente) conta; + sql.setDouble(2, contaCorrente.getDepositoInicial()); + sql.setDouble(3, contaCorrente.getLimite()); + sql.executeUpdate(); + } + + con.commit(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Override + public void update(Conta conta) throws Exception { + try(Connection con = ConnectionFactory.getConnection()){ + con.setAutoCommit(false); + + try(PreparedStatement sql = con.prepareStatement("UPDATE conta SET saldo = ? WHERE numero = ?;")){ + sql.setDouble(1, conta.getSaldo()); + sql.setInt(2, conta.getNumero()); + sql.executeUpdate(); + } + try(PreparedStatement sql = con.prepareStatement("UPDATE contacorrente SET limite = ? WHERE numeroConta = ?;")){ + sql.setDouble(1, ((ContaCorrente) conta).getLimite()); + sql.setInt(2, conta.getNumero()); + sql.executeUpdate(); + } + + con.commit(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Override + public void delete(Conta conta) throws Exception { + try(Connection con = ConnectionFactory.getConnection()){ + con.setAutoCommit(false); + + try(PreparedStatement sql = con.prepareStatement("DELETE FROM contacorrente WHERE numeroConta = ?;")){ + sql.setInt(1, conta.getNumero()); + sql.executeUpdate(); + } + try(PreparedStatement sql = con.prepareStatement("DELETE FROM conta WHERE numero = ?;")){ + sql.setInt(1, conta.getNumero()); + sql.executeUpdate(); + } + + con.commit(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Override + public List readAll() throws Exception { + List contas = new ArrayList<>(); + try(Connection con = ConnectionFactory.getConnection(); + PreparedStatement sql = con.prepareStatement("SELECT * FROM conta INNER JOIN contacorrente ON conta.numero = contacorrente.numeroConta;")){ + ResultSet rs = sql.executeQuery(); + while(rs.next()){ + Cliente dono = new ClienteDaoMysql().getByCpf(rs.getString("cpfCliente")); + ContaCorrente conta = new ContaCorrente(dono, rs.getDouble("saldo"), rs.getDouble("limite"), rs.getDouble("depositoInicial")); + conta.setNumero(rs.getInt("numero")); + contas.add(conta); + } + rs.close(); + } catch (Exception e) { + throw new RuntimeException(e); + } + return contas; + } +} diff --git a/src/main/java/br/ufpr/lpoo/models/connection/mysql/ContaDaoMysql.java b/src/main/java/br/ufpr/lpoo/models/connection/mysql/ContaDaoMysql.java new file mode 100644 index 0000000..7fdb470 --- /dev/null +++ b/src/main/java/br/ufpr/lpoo/models/connection/mysql/ContaDaoMysql.java @@ -0,0 +1,75 @@ +package br.ufpr.lpoo.models.connection.mysql; + +import br.ufpr.lpoo.models.Conta; +import br.ufpr.lpoo.models.connection.ContaDao; + +import java.util.ArrayList; +import java.util.List; + +public class ContaDaoMysql implements ContaDao { + @Override + public Conta getByNumero(String numero) { + Conta conta; + try { + ContaCorrenteDaoMysql contaCorrenteDaoMysql = new ContaCorrenteDaoMysql(); + conta = contaCorrenteDaoMysql.getByNumero(numero); + if (conta == null) { + ContaInvestimentoDaoMysql contaInvestimentoDaoMysql = new ContaInvestimentoDaoMysql(); + conta = contaInvestimentoDaoMysql.getByNumero(numero); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + return conta; + } + + @Override + public Conta getByCliente(String cpfCliente) { + Conta conta; + try { + ContaCorrenteDaoMysql contaCorrenteDaoMysql = new ContaCorrenteDaoMysql(); + conta = contaCorrenteDaoMysql.getByCliente(cpfCliente); + if (conta == null) { + ContaInvestimentoDaoMysql contaInvestimentoDaoMysql = new ContaInvestimentoDaoMysql(); + conta = contaInvestimentoDaoMysql.getByCliente(cpfCliente); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + return conta; + } + + @Override + public void create(Conta object) throws Exception { + switch (object.getClass().getSimpleName()) { + case "ContaCorrente" -> new ContaCorrenteDaoMysql().create(object); + case "ContaInvestimento" -> new ContaInvestimentoDaoMysql().create(object); + } + } + + @Override + public void update(Conta conta) throws Exception { + switch (conta.getClass().getSimpleName()) { + case "ContaCorrente" -> new ContaCorrenteDaoMysql().update(conta); + case "ContaInvestimento" -> new ContaInvestimentoDaoMysql().update(conta); + } + } + + @Override + public void delete(Conta conta) throws Exception { + switch (conta.getClass().getSimpleName()) { + case "ContaCorrente" -> new ContaCorrenteDaoMysql().delete(conta); + case "ContaInvestimento" -> new ContaInvestimentoDaoMysql().delete(conta); + } + } + + @Override + public List readAll() throws Exception { + List contas = new ArrayList<>(); + ContaCorrenteDaoMysql contaCorrenteDaoMysql = new ContaCorrenteDaoMysql(); + ContaInvestimentoDaoMysql contaInvestimentoDaoMysql = new ContaInvestimentoDaoMysql(); + contas.addAll(contaCorrenteDaoMysql.readAll()); + contas.addAll(contaInvestimentoDaoMysql.readAll()); + return contas; + } +} diff --git a/src/main/java/br/ufpr/lpoo/models/connection/mysql/ContaInvestimentoDaoMysql.java b/src/main/java/br/ufpr/lpoo/models/connection/mysql/ContaInvestimentoDaoMysql.java new file mode 100644 index 0000000..1cddea8 --- /dev/null +++ b/src/main/java/br/ufpr/lpoo/models/connection/mysql/ContaInvestimentoDaoMysql.java @@ -0,0 +1,146 @@ +package br.ufpr.lpoo.models.connection.mysql; + +import br.ufpr.lpoo.models.Cliente; +import br.ufpr.lpoo.models.Conta; +import br.ufpr.lpoo.models.ContaCorrente; +import br.ufpr.lpoo.models.ContaInvestimento; +import br.ufpr.lpoo.models.connection.ConnectionFactory; +import br.ufpr.lpoo.models.connection.ContaInvestimentoDao; + +import java.awt.*; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.ArrayList; +import java.util.List; + +public class ContaInvestimentoDaoMysql implements ContaInvestimentoDao { + @Override + public Conta getByNumero(String numero) { + try(Connection con = ConnectionFactory.getConnection(); + PreparedStatement sql = con.prepareStatement("SELECT * FROM conta INNER JOIN containvestimento ON conta.numero = containvestimento.numeroConta WHERE conta.numero = ?;")){ + sql.setInt(1, Integer.parseInt(numero)); + ResultSet rs = sql.executeQuery(); + if(rs.next()){ + Cliente dono = new ClienteDaoMysql().getByCpf(rs.getString("cpfCliente")); + ContaInvestimento conta = new ContaInvestimento(dono, rs.getDouble("saldo"), rs.getDouble("depositoMinimo"), rs.getDouble("montanteMinimo"), rs.getDouble("depositoInicial")); + conta.setNumero(rs.getInt("numero")); + return conta; + } + rs.close(); + } catch (Exception e) { + throw new RuntimeException(e); + } + return null; + } + + @Override + public Conta getByCliente(String cpfCliente) { + try(Connection con = ConnectionFactory.getConnection(); + PreparedStatement sql = con.prepareStatement("SELECT * FROM conta INNER JOIN containvestimento ON conta.numero = containvestimento.numeroConta WHERE conta.cpfCliente = ?;")){ + sql.setString(1, cpfCliente); + ResultSet rs = sql.executeQuery(); + if(rs.next()){ + Cliente dono = new ClienteDaoMysql().getByCpf(rs.getString("cpfCliente")); + ContaInvestimento conta = new ContaInvestimento(dono, rs.getDouble("saldo"), rs.getDouble("depositoMinimo"), rs.getDouble("montanteMinimo"), rs.getDouble("depositoInicial")); + conta.setNumero(rs.getInt("numero")); + return conta; + } + rs.close(); + } catch (Exception e) { + throw new RuntimeException(e); + } + return null; + } + + + @Override + public void create(Conta conta) throws Exception { + try(Connection con = ConnectionFactory.getConnection()) { + con.setAutoCommit(false); + + try(PreparedStatement sql = con.prepareStatement("INSERT INTO conta (cpfCliente, saldo) VALUES (?, ?);", PreparedStatement.RETURN_GENERATED_KEYS)){ + sql.setString(1, conta.getDono().getCpf()); + sql.setDouble(2, conta.getSaldo()); + sql.executeUpdate(); + ResultSet rs = sql.getGeneratedKeys(); + rs.next(); + conta.setNumero(rs.getInt(1)); + } + try(PreparedStatement sql = con.prepareStatement("INSERT INTO containvestimento (numeroConta, depositoInicial, depositoMinimo, montanteMinimo) VALUES (?, ?, ?, ?);")){ + sql.setInt(1, conta.getNumero()); + ContaInvestimento contaInvestimento = (ContaInvestimento) conta; + sql.setDouble(2, contaInvestimento.getDepositoInicial()); + sql.setDouble(3, contaInvestimento.getDepositoMinimo()); + sql.setDouble(4, contaInvestimento.getMontanteMinimo()); + sql.executeUpdate(); + } + + con.commit(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Override + public void update(Conta conta) throws Exception { + try(Connection con = ConnectionFactory.getConnection()){ + con.setAutoCommit(false); + + try(PreparedStatement sql = con.prepareStatement("UPDATE conta SET saldo = ? WHERE numero = ?;")){ + sql.setDouble(1, conta.getSaldo()); + sql.setInt(2, conta.getNumero()); + sql.executeUpdate(); + } + try(PreparedStatement sql = con.prepareStatement("UPDATE containvestimento SET depositoMinimo = ?, montanteMinimo = ? WHERE numeroConta = ?;")){ + sql.setDouble(1, ((ContaInvestimento) conta).getDepositoMinimo()); + sql.setDouble(2, ((ContaInvestimento) conta).getMontanteMinimo()); + sql.setInt(3, conta.getNumero()); + sql.executeUpdate(); + } + + con.commit(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Override + public void delete(Conta conta) throws Exception { + try(Connection con = ConnectionFactory.getConnection()){ + con.setAutoCommit(false); + + try(PreparedStatement sql = con.prepareStatement("DELETE FROM containvestimento WHERE numeroConta = ?;")){ + sql.setInt(1, conta.getNumero()); + sql.executeUpdate(); + } + try(PreparedStatement sql = con.prepareStatement("DELETE FROM conta WHERE numero = ?;")){ + sql.setInt(1, conta.getNumero()); + sql.executeUpdate(); + } + + con.commit(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Override + public List readAll() throws Exception { + List contas = new ArrayList<>(); + try(Connection con = ConnectionFactory.getConnection(); + PreparedStatement sql = con.prepareStatement("SELECT * FROM conta INNER JOIN containvestimento ON conta.numero = containvestimento.numeroConta;")){ + ResultSet rs = sql.executeQuery(); + while(rs.next()){ + Cliente dono = new ClienteDaoMysql().getByCpf(rs.getString("cpfCliente")); + ContaInvestimento conta = new ContaInvestimento(dono, rs.getDouble("saldo"), rs.getDouble("depositoMinimo"), rs.getDouble("montanteMinimo"), rs.getDouble("depositoInicial")); + conta.setNumero(rs.getInt("numero")); + contas.add(conta); + } + rs.close(); + } catch (Exception e) { + throw new RuntimeException(e); + } + return contas; + } +} diff --git a/src/main/java/br/ufpr/lpoo/models/connection/mysql/EnderecoDaoMysql.java b/src/main/java/br/ufpr/lpoo/models/connection/mysql/EnderecoDaoMysql.java new file mode 100644 index 0000000..6fc7fc7 --- /dev/null +++ b/src/main/java/br/ufpr/lpoo/models/connection/mysql/EnderecoDaoMysql.java @@ -0,0 +1,56 @@ +package br.ufpr.lpoo.models.connection.mysql; + +import br.ufpr.lpoo.models.Endereco; +import br.ufpr.lpoo.models.connection.ConnectionFactory; +import br.ufpr.lpoo.models.connection.EnderecoDao; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.util.List; + +public class EnderecoDaoMysql implements EnderecoDao { + @Override + public void create(Endereco endereco) throws Exception { + throw new UnsupportedOperationException("Implementado no create to Cliente"); + } + + @Override + public void update(Endereco endereco) throws Exception { + try(Connection con = ConnectionFactory.getConnection(); + PreparedStatement sql = con.prepareStatement("UPDATE endereco SET logradouro = ?, bairro = ?, numero = ?, cidade = ? WHERE id = ?;")) { + con.setAutoCommit(false); + sql.setString(1, endereco.getLogradouro()); + sql.setString(2, endereco.getBairro()); + sql.setInt(3, endereco.getNumero()); + sql.setString(4, endereco.getCidade()); + sql.setInt(5, endereco.getId()); + sql.executeUpdate(); + con.commit(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Override + public void delete(Endereco endereco) throws Exception { + try(Connection con = ConnectionFactory.getConnection(); + PreparedStatement sql = con.prepareStatement("DELETE FROM endereco WHERE id = ?;")) { + con.setAutoCommit(false); + sql.setInt(1, endereco.getId()); + sql.executeUpdate(); + con.commit(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Override + public List readAll() throws Exception { + throw new UnsupportedOperationException("Not implemented"); + } + + @Override + public Endereco getByClientId(int id) { + throw new UnsupportedOperationException("Not implemented"); + } +} diff --git a/src/main/java/br/ufpr/lpoo/services/FactoryConta.java b/src/main/java/br/ufpr/lpoo/utils/FactoryConta.java similarity index 61% rename from src/main/java/br/ufpr/lpoo/services/FactoryConta.java rename to src/main/java/br/ufpr/lpoo/utils/FactoryConta.java index 12a0144..18fdee9 100644 --- a/src/main/java/br/ufpr/lpoo/services/FactoryConta.java +++ b/src/main/java/br/ufpr/lpoo/utils/FactoryConta.java @@ -1,23 +1,29 @@ -package br.ufpr.lpoo.services; +package br.ufpr.lpoo.utils; -import br.ufpr.lpoo.controllers.Sistema; import br.ufpr.lpoo.models.Cliente; import br.ufpr.lpoo.models.Conta; import br.ufpr.lpoo.models.ContaCorrente; import br.ufpr.lpoo.models.ContaInvestimento; +import br.ufpr.lpoo.models.connection.*; import java.util.ArrayList; +import static br.ufpr.lpoo.models.connection.DaoType.MYSQL; + public class FactoryConta { Conta conta; + private static final DaoType type = MYSQL; - public void abrirConta(String tipo, Cliente dono, ArrayList valoresIniciais){ + public void abrirConta(String tipo, Cliente dono, ArrayList valoresIniciais) throws Exception { if(tipo.equals("Conta Corrente")){ conta = new ContaCorrente(dono, valoresIniciais.get(0), valoresIniciais.get(1)); } else if(tipo.equals("Conta Investimento")){ conta = new ContaInvestimento(dono, valoresIniciais.get(0), valoresIniciais.get(1), valoresIniciais.get(2)); } + ContaDao contaDao = DaoFactory.getContaDao(type); + contaDao.create(conta); dono.setConta(this.conta); - Sistema.cadastrarConta(this.conta); + ClienteDao clienteDao = DaoFactory.getClienteDao(type); + clienteDao.addConta(dono); } } diff --git a/src/main/java/br/ufpr/lpoo/controllers/Imagens.java b/src/main/java/br/ufpr/lpoo/utils/Imagens.java similarity index 99% rename from src/main/java/br/ufpr/lpoo/controllers/Imagens.java rename to src/main/java/br/ufpr/lpoo/utils/Imagens.java index 81f2886..c688e8f 100644 --- a/src/main/java/br/ufpr/lpoo/controllers/Imagens.java +++ b/src/main/java/br/ufpr/lpoo/utils/Imagens.java @@ -1,4 +1,4 @@ -package br.ufpr.lpoo.controllers; +package br.ufpr.lpoo.utils; import javax.imageio.ImageIO; import javax.swing.ImageIcon; diff --git a/src/main/java/br/ufpr/lpoo/services/Observer.java b/src/main/java/br/ufpr/lpoo/utils/Observer.java similarity index 86% rename from src/main/java/br/ufpr/lpoo/services/Observer.java rename to src/main/java/br/ufpr/lpoo/utils/Observer.java index 7c96550..92e96d1 100644 --- a/src/main/java/br/ufpr/lpoo/services/Observer.java +++ b/src/main/java/br/ufpr/lpoo/utils/Observer.java @@ -1,4 +1,4 @@ -package br.ufpr.lpoo.services; +package br.ufpr.lpoo.utils; import java.beans.PropertyChangeListener; diff --git a/src/main/java/br/ufpr/lpoo/views/Home.java b/src/main/java/br/ufpr/lpoo/views/Home.java index a6686fc..bb33d74 100644 --- a/src/main/java/br/ufpr/lpoo/views/Home.java +++ b/src/main/java/br/ufpr/lpoo/views/Home.java @@ -1,7 +1,7 @@ package br.ufpr.lpoo.views; -import br.ufpr.lpoo.controllers.Imagens; -import br.ufpr.lpoo.controllers.Sistema; +import br.ufpr.lpoo.utils.Imagens; +import br.ufpr.lpoo.Sistema; import br.ufpr.lpoo.models.Tela; import com.intellij.uiDesigner.core.GridConstraints; import com.intellij.uiDesigner.core.GridLayoutManager; @@ -9,8 +9,6 @@ import javax.swing.*; import javax.swing.border.TitledBorder; import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; /** * Esta classe representa a tela inicial do sistema. @@ -28,44 +26,19 @@ public class Home implements Tela { * Define os valores iniciais para as variáveis de instância e adiciona os ouvintes de ação aos botões. */ public Home() { - clientesButton.addActionListener(new ActionListener() { - /** - * Este método é chamado quando o botão Clientes é clicado. - * Ele navega para a tela ManterCliente. - * - * @param e O evento de ação. - */ - @Override - public void actionPerformed(ActionEvent e) { - ManterCliente frame = new ManterCliente(); - Sistema.navigate(frame); - } + clientesButton.addActionListener(e -> { + ManterCliente frame = new ManterCliente(); + Sistema.navigate(frame); }); - contasButton.addActionListener(new ActionListener() { - /** - * Este método é chamado quando o botão Contas é clicado. - * Ele navega para a tela VincularCliente. - * - * @param e O evento de ação. - */ - @Override - public void actionPerformed(ActionEvent e) { - VincularCliente frame = new VincularCliente(); - Sistema.navigate(frame); - } + + contasButton.addActionListener(e -> { + VincularCliente frame = new VincularCliente(); + Sistema.navigate(frame); }); - transactionsButton.addActionListener(new ActionListener() { - /** - * Este método é chamado quando o botão Transações é clicado. - * Ele navega para a tela ManipularConta. - * - * @param e O evento de ação. - */ - @Override - public void actionPerformed(ActionEvent e) { - ManipularConta frame = new ManipularConta(); - Sistema.navigate(frame); - } + + transactionsButton.addActionListener(e -> { + ManipularConta frame = new ManipularConta(); + Sistema.navigate(frame); }); this.initUIComponents(); } diff --git a/src/main/java/br/ufpr/lpoo/views/ManipularConta.java b/src/main/java/br/ufpr/lpoo/views/ManipularConta.java index 21bf4b4..206ea19 100644 --- a/src/main/java/br/ufpr/lpoo/views/ManipularConta.java +++ b/src/main/java/br/ufpr/lpoo/views/ManipularConta.java @@ -1,8 +1,10 @@ package br.ufpr.lpoo.views; +import br.ufpr.lpoo.Sistema; import br.ufpr.lpoo.controllers.*; import br.ufpr.lpoo.models.*; -import br.ufpr.lpoo.services.Observer; +import br.ufpr.lpoo.models.connection.DaoType; +import br.ufpr.lpoo.utils.Imagens; import com.intellij.uiDesigner.core.GridConstraints; import com.intellij.uiDesigner.core.GridLayoutManager; import com.intellij.uiDesigner.core.Spacer; @@ -10,8 +12,8 @@ import javax.swing.*; import javax.swing.border.TitledBorder; import java.awt.*; -import java.awt.event.*; -import java.beans.PropertyChangeEvent; + +import static br.ufpr.lpoo.models.connection.DaoType.MYSQL; /** * Classe que representa a tela de manipulação de conta @@ -19,9 +21,10 @@ * * @see Tela */ -public class ManipularConta implements Tela, Observer { +public class ManipularConta implements Tela { private Conta conta; private JPanel frame; + private ManipularContaController controller; private JButton voltarButton; private JTextField cpfCliente; private JPanel dadosConta; @@ -42,6 +45,7 @@ public class ManipularConta implements Tela, Observer { private JLabel rendimento; private JLabel numeroConta; private JLabel warningLimite; + private static final DaoType type = MYSQL; /** * Construtor da classe ManipularConta @@ -49,73 +53,63 @@ public class ManipularConta implements Tela, Observer { * Adiciona os listeners aos botões */ public ManipularConta() { - this.initUIComponents(); + controller = new ManipularContaController(this); + } - voltarButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - Sistema.goBack(); - } - }); - mostrarSaldo.addItemListener(new ItemListener() { - @Override - public void itemStateChanged(ItemEvent e) { - saldo.setVisible(mostrarSaldo.isSelected()); - } - }); - buscarButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - if (!cpfCliente.getText().isEmpty()) { - String cpf = cpfCliente.getText(); - conta = pesquisaContaPorCliente(cpf); - if (conta != null) { - loadConta(); - dadosConta.setVisible(true); - } + public void setController() { + voltarButton.addActionListener(e -> Sistema.goBack()); + + buscarButton.addActionListener(e -> { + if (cpfCliente.getText().isEmpty()) { + MensagensController.aviso(dadosConta, "Digite um CPF para buscar"); + } else { + String cpf = cpfCliente.getText(); + try { + this.controller.buscarConta(cpf); + } catch (Exception ex) { + MensagensController.aviso(dadosConta, ex.getMessage()); } } }); - saqueButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - try { - double valor = Double.parseDouble(valorSaque.getText()); - if (conta.saca(valor)) { - Mensagens.sucesso(dadosConta, "Saque realizado com sucesso"); - } else { - Mensagens.aviso(dadosConta, conta.getClass() == ContaCorrente.class ? "Saldo/limite insuficiente" : "O valor restante é inferior ao montante mínimo"); - } - } catch (NumberFormatException ex) { - Mensagens.erro(dadosConta, "Valor inserido inválido"); - } + mostrarSaldo.addItemListener(e -> saldo.setVisible(mostrarSaldo.isSelected())); + + saqueButton.addActionListener(e -> { + try { + double valor = Double.parseDouble(valorSaque.getText()); + this.controller.realizaSaque(valor); + MensagensController.sucesso(dadosConta, "Saque realizado com sucesso"); + } catch (NumberFormatException ex) { + MensagensController.erro(dadosConta, "Valor inserido inválido"); + } catch (IllegalArgumentException ex) { + MensagensController.aviso(dadosConta, ex.getMessage()); + } catch (Exception ex) { + MensagensController.erro(dadosConta, "Erro ao realizar saque: " + ex.getMessage()); } }); - depositoButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - try { - double valor = Double.parseDouble(valorDeposito.getText()); - if (conta.deposita(valor)) { - Mensagens.sucesso(dadosConta, "Depósito realizado com sucesso"); - } else { - Mensagens.aviso(dadosConta, "Depósito mínimo não atingido"); - } - } catch (NumberFormatException ex) { - Mensagens.erro(dadosConta, "Valor inserido inválido"); - } + + depositoButton.addActionListener(e -> { + try { + double valor = Double.parseDouble(valorDeposito.getText()); + this.controller.realizaDeposito(valor); + MensagensController.sucesso(dadosConta, "Depósito realizado com sucesso"); + } catch (NumberFormatException ex) { + MensagensController.erro(dadosConta, "Valor inserido inválido"); + } catch (IllegalArgumentException ex) { + MensagensController.aviso(dadosConta, ex.getMessage()); + } catch (Exception ex) { + MensagensController.erro(dadosConta, "Erro ao realizar depósito: " + ex.getMessage()); } }); - investirButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - if (conta.getSaldo() > 0) { - conta.remunera(); - Mensagens.sucesso(dadosConta, "Investimento realizado com sucesso"); - } else { - Mensagens.aviso(dadosConta, "Saldo insuficiente para investir"); - } + + investirButton.addActionListener(e -> { + try { + this.controller.realizaInvestimento(); + MensagensController.sucesso(dadosConta, "Investimento realizado com sucesso"); + } catch (IllegalArgumentException ex) { + MensagensController.aviso(dadosConta, ex.getMessage()); + } catch (RuntimeException ex) { + MensagensController.erro(dadosConta, ex.getMessage()); } }); } @@ -128,30 +122,16 @@ public void actionPerformed(ActionEvent e) { */ public ManipularConta(Cliente cliente) { this(); - conta = cliente.getConta(); cpfCliente.setText(cliente.getCpf()); - loadConta(); - dadosConta.setVisible(true); - } - - private Conta pesquisaContaPorCliente(String cpfCliente) { - cpfCliente = cpfCliente.replaceAll("[^0-9]", ""); - for (Cliente c : Sistema.getClientes()) { - if (c.getCpf().equals(cpfCliente)) { - if (c.getConta() != null) { - return c.getConta(); - } else { - Mensagens.aviso(dadosConta, "O cliente pesquisado não possui uma conta"); - return null; - } - } + try { + this.controller.buscarConta(cliente.getCpf()); + } catch (Exception e) { + MensagensController.aviso(dadosConta, e.getMessage()); } - Mensagens.aviso(dadosConta, "Esse cliente não foi encontrado"); - return null; } - private void loadConta() { - Mensagens.carregando(dadosConta, "Carregando dados da conta..."); + public void loadConta(Conta conta) { + MensagensController.carregando(dadosConta, "Carregando dados da conta..."); saldo.setText("R$ " + String.format("%.2f", conta.getSaldo()).replace(".", ",")); numeroConta.setText("Conta Nº: " + String.format("%6d", conta.getNumero())); warningLimite.setVisible(conta.getSaldo() < 0); @@ -162,7 +142,12 @@ private void loadConta() { tipoConta.setText("Sua conta é do tipo: Conta de Investimento"); rendimento.setText("Seu rendimento é de: 2% do montante total"); } - conta.addObserver(this); + dadosConta.setVisible(true); + } + + public void updateSaldo(double newSaldo) { + saldo.setText("R$ " + String.format("%.2f", newSaldo).replace(".", ",")); + warningLimite.setVisible(newSaldo < 0); } /** @@ -186,20 +171,6 @@ public void initUIComponents() { investirButton.setIcon(Imagens.INVESTIMENTO.icon()); } - /** - * Método que atualiza o saldo da conta - * - * @param evt Evento de mudança de propriedade - * @see Observer - */ - @Override - public void propertyChange(PropertyChangeEvent evt) { - if (evt.getPropertyName().equals("saldo")) { - saldo.setText("R$ " + String.format("%.2f", conta.getSaldo()).replace(".", ",")); - warningLimite.setVisible(conta.getSaldo() < 0); - } - } - { // GUI initializer generated by IntelliJ IDEA GUI Designer // >>> IMPORTANT!! <<< @@ -355,4 +326,5 @@ public void propertyChange(PropertyChangeEvent evt) { public JComponent $$$getRootComponent$$$() { return frame; } + } diff --git a/src/main/java/br/ufpr/lpoo/views/ManterCliente.form b/src/main/java/br/ufpr/lpoo/views/ManterCliente.form index 879e10d..d8980db 100644 --- a/src/main/java/br/ufpr/lpoo/views/ManterCliente.form +++ b/src/main/java/br/ufpr/lpoo/views/ManterCliente.form @@ -1,9 +1,9 @@
- + - + @@ -15,46 +15,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -157,58 +117,9 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -235,18 +146,9 @@ - - - - - - - - - - + @@ -255,52 +157,221 @@ - + - + + - + - - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + - - + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + - + + + + + + + + + + + + + + + + + + + + + +
diff --git a/src/main/java/br/ufpr/lpoo/views/ManterCliente.java b/src/main/java/br/ufpr/lpoo/views/ManterCliente.java index 5e1ed4a..1a469c5 100644 --- a/src/main/java/br/ufpr/lpoo/views/ManterCliente.java +++ b/src/main/java/br/ufpr/lpoo/views/ManterCliente.java @@ -1,10 +1,12 @@ package br.ufpr.lpoo.views; +import br.ufpr.lpoo.Sistema; import br.ufpr.lpoo.controllers.*; import br.ufpr.lpoo.models.Cliente; import br.ufpr.lpoo.models.Endereco; import br.ufpr.lpoo.models.Tela; import br.ufpr.lpoo.models.comparables.*; +import br.ufpr.lpoo.utils.Imagens; import com.intellij.uiDesigner.core.GridConstraints; import com.intellij.uiDesigner.core.GridLayoutManager; @@ -13,10 +15,11 @@ import javax.swing.plaf.FontUIResource; import javax.swing.text.StyleContext; import java.awt.*; -import java.awt.event.*; import java.util.Comparator; import java.util.Locale; +import java.sql.SQLIntegrityConstraintViolationException; + /** * Esta classe representa a tela de manutenção do cliente. * Ela implementa a interface Tela e define os campos de entrada e botões para inserir, editar, excluir e buscar clientes. @@ -24,6 +27,7 @@ public class ManterCliente implements Tela { private JPanel frame; private JButton voltarButton; + private final ManterClienteController controller; private JTextField textFieldNome; private JTextField textFieldSobrenome; private JTextField textFieldLogradouro; @@ -39,8 +43,9 @@ public class ManterCliente implements Tela { private JButton excluirButton; private JScrollPane scrollPanel; private JComboBox comboOrdem; + private JTextField pesquisa; + private JButton clearButton; private Comparator comparator; - private ManterClienteTableModel tabelaModel = new ManterClienteTableModel(Sistema.getClientes()); /** @@ -48,261 +53,131 @@ public class ManterCliente implements Tela { * Define os valores iniciais para as variáveis de instância e adiciona os ouvintes de ação aos botões. */ public ManterCliente() { - this.initUIComponents(); - tabelaClientes.setModel(tabelaModel); - tabelaClientes.setColumnModel(tabelaClientes.getColumnModel()); - - comparator = new NomeComparator(); - tabelaModel.sortClientes(comparator); + this.controller = new ManterClienteController(this); + } - voltarButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - Sistema.goBack(); - } - }); - inserirButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - String nome = textFieldNome.getText(); - String sobreNome = textFieldSobrenome.getText(); - String logradouro = textFieldLogradouro.getText(); - String bairro = textFieldBairro.getText(); - String cidade = textFieldCidade.getText(); - String numero = textFieldNumero.getText(); - String cpf = textFieldCPF.getText(); - String rg = textFieldRG.getText(); + @Override + public void initUIComponents() { + this.excluirButton.setIcon(Imagens.DELETE.icon()); + this.editarButton.setIcon(Imagens.EDIT.icon()); + this.buscarButton.setIcon(Imagens.SEARCH.icon()); + this.inserirButton.setIcon(Imagens.ADD.icon()); - areTextFieldsFilled(textFieldNome, "nome"); - areTextFieldsFilled(textFieldSobrenome, "sobrenome"); - areTextFieldsFilled(textFieldLogradouro, "logradouro"); - areTextFieldsFilled(textFieldBairro, "bairro"); - areTextFieldsFilled(textFieldCidade, "cidade"); - areTextFieldsFilled(textFieldNumero, "numero"); - areTextFieldsFilled(textFieldCPF, "CPF"); - areTextFieldsFilled(textFieldRG, "RG"); + this.scrollPanel.getViewport().setBackground(new Color(5, 28, 59)); + this.tabelaClientes.getTableHeader().setBackground(new Color(225, 248, 255)); + } - cpf = cpf.replaceAll("[^0-9]", ""); + public void setController(ManterClienteTableModel tabelaModel) { + tabelaClientes.setModel(tabelaModel); + comparator = new NomeComparator(); + tabelaModel.sortClientes(comparator); - if (isInteger(numero)) { - Mensagens.erro(null, "Número Inválido\n"); - return; - } + voltarButton.addActionListener(e -> Sistema.goBack()); - if (cpf.equals("")) { - Mensagens.erro(null, "Campo CPF não pode estar vazio\n"); - return; - } - if (isCpfExistente(cpf)) { - Mensagens.erro(null, "CPF já cadastrado\n"); - return; - } + clearButton.addActionListener(e -> clearForm()); - if (!validaCpf(cpf)) { - Mensagens.erro(null, "CPF inválido\n"); - return; + inserirButton.addActionListener(e -> { + try { + Cliente c = loadForm(); + controller.cadastrarCliente(c); + MensagensController.sucesso(frame, "Cliente cadastrado com sucesso"); + clearForm(); + } catch (SQLIntegrityConstraintViolationException ex) { + System.out.println(ex.getMessage()); + if (ex.getMessage().contains("Duplicate entry")) { + MensagensController.erro(frame, "CPF já cadastrado"); } - - Endereco endereco = new Endereco(logradouro, bairro, numero, cidade); - Cliente c = new Cliente(nome, sobreNome, endereco, cpf, rg); - - Sistema.cadastrarCliente(c); - - textFieldNome.setText(""); - textFieldSobrenome.setText(""); - textFieldLogradouro.setText(""); - textFieldBairro.setText(""); - textFieldCidade.setText(""); - textFieldNumero.setText(""); - textFieldCPF.setText(""); - textFieldRG.setText(""); - - tabelaModel.fireTableDataChanged(); + } catch (Exception ex) { + MensagensController.erro(frame, ex.getMessage()); } }); - - buscarButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - - String cpf = textFieldCPF.getText(); - - cpf = cpf.replaceAll("[^0-9]", ""); - - if (cpf.equals("")) { - Mensagens.aviso(null, "Insira um CPF para buscar\n"); - return; - } - - if (!isCpfExistente(cpf)) { - Mensagens.erro(null, "CPF não cadastrado\n"); - return; - } - - - for (Cliente cliente : Sistema.getClientes()) { - if (cliente.getCpf().equalsIgnoreCase(cpf)) { - textFieldNome.setText(cliente.getNome()); - textFieldSobrenome.setText(cliente.getSobrenome()); - textFieldLogradouro.setText(cliente.getEndereco().getLogradouro()); - textFieldBairro.setText(cliente.getEndereco().getBairro()); - textFieldCidade.setText(cliente.getEndereco().getCidade()); - textFieldNumero.setText(Integer.toString(cliente.getEndereco().getNumero())); - textFieldRG.setText(cliente.getRg()); - } - } - + editarButton.addActionListener(e -> { + try { + Cliente cliente = loadForm(); + controller.updateCliente(cliente); + MensagensController.sucesso(frame, "Informações editadas\n"); + clearForm(); + } catch (Exception ex) { + MensagensController.erro(frame, "Não foi possível editar: " + ex.getMessage()); } }); - editarButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - - String nome = textFieldNome.getText(); - String sobreNome = textFieldSobrenome.getText(); - String logradouro = textFieldLogradouro.getText(); - String bairro = textFieldBairro.getText(); - String cidade = textFieldCidade.getText(); - String numero = textFieldNumero.getText(); - String cpf = textFieldCPF.getText(); - String rg = textFieldRG.getText(); - - - areTextFieldsFilled(textFieldNome, "nome"); - areTextFieldsFilled(textFieldSobrenome, "sobrenome"); - areTextFieldsFilled(textFieldLogradouro, "logradouro"); - areTextFieldsFilled(textFieldBairro, "bairro"); - areTextFieldsFilled(textFieldCidade, "cidade"); - areTextFieldsFilled(textFieldNumero, "numero"); - areTextFieldsFilled(textFieldCPF, "CPF"); - areTextFieldsFilled(textFieldRG, "RG"); - - if (isInteger(numero)) { - Mensagens.erro(null, "Número Inválido\n"); - return; + excluirButton.addActionListener(e -> { + String cpf = textFieldCPF.getText(); + if (MensagensController.confirmar(frame, "Certeza que deseja excluir o cliente?")) { + try { + controller.deleteCliente(cpf); + MensagensController.sucesso(frame, "CPF '" + cpf + "' removido\n"); + } catch (RuntimeException ex) { + MensagensController.erro(frame, "Ocorreu um erro ao remover o cliente: " + ex.getMessage()); } - - if (cpf.equals("")) { - Mensagens.aviso(null, "CPF não pode ser vazio\n"); - return; - } - - if (!validaCpf(cpf)) { - Mensagens.erro(null, "CPF Inválido\n"); - return; - } - - cpf = cpf.replaceAll("[^0-9]", ""); - - for (Cliente cliente : Sistema.getClientes()) { - if (cliente.getCpf().equalsIgnoreCase(cpf)) { - cliente.setNome(nome); - cliente.setSobrenome(sobreNome); - Endereco endereco = new Endereco(logradouro, bairro, numero, cidade); - cliente.setEndereco(endereco); - cliente.setRg(rg); - } - } - - Mensagens.sucesso(null, "Informações editadas\n"); - - textFieldNome.setText(""); - textFieldSobrenome.setText(""); - textFieldLogradouro.setText(""); - textFieldBairro.setText(""); - textFieldCidade.setText(""); - textFieldNumero.setText(""); - textFieldCPF.setText(""); - textFieldRG.setText(""); - - tabelaModel.fireTableDataChanged(); } }); - excluirButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - String cpf = textFieldCPF.getText(); - - cpf = cpf.replaceAll("[^0-9]", ""); - - String finalCpf = cpf; - - Sistema.getClientes().removeIf(cliente -> cliente.getCpf().equalsIgnoreCase(finalCpf)); - - Mensagens.sucesso(null, "CPF " + cpf + " removido\n"); - - textFieldNome.setText(""); - textFieldSobrenome.setText(""); - textFieldLogradouro.setText(""); - textFieldBairro.setText(""); - textFieldCidade.setText(""); - textFieldNumero.setText(""); - textFieldCPF.setText(""); - textFieldRG.setText(""); - - tabelaModel.fireTableDataChanged(); + buscarButton.addActionListener(e -> { + try { + String query = pesquisa.getText(); + controller.buscarClientes(query); + } catch (RuntimeException ex) { + MensagensController.aviso(frame, ex.getMessage()); } }); - comboOrdem.addComponentListener(new ComponentAdapter() { - }); - comboOrdem.addItemListener(new ItemListener() { - @Override - public void itemStateChanged(ItemEvent e) { - if (comboOrdem.getSelectedIndex() == 1) { - comparator = new SobrenomeComparator(); - } else { - comparator = new NomeComparator(); - } - tabelaModel.sortClientes(comparator); + + comboOrdem.addItemListener(e -> { + if (comboOrdem.getSelectedIndex() == 1) { + comparator = new SobrenomeComparator(); + } else { + comparator = new NomeComparator(); } + tabelaModel.sortClientes(comparator); }); - } - @Override - public void initUIComponents() { - this.excluirButton.setIcon(Imagens.DELETE.icon()); - this.editarButton.setIcon(Imagens.EDIT.icon()); - this.buscarButton.setIcon(Imagens.SEARCH.icon()); - this.inserirButton.setIcon(Imagens.ADD.icon()); + tabelaClientes.getSelectionModel().addListSelectionListener(e -> controller.selectCliente(tabelaClientes.getSelectedRow())); + } - this.scrollPanel.getViewport().setBackground(new Color(5, 28, 59)); - this.tabelaClientes.getTableHeader().setBackground(new Color(225, 248, 255)); + public void loadCliente(Cliente cliente) { + textFieldNome.setText(cliente.getNome()); + textFieldCPF.setText(cliente.getCpf()); + textFieldSobrenome.setText(cliente.getSobrenome()); + textFieldLogradouro.setText(cliente.getEndereco().getLogradouro()); + textFieldBairro.setText(cliente.getEndereco().getBairro()); + textFieldCidade.setText(cliente.getEndereco().getCidade()); + textFieldNumero.setText(Integer.toString(cliente.getEndereco().getNumero())); + textFieldRG.setText(cliente.getRg()); } - /** - * Verifica se um CPF já existe na lista de clientes. - * - * @param cpf O CPF a ser verificado. - * @return Verdadeiro se o CPF já existe, falso caso contrário. - */ - private boolean isCpfExistente(String cpf) { - for (Cliente cliente : Sistema.getClientes()) { - if (cliente.getCpf().equalsIgnoreCase(cpf)) { - return true; - } - } - return false; + public Cliente loadForm() { + String nome = textFieldNome.getText(); + String sobreNome = textFieldSobrenome.getText(); + String logradouro = textFieldLogradouro.getText(); + String bairro = textFieldBairro.getText(); + String cidade = textFieldCidade.getText(); + String numero = textFieldNumero.getText(); + String cpf = textFieldCPF.getText(); + cpf = cpf.replaceAll("[^0-9]", ""); + String rg = textFieldRG.getText(); + + this.areTextFieldsFilled(textFieldNome, "nome"); + this.areTextFieldsFilled(textFieldSobrenome, "sobrenome"); + this.areTextFieldsFilled(textFieldLogradouro, "logradouro"); + this.areTextFieldsFilled(textFieldBairro, "bairro"); + this.areTextFieldsFilled(textFieldCidade, "cidade"); + this.areTextFieldsFilled(textFieldRG, "RG"); + + Endereco endereco = new Endereco(logradouro, bairro, numero, cidade); + return new Cliente(nome, sobreNome, endereco, cpf, rg); } - /** - * Verifica se uma string pode ser convertida para um número inteiro. - * - * @param str A string a ser verificada. - * @return Verdadeiro se a string pode ser convertida para um número inteiro, falso caso contrário. - */ - public static boolean isInteger(String str) { - if (str == null) { - return true; - } - try { - Integer.parseInt(str); - } catch (NumberFormatException e) { - return true; - } - return false; + public void clearForm() { + textFieldNome.setText(""); + textFieldSobrenome.setText(""); + textFieldLogradouro.setText(""); + textFieldBairro.setText(""); + textFieldCidade.setText(""); + textFieldNumero.setText(""); + textFieldCPF.setText(""); + textFieldRG.setText(""); } /** @@ -310,54 +185,11 @@ public static boolean isInteger(String str) { * * @param textField O campo de texto a ser verificado. * @param campo O nome do campo a ser verificado. - * @return Verdadeiro se o campo de texto está preenchido, falso caso contrário. */ - public static boolean areTextFieldsFilled(JTextField textField, String campo) { + public void areTextFieldsFilled(JTextField textField, String campo) { if (textField.getText().trim().isEmpty()) { - Mensagens.aviso(null, "Campo " + campo + " está vazio\n"); - return false; + throw new IllegalArgumentException("Campo " + campo + " não pode estar vazio\n"); } - return true; - } - - /** - * Valida um CPF. - * - * @param cpf O CPF a ser validado. - * @return Verdadeiro se o CPF é válido, falso caso contrário. - */ - public static boolean validaCpf(String cpf) { - int soma = 0, resto = 0; - - cpf = cpf.replaceAll("[^0-9]", ""); - - if (cpf.matches("[0-9]{11}") && !cpf.matches("^(\\d)\\1{10}")) { - for (int i = 0; i < 9; i++) { - soma += Integer.parseInt(cpf.substring(i, i + 1)) * (10 - i); - } - resto = 11 - (soma % 11); - if (resto == 10 || resto == 11) { - resto = 0; - } - if (resto != Integer.parseInt(cpf.substring(9, 10))) { - return false; - } - - soma = 0; - for (int i = 0; i < 10; i++) { - soma += Integer.parseInt(cpf.substring(i, i + 1)) * (11 - i); - } - resto = 11 - (soma % 11); - if (resto == 10 || resto == 11) { - resto = 0; - } - if (resto != Integer.parseInt(cpf.substring(10, 11))) { - return false; - } - - return true; - } - return false; } /** @@ -369,10 +201,6 @@ public JPanel getFrame() { return frame; } - private void createUIComponents() { - // TODO: place custom component creation code here - } - { // GUI initializer generated by IntelliJ IDEA GUI Designer // >>> IMPORTANT!! <<< @@ -389,27 +217,11 @@ private void createUIComponents() { */ private void $$$setupUI$$$() { frame = new JPanel(); - frame.setLayout(new GridLayoutManager(7, 4, new Insets(8, 8, 8, 8), -1, -1)); + frame.setLayout(new GridLayoutManager(6, 4, new Insets(8, 8, 8, 8), -1, -1)); frame.setBackground(new Color(-16442309)); frame.setEnabled(false); frame.setForeground(new Color(-1967873)); frame.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(new Color(-1967873)), "Clientes", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, null, new Color(-1967873))); - final JLabel label1 = new JLabel(); - label1.setForeground(new Color(-1967873)); - label1.setText("Nome:"); - frame.add(label1, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - final JLabel label2 = new JLabel(); - label2.setForeground(new Color(-1967873)); - label2.setText("Sobrenome:"); - frame.add(label2, new GridConstraints(0, 2, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - textFieldNome = new JTextField(); - textFieldNome.setBackground(new Color(-2500135)); - textFieldNome.setForeground(new Color(-16777216)); - frame.add(textFieldNome, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); - textFieldSobrenome = new JTextField(); - textFieldSobrenome.setBackground(new Color(-2500135)); - textFieldSobrenome.setForeground(new Color(-16777216)); - frame.add(textFieldSobrenome, new GridConstraints(0, 3, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); final JPanel panel1 = new JPanel(); panel1.setLayout(new GridLayoutManager(2, 6, new Insets(0, 0, 0, 0), -1, -1)); panel1.setBackground(new Color(-16442309)); @@ -417,30 +229,30 @@ private void createUIComponents() { panel1.setForeground(new Color(-1967873)); frame.add(panel1, new GridConstraints(1, 0, 1, 4, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); panel1.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(new Color(-1967873)), "Endereço", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, this.$$$getFont$$$(null, -1, -1, panel1.getFont()), new Color(-1967873))); - final JLabel label3 = new JLabel(); - label3.setForeground(new Color(-1967873)); - label3.setText("Logradouro:"); - panel1.add(label3, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(50, 17), null, 0, false)); + final JLabel label1 = new JLabel(); + label1.setForeground(new Color(-1967873)); + label1.setText("Logradouro:"); + panel1.add(label1, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(50, 17), null, 0, false)); textFieldLogradouro = new JTextField(); textFieldLogradouro.setBackground(new Color(-2500135)); textFieldLogradouro.setForeground(new Color(-16777216)); panel1.add(textFieldLogradouro, new GridConstraints(0, 1, 1, 5, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); - final JLabel label4 = new JLabel(); - label4.setForeground(new Color(-1967873)); - label4.setText("Número:"); - panel1.add(label4, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(50, 17), null, 0, false)); - final JLabel label5 = new JLabel(); - label5.setForeground(new Color(-1967873)); - label5.setText("Bairro:"); - panel1.add(label5, new GridConstraints(1, 2, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + final JLabel label2 = new JLabel(); + label2.setForeground(new Color(-1967873)); + label2.setText("Número:"); + panel1.add(label2, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(50, 17), null, 0, false)); + final JLabel label3 = new JLabel(); + label3.setForeground(new Color(-1967873)); + label3.setText("Bairro:"); + panel1.add(label3, new GridConstraints(1, 2, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); textFieldBairro = new JTextField(); textFieldBairro.setBackground(new Color(-2500135)); textFieldBairro.setForeground(new Color(-16777216)); panel1.add(textFieldBairro, new GridConstraints(1, 3, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); - final JLabel label6 = new JLabel(); - label6.setForeground(new Color(-1967873)); - label6.setText("Cidade:"); - panel1.add(label6, new GridConstraints(1, 4, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + final JLabel label4 = new JLabel(); + label4.setForeground(new Color(-1967873)); + label4.setText("Cidade:"); + panel1.add(label4, new GridConstraints(1, 4, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); textFieldCidade = new JTextField(); textFieldCidade.setBackground(new Color(-2500135)); textFieldCidade.setForeground(new Color(-16777216)); @@ -449,30 +261,10 @@ private void createUIComponents() { textFieldNumero.setBackground(new Color(-2500135)); textFieldNumero.setForeground(new Color(-16777216)); panel1.add(textFieldNumero, new GridConstraints(1, 1, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); - final JLabel label7 = new JLabel(); - label7.setForeground(new Color(-1967873)); - label7.setText("CPF:"); - frame.add(label7, new GridConstraints(2, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - textFieldCPF = new JTextField(); - textFieldCPF.setBackground(new Color(-2500135)); - textFieldCPF.setForeground(new Color(-16777216)); - frame.add(textFieldCPF, new GridConstraints(2, 1, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); - final JLabel label8 = new JLabel(); - label8.setForeground(new Color(-1967873)); - label8.setText("RG:"); - frame.add(label8, new GridConstraints(2, 2, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - textFieldRG = new JTextField(); - textFieldRG.setBackground(new Color(-2500135)); - textFieldRG.setForeground(new Color(-16777216)); - frame.add(textFieldRG, new GridConstraints(2, 3, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); - buscarButton = new JButton(); - buscarButton.setBackground(new Color(-11487489)); - buscarButton.setText("Buscar"); - frame.add(buscarButton, new GridConstraints(3, 2, 1, 2, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); scrollPanel = new JScrollPane(); scrollPanel.setBackground(new Color(-14134075)); scrollPanel.setEnabled(true); - frame.add(scrollPanel, new GridConstraints(5, 0, 1, 4, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, null, null, null, 0, false)); + frame.add(scrollPanel, new GridConstraints(4, 0, 1, 4, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, null, null, null, 0, false)); scrollPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(new Color(-16442309)), null, TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, null, null)); tabelaClientes = new JTable(); tabelaClientes.setBackground(new Color(-11487489)); @@ -484,37 +276,100 @@ private void createUIComponents() { tabelaClientes.putClientProperty("JTable.autoStartsEdit", Boolean.FALSE); tabelaClientes.putClientProperty("Table.isFileList", Boolean.FALSE); scrollPanel.setViewportView(tabelaClientes); - inserirButton = new JButton(); - inserirButton.setBackground(new Color(-11487489)); - inserirButton.setText("Inserir"); - frame.add(inserirButton, new GridConstraints(3, 0, 1, 2, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); voltarButton = new JButton(); voltarButton.setBackground(new Color(-11487489)); voltarButton.setText("Voltar"); - frame.add(voltarButton, new GridConstraints(6, 3, 1, 1, GridConstraints.ANCHOR_EAST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - final JLabel label9 = new JLabel(); - label9.setForeground(new Color(-1967873)); - label9.setText("Clientes cadastrados"); - frame.add(label9, new GridConstraints(4, 0, 1, 2, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - editarButton = new JButton(); - editarButton.setBackground(new Color(-11487489)); - editarButton.setText("Editar"); - frame.add(editarButton, new GridConstraints(6, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - excluirButton = new JButton(); - excluirButton.setBackground(new Color(-11487489)); - excluirButton.setText("Excluir"); - frame.add(excluirButton, new GridConstraints(6, 1, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + frame.add(voltarButton, new GridConstraints(5, 3, 1, 1, GridConstraints.ANCHOR_EAST, GridConstraints.FILL_VERTICAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + final JLabel label5 = new JLabel(); + label5.setForeground(new Color(-1967873)); + label5.setText("Clientes cadastrados"); + frame.add(label5, new GridConstraints(3, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + final JPanel panel2 = new JPanel(); + panel2.setLayout(new GridLayoutManager(1, 4, new Insets(0, 0, 0, 0), -1, -1)); + panel2.setBackground(new Color(-16442309)); + frame.add(panel2, new GridConstraints(3, 1, 1, 3, GridConstraints.ANCHOR_EAST, GridConstraints.FILL_VERTICAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); + pesquisa = new JTextField(); + pesquisa.setBackground(new Color(-2500135)); + pesquisa.setForeground(new Color(-16777216)); + panel2.add(pesquisa, new GridConstraints(0, 2, 1, 1, GridConstraints.ANCHOR_EAST, GridConstraints.FILL_VERTICAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); + buscarButton = new JButton(); + buscarButton.setBackground(new Color(-11487489)); + buscarButton.setText("Buscar"); + panel2.add(buscarButton, new GridConstraints(0, 3, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_VERTICAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + final JLabel label6 = new JLabel(); + label6.setForeground(new Color(-1967873)); + label6.setText("Ordenar por"); + panel2.add(label6, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_EAST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); comboOrdem = new JComboBox(); comboOrdem.setBackground(new Color(-2500135)); final DefaultComboBoxModel defaultComboBoxModel1 = new DefaultComboBoxModel(); defaultComboBoxModel1.addElement("nome"); defaultComboBoxModel1.addElement("sobrenome"); comboOrdem.setModel(defaultComboBoxModel1); - frame.add(comboOrdem, new GridConstraints(4, 3, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + panel2.add(comboOrdem, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + final JPanel panel3 = new JPanel(); + panel3.setLayout(new GridLayoutManager(1, 2, new Insets(0, 0, 0, 0), -1, -1)); + panel3.setBackground(new Color(-16442309)); + frame.add(panel3, new GridConstraints(5, 0, 1, 2, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_VERTICAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); + excluirButton = new JButton(); + excluirButton.setBackground(new Color(-11487489)); + excluirButton.setText("Excluir"); + panel3.add(excluirButton, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + editarButton = new JButton(); + editarButton.setBackground(new Color(-11487489)); + editarButton.setText("Editar"); + panel3.add(editarButton, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + final JPanel panel4 = new JPanel(); + panel4.setLayout(new GridLayoutManager(2, 4, new Insets(0, 0, 0, 0), -1, -1)); + panel4.setBackground(new Color(-16442309)); + frame.add(panel4, new GridConstraints(0, 0, 1, 4, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); + final JLabel label7 = new JLabel(); + label7.setForeground(new Color(-1967873)); + label7.setText("Nome:"); + panel4.add(label7, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + textFieldNome = new JTextField(); + textFieldNome.setBackground(new Color(-2500135)); + textFieldNome.setForeground(new Color(-16777216)); + panel4.add(textFieldNome, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); + final JLabel label8 = new JLabel(); + label8.setForeground(new Color(-1967873)); + label8.setText("Sobrenome:"); + panel4.add(label8, new GridConstraints(0, 2, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + textFieldSobrenome = new JTextField(); + textFieldSobrenome.setBackground(new Color(-2500135)); + textFieldSobrenome.setForeground(new Color(-16777216)); + panel4.add(textFieldSobrenome, new GridConstraints(0, 3, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); + final JLabel label9 = new JLabel(); + label9.setForeground(new Color(-1967873)); + label9.setText("CPF:"); + panel4.add(label9, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + textFieldCPF = new JTextField(); + textFieldCPF.setBackground(new Color(-2500135)); + textFieldCPF.setDisabledTextColor(new Color(-16442309)); + textFieldCPF.setEditable(true); + textFieldCPF.setEnabled(true); + textFieldCPF.setForeground(new Color(-16777216)); + panel4.add(textFieldCPF, new GridConstraints(1, 1, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); final JLabel label10 = new JLabel(); label10.setForeground(new Color(-1967873)); - label10.setText("Ordenar por"); - frame.add(label10, new GridConstraints(4, 2, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + label10.setText("RG:"); + panel4.add(label10, new GridConstraints(1, 2, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + textFieldRG = new JTextField(); + textFieldRG.setBackground(new Color(-2500135)); + textFieldRG.setForeground(new Color(-16777216)); + panel4.add(textFieldRG, new GridConstraints(1, 3, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); + final JPanel panel5 = new JPanel(); + panel5.setLayout(new GridLayoutManager(1, 2, new Insets(0, 0, 0, 0), -1, -1)); + panel5.setBackground(new Color(-16442309)); + frame.add(panel5, new GridConstraints(2, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_VERTICAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); + inserirButton = new JButton(); + inserirButton.setBackground(new Color(-11487489)); + inserirButton.setText("Inserir"); + panel5.add(inserirButton, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + clearButton = new JButton(); + clearButton.setBackground(new Color(-11487489)); + clearButton.setText("Limpar"); + panel5.add(clearButton, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); } /** @@ -545,4 +400,5 @@ private void createUIComponents() { public JComponent $$$getRootComponent$$$() { return frame; } + } diff --git a/src/main/java/br/ufpr/lpoo/views/ManterClienteTableModel.java b/src/main/java/br/ufpr/lpoo/views/ManterClienteTableModel.java index da0d879..b92266a 100644 --- a/src/main/java/br/ufpr/lpoo/views/ManterClienteTableModel.java +++ b/src/main/java/br/ufpr/lpoo/views/ManterClienteTableModel.java @@ -11,7 +11,7 @@ * Ela estende AbstractTableModel e define as colunas e os dados da tabela. */ public class ManterClienteTableModel extends AbstractTableModel { - private final List clientes; + private List clientes; private final String[] columns = {"Nome", "Sobrenome", "Endereço", "CPF", "RG"}; /** @@ -24,6 +24,15 @@ public ManterClienteTableModel(List clientes){ this.clientes = clientes; } + public void updateList(List lista){ + this.clientes = lista; + this.fireTableDataChanged(); + } + + public Cliente getClientAt(int index){ + return this.clientes.get(index); + } + /** * Este método retorna o número de linhas da tabela. * diff --git a/src/main/java/br/ufpr/lpoo/views/VincularCliente.java b/src/main/java/br/ufpr/lpoo/views/VincularCliente.java index f2c0e68..f27b777 100644 --- a/src/main/java/br/ufpr/lpoo/views/VincularCliente.java +++ b/src/main/java/br/ufpr/lpoo/views/VincularCliente.java @@ -1,19 +1,15 @@ package br.ufpr.lpoo.views; +import br.ufpr.lpoo.Sistema; import br.ufpr.lpoo.controllers.*; -import br.ufpr.lpoo.models.Cliente; -import br.ufpr.lpoo.models.ContaCorrente; -import br.ufpr.lpoo.models.ContaInvestimento; -import br.ufpr.lpoo.models.Tela; -import br.ufpr.lpoo.services.FactoryConta; +import br.ufpr.lpoo.models.*; +import br.ufpr.lpoo.utils.Imagens; import com.intellij.uiDesigner.core.GridConstraints; import com.intellij.uiDesigner.core.GridLayoutManager; import javax.swing.*; import javax.swing.border.TitledBorder; import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.util.*; /** @@ -22,6 +18,7 @@ */ public class VincularCliente implements Tela { private JPanel frame; + private final VincularClienteController controller; private JButton voltarButton; private JComboBox tipoConta; private JTextField depositoInicial; @@ -35,8 +32,6 @@ public class VincularCliente implements Tela { private JPanel formulario; private JButton gerenciarContaButton; private JButton excluirButton; - private VincularTableModel tabelaModel = new VincularTableModel(Sistema.getClientes()); - private Cliente clienteSelecionado; private ContaCorrente corrente; private ContaInvestimento investimento; private JScrollPane scrollPanel; @@ -46,124 +41,108 @@ public class VincularCliente implements Tela { * Inicializa os componentes da interface e define os listeners dos botões. */ public VincularCliente() { - this.initUIComponents(); + controller = new VincularClienteController(this); + } + public void setController(VincularTableModel tabelaModel) { tabela.setModel(tabelaModel); - tabela.setColumnModel(tabela.getColumnModel()); - voltarButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - Sistema.goBack(); - } - }); + voltarButton.addActionListener(e -> Sistema.goBack()); - tipoConta.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent actionEvent) { - label1.setText("Depósito Inicial:"); + tipoConta.addActionListener(e -> this.controller.selectTipo((String) tipoConta.getSelectedItem())); - switch (Objects.requireNonNull(tipoConta.getSelectedItem()).toString()) { - case "Conta Corrente": - formulario.setVisible(true); - label2.setText("Limite:"); - label3.setVisible(false); - textField3.setVisible(false); - break; - case "Conta Investimento": - formulario.setVisible(true); - label3.setVisible(true); - textField3.setVisible(true); - label2.setText("Montante Mínimo:"); - label3.setText("Depósito Mínimo:"); - break; - default: - formulario.setVisible(false); - break; - } - } - }); + tabela.getSelectionModel().addListSelectionListener(e -> controller.selectCliente(tabela.getSelectedRow())); + salvarButton.addActionListener(e -> { + try { + ArrayList campos = new ArrayList<>(Arrays.asList(depositoInicial, textField2, textField3)); + controller.abrirConta(controller.validaCampos(campos)); - tabela.getSelectionModel().addListSelectionListener(e -> { - if (tabela.getSelectedRow() != -1) { - clienteSelecionado = Sistema.getClientes().get(tabela.getSelectedRow()); + MensagensController.sucesso(frame, "Conta cadastrada com sucesso!"); + + formulario.setVisible(false); tipoConta.setEnabled(false); - excluirButton.setVisible(true); - gerenciarContaButton.setVisible(true); - salvarButton.setVisible(false); - switch (clienteSelecionado.getConta() != null ? clienteSelecionado.getConta().getClass().getSimpleName() : "") { - case "ContaCorrente": - tipoConta.setSelectedItem("Conta Corrente"); - corrente = (ContaCorrente) clienteSelecionado.getConta(); - depositoInicial.setText(String.valueOf(corrente.getDepositoInicial())); - textField2.setText(String.valueOf(corrente.getLimite())); - break; - case "ContaInvestimento": - tipoConta.setSelectedItem("Conta Investimento"); - investimento = (ContaInvestimento) clienteSelecionado.getConta(); - depositoInicial.setText(String.valueOf(investimento.getDepositoInicial())); - textField2.setText(String.valueOf(investimento.getMontanteMinimo())); - textField3.setText(String.valueOf(investimento.getDepositoMinimo())); - break; - default: - tipoConta.setSelectedItem(""); - depositoInicial.setText(""); - textField2.setText(""); - textField3.setText(""); - excluirButton.setVisible(false); - gerenciarContaButton.setVisible(false); - salvarButton.setVisible(true); - tipoConta.setEnabled(true); - break; - } + + } catch (IllegalArgumentException ex) { + MensagensController.aviso(frame, ex.getMessage()); + } catch (Exception ex) { + MensagensController.erro(frame, ex.getMessage()); } }); - - salvarButton.addActionListener(new ActionListener() { - - @Override - public void actionPerformed(ActionEvent e) { - - FactoryConta factory = new FactoryConta(); - ArrayList campos = new ArrayList<>(Arrays.asList(depositoInicial, textField2, textField3)); - + excluirButton.addActionListener(e -> { + if (MensagensController.confirmar(frame, "Tem certeza que deseja excluir a conta?")) { try { - factory.abrirConta(tipoConta.getSelectedItem().toString(), clienteSelecionado, validaCampos(campos)); - Mensagens.sucesso(frame, "Conta cadastrada com sucesso!"); - formulario.setVisible(false); - tipoConta.setEnabled(false); - tabelaModel.fireTableDataChanged(); + this.controller.deleteConta(); - } catch (NumberFormatException ex) { - Mensagens.erro(frame, ex.getMessage()); - } catch (IllegalArgumentException ex) { - Mensagens.aviso(frame, ex.getMessage()); + tipoConta.setSelectedIndex(0); + MensagensController.sucesso(frame, "Conta excluída com sucesso"); + } catch (Exception ex) { + MensagensController.erro(frame, ex.getMessage()); } } }); - gerenciarContaButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - Sistema.navigate(new ManipularConta(clienteSelecionado)); - } - }); + gerenciarContaButton.addActionListener(e -> Sistema.navigate(new ManipularConta(this.controller.getClienteSelecionado()))); + } - excluirButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { + public void switchForms(Conta conta) { + tipoConta.setEnabled(false); + excluirButton.setVisible(true); + gerenciarContaButton.setVisible(true); + salvarButton.setVisible(false); + if (conta == null) { + tipoConta.setSelectedItem(""); + depositoInicial.setText(""); + textField2.setText(""); + textField3.setText(""); + excluirButton.setVisible(false); + gerenciarContaButton.setVisible(false); + salvarButton.setVisible(true); + tipoConta.setEnabled(true); + } else { + loadFormGerenciamento(conta); + } + } - if (!Mensagens.confirmar(frame, "Tem certeza que deseja excluir a conta?")) return; - Sistema.getContas().remove(clienteSelecionado.getConta()); - clienteSelecionado.setConta(null); - tabelaModel.fireTableDataChanged(); - Mensagens.sucesso(frame, "Conta excluída com sucesso"); - tipoConta.setSelectedIndex(0); + public void loadFormAbertura(String tipo) { + label1.setText("Depósito Inicial:"); + switch (tipo) { + case "Conta Corrente": + formulario.setVisible(true); + label2.setText("Limite:"); + label3.setVisible(false); + textField3.setVisible(false); + break; + case "Conta Investimento": + formulario.setVisible(true); + label3.setVisible(true); + textField3.setVisible(true); + label2.setText("Montante Mínimo:"); + label3.setText("Depósito Mínimo:"); + break; + default: + formulario.setVisible(false); + break; + } + } - } - }); + public void loadFormGerenciamento(Conta conta) { + switch (conta.getClass().getSimpleName()) { + case "ContaCorrente": + tipoConta.setSelectedItem("Conta Corrente"); + corrente = (ContaCorrente) conta; + depositoInicial.setText(String.valueOf(corrente.getDepositoInicial())); + textField2.setText(String.valueOf(corrente.getLimite())); + break; + case "ContaInvestimento": + tipoConta.setSelectedItem("Conta Investimento"); + investimento = (ContaInvestimento) conta; + depositoInicial.setText(String.valueOf(investimento.getDepositoInicial())); + textField2.setText(String.valueOf(investimento.getMontanteMinimo())); + textField3.setText(String.valueOf(investimento.getDepositoMinimo())); + break; + } } /** @@ -183,30 +162,6 @@ public void initUIComponents() { tabela.getTableHeader().setBackground(new Color(225, 248, 255)); } - /** - * Valida se todos os campos necessários estão preenchidos corretamente e, se estiver, retorna um array com os valores dos campos. - * - * @param campos ArrayList de campos de texto a serem verificados. - * @return ArrayList com os valores dos campos. - * @throws NumberFormatException Se um dos campos não for um número válido. - * @throws IllegalArgumentException Se um dos campos estiver vazio. - */ - private ArrayList validaCampos(ArrayList campos) { - ArrayList valores = new ArrayList<>(); - for (JTextField campo : campos) { - if (!campo.isVisible()) continue; - if (campo.getText().isEmpty()) { - throw new IllegalArgumentException("Preencha todos os campos"); - } - try { - valores.add(Double.parseDouble(campo.getText())); - } catch (NumberFormatException e) { - throw new NumberFormatException("Valor '" + campo.getText() + "' inválido"); - } - } - return valores; - } - { // GUI initializer generated by IntelliJ IDEA GUI Designer // >>> IMPORTANT!! <<< @@ -304,4 +259,5 @@ private ArrayList validaCampos(ArrayList campos) { public JComponent $$$getRootComponent$$$() { return frame; } + } diff --git a/src/main/java/br/ufpr/lpoo/views/VincularTableModel.java b/src/main/java/br/ufpr/lpoo/views/VincularTableModel.java index 541b944..d04625d 100644 --- a/src/main/java/br/ufpr/lpoo/views/VincularTableModel.java +++ b/src/main/java/br/ufpr/lpoo/views/VincularTableModel.java @@ -10,7 +10,7 @@ * Ela estende AbstractTableModel e define as colunas e os dados da tabela. */ public class VincularTableModel extends AbstractTableModel { - private final List clientes; + private List clientes; private final String[] colunas = {"Nome", "CPF", "Tipo da Conta", "Conta"}; /** @@ -23,6 +23,15 @@ public VincularTableModel(List clientes) { this.clientes = clientes; } + public void updateList(List lista){ + this.clientes = lista; + this.fireTableDataChanged(); + } + + public Cliente getClientAt(int index){ + return this.clientes.get(index); + } + /** * Este método retorna o número de linhas da tabela. * diff --git a/src/main/java/br/ufpr/lpoo/views/dialog/ConfirmDialog.form b/src/main/java/br/ufpr/lpoo/views/dialog/ConfirmDialog.form new file mode 100644 index 0000000..b766132 --- /dev/null +++ b/src/main/java/br/ufpr/lpoo/views/dialog/ConfirmDialog.form @@ -0,0 +1,83 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/src/main/java/br/ufpr/lpoo/views/dialog/ConfirmDialog.java b/src/main/java/br/ufpr/lpoo/views/dialog/ConfirmDialog.java new file mode 100644 index 0000000..463e5b2 --- /dev/null +++ b/src/main/java/br/ufpr/lpoo/views/dialog/ConfirmDialog.java @@ -0,0 +1,103 @@ +package br.ufpr.lpoo.views.dialog; + +import br.ufpr.lpoo.controllers.MensagensController; +import br.ufpr.lpoo.utils.Imagens; +import com.intellij.uiDesigner.core.GridConstraints; +import com.intellij.uiDesigner.core.GridLayoutManager; + +import javax.swing.*; +import java.awt.*; + +public class ConfirmDialog { + private final JDialog dialog; + private JPanel contentPane; + private JButton buttonOK; + private JLabel mensagem; + private JButton buttonCancel; + + public ConfirmDialog() { + this.dialog = new JDialog(); + this.dialog.setContentPane(contentPane); + Image image = Imagens.MAIN.image(); + this.dialog.setIconImage(image); + } + + public void initDialog(Component origin, String mensagem) { + this.dialog.setModal(true); + this.dialog.setSize(310 + (mensagem.length() * 2), 150); + this.dialog.setLocationRelativeTo(origin); + this.dialog.setTitle("Confirmar"); + this.dialog.getRootPane().setDefaultButton(buttonOK); + + this.mensagem.setText(mensagem); + buttonOK.addActionListener(e -> { + MensagensController.toogleResponse(true); + close(); + }); + buttonCancel.addActionListener(e -> { + MensagensController.toogleResponse(false); + close(); + }); + } + + public void open() { + this.dialog.setVisible(true); + } + + private void close() { + this.dialog.dispose(); + } + + { +// GUI initializer generated by IntelliJ IDEA GUI Designer +// >>> IMPORTANT!! <<< +// DO NOT EDIT OR ADD ANY CODE HERE! + $$$setupUI$$$(); + } + + /** + * Method generated by IntelliJ IDEA GUI Designer + * >>> IMPORTANT!! <<< + * DO NOT edit this method OR call it in your code! + * + * @noinspection ALL + */ + private void $$$setupUI$$$() { + contentPane = new JPanel(); + contentPane.setLayout(new GridLayoutManager(2, 1, new Insets(10, 10, 10, 10), -1, -1)); + contentPane.setBackground(new Color(-2500135)); + final JPanel panel1 = new JPanel(); + panel1.setLayout(new GridLayoutManager(1, 1, new Insets(0, 0, 0, 0), -1, -1)); + contentPane.add(panel1, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, 1, null, null, null, 0, false)); + final JPanel panel2 = new JPanel(); + panel2.setLayout(new GridLayoutManager(1, 2, new Insets(0, 0, 0, 0), -1, -1)); + panel2.setBackground(new Color(-2500135)); + panel1.add(panel2, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); + buttonOK = new JButton(); + buttonOK.setBackground(new Color(-11487489)); + buttonOK.setForeground(new Color(-16777216)); + buttonOK.setText("Confirmar"); + panel2.add(buttonOK, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_EAST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + buttonCancel = new JButton(); + buttonCancel.setBackground(new Color(-11487489)); + buttonCancel.setForeground(new Color(-16777216)); + buttonCancel.setText("Cancelar"); + panel2.add(buttonCancel, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + final JPanel panel3 = new JPanel(); + panel3.setLayout(new GridLayoutManager(1, 1, new Insets(0, 0, 0, 0), -1, -1)); + panel3.setBackground(new Color(-2500135)); + contentPane.add(panel3, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); + mensagem = new JLabel(); + mensagem.setBackground(new Color(-1967873)); + mensagem.setForeground(new Color(-16442309)); + mensagem.setText("Label"); + panel3.add(mensagem, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_NONE, 1, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + } + + /** + * @noinspection ALL + */ + public JComponent $$$getRootComponent$$$() { + return contentPane; + } +} diff --git a/src/main/java/br/ufpr/lpoo/views/dialog/MessageDialog.form b/src/main/java/br/ufpr/lpoo/views/dialog/MessageDialog.form new file mode 100644 index 0000000..6d4980d --- /dev/null +++ b/src/main/java/br/ufpr/lpoo/views/dialog/MessageDialog.form @@ -0,0 +1,81 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/src/main/java/br/ufpr/lpoo/views/dialog/MessageDialog.java b/src/main/java/br/ufpr/lpoo/views/dialog/MessageDialog.java new file mode 100644 index 0000000..a19caeb --- /dev/null +++ b/src/main/java/br/ufpr/lpoo/views/dialog/MessageDialog.java @@ -0,0 +1,94 @@ +package br.ufpr.lpoo.views.dialog; + +import br.ufpr.lpoo.utils.Imagens; +import com.intellij.uiDesigner.core.GridConstraints; +import com.intellij.uiDesigner.core.GridLayoutManager; + +import javax.swing.*; +import java.awt.*; + +public class MessageDialog { + private final JDialog dialog; + private JPanel contentPane; + private JButton buttonOK; + private JLabel mensagem; + private JLabel icone; + + public MessageDialog() { + this.dialog = new JDialog(); + this.dialog.setContentPane(contentPane); + Image image = Imagens.MAIN.image(); + this.dialog.setIconImage(image); + } + + public void initDialog(Component origin, String mensagem, String title, Icon icon) { + this.dialog.setModal(true); + this.dialog.setSize(310 + (mensagem.length() * 2), 150); + this.dialog.setLocationRelativeTo(origin); + this.dialog.setTitle(title); + this.dialog.getRootPane().setDefaultButton(buttonOK); + + this.mensagem.setText(mensagem); + this.icone.setIcon(icon); + buttonOK.addActionListener(e -> onOK()); + } + + public void open() { + this.dialog.setVisible(true); + } + + private void onOK() { + this.dialog.dispose(); + } + + { +// GUI initializer generated by IntelliJ IDEA GUI Designer +// >>> IMPORTANT!! <<< +// DO NOT EDIT OR ADD ANY CODE HERE! + $$$setupUI$$$(); + } + + /** + * Method generated by IntelliJ IDEA GUI Designer + * >>> IMPORTANT!! <<< + * DO NOT edit this method OR call it in your code! + * + * @noinspection ALL + */ + private void $$$setupUI$$$() { + contentPane = new JPanel(); + contentPane.setLayout(new GridLayoutManager(2, 1, new Insets(10, 10, 10, 10), -1, -1)); + contentPane.setBackground(new Color(-2500135)); + final JPanel panel1 = new JPanel(); + panel1.setLayout(new GridLayoutManager(1, 1, new Insets(0, 0, 0, 0), -1, -1)); + contentPane.add(panel1, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, 1, null, null, null, 0, false)); + final JPanel panel2 = new JPanel(); + panel2.setLayout(new GridLayoutManager(1, 1, new Insets(0, 0, 0, 0), -1, -1)); + panel2.setBackground(new Color(-2500135)); + panel1.add(panel2, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); + buttonOK = new JButton(); + buttonOK.setBackground(new Color(-11487489)); + buttonOK.setForeground(new Color(-16777216)); + buttonOK.setText("OK"); + panel2.add(buttonOK, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + final JPanel panel3 = new JPanel(); + panel3.setLayout(new GridLayoutManager(1, 2, new Insets(0, 0, 0, 0), -1, -1)); + panel3.setBackground(new Color(-2500135)); + contentPane.add(panel3, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); + mensagem = new JLabel(); + mensagem.setBackground(new Color(-1967873)); + mensagem.setForeground(new Color(-16442309)); + mensagem.setText("Label"); + panel3.add(mensagem, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, 1, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + icone = new JLabel(); + icone.setText(""); + panel3.add(icone, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_EAST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + } + + /** + * @noinspection ALL + */ + public JComponent $$$getRootComponent$$$() { + return contentPane; + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index c53ef50..680cb96 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,3 +1,3 @@ -mysql.database.url=${database.url} -mysql.database.username=${database.username} -mysql.database.password=${database.password} \ No newline at end of file +mysql.database.url=${database_url} +mysql.database.username=${database_username} +mysql.database.password=${database_password} \ No newline at end of file diff --git a/src/main/resources/assets/load.png b/src/main/resources/assets/load.png index e7647a1..105e8d0 100644 Binary files a/src/main/resources/assets/load.png and b/src/main/resources/assets/load.png differ diff --git a/src/main/resources/scripts/database_inserts.sql b/src/main/resources/scripts/database_inserts.sql index 2413bfa..075c478 100644 --- a/src/main/resources/scripts/database_inserts.sql +++ b/src/main/resources/scripts/database_inserts.sql @@ -22,11 +22,11 @@ INSERT INTO cliente (cpf, nome, sobrenome, rg, idEndereco) VALUES ('31057053090', 'Raul', 'Bana', '130632776', 3), ('12345678909', 'Maria', 'Silva', '123456789', 4), ('98765432100', 'João', 'Pereira', '987654321', 5), -('11122233344', 'Ana', 'Costa', '111222333', 6), -('55566677788', 'Carlos', 'Oliveira', '555666777', 7), -('99988877766', 'Fernanda', 'Almeida', '999888777', 8), -('44455566677', 'Paulo', 'Souza', '444555666', 9), -('22233344455', 'Juliana', 'Mendes', '222333444', 10); +('69429562010', 'Ana', 'Costa', '111222333', 6), +('45940918069', 'Carlos', 'Oliveira', '555666777', 7), +('38547351035', 'Fernanda', 'Almeida', '999888777', 8), +('90692230076', 'Paulo', 'Souza', '444555666', 9), +('82623549079', 'Juliana', 'Mendes', '222333444', 10); INSERT INTO conta (cpfCliente, saldo) VALUES ('94831227080', 1000.00), @@ -44,4 +44,11 @@ INSERT INTO contaCorrente (numeroConta, limite, depositoInicial) VALUES INSERT INTO contaInvestimento (numeroConta, depositoInicial, depositoMinimo, montanteMinimo) VALUES (4, 2000.00, 1000.00, 2000.00), (5, 2500.00, 1500.00, 2500.00), -(6, 3000.00, 2000.00, 3000.00); \ No newline at end of file +(6, 3000.00, 2000.00, 3000.00); + +UPDATE cliente SET numeroConta = 1 WHERE cpf = '94831227080'; +UPDATE cliente SET numeroConta = 2 WHERE cpf = '88543471087'; +UPDATE cliente SET numeroConta = 3 WHERE cpf = '63287208071'; +UPDATE cliente SET numeroConta = 4 WHERE cpf = '31057053090'; +UPDATE cliente SET numeroConta = 5 WHERE cpf = '12345678909'; +UPDATE cliente SET numeroConta = 6 WHERE cpf = '98765432100'; \ No newline at end of file diff --git a/src/test/java/br/ufpr/lpoo/controllers/TesteSistema.java b/src/test/java/br/ufpr/lpoo/controllers/TesteSistema.java deleted file mode 100644 index f9158f7..0000000 --- a/src/test/java/br/ufpr/lpoo/controllers/TesteSistema.java +++ /dev/null @@ -1,19 +0,0 @@ -package br.ufpr.lpoo.controllers; -import br.ufpr.lpoo.models.Cliente; -import br.ufpr.lpoo.models.Endereco; - -import org.junit.Test; -import static org.junit.Assert.assertEquals; - -public class TesteSistema { - @Test - public void adicionarCliente() { - Endereco endereco = new Endereco("Rua Carlos Maia", "Cajuru", "123", "Curitiba"); - Cliente cliente = new Cliente("João Dória", "Silva", endereco, "400.855.360-67", "123456789"); - Sistema.cadastrarCliente(cliente); - - assertEquals(1, Sistema.getClientes().size()); - assertEquals(cliente, Sistema.getClientes().get(0)); - } - -} diff --git a/src/test/java/br/ufpr/lpoo/models/TesteConta.java b/src/test/java/br/ufpr/lpoo/models/TesteConta.java index 94062dd..18dbdb1 100644 --- a/src/test/java/br/ufpr/lpoo/models/TesteConta.java +++ b/src/test/java/br/ufpr/lpoo/models/TesteConta.java @@ -1,5 +1,6 @@ package br.ufpr.lpoo.models; +import org.junit.Assert; import org.junit.Test; public class TesteConta { @@ -12,72 +13,108 @@ private Cliente criarCliente() { return new Cliente("Tester", "Teste", criarEndereco(), "77191328070", "232215492"); } - @Test(expected = IllegalArgumentException.class) - public void testeNumeroNegativo() { - Cliente dono = criarCliente(); - new ContaCorrente(-1, dono, 1000, 600); - } - @Test(expected = IllegalArgumentException.class) public void testeSaldoNegativo() { Cliente dono = criarCliente(); - new ContaCorrente(1, dono, -1000, 600); + try { + new ContaCorrente(dono, -1000, 600); + } catch (IllegalArgumentException e) { + Assert.assertEquals("O saldo deve ser maior que 0.", e.getMessage()); + throw e; + } } @Test(expected = IllegalArgumentException.class) public void testeLimiteNegativo() { Cliente dono = criarCliente(); - new ContaCorrente(1, dono, 1000, -600); + try { + new ContaCorrente(dono, 1000, -600); + } catch (IllegalArgumentException e) { + Assert.assertEquals("Limite deve ser maior ou igual a 0.", e.getMessage()); + throw e; + } } - @Test(expected = IllegalArgumentException.class) + @Test public void testeDepositoNegativo() { Cliente dono = criarCliente(); - ContaCorrente conta = new ContaCorrente(1, dono, 1000, 600); + ContaCorrente conta = new ContaCorrente(dono, 1000, 600); conta.deposita(-200); + Assert.assertEquals(1000, conta.getSaldo(), 0.01); } - @Test(expected = IllegalArgumentException.class) + @Test() public void testeSaqueNegativo() { Cliente dono = criarCliente(); - ContaCorrente conta = new ContaCorrente(1, dono, 1000, 600); + ContaCorrente conta = new ContaCorrente(dono, 1000, 600); conta.saca(-200); + Assert.assertEquals(1000, conta.getSaldo(), 0.01); } @Test(expected = IllegalArgumentException.class) public void testeDepositoMinimoNegativo() { Cliente dono = criarCliente(); - new ContaInvestimento(1, dono, 1000, -500, 1000); + try { + new ContaInvestimento(dono, 1000, -500, 1000); + } catch (IllegalArgumentException e) { + Assert.assertEquals("Depósito mínimo e montante mínimo devem ser maiores que 0.", e.getMessage()); + throw e; + } } @Test(expected = IllegalArgumentException.class) public void testeMontanteMinimoNegativo() { Cliente dono = criarCliente(); - new ContaInvestimento(1, dono, 1000, 500, -1000); + try { + new ContaInvestimento(dono, 1000, 500, -1000); + } catch (IllegalArgumentException e) { + Assert.assertEquals("Depósito mínimo e montante mínimo devem ser maiores que 0.", e.getMessage()); + throw e; + } } @Test(expected = IllegalArgumentException.class) public void testeDepositoMinimoZero() { Cliente dono = criarCliente(); - new ContaInvestimento(1, dono, 1000, 0, 1000); + try { + new ContaInvestimento(dono, 1000, 0, 1000); + } catch (IllegalArgumentException e) { + Assert.assertEquals("Depósito mínimo e montante mínimo devem ser maiores que 0.", e.getMessage()); + throw e; + } } @Test(expected = IllegalArgumentException.class) public void testeMontanteMinimoZero() { Cliente dono = criarCliente(); - new ContaInvestimento(1, dono, 1000, 500, 0); + try { + new ContaInvestimento(dono, 1000, 500, 0); + } catch (IllegalArgumentException e) { + Assert.assertEquals("Depósito mínimo e montante mínimo devem ser maiores que 0.", e.getMessage()); + throw e; + } } @Test(expected = IllegalArgumentException.class) public void testeDepositoMinimoMaiorQueSaldo() { Cliente dono = criarCliente(); - new ContaInvestimento(1, dono, 1000, 2000, 1000); + try { + new ContaInvestimento(dono, 1000, 2000, 1000); + } catch (IllegalArgumentException e) { + Assert.assertEquals("Saldo inicial menor que o depósito mínimo.", e.getMessage()); + throw e; + } } @Test(expected = IllegalArgumentException.class) public void testeMontanteMinimoMaiorQueSaldo() { Cliente dono = criarCliente(); - new ContaInvestimento(1, dono, 1000, 500, 2000); + try { + new ContaInvestimento(dono, 1000, 500, 2000); + } catch (IllegalArgumentException e) { + Assert.assertEquals("Saldo inicial menor que o montante mínimo.", e.getMessage()); + throw e; + } } } diff --git a/src/test/java/br/ufpr/lpoo/models/connection/TestConnection.java b/src/test/java/br/ufpr/lpoo/models/connection/TestConnection.java new file mode 100644 index 0000000..b3b6885 --- /dev/null +++ b/src/test/java/br/ufpr/lpoo/models/connection/TestConnection.java @@ -0,0 +1,30 @@ +package br.ufpr.lpoo.models.connection; + +import org.junit.Assert; +import org.junit.Test; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +public class TestConnection { + @Test + public void testConnection() { + try { + Connection connection = ConnectionFactory.getConnection(); + Assert.assertNotNull(connection); + PreparedStatement stmt = connection.prepareStatement("SELECT * FROM cliente WHERE cpf = ?;"); + stmt.setString(1, "63287208071"); + ResultSet rs = stmt.executeQuery(); + Assert.assertNotNull(rs); + if (rs.next()) { + Assert.assertEquals("63287208071", rs.getString("cpf")); + Assert.assertEquals("Leonardo", rs.getString("nome")); + } + } catch (SQLException e) { + Assert.fail("Erro ao conectar ao banco de dados: " + e.getMessage()); + } + + } +} diff --git a/src/test/java/br/ufpr/lpoo/views/TesteManipularConta.java b/src/test/java/br/ufpr/lpoo/views/TesteManipularConta.java deleted file mode 100644 index 0129f5b..0000000 --- a/src/test/java/br/ufpr/lpoo/views/TesteManipularConta.java +++ /dev/null @@ -1,166 +0,0 @@ -package br.ufpr.lpoo.views; - -import br.ufpr.lpoo.controllers.Sistema; -import br.ufpr.lpoo.models.*; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import javax.swing.*; - -import java.awt.*; - -import static org.junit.Assert.*; - -public class TesteManipularConta { - - @Before - public void setUp() { - Endereco endereco = new Endereco("Rua", "Bairro", "1", "Cidade"); - Cliente cliente = new Cliente("João", "Silva", endereco, "095.218.850-33", "12345678900"); - Cliente cliente1 = new Cliente("Maria", "Silva", endereco, "302.595.890-12", "12345678901"); - Conta conta = new ContaCorrente(12345, cliente, 1000.0, 0.0); - Sistema.cadastrarCliente(cliente); - Sistema.cadastrarCliente(cliente1); - cliente.setConta(conta); - } - - @After - public void tearDown() { - Sistema.getClientes().clear(); - } - - @Test - public void testInstanciarTelaVazia() { - Tela manipularConta = new ManipularConta(); - JPanel frame = manipularConta.getFrame(); - Component dadosConta = frame.getComponent(4); - - assertNotNull(frame); - assertNotNull(dadosConta); - assertEquals("javax.swing.JPanel", dadosConta.getClass().getName()); - assertFalse(dadosConta.isVisible()); - } - - @Test - public void testinstanciarTelaComConta(){ - Tela manipularConta = new ManipularConta(Sistema.getClientes().get(0)); - JPanel frame = manipularConta.getFrame(); - Component dadosConta = frame.getComponent(4); - JTextField cpfCliente = (JTextField) frame.getComponent(1); - - assertNotNull(frame); - assertNotNull(dadosConta); - assertTrue(dadosConta.isVisible()); - assertEquals("09521885033", cpfCliente.getText()); - } - - @Test - public void testPesquisarContaPorCpf1(){ - Tela manipularConta = new ManipularConta(); - JPanel frame = manipularConta.getFrame(); - Component dadosConta = frame.getComponent(4); - JTextField cpfCliente = (JTextField) frame.getComponent(1); - JButton buscarButton = (JButton) frame.getComponent(5); - cpfCliente.setText("123.456.789-00"); - buscarButton.doClick(); - - assertNotNull(frame); - assertNotNull(dadosConta); - assertFalse(dadosConta.isVisible()); - } - - @Test - public void testPesquisarContaPorCpf2(){ - Tela manipularConta = new ManipularConta(); - JPanel frame = manipularConta.getFrame(); - Component dadosConta = frame.getComponent(4); - JTextField cpfCliente = (JTextField) frame.getComponent(1); - JButton buscarButton = (JButton) frame.getComponent(5); - cpfCliente.setText("095.218.850-33"); - buscarButton.doClick(); - - assertNotNull(frame); - assertNotNull(dadosConta); - assertTrue(dadosConta.isVisible()); - } - - @Test - public void testPesquisarContaPorCpf3(){ - Tela manipularConta = new ManipularConta(); - JPanel frame = manipularConta.getFrame(); - Component dadosConta = frame.getComponent(4); - JTextField cpfCliente = (JTextField) frame.getComponent(1); - JButton buscarButton = (JButton) frame.getComponent(5); - cpfCliente.setText("302.595.890-12"); - buscarButton.doClick(); - - assertNotNull(frame); - assertNotNull(dadosConta); - assertFalse(dadosConta.isVisible()); - } - - @Test - public void testSaque1(){ - Tela manipularConta = new ManipularConta(Sistema.getClientes().get(0)); - JPanel frame = manipularConta.getFrame(); - Component dadosConta = frame.getComponent(4); - JTabbedPane tabbedPane = (JTabbedPane) ((JPanel) dadosConta).getComponent(3); - JPanel sacar = (JPanel) tabbedPane.getComponent(0); - JTextField valorSaque = (JTextField) sacar.getComponent(2); - JButton saqueButton = (JButton) sacar.getComponent(4); - JLabel saldo = (JLabel) ((JPanel) ((JPanel) dadosConta).getComponent(1)).getComponent(0); - valorSaque.setText("500"); - saqueButton.doClick(); - - assertEquals("R$ 500,00", saldo.getText()); - } - - @Test - public void testSaque2(){ - Tela manipularConta = new ManipularConta(Sistema.getClientes().get(0)); - JPanel frame = manipularConta.getFrame(); - Component dadosConta = frame.getComponent(4); - JTabbedPane tabbedPane = (JTabbedPane) ((JPanel) dadosConta).getComponent(3); - JPanel sacar = (JPanel) tabbedPane.getComponent(0); - JTextField valorSaque = (JTextField) sacar.getComponent(2); - JButton saqueButton = (JButton) sacar.getComponent(4); - JLabel saldo = (JLabel) ((JPanel) ((JPanel) dadosConta).getComponent(1)).getComponent(0); - valorSaque.setText("1500"); - saqueButton.doClick(); - - assertEquals("R$ 1000,00", saldo.getText()); - } - - @Test - public void remunera(){ - Tela manipularConta = new ManipularConta(Sistema.getClientes().get(0)); - JPanel frame = manipularConta.getFrame(); - Component dadosConta = frame.getComponent(4); - JTabbedPane tabbedPane = (JTabbedPane) ((JPanel) dadosConta).getComponent(3); - JPanel investir = (JPanel) tabbedPane.getComponent(2); - JButton investirButton = (JButton) investir.getComponent(3); - JLabel saldo = (JLabel) ((JPanel) ((JPanel) dadosConta).getComponent(1)).getComponent(0); - investirButton.doClick(); - - assertEquals("R$ 1010,00", saldo.getText()); - } - - @Test - public void testDeposito1(){ - Tela manipularConta = new ManipularConta(Sistema.getClientes().get(0)); - JPanel frame = manipularConta.getFrame(); - Component dadosConta = frame.getComponent(4); - JTabbedPane tabbedPane = (JTabbedPane) ((JPanel) dadosConta).getComponent(3); - JPanel depositar = (JPanel) tabbedPane.getComponent(1); - JTextField valorDeposito = (JTextField) depositar.getComponent(2); - JButton depositoButton = (JButton) depositar.getComponent(4); - JLabel saldo = (JLabel) ((JPanel) ((JPanel) dadosConta).getComponent(1)).getComponent(0); - valorDeposito.setText("500"); - depositoButton.doClick(); - - assertEquals("R$ 1500,00", saldo.getText()); - } - - -} diff --git a/src/test/java/br/ufpr/lpoo/views/TesteVincularCliente.java b/src/test/java/br/ufpr/lpoo/views/TesteVincularCliente.java deleted file mode 100644 index 11f5ad8..0000000 --- a/src/test/java/br/ufpr/lpoo/views/TesteVincularCliente.java +++ /dev/null @@ -1,149 +0,0 @@ -package br.ufpr.lpoo.views; - -import br.ufpr.lpoo.controllers.Sistema; -import br.ufpr.lpoo.models.*; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import javax.swing.*; -import java.awt.*; - -import static org.junit.Assert.*; - - -public class TesteVincularCliente { - - @Before - public void setUp() { - Endereco endereco = new Endereco("Rua", "Bairro", "1", "Cidade"); - Cliente cliente1 = new Cliente("Maria", "Silva", endereco, "302.595.890-12", "12345678901"); - Sistema.cadastrarCliente(cliente1); - } - - @After - public void tearDown() { - Sistema.getClientes().clear(); - } - - @Test - public void testInstanciarTelaVazia() { - Tela vincularCliente = new VincularCliente(); - JPanel frame = vincularCliente.getFrame(); - Component formulario = frame.getComponent(3); - - assertNotNull(frame); - assertNotNull(formulario); - assertFalse(formulario.isVisible()); - } - - @Test - public void vincularContaCorrente() { - VincularCliente vincularCliente = new VincularCliente(); - JPanel frame = vincularCliente.getFrame(); - JComboBox tipoConta = (JComboBox) frame.getComponent(1); - JPanel formulario = (JPanel) frame.getComponent(3); - JTextField depositoInicial = (JTextField) formulario.getComponent(8); - JTextField limite = (JTextField) formulario.getComponent(7); - JButton salvarButton = (JButton) formulario.getComponent(1); - - JScrollPane scrollPane = (JScrollPane) frame.getComponent(2); - JTable tabela = (JTable) scrollPane.getViewport().getView(); - tabela.selectAll(); - - tipoConta.setSelectedItem("Conta Corrente"); - depositoInicial.setText("1000"); - limite.setText("500"); - salvarButton.doClick(); - - Cliente cliente = Sistema.getClientes().get(0); - assertTrue(cliente.getConta() instanceof ContaCorrente); - assertEquals(1000, cliente.getConta().getSaldo(), 0.01); - assertEquals(500, ((ContaCorrente) cliente.getConta()).getLimite(), 0.01); - } - - @Test - public void vincularContaInvestimento() { - VincularCliente vincularCliente = new VincularCliente(); - JPanel frame = vincularCliente.getFrame(); - JComboBox tipoConta = (JComboBox) frame.getComponent(1); - JPanel formulario = (JPanel) frame.getComponent(3); - JTextField depositoInicial = (JTextField) formulario.getComponent(8); - JTextField montanteMinimo = (JTextField) formulario.getComponent(7); - JTextField depositoMinimo = (JTextField) formulario.getComponent(6); - JButton salvarButton = (JButton) formulario.getComponent(1); - - JScrollPane scrollPane = (JScrollPane) frame.getComponent(2); - JTable tabela = (JTable) scrollPane.getViewport().getView(); - tabela.selectAll(); - - tipoConta.setSelectedItem("Conta Investimento"); - depositoInicial.setText("1000"); - montanteMinimo.setText("500"); - depositoMinimo.setText("100"); - salvarButton.doClick(); - - Cliente cliente = Sistema.getClientes().get(0); - assertTrue(cliente.getConta() instanceof ContaInvestimento); - assertEquals(1000, cliente.getConta().getSaldo(), 0.01); - assertEquals(500, ((ContaInvestimento) cliente.getConta()).getMontanteMinimo(), 0.01); - } - - @Test - public void excluirConta() { - VincularCliente vincularCliente = new VincularCliente(); - JPanel frame = vincularCliente.getFrame(); - JComboBox tipoConta = (JComboBox) frame.getComponent(1); - JPanel formulario = (JPanel) frame.getComponent(3); - JTextField depositoInicial = (JTextField) formulario.getComponent(8); - JTextField montanteMinimo = (JTextField) formulario.getComponent(7); - JTextField depositoMinimo = (JTextField) formulario.getComponent(6); - JButton salvarButton = (JButton) formulario.getComponent(1); - JButton excluirButton = (JButton) formulario.getComponent(0); - - JScrollPane scrollPane = (JScrollPane) frame.getComponent(2); - JTable tabela = (JTable) scrollPane.getViewport().getView(); - tabela.selectAll(); - - tipoConta.setSelectedItem("Conta Investimento"); - depositoInicial.setText("1000"); - montanteMinimo.setText("500"); - depositoMinimo.setText("100"); - salvarButton.doClick(); - - tabela.selectAll(); - - excluirButton.doClick(); - - Cliente cliente = Sistema.getClientes().get(0); - assertNull(cliente.getConta()); - } - - @Test - public void testRedirecionarParaManipularConta() { - VincularCliente vincularCliente = new VincularCliente(); - JPanel frame = vincularCliente.getFrame(); - JComboBox tipoConta = (JComboBox) frame.getComponent(1); - JPanel formulario = (JPanel) frame.getComponent(3); - JTextField depositoInicial = (JTextField) formulario.getComponent(8); - JTextField montanteMinimo = (JTextField) formulario.getComponent(7); - JTextField depositoMinimo = (JTextField) formulario.getComponent(6); - JButton salvarButton = (JButton) formulario.getComponent(1); - JButton gerenciarButton = (JButton) formulario.getComponent(2); - - JScrollPane scrollPane = (JScrollPane) frame.getComponent(2); - JTable tabela = (JTable) scrollPane.getViewport().getView(); - tabela.selectAll(); - - tipoConta.setSelectedItem("Conta Investimento"); - depositoInicial.setText("1000"); - montanteMinimo.setText("500"); - depositoMinimo.setText("100"); - salvarButton.doClick(); - - tabela.selectAll(); - gerenciarButton.doClick(); - - - } -}