Java tutorial
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package br.edu.ifrs.restinga.sgru.modelo; import br.edu.ifrs.restinga.sgru.excessao.FotoNaoEncontradaException; import br.edu.ifrs.restinga.sgru.excessao.MatriculaInvalidaException; import br.edu.ifrs.restinga.sgru.excessao.PeriodoEntreAlmocosInvalidoException; import br.edu.ifrs.restinga.sgru.excessao.SaldoInsuficienteException; import br.edu.ifrs.restinga.sgru.excessao.TicketInvalidoException; import br.edu.ifrs.restinga.sgru.excessao.UsuarioInvalidoException; import br.edu.ifrs.restinga.sgru.excessao.ValorAberturaCaixaInvalido; import br.edu.ifrs.restinga.sgru.excessao.ValorAlmocoInvalidoException; import br.edu.ifrs.restinga.sgru.excessao.ValorRecargaInvalidoException; import br.edu.ifrs.restinga.sgru.persistencia.CaixaRUDAO; import br.edu.ifrs.restinga.sgru.persistencia.ClienteDAO; import com.lowagie.text.Cell; import com.lowagie.text.Document; import com.lowagie.text.DocumentException; import com.lowagie.text.Element; import com.lowagie.text.PageSize; import com.lowagie.text.Paragraph; import com.lowagie.text.Table; import com.lowagie.text.pdf.PdfWriter; import java.awt.Desktop; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.text.NumberFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Locale; /** * Classe que implementa o padro GRASP "Controlador" para as vendas realizadas * no caixa. * * @author marcelo.lima */ public class ControladorVenda { private final int FORMA_PGTO_PAYPAL = 1; private CaixaRU caixaRU; private Cliente cliente; private Funcionario operador; private Recarga recarga; private int formaPgto; private int quantidade = 1; private double valorTickets = this.quantidade * ValorAlmoco.carregarValorAtualAlmoco().getValorAlmoco(); public ControladorVenda() { this.formaPgto = this.FORMA_PGTO_PAYPAL; } /** * @return the FORMA_PGTO_PAYPAL */ public int getFORMA_PGTO_PAYPAL() { return FORMA_PGTO_PAYPAL; } /** * @return the caixaRU */ public CaixaRU getCaixaRU() { return caixaRU; } /** * @param caixaRU the caixaRU to set */ public void setCaixaRU(CaixaRU caixaRU) { this.caixaRU = caixaRU; } /** * @return the cliente */ public Cliente getCliente() { return cliente; } /** * @param cliente the cliente to set */ public void setCliente(Cliente cliente) { this.cliente = cliente; } /** * @return the operador */ public Funcionario getOperador() { return operador; } /** * @param operador the operador to set */ public void setOperador(Funcionario operador) { this.operador = operador; } /** * Retorna o valor a pagar pelo almoo * * @return O valor a pagar pelo almoo * @throws ArrayIndexOutOfBoundsException Caso no exista almoo realizado * @throws ValorAlmocoInvalidoException Caso no encontre um valor de almoo * cadastrado */ public double getValorPagoAlmoco() throws ArrayIndexOutOfBoundsException, ValorAlmocoInvalidoException { return caixaRU.ultimoAlmocoVendido().getValorAlmoco().getValorAlmoco(); } /** * @return the recarga */ public Recarga getRecarga() { return recarga; } /** * @param recarga the recarga to set */ public void setRecarga(Recarga recarga) { this.recarga = recarga; } /** * Seta o cliente para a recarga e, caso haja operador logado, seta o * operador * * @param pessoa A pessoa logada no sistema */ public void setClienteRecarga(Pessoa pessoa) { if (pessoa instanceof Funcionario) { this.operador = (Funcionario) pessoa; // O cliente nao estah logado no sistema, mas precisa ser instanciado this.cliente = new Cliente(); } else { // Cliente logado no sistema this.cliente = (Cliente) pessoa; } } /** * @return the formaPgto */ public int getFormaPgto() { return formaPgto; } /** * @param formaPgto the formaPgto to set */ public void setFormaPgto(int formaPgto) { this.formaPgto = formaPgto; } /** * @return */ public int getQuantidade() { return quantidade; } /** * @param quantidade */ public void setQuantidade(int quantidade) { this.quantidade = quantidade; } public double getValorTickets() { return valorTickets; } public void setValorTickets(double valorTickets) { this.valorTickets = valorTickets; } /** * Instancia um objeto recarga com a data atual e seu valor atualizado como * false */ public void iniciarRecarga() { this.recarga = new Recarga(); this.recarga.setDataCredito(Calendar.getInstance()); this.recarga.setUtilizado(false); } /** * Realiza a recarga para o cliente * * @throws br.edu.ifrs.restinga.sgru.excessao.MatriculaInvalidaException * Caso a matrcula informada no esteja cadastrada * @throws br.edu.ifrs.restinga.sgru.excessao.ValorRecargaInvalidoException * Caso o valor da recarga seja invlido */ public void realizarRecarga() throws MatriculaInvalidaException, ValorRecargaInvalidoException { // Verifica valores invalidos para recarga if (this.recarga.getValorRecarregado() <= 0) { throw new ValorRecargaInvalidoException("Valor invlido de recarga!"); } // Recarga realizada no caixa if (this.operador != null) { ClienteDAO daoCliente = new ClienteDAO(); this.cliente = daoCliente.carregar(this.cliente.getMatricula()); // Seta o cartao da recarga this.recarga.setCartao(this.cliente.getCartao()); // Atualiza o saldo do cartao this.recarga.getCartao() .setSaldo(this.recarga.getCartao().getSaldo() + this.recarga.getValorRecarregado()); // Caso o valor da ultima regarga seja menor ou igual a zero, deve-se atualizar o valor if (this.recarga.getCartao().getSaldoUltimaRecarga() <= 0) { this.recarga.getCartao().setSaldoUltimaRecarga( this.recarga.getCartao().getSaldoUltimaRecarga() + this.recarga.getValorRecarregado()); this.recarga.setUtilizado(true); } VendaTicketsRecargas vendaTicketsRecargas = new VendaTicketsRecargas(); vendaTicketsRecargas.setCaixaRU(this.caixaRU); vendaTicketsRecargas.setRecarga(recarga); vendaTicketsRecargas.realizarRecargaCaixa(); this.caixaRU.atualizarLstVendaTicketsRecargas(vendaTicketsRecargas); } else { // Recarga realizada na pagina do cliente this.recarga.setCartao(this.cliente.getCartao()); // Atualiza o saldo do cartao this.recarga.getCartao() .setSaldo(this.recarga.getCartao().getSaldo() + this.recarga.getValorRecarregado()); // Caso o valor da ultima regarga seja menor ou igual a zero, deve-se atualizar o valor if (this.recarga.getCartao().getSaldoUltimaRecarga() <= 0) { this.recarga.getCartao().setSaldoUltimaRecarga( this.recarga.getCartao().getSaldoUltimaRecarga() + this.recarga.getValorRecarregado()); this.recarga.setUtilizado(true); } VendaTicketsRecargas vendaTicketsRecargas = new VendaTicketsRecargas(); vendaTicketsRecargas.setRecarga(recarga); vendaTicketsRecargas.realizarRecargaPaginaCliente(); } } /** * Verifica se o caixa est aberto * * @return A prxima pgina a ser visualizada pelo operador e Null, caso o * caixa esteja fechado */ public String carregarCaixaAberto() { CaixaRUDAO dao = new CaixaRUDAO(); this.caixaRU = dao.carregarCaixaAberto(this.operador, Calendar.getInstance()); if (this.caixaRU != null) { // Carrega o valor atual do almoco this.caixaRU.carregarValorAtualAlmoco(); if (this.operador.getTipoFuncionario().getCodigo().equals(Funcionario.OPERADOR_CAIXA)) { // verifica se a lista de almocos estah preenchida this.caixaRU.preencherListaAlmoco(); return "caixa"; } else if (this.operador.getTipoFuncionario().getCodigo().equals(Funcionario.OPERADOR_SISTEMA)) { // verifica se a lista de venda ticket/recargas estah preenchida this.caixaRU.preencherListaVendaTicketsRecargas(); return "recarregarCartao"; } } // Se nao encontrar o caixa, retorna null this.caixaRU = new CaixaRU(); // Verifica qual lista instanciar: lstVendaAlmoco, para venda de almocos; // e lstVendaTicketsRecargas, para venda de recargas if (this.operador.getTipoFuncionario().getCodigo().equals(Funcionario.OPERADOR_CAIXA)) { this.caixaRU.setLstVendaAlmoco(new ArrayList()); } else if (this.operador.getTipoFuncionario().getCodigo().equals(Funcionario.OPERADOR_SISTEMA)) { this.caixaRU.setLstVendaTicketsRecargas(new ArrayList()); } return null; } /** * Carrega um caixa j aberto (com valor de fechamento zerado) ou abre um * novo caixa * * @param valorAbertura O valor de abertura do caixa * @return A prxima pgina a ser visitada pelo operador * @throws br.edu.ifrs.restinga.sgru.excessao.ValorAberturaCaixaInvalido * Caso o valor de abertura informado seja zero ou negativo */ public String realizarAberturaCaixa(double valorAbertura) throws ValorAberturaCaixaInvalido { this.getCaixaRU().realizarAberturaCaixa(this.operador, valorAbertura); if (this.operador.getTipoFuncionario().getCodigo().equals(Funcionario.OPERADOR_CAIXA)) { return "caixa"; } else if (this.operador.getTipoFuncionario().getCodigo().equals(Funcionario.OPERADOR_SISTEMA)) { return "recarregarCartao"; } return null; } /** * Realiza uma venda de almoco com cartao para o cliente * * @param matricula A matrcula do cliente * @throws br.edu.ifrs.restinga.sgru.excessao.MatriculaInvalidaException * Caso a matrcula no seja localizada * @throws br.edu.ifrs.restinga.sgru.excessao.UsuarioInvalidoException Caso * o usurio no seja um cliente * @throws br.edu.ifrs.restinga.sgru.excessao.SaldoInsuficienteException * Caso o cliente no possua saldo para a compra do almoo * @throws * br.edu.ifrs.restinga.sgru.excessao.PeriodoEntreAlmocosInvalidoException * Caso o prazo para aquisio de um outro almoo no tenha expirado * @throws br.edu.ifrs.restinga.sgru.excessao.ValorAlmocoInvalidoException * Caso no encontre valor de almoo */ public void realizarVendaAlmocoCartao(String matricula) throws MatriculaInvalidaException, UsuarioInvalidoException, SaldoInsuficienteException, ValorAlmocoInvalidoException, PeriodoEntreAlmocosInvalidoException { this.getCaixaRU().realizarVendaAlmocoCartao(matricula); } /** * Realiza uma venda de almoo com ticket * * @param codigo O cdigo do ticket apresentado * @throws br.edu.ifrs.restinga.sgru.excessao.TicketInvalidoException Caso o * ticket esteja vencido ou no seja encontrado */ public void realizarVendaAlmocoTicket(int codigo) throws TicketInvalidoException { String descodigo = Integer.toHexString(codigo); descodigo = String.format("%07d", Integer.parseInt(descodigo)); String invcodigo = ""; for (char inv : descodigo.toCharArray()) { invcodigo = inv + invcodigo; } codigo = Integer.parseInt(invcodigo); this.getCaixaRU().realizarVendaAlmocoTicket(codigo); } /** * Calcular o valor total da venda de tickets */ public void calcularVendaTicket() { this.valorTickets = this.quantidade * ValorAlmoco.carregarValorAtualAlmoco().getValorAlmoco(); } /** * Realiza a venda de um ticket para um cliente * * @param documento * @throws br.edu.ifrs.restinga.sgru.excessao.TicketInvalidoException */ //public void realizarVendaTicket(Object documento) throws TicketInvalidoException { public void realizarVendaTicket() throws TicketInvalidoException { if (this.quantidade <= 0) { throw new TicketInvalidoException("Venda de Quantidade invalida!"); } Document pdfTicket = new Document(); File temp; try { temp = File.createTempFile("imp_ticket", ".pdf"); PdfWriter.getInstance(pdfTicket, new FileOutputStream(temp)); pdfTicket.open(); pdfTicket.setPageSize(PageSize.A4); Table tabela = new Table(1); tabela.setWidth(100); for (int i = 0; i < this.quantidade; i++) { VendaTicketsRecargas vendaTicketsRecarga = new VendaTicketsRecargas(); vendaTicketsRecarga.setCaixaRU(this.caixaRU); vendaTicketsRecarga.realizarVendaTicket(); Cell celula = new Cell(); celula.setHorizontalAlignment(Element.ALIGN_CENTER); celula.add(new Paragraph("SISTEMA DE GERENCIAMENTO DE RESTAURANTE UNIVERSIT?RIO")); Paragraph parag = new Paragraph(); parag.getFont().setSize(18); parag.add("TICKET"); celula.add(parag); // Gerando o codigo convetido do ticket String conversor = ""; for (char con : String.format("%07d", vendaTicketsRecarga.getTicket().getId()).toCharArray()) { conversor = con + conversor; } parag = new Paragraph(); parag.getFont().setSize(20); parag.add(String.valueOf(Integer.valueOf(conversor, 16))); celula.add(parag); NumberFormat format = NumberFormat.getCurrencyInstance(new Locale("pt", "BR")); format.setMaximumFractionDigits(2); celula.add(new Paragraph("VALOR " + format.format(vendaTicketsRecarga.getTicket().getValor()))); celula.add(new Paragraph(vendaTicketsRecarga.getTicket().getDataCriado().getTime().toString())); celula.add(new Paragraph(" _ ")); tabela.addCell(celula); this.caixaRU.atualizarLstVendaTicketsRecargas(vendaTicketsRecarga); } pdfTicket.add(tabela); } catch (DocumentException | IOException de) { throw new TicketInvalidoException(de.getMessage()); } finally { pdfTicket.close(); } // Abrindo o pdf no pc try { Desktop.getDesktop().open(temp); temp.deleteOnExit(); } catch (IOException ex) { throw new TicketInvalidoException(ex.getMessage()); } } /** * Confirma ou no confirmar a a venda do almoo * * @param confirmar True, para confirmar a venda, e false para no confirmar * @throws br.edu.ifrs.restinga.sgru.excessao.ValorAlmocoInvalidoException * Caso no encontre um valor de almoo cadastrado */ public void finalizarAlmoco(boolean confirmar) throws ValorAlmocoInvalidoException { this.getCaixaRU().finalizarAlmoco(confirmar); } /** * Verifica se a foto do usurio existe * * @throws br.edu.ifrs.restinga.sgru.excessao.FotoNaoEncontradaException * Caso no encontre a foto do cliente */ public void verificarExistenciaFoto() throws FotoNaoEncontradaException { this.caixaRU.ultimoAlmocoVendido().getCartao().getCliente().verificarExistenciaFoto(); } /** * Carrega um cliente * * @param matricula A matrcula do cliente a ser carregado * @throws br.edu.ifrs.restinga.sgru.excessao.MatriculaInvalidaException Se * a matrcula no for encontrada */ public void carregarCliente(String matricula) throws MatriculaInvalidaException { ClienteDAO dao = new ClienteDAO(); cliente = dao.carregar(matricula); } }