br.edu.ifrs.restinga.sgru.bean.RelatorioBean.java Source code

Java tutorial

Introduction

Here is the source code for br.edu.ifrs.restinga.sgru.bean.RelatorioBean.java

Source

/*
 * 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.bean;

import br.edu.ifrs.restinga.sgru.excessao.DataRelatorioInvalidaException;
import br.edu.ifrs.restinga.sgru.excessao.RecargaNaoEncontradaException;
import br.edu.ifrs.restinga.sgru.excessao.RelatorioException;
import br.edu.ifrs.restinga.sgru.modelo.ControladorRelatorio;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Element;
import com.lowagie.text.Font;
import com.lowagie.text.PageSize;
import com.lowagie.text.Paragraph;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.faces.application.ConfigurableNavigationHandler;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import org.primefaces.event.SelectEvent;

/**
 *
 * @author marcelo.lima
 */
@ManagedBean
@SessionScoped
public class RelatorioBean implements Serializable {
    private static final Font CAT_FONT = new Font(Font.TIMES_ROMAN, 18, Font.BOLD);
    private static final Font SMALL_BOLD = new Font(Font.TIMES_ROMAN, 12, Font.BOLD);
    public static final int RELATORIO_COMPRAS = 1;
    public static final int RELATORIO_RECARGAS = 2;
    public static final int FORMA_PGTO_CARTAO = 1;
    public static final int FORMA_PGTO_TICKET = 2;

    private final ControladorRelatorio controlador;
    private Date dataInicialMin;
    private Date dataInicialMax;
    private Date dataFinalMin;
    private final Date dataFinalMax;
    private boolean relatorioCompras;
    private boolean relatorioCartao;

    public RelatorioBean() {
        this.controlador = new ControladorRelatorio();
        // A data inicial maxima eh a data atual
        this.dataInicialMax = new Date();
        // A data final minima eh a data atual
        this.dataFinalMin = new Date();
        // A data final maxima sempre sera a data atual
        this.dataFinalMax = new Date();
        // O tipo de relatorio default eh compras
        this.controlador.setTipoRelatorio(RELATORIO_COMPRAS);
        // A forma de pagamento default eh cartao
        this.controlador.setFormaPgto(FORMA_PGTO_CARTAO);
        // Flag para controlar a ativacao do campo forma de pagamento
        this.relatorioCompras = true;
        // Flag para controlar a ativacao dos campos tipo de usuario e cliente
        this.relatorioCartao = true;
    }

    /**
     * @return the RELATORIO_COMPRAS
     */
    public int getRELATORIO_COMPRAS() {
        return RELATORIO_COMPRAS;
    }

    /**
     * @return the RELATORIO_RECARGAS
     */
    public int getRELATORIO_RECARGAS() {
        return RELATORIO_RECARGAS;
    }

    /**
     * @return the FORMA_PGTO_CARTAO
     */
    public int getFORMA_PGTO_CARTAO() {
        return FORMA_PGTO_CARTAO;
    }

    /**
     * @return the FORMA_PGTO_TICKET
     */
    public int getFORMA_PGTO_TICKET() {
        return FORMA_PGTO_TICKET;
    }

    /**     
     * @return O nome do arquivo para o relatorio
     */
    public String getNomeArquivoRelatorio() {
        return this.controlador.getNomeArquivoRelatorio();
    }

    /**
     * @return the controlador
     */
    public ControladorRelatorio getControlador() {
        return controlador;
    }

    /**
     * @return the dataInicialMin
     */
    public Date getDataInicialMin() {
        return dataInicialMin;
    }

    /**
     * @return the dataInicialMax
     */
    public Date getDataInicialMax() {
        return dataInicialMax;
    }

    /**
     * @return the dataFinalMin
     */
    public Date getDataFinalMin() {
        return dataFinalMin;
    }

    /**
     * @return the dataFinalMax
     */
    public Date getDataFinalMax() {
        return dataFinalMax;
    }

    /**
     * @return the relatorioCompras
     */
    public boolean isRelatorioCompras() {
        return relatorioCompras;
    }

    /**
     * @return the relatorioCartao
     */
    public boolean isRelatorioCartao() {
        return relatorioCartao;
    }

    /**
     * Formata a a data inicial (this.controlador.dataInicial) para o formato dd/mm/aaaa
     * @return Um string com a data formatada
     */
    public String getDataInicialFormatada() {
        SimpleDateFormat fmt = new SimpleDateFormat("dd/MM/yyyy");
        return fmt.format(controlador.getDataInicial().getTime());
    }

    /**
     * Formata a a data final (this.controlador.dataFinal) para o formato dd/mm/aaaa
     * @return Um string com a data formatada
     */
    public String getDataFinalFormatada() {
        SimpleDateFormat fmt = new SimpleDateFormat("dd/MM/yyyy");
        return fmt.format(controlador.getDataFinal().getTime());
    }

    /**
     * Verifica se a lista this.controlador.lstVendaAlmoco est preenchida. 
     * Caso no esteja, redireciona o usurio para a pgina gerencial.
     */
    public void isRelatorioComprasSet() {
        // Caso nao haja lista de venda setada, entao retorna para a pagina gerencial
        if (this.controlador.getLstVendaAlmoco() == null) {
            // O caixa ainda nao esta aberto
            ConfigurableNavigationHandler nav = (ConfigurableNavigationHandler) FacesContext.getCurrentInstance()
                    .getApplication().getNavigationHandler();
            nav.performNavigation("paginaGerencial.xhtml?faces-redirect=true");
        }
    }

    /**
     * Verifica se a lista this.controlador.lstRecargas est preenchida.
     * Caso no esteja, redireciona o usurio para a pgina gerencial.
     */
    public void isRelatorioRecargasSet() {
        // Caso nao haja lista de venda setada, entao retorna para a pagina gerencial
        if (this.controlador.getLstRecargas() == null) {
            // O caixa ainda nao esta aberto
            ConfigurableNavigationHandler nav = (ConfigurableNavigationHandler) FacesContext.getCurrentInstance()
                    .getApplication().getNavigationHandler();
            nav.performNavigation("paginaGerencial.xhtml?faces-redirect=true");
        }
    }

    /**
     * Adapta o componente calendar dataFinal da view
     * @param evento 
     */
    public void tratarDataInicial(SelectEvent evento) {
        Date data = (Date) evento.getObject();
        this.dataFinalMin = data;
    }

    /**
     * Adapta o componente calendar dataInicial da view
     * @param evento 
     */
    public void tratarDataFinal(SelectEvent evento) {
        Date data = (Date) evento.getObject();
        this.dataInicialMax = data;
    }

    /**
     * Habilita ou no um componente na view conforme o tipo de usurio     
     * @return True, se for necessrio habilitar o componente e false, caso contrrio
     */
    public boolean habilitarComponentesGerenciais() {
        return this.controlador.isUsuarioLogadoGerente();
    }

    public boolean habilitarNomeCliente() {
        // Nao ha necessidade de mostrar a coluna nome cliente quando a solicitacao
        // parte de um cliente
        if (!this.habilitarComponentesGerenciais()) {
            return false;
        }
        // Ticket nao tem cliente associado
        return !(this.controlador.getFormaPgto() == FORMA_PGTO_TICKET);
    }

    /**
     * Altera o status dos atributos relatorioCompras, relatorioCartao, 
     * tipo de usurio, cliente e forma de pagamento
     */
    public void alterarStatusRelatorioCompras() {
        this.relatorioCompras = this.controlador.getTipoRelatorio() == RELATORIO_COMPRAS;

        // Se recarga, altera os campos do cliente e tipo cliente para todos        
        this.relatorioCartao = true;
        this.controlador.setCliente(null);
        this.controlador.setTipoCliente(null);
        this.controlador.setFormaPgto(FORMA_PGTO_CARTAO);
    }

    /**
     * Altera o status do atributo relatorioCartao, tipo de usurio e cliente
     */
    public void alterarStatusRelatorioCartao() {
        this.relatorioCartao = this.controlador.getFormaPgto() == FORMA_PGTO_CARTAO;

        this.controlador.setCliente(null);
        this.controlador.setTipoCliente(null);
    }

    /**
     * Solicita a emisso de um relatrio     
     * @return A prxima pgina a ser visitada pelo usurio
     */
    public String emitirRelatorio() {
        String retorno;
        try {
            if (relatorioCompras) {
                this.controlador.buscarDadosRelatorioCompras();
                retorno = "relatorioCompras";
            } else {
                this.controlador.buscarDadosRelatorioRecargas();
                retorno = "relatorioRecargas";
            }
        } catch (DataRelatorioInvalidaException | RelatorioException | RecargaNaoEncontradaException e) {
            enviarMensagem(FacesMessage.SEVERITY_ERROR, e.getMessage());
            return null;
        }
        return retorno;
    }

    /**
     * Cria um cabealho para o documento PDF
     * @param document
     */
    public void preProcessPDF(Object document) {
        try {
            Document pdf = (Document) document;
            pdf.setPageSize(PageSize.A4);
            pdf.open();

            Paragraph preface = new Paragraph();

            // Titulo
            String titulo;
            if (this.relatorioCompras) {
                titulo = "Compras realizadas no perodo de " + this.getDataInicialFormatada() + " a "
                        + this.getDataFinalFormatada();
            } else {
                titulo = "Recargas realizadas no perodo de " + this.getDataInicialFormatada() + " a "
                        + this.getDataFinalFormatada();
            }
            // Titulo centralizado
            preface.setAlignment(Element.ALIGN_CENTER);
            // We add one empty line
            addEmptyLine(preface, 1);
            // Lets write a big header
            preface.add(new Paragraph(titulo, CAT_FONT));
            addEmptyLine(preface, 1);

            // O restante serah alinhado a a esquerda
            preface.setAlignment(Element.ALIGN_LEFT);
            // Nome de quem requisitou o relatorio
            SimpleDateFormat fmt = new SimpleDateFormat("dd/MM/yyyy 's' HH'h'mm");
            String dataSolicitacao = fmt.format(Calendar.getInstance().getTime());
            preface.add(new Paragraph("Relatrio gerado por " + this.controlador.getUsuarioLogado().getNome()
                    + " em " + dataSolicitacao, SMALL_BOLD));

            // Forma de pagamento, Tipo de Cliente e Nome do Cliente            
            if (this.controlador.isUsuarioLogadoGerente()) {
                // Opcao para relatorio de compras apenas
                if (this.relatorioCompras) {
                    String formaPgto;
                    if (this.controlador.getFormaPgto() == FORMA_PGTO_CARTAO) {
                        formaPgto = "Carto";
                    } else {
                        formaPgto = "Ticket";
                    }
                    preface.add(new Paragraph("Forma de Pagamento: " + formaPgto, SMALL_BOLD));
                }

                // Tipo de cliente
                //String tipoUsuario = this.controlador.getDescricaoCodigoCliente();
                String tipoCliente = "Todos";
                if (this.controlador.getTipoCliente() != null) {
                    tipoCliente = this.controlador.getTipoCliente().getDescricao();
                }

                // Tipo de usuario e cliente nao serah impresso para ticket
                if ((this.controlador.getFormaPgto() != FORMA_PGTO_TICKET)) {
                    // Tipo de usuario
                    preface.add(new Paragraph("Tipo de Usurio: " + tipoCliente, SMALL_BOLD));

                    // Cliente           
                    String nomeCliente = "Todos";
                    if (this.controlador.getCliente() != null) {
                        nomeCliente = this.controlador.getCliente().getNome();
                    }
                    preface.add(new Paragraph("Nome do Cliente: " + nomeCliente, SMALL_BOLD));

                }
            }

            addEmptyLine(preface, 1);
            pdf.add(preface);
        } catch (DocumentException e) {
            enviarMensagem(FacesMessage.SEVERITY_ERROR, e.getMessage());
        }
    }

    /**
     * Adiciona uma linha no arquivo PDF
     * @param paragraph
     * @param number 
     */
    private void addEmptyLine(Paragraph paragraph, int number) {
        for (int i = 0; i < number; i++) {
            paragraph.add(new Paragraph(" "));
        }
    }

    /**
     * Envia  viewer uma mensagem com o status da operao
     * @param sev A severidade da mensagem
     * @param msg A mensagem a ser apresentada
     */
    private void enviarMensagem(FacesMessage.Severity sev, String msg) {
        FacesContext context = FacesContext.getCurrentInstance();
        context.addMessage(null, new FacesMessage(sev, msg, ""));
    }
}