com.t2tierp.controller.nfe.NfeCabecalhoController.java Source code

Java tutorial

Introduction

Here is the source code for com.t2tierp.controller.nfe.NfeCabecalhoController.java

Source

/*
 * The MIT License
 * 
 * Copyright: Copyright (C) 2014 T2Ti.COM
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 * 
 * The author may be contacted at: t2ti.com@gmail.com
 *
 * @author Claudio de Barros (T2Ti.com)
 * @version 2.0
 */
package com.t2tierp.controller.nfe;

import java.awt.Image;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.security.KeyStore;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;

import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;
import javax.swing.ImageIcon;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.Unmarshaller;

import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRXmlDataSource;

import org.apache.axis2.classloader.IoUtil;
import org.apache.commons.mail.EmailAttachment;
import org.apache.commons.mail.MultiPartEmail;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.event.SelectEvent;
import org.primefaces.model.UploadedFile;

import br.inf.portalfiscal.nfe.procnfe.TNfeProc;

import com.t2tierp.controller.AbstractController;
import com.t2tierp.controller.T2TiLazyDataModel;
import com.t2tierp.model.bean.cadastros.Certificado;
import com.t2tierp.model.bean.cadastros.Cliente;
import com.t2tierp.model.bean.cadastros.Empresa;
import com.t2tierp.model.bean.cadastros.PessoaCliente;
import com.t2tierp.model.bean.cadastros.Produto;
import com.t2tierp.model.bean.cadastros.Transportadora;
import com.t2tierp.model.bean.nfe.NfeCabecalho;
import com.t2tierp.model.bean.nfe.NfeCalculo;
import com.t2tierp.model.bean.nfe.NfeConfiguracao;
import com.t2tierp.model.bean.nfe.NfeCteReferenciado;
import com.t2tierp.model.bean.nfe.NfeCupomFiscalReferenciado;
import com.t2tierp.model.bean.nfe.NfeDeclaracaoImportacao;
import com.t2tierp.model.bean.nfe.NfeDestinatario;
import com.t2tierp.model.bean.nfe.NfeDetEspecificoArmamento;
import com.t2tierp.model.bean.nfe.NfeDetEspecificoMedicamento;
import com.t2tierp.model.bean.nfe.NfeDetalhe;
import com.t2tierp.model.bean.nfe.NfeDetalheImpostoCofins;
import com.t2tierp.model.bean.nfe.NfeDetalheImpostoIcms;
import com.t2tierp.model.bean.nfe.NfeDetalheImpostoIi;
import com.t2tierp.model.bean.nfe.NfeDetalheImpostoIpi;
import com.t2tierp.model.bean.nfe.NfeDetalheImpostoIssqn;
import com.t2tierp.model.bean.nfe.NfeDetalheImpostoPis;
import com.t2tierp.model.bean.nfe.NfeDuplicata;
import com.t2tierp.model.bean.nfe.NfeFatura;
import com.t2tierp.model.bean.nfe.NfeImportacaoDetalhe;
import com.t2tierp.model.bean.nfe.NfeLocalEntrega;
import com.t2tierp.model.bean.nfe.NfeLocalRetirada;
import com.t2tierp.model.bean.nfe.NfeNfReferenciada;
import com.t2tierp.model.bean.nfe.NfeNumero;
import com.t2tierp.model.bean.nfe.NfeProdRuralReferenciada;
import com.t2tierp.model.bean.nfe.NfeReferenciada;
import com.t2tierp.model.bean.nfe.NfeTransporte;
import com.t2tierp.model.bean.nfe.NfeTransporteReboque;
import com.t2tierp.model.bean.nfe.NfeTransporteVolume;
import com.t2tierp.model.bean.nfe.RespostaSefaz;
import com.t2tierp.model.bean.tributacao.TributIss;
import com.t2tierp.model.bean.tributacao.TributOperacaoFiscal;
import com.t2tierp.model.bean.tributacao.ViewTributacaoCofins;
import com.t2tierp.model.bean.tributacao.ViewTributacaoIcms;
import com.t2tierp.model.bean.tributacao.ViewTributacaoIcmsCustom;
import com.t2tierp.model.bean.tributacao.ViewTributacaoIpi;
import com.t2tierp.model.bean.tributacao.ViewTributacaoPis;
import com.t2tierp.model.dao.Filtro;
import com.t2tierp.model.dao.InterfaceDAO;
import com.t2tierp.model.dao.controleestoque.ControleEstoqueDAO;
import com.t2tierp.util.Biblioteca;
import com.t2tierp.util.FacesContextUtil;

@ManagedBean
@ViewScoped
public class NfeCabecalhoController extends AbstractController<NfeCabecalho> implements Serializable {

    private static final long serialVersionUID = 1L;
    private NfeCabecalhoDataModel dataModel;
    private NfeDetalhe nfeDetalhe;
    private NfeDetalhe nfeDetalheSelecionado;
    private NfeDetalheImpostoIcms nfeDetalheImpostoIcms = new NfeDetalheImpostoIcms();
    private NfeTransporteReboque nfeTransporteReboque;
    private NfeTransporteReboque nfeTransporteReboqueSelecionado;
    private Integer numeroItem = 0;
    private boolean podeIncluirProduto = false;
    @EJB
    private InterfaceDAO<TributOperacaoFiscal> operacaoFiscalDao;
    @EJB
    private InterfaceDAO<Produto> produtoDao;
    PessoaCliente pessoaCliente;
    @EJB
    private InterfaceDAO<PessoaCliente> pessoaClienteDao;
    @EJB
    private InterfaceDAO<ViewTributacaoIcms> icmsDao;
    @EJB
    private InterfaceDAO<ViewTributacaoIpi> ipiDao;
    @EJB
    private InterfaceDAO<ViewTributacaoPis> pisDao;
    @EJB
    private InterfaceDAO<ViewTributacaoCofins> cofinsDao;
    @EJB
    private InterfaceDAO<ViewTributacaoIcmsCustom> icmsCustomDao;
    @EJB
    private InterfaceDAO<NfeNumero> nfeNumeroDao;
    @EJB
    private InterfaceDAO<NfeConfiguracao> nfeConfiguracaoDao;
    @EJB
    private ControleEstoqueDAO controleEstoqueDao;
    @EJB
    private InterfaceDAO<NfeDetalhe> nfeDetalheDao;
    @EJB
    private InterfaceDAO<Transportadora> transportadoraDao;

    private boolean dadosSalvos = false;
    private String senhaCertificado;
    private Certificado certificado;
    private String justificativaCancelamento;
    private KeyStore keyStore;
    private final String diretorioXml = "modulos/nfe/xml";

    @Override
    public Class<NfeCabecalho> getClazz() {
        return NfeCabecalho.class;
    }

    @Override
    public String getFuncaoBase() {
        return "NFE_CABECALHO";
    }

    @Override
    public T2TiLazyDataModel<NfeCabecalho> getDataModel() {
        if (dataModel == null) {
            dataModel = new NfeCabecalhoDataModel();
            dataModel.setClazz(getClazz());
            dataModel.setDao(dao);
        }
        return dataModel;
    }

    @Override
    public void incluir() {
        super.incluir();
        getObjeto().setDestinatario(new NfeDestinatario());
        getObjeto().getDestinatario().setNfeCabecalho(getObjeto());
        getObjeto().setLocalEntrega(new NfeLocalEntrega());
        getObjeto().getLocalEntrega().setNfeCabecalho(getObjeto());
        getObjeto().setLocalRetirada(new NfeLocalRetirada());
        getObjeto().getLocalRetirada().setNfeCabecalho(getObjeto());
        getObjeto().setTransporte(new NfeTransporte());
        getObjeto().getTransporte().setNfeCabecalho(getObjeto());
        getObjeto().setFatura(new NfeFatura());
        getObjeto().getFatura().setNfeCabecalho(getObjeto());

        getObjeto().setListaNfeReferenciada(new HashSet<NfeReferenciada>());
        getObjeto().setListaNfReferenciada(new HashSet<NfeNfReferenciada>());
        getObjeto().setListaCteReferenciado(new HashSet<NfeCteReferenciado>());
        getObjeto().setListaProdRuralReferenciada(new HashSet<NfeProdRuralReferenciada>());
        getObjeto().setListaCupomFiscalReferenciado(new HashSet<NfeCupomFiscalReferenciado>());
        getObjeto().getTransporte().setListaTransporteReboque(new HashSet<NfeTransporteReboque>());
        getObjeto().getTransporte().setListaTransporteVolume(new HashSet<NfeTransporteVolume>());
        getObjeto().setListaDuplicata(new HashSet<NfeDuplicata>());
        getObjeto().setListaNfeDetalhe(new ArrayList<NfeDetalhe>());

        valoresPadrao();
        dadosSalvos = false;
    }

    @Override
    public void alterar() {
        super.alterar();
        dadosSalvos = true;
    }

    @Override
    public void salvar() {
        if (verificaAutorizado()) {
            FacesContextUtil.adiconaMensagem(FacesMessage.SEVERITY_INFO,
                    "Esta NF-e j foi autorizada. Os dados no foram salvos.", "");
        } else if (verificaCancelado()) {
            FacesContextUtil.adiconaMensagem(FacesMessage.SEVERITY_INFO,
                    "Esta NF-e j foi cancelada. Os dados no foram salvos.", "");
        } else {
            try {
                if (getObjeto().getId() == null) {
                    numeroNfe();
                    configuraNfe();
                } else {
                    HashMap<String, Object> filtro = new HashMap<>();
                    filtro.put("nfeCabecalho", getObjeto());
                    String atributos[] = new String[] { "produto", "quantidadeComercial" };
                    List<NfeDetalhe> listaNfeDetOld = nfeDetalheDao.getBeans(NfeDetalhe.class, 0, 0, null, null,
                            filtro, atributos);
                    for (NfeDetalhe detalhe : listaNfeDetOld) {
                        controleEstoqueDao.atualizaEstoque(detalhe.getProduto().getId(),
                                detalhe.getQuantidadeComercial());
                    }
                }
                defineNumeroItens();
                controleEstoqueDao.atualizaEstoque(getObjeto().getListaNfeDetalhe());
                super.salvar();
                dadosSalvos = true;
            } catch (Exception e) {
                e.printStackTrace();
                FacesContextUtil.adiconaMensagem(FacesMessage.SEVERITY_ERROR,
                        "Ocorreu um erro ao salvar o registro", e.getMessage());
            }
        }
    }

    private void configuraNfe() throws Exception {
        NfeConfiguracao configuracao = nfeConfiguracaoDao.getBean(NfeConfiguracao.class, new ArrayList<Filtro>());

        getObjeto().setAmbiente(configuracao.getWebserviceAmbiente());
        getObjeto().setProcessoEmissao(configuracao.getProcessoEmissao());
        getObjeto().setVersaoProcessoEmissao(configuracao.getVersaoProcessoEmissao());
    }

    private void defineNumeroItens() throws Exception {
        int i = 0;
        for (NfeDetalhe nfeDetalhe : getObjeto().getListaNfeDetalhe()) {
            nfeDetalhe.setNumeroItem(++i);

            for (NfeDetEspecificoArmamento armamento : nfeDetalhe.getListaArmamento()) {
                armamento.setNfeDetalhe(nfeDetalhe);
            }

            for (NfeDeclaracaoImportacao declaracaoImportacao : nfeDetalhe.getListaDeclaracaoImportacao()) {
                declaracaoImportacao.setNfeDetalhe(nfeDetalhe);
                for (NfeImportacaoDetalhe importacaoDetalhe : declaracaoImportacao.getListaImportacaoDetalhe()) {
                    importacaoDetalhe.setNfeDeclaracaoImportacao(declaracaoImportacao);
                }
            }
            for (NfeDetEspecificoMedicamento medicamento : nfeDetalhe.getListaMedicamento()) {
                medicamento.setNfeDetalhe(nfeDetalhe);
            }
        }
    }

    @SuppressWarnings("rawtypes")
    public void enviaNfe() {
        if (dadosSalvos) {
            if (verificaAutorizado()) {
                FacesContextUtil.adiconaMensagem(FacesMessage.SEVERITY_INFO,
                        "Esta NF-e j foi autorizada. Envio no realizado", null);
            } else if (verificaCancelado()) {
                FacesContextUtil.adiconaMensagem(FacesMessage.SEVERITY_INFO,
                        "Esta NF-e j foi cancelada. Envio no realizado", null);
            } else if (certificado == null || certificado.getArquivo() == null || certificado.getSenha() == null) {
                FacesContextUtil.adiconaMensagem(FacesMessage.SEVERITY_INFO,
                        " Necessrio informar os dados do certificado antes do envio!", null);
            } else {
                try {
                    Empresa empresa = FacesContextUtil.getEmpresaUsuario();

                    getKeyStore();

                    GeraXMLEnvio geraXmlNfe = new GeraXMLEnvio();
                    String xml = geraXmlNfe.gerarXmlEnvio(empresa, getObjeto(), certificado.getAlias(),
                            getKeyStore(), certificado.getSenha());
                    System.out.println("esse  o xml " + xml);

                    try {
                        ValidaXmlNfe validaXmlNfe = new ValidaXmlNfe();
                        validaXmlNfe.validaXmlEnvio(xml, (ServletContext) FacesContext.getCurrentInstance()
                                .getExternalContext().getContext());
                    } catch (Exception e) {
                        throw new Exception("Erro na validao do XML\n" + e.getMessage());
                    }

                    EnviaNfe envia = new EnviaNfe();
                    Map mapResposta = envia.enviaNfe(xml, certificado.getAlias(), getKeyStore(),
                            certificado.getSenha(), getObjeto().getUfEmitente().toString(),
                            String.valueOf(getObjeto().getAmbiente()));

                    Boolean autorizado = (Boolean) mapResposta.get("autorizado");
                    RespostaSefaz respostaSefaz = new RespostaSefaz();
                    respostaSefaz.setAutorizado(autorizado);
                    respostaSefaz.setResposta((String) mapResposta.get("resposta"));
                    respostaSefaz.setNumeroRecibo((String) mapResposta.get("numeroRecibo"));
                    respostaSefaz.setXmlEnviNfe((String) mapResposta.get("xmlEnviNfe"));

                    if (autorizado) {
                        String xmlProc = (String) mapResposta.get("xmlProc");
                        salvaArquivos(xmlProc);
                    }

                    FacesContextUtil.adiconaMensagem(FacesMessage.SEVERITY_INFO, "NF-e enviada com sucesso!", null);
                } catch (Exception e) {
                    e.printStackTrace();
                    FacesContextUtil.adiconaMensagem(FacesMessage.SEVERITY_ERROR,
                            "Ocorreu um erro ao enviar a NF-e!", e.getMessage());
                }
            }
        } else {
            FacesContextUtil.adiconaMensagem(FacesMessage.SEVERITY_INFO,
                    "Antes de enviar a NF-e  necessrio salvar as informaes no banco!", null);
        }
    }

    @SuppressWarnings({ "unchecked", "rawtypes" })
    private void salvaArquivos(String xml) throws Exception {
        getObjeto().setStatusNota(5);

        setObjeto(dao.merge(getObjeto()));

        // salva o xml
        ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
        String caminhoArquivo = context.getRealPath(diretorioXml) + System.getProperty("file.separator")
                + getObjeto().getChaveAcesso() + getObjeto().getDigitoChaveAcesso();
        OutputStream outXml = new FileOutputStream(new File(caminhoArquivo + "-nfeproc.xml"));
        outXml.write(xml.getBytes());
        outXml.close();

        // gera e salva o danfe
        Map map = new HashMap();
        Image image = new ImageIcon(context.getRealPath("imagens/logo_t2ti.png")).getImage();
        map.put("Logo", image);

        JRXmlDataSource jrXmlDataSource = new JRXmlDataSource(caminhoArquivo + "-nfeproc.xml",
                "/nfeProc/NFe/infNFe/det");
        JasperPrint jp = JasperFillManager.fillReport(context.getRealPath("modulos/nfe/danfe/danfeR.jasper"), map,
                jrXmlDataSource);
        OutputStream outPdf = new FileOutputStream(new File(caminhoArquivo + ".pdf"));
        outPdf.write(JasperExportManager.exportReportToPdf(jp));
        outPdf.close();
    }

    public void danfe() {
        try {
            if (getObjeto().getStatusNota().intValue() != 5) {
                throw new Exception("NF-e no autorizada. Impresso do Danfe no permitida!");
            }

            ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
            String caminhoArquivo = context.getRealPath(diretorioXml) + System.getProperty("file.separator")
                    + getObjeto().getChaveAcesso() + getObjeto().getDigitoChaveAcesso() + ".pdf";
            File arquivoPdf = new File(caminhoArquivo);
            if (!arquivoPdf.exists()) {
                throw new Exception("Arquivo do danfe no localizado!");
            }

            FacesContextUtil.downloadArquivo(arquivoPdf, arquivoPdf.getName());
        } catch (Exception e) {
            e.printStackTrace();
            FacesContextUtil.adiconaMensagem(FacesMessage.SEVERITY_ERROR, "Ocorreu um erro ao buscar o danfe!",
                    e.getMessage());
        }
    }

    public void enviaEmail() {
        try {
            if (getObjeto().getStatusNota().intValue() != 5) {
                throw new Exception("NF-e no autorizada. Envio de email no permitido!");
            }

            NfeConfiguracao configuracao = nfeConfiguracaoDao.getBean(NfeConfiguracao.class,
                    new ArrayList<Filtro>());

            if (configuracao == null) {
                throw new Exception("Configurao NFe no definida");
            }
            if (configuracao.getEmailAssunto() == null || configuracao.getEmailSenha() == null
                    || configuracao.getEmailServidorSmtp() == null || configuracao.getEmailTexto() == null
                    || configuracao.getEmailUsuario() == null) {
                throw new Exception("Configurao de envio de email no definida");
            }

            MultiPartEmail email = new MultiPartEmail();
            email.setHostName(configuracao.getEmailServidorSmtp());
            email.setFrom(configuracao.getEmpresa().getEmail());
            email.addTo(getObjeto().getDestinatario().getEmail());
            email.setSubject(configuracao.getEmailAssunto());
            email.setMsg(configuracao.getEmailTexto());

            email.setAuthentication(configuracao.getEmailUsuario(), configuracao.getEmailSenha());
            if (configuracao.getEmailPorta() != null) {
                if (configuracao.getEmailAutenticaSsl() != null
                        && configuracao.getEmailAutenticaSsl().equals("S")) {
                    email.setSSLOnConnect(true);
                    email.setSslSmtpPort(configuracao.getEmailPorta().toString());
                } else {
                    email.setSmtpPort(configuracao.getEmailPorta());
                }
            }

            ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();

            EmailAttachment anexo = new EmailAttachment();
            anexo.setPath(context.getRealPath(diretorioXml) + System.getProperty("file.separator")
                    + getObjeto().getChaveAcesso() + getObjeto().getDigitoChaveAcesso() + "-nfeproc.xml");
            anexo.setDisposition(EmailAttachment.ATTACHMENT);
            anexo.setDescription("Nota Fiscal Eletronica");
            anexo.setName(getObjeto().getChaveAcesso() + getObjeto().getDigitoChaveAcesso() + "-nfeproc.xml");

            EmailAttachment anexo2 = new EmailAttachment();
            anexo2.setPath(context.getRealPath(diretorioXml) + System.getProperty("file.separator")
                    + getObjeto().getChaveAcesso() + getObjeto().getDigitoChaveAcesso() + ".pdf");
            anexo2.setDisposition(EmailAttachment.ATTACHMENT);
            anexo2.setDescription("Nota Fiscal Eletronica");
            anexo2.setName(getObjeto().getChaveAcesso() + getObjeto().getDigitoChaveAcesso() + ".pdf");

            email.attach(anexo);
            email.attach(anexo2);

            email.send();

            FacesContextUtil.adiconaMensagem(FacesMessage.SEVERITY_INFO, "Email enviado com sucesso", "");
        } catch (Exception ex) {
            ex.printStackTrace();
            FacesContextUtil.adiconaMensagem(FacesMessage.SEVERITY_ERROR, "Ocorreu um erro ao enviar o email.",
                    ex.getMessage());
        }
    }

    @SuppressWarnings({ "unchecked", "rawtypes" })
    public void cancelaNfe() {
        if (certificado == null || certificado.getArquivo() == null || certificado.getSenha() == null) {
            FacesContextUtil.adiconaMensagem(FacesMessage.SEVERITY_INFO,
                    " Necessrio informar os dados do certificado antes do cancelamento!", null);
        } else {
            try {
                if (justificativaCancelamento == null) {
                    throw new Exception(" necessrio informar uma justificativa para o cancelamento da NF-e.");
                }
                if (justificativaCancelamento.trim().equals("")) {
                    throw new Exception(" necessrio informar uma justificativa para o cancelamento da NF-e.");
                }
                if (justificativaCancelamento.trim().length() < 15) {
                    throw new Exception("A justificativa deve ter no mnimo 15 caracteres.");
                }
                if (justificativaCancelamento.trim().length() > 255) {
                    throw new Exception("A justificativa deve ter no mximo 255 caracteres.");
                }
                if (getObjeto().getStatusNota().intValue() == 6) {
                    throw new Exception("NF-e j cancelada. Cancelamento no permitido!");
                }
                if (getObjeto().getStatusNota().intValue() != 5) {
                    throw new Exception("NF-e no autorizada. Cancelamento no permitido!");
                }

                ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
                String caminhoArquivo = context.getRealPath(diretorioXml) + System.getProperty("file.separator")
                        + getObjeto().getChaveAcesso() + getObjeto().getDigitoChaveAcesso() + "-nfeproc.xml";
                File arquivoXml = new File(caminhoArquivo);
                if (!arquivoXml.exists()) {
                    throw new Exception("Arquivo XML da NF-e no localizado!");
                }

                JAXBContext jc = JAXBContext.newInstance("br.inf.portalfiscal.nfe.procnfe");
                Unmarshaller unmarshaller = jc.createUnmarshaller();

                JAXBElement<TNfeProc> element = (JAXBElement) unmarshaller.unmarshal(arquivoXml);
                String protocolo = element.getValue().getProtNFe().getInfProt().getNProt();

                getKeyStore();

                CancelaNfe cancelaNfe = new CancelaNfe();
                Map dadosCancelamento = cancelaNfe.cancelaNfe(certificado.getAlias(), getKeyStore(),
                        certificado.getSenha(), getObjeto().getUfEmitente().toString(),
                        String.valueOf(getObjeto().getAmbiente()),
                        getObjeto().getChaveAcesso() + getObjeto().getDigitoChaveAcesso(), protocolo,
                        justificativaCancelamento.trim(), getObjeto().getEmpresa().getCnpj());

                RespostaSefaz respostaSefaz = new RespostaSefaz();
                respostaSefaz.setCancelado((Boolean) dadosCancelamento.get("nfeCancelada"));

                String resposta = "";
                if (respostaSefaz.isCancelado()) {
                    // salva o xml
                    caminhoArquivo = context.getRealPath(diretorioXml) + System.getProperty("file.separator")
                            + getObjeto().getChaveAcesso() + getObjeto().getDigitoChaveAcesso() + "-nfeCanc.xml";
                    OutputStream out = new FileOutputStream(new File(caminhoArquivo));
                    out.write(((String) dadosCancelamento.get("xmlCancelamento")).getBytes());
                    out.close();

                    getObjeto().setStatusNota(6);
                    setObjeto(dao.merge(getObjeto()));

                    // atualiza o estoque
                    for (NfeDetalhe nfeDetalhe : getObjeto().getListaNfeDetalhe()) {
                        controleEstoqueDao.atualizaEstoque(nfeDetalhe.getProduto().getId(),
                                nfeDetalhe.getQuantidadeComercial());
                    }

                    resposta += "NF-e Cancelada com sucesso";
                } else {
                    resposta += "A NF-e NO foi cancelada.";
                }
                resposta += "\n" + (String) dadosCancelamento.get("motivo1");
                resposta += "\n" + (String) dadosCancelamento.get("motivo2");

                respostaSefaz.setResposta(resposta);

                FacesContextUtil.adiconaMensagem(FacesMessage.SEVERITY_INFO, respostaSefaz.getResposta(), "");
            } catch (Exception e) {
                e.printStackTrace();
                FacesContextUtil.adiconaMensagem(FacesMessage.SEVERITY_ERROR, "Ocorreu um erro ao cancelar a NF-e!",
                        e.getMessage());
            }
        }
    }

    public void carregaDadosCertificado() {
        try {
            if (certificado != null) {
                if (senhaCertificado != null) {
                    certificado.setSenha(senhaCertificado.toCharArray());

                    FacesContextUtil.adiconaMensagem(FacesMessage.SEVERITY_INFO,
                            "Dados do certificado carregado com sucesso!", null);
                } else {
                    certificado = null;
                    FacesContextUtil.adiconaMensagem(FacesMessage.SEVERITY_ERROR,
                            "Senha do certficado no informada!", null);
                }
            } else {
                FacesContextUtil.adiconaMensagem(FacesMessage.SEVERITY_ERROR,
                        "Upload do certificado no foi realizado!", null);
            }
        } catch (Exception e) {
            certificado = null;
            e.printStackTrace();
            FacesContextUtil.adiconaMensagem(FacesMessage.SEVERITY_ERROR,
                    "Ocorreu um erro ao carregar os dados do certificado!", e.getMessage());
        }
    }

    public void uploadCertificado(FileUploadEvent event) {
        try {
            UploadedFile arquivoUpload = event.getFile();
            keyStore = null;
            certificado = new Certificado();
            certificado.setArquivo(IoUtil.getBytes(arquivoUpload.getInputstream()));
            arquivoUpload.getInputstream().close();
        } catch (Exception e) {
            certificado = null;
            FacesContextUtil.adiconaMensagem(FacesMessage.SEVERITY_ERROR,
                    "Ocorreu um erro ao realizar o upload do arquivo!", e.getMessage());
            // e.printStackTrace();
        }
    }

    private KeyStore getKeyStore() throws Exception {
        if (keyStore == null) {
            keyStore = KeyStore.getInstance("PKCS12");
            keyStore.load(new ByteArrayInputStream(certificado.getArquivo()), certificado.getSenha());
            certificado.setAlias(keyStore.aliases().nextElement());
        }
        return keyStore;
    }

    public boolean verificaAutorizado() {
        return getObjeto().getStatusNota().intValue() == 5;
    }

    public boolean verificaCancelado() {
        return getObjeto().getStatusNota().intValue() == 6;
    }

    private void valoresPadrao() {
        getObjeto().setStatusNota(0);
        getObjeto().setTipoOperacao(1);
        getObjeto().setStatusNota(0);
        getObjeto().setFormatoImpressaoDanfe(1);
        getObjeto().setConsumidorOperacao(1);
        getObjeto().setConsumidorPresenca(1);
        getObjeto().setTipoEmissao(1);
        getObjeto().setFinalidadeEmissao(1);
        getObjeto().setIndicadorFormaPagamento(0);
        getObjeto().setLocalDestino(1);
        getObjeto().getTransporte().setModalidadeFrete(0);

        Date dataAtual = new Date();
        getObjeto().setEmpresa(FacesContextUtil.getEmpresaUsuario());
        getObjeto().setUfEmitente(getObjeto().getEmpresa().getCodigoIbgeUf());
        getObjeto().setDataHoraEmissao(dataAtual);
        getObjeto().setDataHoraEntradaSaida(dataAtual);

        getObjeto().setBaseCalculoIcms(BigDecimal.ZERO);
        getObjeto().setValorIcms(BigDecimal.ZERO);
        getObjeto().setValorTotalProdutos(BigDecimal.ZERO);
        getObjeto().setBaseCalculoIcmsSt(BigDecimal.ZERO);
        getObjeto().setValorIcmsSt(BigDecimal.ZERO);
        getObjeto().setValorIpi(BigDecimal.ZERO);
        getObjeto().setValorPis(BigDecimal.ZERO);
        getObjeto().setValorCofins(BigDecimal.ZERO);
        getObjeto().setValorFrete(BigDecimal.ZERO);
        getObjeto().setValorSeguro(BigDecimal.ZERO);
        getObjeto().setValorDespesasAcessorias(BigDecimal.ZERO);
        getObjeto().setValorDesconto(BigDecimal.ZERO);
        getObjeto().setValorTotal(BigDecimal.ZERO);
        getObjeto().setValorImpostoImportacao(BigDecimal.ZERO);
        getObjeto().setBaseCalculoIssqn(BigDecimal.ZERO);
        getObjeto().setValorIssqn(BigDecimal.ZERO);
        getObjeto().setValorPisIssqn(BigDecimal.ZERO);
        getObjeto().setValorCofinsIssqn(BigDecimal.ZERO);
        getObjeto().setValorServicos(BigDecimal.ZERO);
        getObjeto().setValorRetidoPis(BigDecimal.ZERO);
        getObjeto().setValorRetidoCofins(BigDecimal.ZERO);
        getObjeto().setValorRetidoCsll(BigDecimal.ZERO);
        getObjeto().setBaseCalculoIrrf(BigDecimal.ZERO);
        getObjeto().setValorRetidoIrrf(BigDecimal.ZERO);
        getObjeto().setBaseCalculoPrevidencia(BigDecimal.ZERO);
        getObjeto().setValorRetidoPrevidencia(BigDecimal.ZERO);
        getObjeto().setValorIcmsDesonerado(BigDecimal.ZERO);
    }

    public void detalheImposto() {
        setNfeDetalheImpostoIcms(nfeDetalheSelecionado.getNfeDetalheImpostoIcms());
    }

    public void selecionaOperacaoFiscal(SelectEvent event) {
        TributOperacaoFiscal tributOperacaoFiscal = (TributOperacaoFiscal) event.getObject();
        getObjeto().setNaturezaOperacao(tributOperacaoFiscal.getDescricaoNaNf());
        dadosSalvos = false;
    }

    public void selecionaDestinatario(SelectEvent event) {
        pessoaCliente = (PessoaCliente) event.getObject();
        Cliente cliente = new Cliente();
        cliente.setId(pessoaCliente.getId());
        getObjeto().setCliente(cliente);

        getObjeto().getDestinatario().setCpfCnpj(pessoaCliente.getCpfCnpj());
        getObjeto().getDestinatario().setNome(pessoaCliente.getNome());
        getObjeto().getDestinatario().setLogradouro(pessoaCliente.getLogradouro());
        getObjeto().getDestinatario().setComplemento(pessoaCliente.getComplemento());
        getObjeto().getDestinatario().setNumero(pessoaCliente.getNumero());
        getObjeto().getDestinatario().setBairro(pessoaCliente.getBairro());
        getObjeto().getDestinatario().setNomeMunicipio(pessoaCliente.getCidade());
        getObjeto().getDestinatario().setCodigoMunicipio(pessoaCliente.getMunicipioIbge());
        getObjeto().getDestinatario().setUf(pessoaCliente.getUf());
        getObjeto().getDestinatario().setCep(pessoaCliente.getCep());
        getObjeto().getDestinatario().setTelefone(pessoaCliente.getFone());
        getObjeto().getDestinatario().setInscricaoEstadual(pessoaCliente.getRgIe());
        getObjeto().getDestinatario().setEmail(pessoaCliente.getEmail());
        getObjeto().getDestinatario().setCodigoPais(1058);
        getObjeto().getDestinatario().setNomePais("Brazil");

        getObjeto().setCodigoMunicipio(getObjeto().getDestinatario().getCodigoMunicipio());

        pessoaCliente = null;
        dadosSalvos = false;
    }

    public void incluiProduto() {
        if (getObjeto().getTributOperacaoFiscal() == null) {
            podeIncluirProduto = false;
            FacesContextUtil.adiconaMensagem(FacesMessage.SEVERITY_INFO,
                    "Antes de incluir produtos selecione a Operao Fiscal.", null);
        } else if (getObjeto().getDestinatario().getNome() == null
                || getObjeto().getDestinatario().getNome().isEmpty()) {
            podeIncluirProduto = false;
            FacesContextUtil.adiconaMensagem(FacesMessage.SEVERITY_INFO,
                    "Antes de incluir produtos selecione o destinatrio.", null);
        } else {
            podeIncluirProduto = true;
            nfeDetalhe = new NfeDetalhe();
            nfeDetalhe.setNfeCabecalho(getObjeto());
        }
    }

    public void alteraProduto() {
        nfeDetalhe = nfeDetalheSelecionado;
    }

    public void salvaProduto() {
        try {
            realizaCalculosItem();
            if (!getObjeto().getListaNfeDetalhe().contains(nfeDetalhe)) {
                getObjeto().getListaNfeDetalhe().add(nfeDetalhe);
                atualizaTotais();
                FacesContextUtil.adiconaMensagem(FacesMessage.SEVERITY_INFO, "Registro includo!", null);
            } else {
                atualizaTotais();
                FacesContextUtil.adiconaMensagem(FacesMessage.SEVERITY_INFO, "Registro alterado!", null);
            }
            dadosSalvos = false;
        } catch (Exception e) {
            e.printStackTrace();
            FacesContextUtil.adiconaMensagem(FacesMessage.SEVERITY_ERROR, "Ocorreu um erro ao salvar o registro",
                    e.getMessage());
        }

    }

    public void excluirProduto() {
        if (nfeDetalheSelecionado == null) {
            FacesContextUtil.adiconaMensagem(FacesMessage.SEVERITY_INFO, "Nenhum registro selecionado!", null);
        } else {
            getObjeto().getListaNfeDetalhe().remove(nfeDetalheSelecionado);
            atualizaTotais();
            dadosSalvos = false;
            FacesContextUtil.adiconaMensagem(FacesMessage.SEVERITY_INFO, "Registro excludo!", null);
        }
    }

    private NfeDetalhe realizaCalculosItem() throws Exception {
        nfeDetalhe.setNumeroItem(++numeroItem);
        nfeDetalhe.setGtin(nfeDetalhe.getProduto().getGtin());
        nfeDetalhe.setNomeProduto(nfeDetalhe.getProduto().getDescricaoPdv());
        nfeDetalhe.setNcm(nfeDetalhe.getProduto().getNcm());
        if (nfeDetalhe.getProduto().getExTipi() != null) {
            nfeDetalhe.setExTipi(Integer.valueOf(nfeDetalhe.getProduto().getExTipi()));
        }
        nfeDetalhe.setUnidadeComercial(nfeDetalhe.getProduto().getUnidadeProduto().getSigla());
        nfeDetalhe.setValorUnitarioComercial(nfeDetalhe.getProduto().getValorVenda());

        nfeDetalhe.setCodigoProduto(nfeDetalhe.getGtin());
        nfeDetalhe.setGtinUnidadeTributavel(nfeDetalhe.getGtin());
        nfeDetalhe.setUnidadeTributavel(nfeDetalhe.getUnidadeComercial());
        nfeDetalhe.setValorUnitarioTributavel(nfeDetalhe.getValorUnitarioComercial());
        nfeDetalhe.setValorBrutoProduto(
                Biblioteca.multiplica(nfeDetalhe.getValorUnitarioComercial(), nfeDetalhe.getQuantidadeComercial()));
        nfeDetalhe.setQuantidadeTributavel(nfeDetalhe.getQuantidadeComercial());
        nfeDetalhe.setValorSubtotal(nfeDetalhe.getValorBrutoProduto());
        nfeDetalhe.setEntraTotal(1);
        if (nfeDetalhe.getValorFrete() == null) {
            nfeDetalhe.setValorFrete(BigDecimal.ZERO);
        }
        if (nfeDetalhe.getValorOutrasDespesas() == null) {
            nfeDetalhe.setValorOutrasDespesas(BigDecimal.ZERO);
        }
        if (nfeDetalhe.getValorSeguro() == null) {
            nfeDetalhe.setValorSeguro(BigDecimal.ZERO);
        }
        if (nfeDetalhe.getValorDesconto() == null) {
            nfeDetalhe.setValorDesconto(BigDecimal.ZERO);
        }
        nfeDetalhe.setValorTotal(nfeDetalhe.getValorBrutoProduto().subtract(nfeDetalhe.getValorDesconto()));

        defineTributacao();
        return nfeDetalhe;
    }

    private void defineTributacao() throws Exception {
        TributOperacaoFiscal operacaoFiscal = getObjeto().getTributOperacaoFiscal();
        Empresa empresa = FacesContextUtil.getEmpresaUsuario();
        NfeDestinatario destinatario = getObjeto().getDestinatario();
        nfeDetalhe.setNfeDetalheImpostoIssqn(new NfeDetalheImpostoIssqn());
        nfeDetalhe.getNfeDetalheImpostoIssqn().setNfeDetalhe(nfeDetalhe);
        nfeDetalhe.setNfeDetalheImpostoPis(new NfeDetalheImpostoPis());
        nfeDetalhe.getNfeDetalheImpostoPis().setNfeDetalhe(nfeDetalhe);
        nfeDetalhe.setNfeDetalheImpostoCofins(new NfeDetalheImpostoCofins());
        nfeDetalhe.getNfeDetalheImpostoCofins().setNfeDetalhe(nfeDetalhe);
        nfeDetalhe.setNfeDetalheImpostoIcms(new NfeDetalheImpostoIcms());
        nfeDetalhe.getNfeDetalheImpostoIcms().setNfeDetalhe(nfeDetalhe);
        nfeDetalhe.setNfeDetalheImpostoIpi(new NfeDetalheImpostoIpi());
        nfeDetalhe.getNfeDetalheImpostoIpi().setNfeDetalhe(nfeDetalhe);
        nfeDetalhe.setNfeDetalheImpostoIi(new NfeDetalheImpostoIi());
        nfeDetalhe.getNfeDetalheImpostoIi().setNfeDetalhe(nfeDetalhe);
        nfeDetalhe.setListaArmamento(new HashSet<NfeDetEspecificoArmamento>());
        nfeDetalhe.setListaMedicamento(new HashSet<NfeDetEspecificoMedicamento>());
        nfeDetalhe.setListaDeclaracaoImportacao(new HashSet<NfeDeclaracaoImportacao>());

        // Se houver CFOP cadastrado na Operao Fiscal, a nota  de servios
        if (operacaoFiscal.getCfop() != null) {
            nfeDetalhe.setCfop(operacaoFiscal.getCfop());

            // ISSQN
            TributIss iss = operacaoFiscal.getListaIss().get(0);
            nfeDetalhe.getNfeDetalheImpostoIssqn().setBaseCalculoIssqn(nfeDetalhe.getValorBrutoProduto());
            nfeDetalhe.getNfeDetalheImpostoIssqn().setAliquotaIssqn(iss.getAliquotaPorcento());
            nfeDetalhe.getNfeDetalheImpostoIssqn()
                    .setValorIssqn(nfeDetalhe.getNfeDetalheImpostoIssqn().getBaseCalculoIssqn().multiply(
                            iss.getAliquotaPorcento().divide(BigDecimal.valueOf(100), RoundingMode.HALF_DOWN)));
            nfeDetalhe.getNfeDetalheImpostoIssqn().setMunicipioIssqn(empresa.getCodigoIbgeCidade());
            nfeDetalhe.getNfeDetalheImpostoIssqn().setItemListaServicos(iss.getItemListaServico());
            // nfeDetalhe.getNfeDetalheImpostoIssqn().setTributacaoIssqn(iss.getCodigoTributacao());

            // PIS ISSQN
            nfeDetalhe.getNfeDetalheImpostoPis().setAliquotaPisPercentual(BigDecimal.ZERO);
            nfeDetalhe.getNfeDetalheImpostoPis().setAliquotaPisReais(BigDecimal.ZERO);
            nfeDetalhe.getNfeDetalheImpostoPis().setValorBaseCalculoPis(BigDecimal.ZERO);
            nfeDetalhe.getNfeDetalheImpostoPis().setValorPis(BigDecimal.ZERO);

            // COFINS ISSQN
            nfeDetalhe.getNfeDetalheImpostoCofins().setAliquotaCofinsPercentual(BigDecimal.ZERO);
            nfeDetalhe.getNfeDetalheImpostoCofins().setAliquotaCofinsReais(BigDecimal.ZERO);
            nfeDetalhe.getNfeDetalheImpostoCofins().setBaseCalculoCofins(BigDecimal.ZERO);
            nfeDetalhe.getNfeDetalheImpostoCofins().setValorCofins(BigDecimal.ZERO);
        } else {
            // ICMS
            // Se o Produto estiver vinculado a uma configurao de Operao
            // Fiscal + Grupo Tributrio, carrega esses dados
            if (nfeDetalhe.getProduto().getTributGrupoTributario() != null) {
                List<Filtro> listaFiltro = new ArrayList<>();

                listaFiltro.add(new Filtro("AND", "idTributOperacaoFiscal", "=", operacaoFiscal.getId()));
                listaFiltro.add(new Filtro("AND", "idTributGrupoTributario", "=",
                        nfeDetalhe.getProduto().getTributGrupoTributario().getId()));
                listaFiltro.add(new Filtro("AND", "ufDestino", "=", destinatario.getUf()));

                ViewTributacaoIcms icms = icmsDao.getBean(ViewTributacaoIcms.class, listaFiltro);
                if (icms != null) {
                    nfeDetalhe.setCfop(icms.getCfop());
                    nfeDetalhe.getNfeDetalheImpostoIcms()
                            .setOrigemMercadoria(Integer.valueOf(icms.getOrigemMercadoria()));
                    nfeDetalhe.getNfeDetalheImpostoIcms().setCstIcms(icms.getCstB());
                    nfeDetalhe.getNfeDetalheImpostoIcms().setCsosn(icms.getCsosnB());
                    nfeDetalhe.getNfeDetalheImpostoIcms()
                            .setModalidadeBcIcms(Integer.valueOf(icms.getModalidadeBc()));
                    nfeDetalhe.getNfeDetalheImpostoIcms().setTaxaReducaoBcIcms(icms.getPorcentoBc());
                    nfeDetalhe.getNfeDetalheImpostoIcms().setAliquotaIcms(icms.getAliquota());
                    nfeDetalhe.getNfeDetalheImpostoIcms()
                            .setModalidadeBcIcmsSt(Integer.valueOf(icms.getModalidadeBcSt()));
                    nfeDetalhe.getNfeDetalheImpostoIcms().setPercentualMvaIcmsSt(icms.getMva());
                    nfeDetalhe.getNfeDetalheImpostoIcms().setPercentualReducaoBcIcmsSt(icms.getPorcentoBcSt());
                    nfeDetalhe.getNfeDetalheImpostoIcms().setAliquotaIcmsSt(icms.getAliquotaIcmsSt());
                    nfeDetalhe.getNfeDetalheImpostoIcms().setAliquotaCreditoIcmsSn(BigDecimal.ZERO);
                } else {
                    throw new Exception(
                            "No existe tributao de ICMS definida para os parmetros informados. Operao no realizada.");
                }

                // IPI
                listaFiltro.clear();
                listaFiltro.add(new Filtro("AND", "idTributOperacaoFiscal", "=", operacaoFiscal.getId()));
                listaFiltro.add(new Filtro("AND", "idTributGrupoTributario", "=",
                        nfeDetalhe.getProduto().getTributGrupoTributario().getId()));

                ViewTributacaoIpi ipi = ipiDao.getBean(ViewTributacaoIpi.class, listaFiltro);
                if (ipi != null) {
                    nfeDetalhe.getNfeDetalheImpostoIpi().setCstIpi(ipi.getCstIpi());
                    nfeDetalhe.getNfeDetalheImpostoIpi().setAliquotaIpi(ipi.getAliquotaPorcento());
                }

                // PIS ICMS
                listaFiltro.clear();
                listaFiltro.add(new Filtro("AND", "idTributOperacaoFiscal", "=", operacaoFiscal.getId()));
                listaFiltro.add(new Filtro("AND", "idTributGrupoTributario", "=",
                        nfeDetalhe.getProduto().getTributGrupoTributario().getId()));

                ViewTributacaoPis pis = pisDao.getBean(ViewTributacaoPis.class, listaFiltro);
                if (pis != null) {
                    nfeDetalhe.getNfeDetalheImpostoPis().setCstPis(pis.getCstPis());
                    nfeDetalhe.getNfeDetalheImpostoPis().setAliquotaPisPercentual(pis.getAliquotaPorcento());
                    nfeDetalhe.getNfeDetalheImpostoPis().setAliquotaPisReais(pis.getAliquotaUnidade());
                }

                // COFINS ICMS
                listaFiltro.clear();
                listaFiltro.add(new Filtro("AND", "idTributOperacaoFiscal", "=", operacaoFiscal.getId()));
                listaFiltro.add(new Filtro("AND", "idTributGrupoTributario", "=",
                        nfeDetalhe.getProduto().getTributGrupoTributario().getId()));

                ViewTributacaoCofins cofins = cofinsDao.getBean(ViewTributacaoCofins.class, listaFiltro);
                if (cofins != null) {
                    nfeDetalhe.getNfeDetalheImpostoCofins().setNfeDetalhe(nfeDetalhe);
                    nfeDetalhe.getNfeDetalheImpostoCofins().setCstCofins(cofins.getCstCofins());
                    nfeDetalhe.getNfeDetalheImpostoCofins()
                            .setAliquotaCofinsPercentual(cofins.getAliquotaPorcento());
                    nfeDetalhe.getNfeDetalheImpostoCofins().setAliquotaCofinsReais(cofins.getAliquotaUnidade());
                }
            } else if (nfeDetalhe.getProduto().getTributIcmsCustomCab() != null) {
                // Seno pega do ICMS Customizado
                List<Filtro> listaFiltro = new ArrayList<>();

                listaFiltro.add(
                        new Filtro("AND", "id", "=", nfeDetalhe.getProduto().getTributIcmsCustomCab().getId()));
                listaFiltro.add(new Filtro("AND", "ufDestino", "=", destinatario.getUf()));

                ViewTributacaoIcmsCustom icms = icmsCustomDao.getBean(ViewTributacaoIcmsCustom.class, listaFiltro);
                if (icms != null) {
                    nfeDetalhe.getNfeDetalheImpostoIcms().setNfeDetalhe(nfeDetalhe);
                    nfeDetalhe.setCfop(icms.getCfop());
                    nfeDetalhe.getNfeDetalheImpostoIcms()
                            .setOrigemMercadoria(Integer.valueOf(icms.getOrigemMercadoria()));
                    nfeDetalhe.getNfeDetalheImpostoIcms().setCstIcms(icms.getCstB());
                    nfeDetalhe.getNfeDetalheImpostoIcms().setCsosn(icms.getCsosnB());
                    nfeDetalhe.getNfeDetalheImpostoIcms()
                            .setModalidadeBcIcms(Integer.valueOf(icms.getModalidadeBc()));
                    nfeDetalhe.getNfeDetalheImpostoIcms().setTaxaReducaoBcIcms(icms.getPorcentoBc());
                    nfeDetalhe.getNfeDetalheImpostoIcms().setAliquotaIcms(icms.getAliquota());
                    nfeDetalhe.getNfeDetalheImpostoIcms()
                            .setModalidadeBcIcmsSt(Integer.valueOf(icms.getModalidadeBcSt()));
                    nfeDetalhe.getNfeDetalheImpostoIcms().setPercentualMvaIcmsSt(icms.getMva());
                    nfeDetalhe.getNfeDetalheImpostoIcms().setPercentualReducaoBcIcmsSt(icms.getPorcentoBcSt());
                    nfeDetalhe.getNfeDetalheImpostoIcms().setAliquotaIcmsSt(icms.getAliquotaIcmsSt());
                    nfeDetalhe.getNfeDetalheImpostoIcms().setAliquotaCreditoIcmsSn(BigDecimal.ZERO);
                } else {
                    throw new Exception(
                            "No existe tributao de ICMS definida para os parmetros informados. Operao no realizada.");
                }
            }

            NfeCalculo calculo = NfeCalculoController.calculo(nfeDetalhe, empresa, destinatario);

            // Valores ICMS
            nfeDetalhe.getNfeDetalheImpostoIcms().setBaseCalculoIcms(calculo.getBaseCalculoIcms());
            nfeDetalhe.getNfeDetalheImpostoIcms().setPercentualReducaoBcIcmsSt(calculo.getReducaoBcIcmsSt());
            nfeDetalhe.getNfeDetalheImpostoIcms().setValorIcms(calculo.getValorIcms());
            // valores de icms st
            nfeDetalhe.getNfeDetalheImpostoIcms().setValorBaseCalculoIcmsSt(calculo.getBaseCalculoIcmsSt());
            nfeDetalhe.getNfeDetalheImpostoIcms().setValorIcmsSt(calculo.getValorIcmsSt());
            // credito de icmssn
            nfeDetalhe.getNfeDetalheImpostoIcms().setValorCreditoIcmsSn(calculo.getValorCreditoIcmsSn());

            // Valores IPI
            nfeDetalhe.getNfeDetalheImpostoIpi().setValorBaseCalculoIpi(calculo.getBaseCalculoIpi());
            nfeDetalhe.getNfeDetalheImpostoIpi().setValorIpi(calculo.getValorIpi());

            // Valores PIS
            nfeDetalhe.getNfeDetalheImpostoPis().setValorBaseCalculoPis(calculo.getBaseCalculoPis());
            nfeDetalhe.getNfeDetalheImpostoPis().setValorPis(calculo.getValorPis());

            // Valores COFINS
            nfeDetalhe.getNfeDetalheImpostoCofins().setBaseCalculoCofins(calculo.getBaseCalculoCofins());
            nfeDetalhe.getNfeDetalheImpostoCofins().setValorCofins(calculo.getValorCofins());
        }
    }

    private void atualizaTotais() {
        BigDecimal totalProdutos = BigDecimal.ZERO;
        BigDecimal valorFrete = BigDecimal.ZERO;
        BigDecimal valorSeguro = BigDecimal.ZERO;
        BigDecimal valorOutrasDespesas = BigDecimal.ZERO;
        BigDecimal desconto = BigDecimal.ZERO;
        BigDecimal baseCalculoIcms = BigDecimal.ZERO;
        BigDecimal valorIcms = BigDecimal.ZERO;
        BigDecimal baseCalculoIcmsSt = BigDecimal.ZERO;
        BigDecimal valorIcmsSt = BigDecimal.ZERO;
        BigDecimal valorIpi = BigDecimal.ZERO;
        BigDecimal valorPis = BigDecimal.ZERO;
        BigDecimal valorCofins = BigDecimal.ZERO;
        BigDecimal valorNotaFiscal = BigDecimal.ZERO;

        BigDecimal totalServicos = BigDecimal.ZERO;
        BigDecimal baseCalculoIssqn = BigDecimal.ZERO;
        BigDecimal valorIssqn = BigDecimal.ZERO;
        BigDecimal valorPisIssqn = BigDecimal.ZERO;
        BigDecimal valorCofinsIssqn = BigDecimal.ZERO;

        // Se houver CFOP cadastrado na Operao Fiscal, a nota  de servios
        if (getObjeto().getTributOperacaoFiscal().getCfop() != null) {
            for (NfeDetalhe itensNfe : getObjeto().getListaNfeDetalhe()) {
                totalServicos = totalServicos.add(itensNfe.getValorTotal());
                valorFrete = valorFrete.add(itensNfe.getValorFrete());
                valorSeguro = valorSeguro.add(itensNfe.getValorSeguro());
                valorOutrasDespesas = valorOutrasDespesas.add(itensNfe.getValorOutrasDespesas());
                desconto = desconto.add(itensNfe.getValorDesconto());
                baseCalculoIssqn = baseCalculoIssqn.add(itensNfe.getNfeDetalheImpostoIssqn().getBaseCalculoIssqn());
                valorIssqn = valorIssqn.add(itensNfe.getNfeDetalheImpostoIssqn().getValorIssqn());
                valorPisIssqn = valorPisIssqn.add(itensNfe.getNfeDetalheImpostoPis().getValorPis());
                valorCofinsIssqn = valorCofinsIssqn.add(itensNfe.getNfeDetalheImpostoCofins().getValorCofins());
            }
            // valorNotaFiscal =
            // totalServicos.add(valorPis).add(valorCofins).add(valorOutrasDespesas).subtract(desconto);
            valorNotaFiscal = totalServicos.add(valorOutrasDespesas).subtract(desconto);
        } else {
            for (NfeDetalhe itensNfe : getObjeto().getListaNfeDetalhe()) {
                totalProdutos = totalProdutos.add(itensNfe.getValorTotal());
                valorFrete = valorFrete.add(itensNfe.getValorFrete());
                valorSeguro = valorSeguro.add(itensNfe.getValorSeguro());
                valorOutrasDespesas = valorOutrasDespesas.add(itensNfe.getValorOutrasDespesas());
                desconto = desconto.add(itensNfe.getValorDesconto());
                if (itensNfe.getNfeDetalheImpostoIcms().getBaseCalculoIcms() != null) {
                    baseCalculoIcms = baseCalculoIcms.add(itensNfe.getNfeDetalheImpostoIcms().getBaseCalculoIcms());
                }
                if (itensNfe.getNfeDetalheImpostoIcms().getValorIcms() != null) {
                    valorIcms = valorIcms.add(itensNfe.getNfeDetalheImpostoIcms().getValorIcms());
                }
                if (itensNfe.getNfeDetalheImpostoIcms().getValorBaseCalculoIcmsSt() != null) {
                    baseCalculoIcmsSt = baseCalculoIcmsSt
                            .add(itensNfe.getNfeDetalheImpostoIcms().getValorBaseCalculoIcmsSt());
                }
                if (itensNfe.getNfeDetalheImpostoIcms().getValorIcmsSt() != null) {
                    valorIcmsSt = valorIcmsSt.add(itensNfe.getNfeDetalheImpostoIcms().getValorIcmsSt());
                }
                if (itensNfe.getNfeDetalheImpostoIpi().getValorIpi() != null) {
                    valorIpi = valorIpi.add(itensNfe.getNfeDetalheImpostoIpi().getValorIpi());
                }
                if (itensNfe.getNfeDetalheImpostoPis().getValorPis() != null) {
                    valorPis = valorPis.add(itensNfe.getNfeDetalheImpostoPis().getValorPis());
                }
                if (itensNfe.getNfeDetalheImpostoCofins().getValorCofins() != null) {
                    valorCofins = valorCofins.add(itensNfe.getNfeDetalheImpostoCofins().getValorCofins());
                }
            }
            // valorNotaFiscal =
            // totalProdutos.add(valorIcmsSt).add(valorPis).add(valorCofins).add(valorIpi).add(valorOutrasDespesas).subtract(desconto);
            valorNotaFiscal = totalProdutos.add(valorIpi).add(valorOutrasDespesas).subtract(desconto);
        }

        getObjeto().setValorFrete(valorFrete);
        getObjeto().setValorDespesasAcessorias(valorOutrasDespesas);
        getObjeto().setValorSeguro(valorSeguro);
        getObjeto().setValorDesconto(desconto);

        getObjeto().setValorServicos(totalServicos);
        getObjeto().setBaseCalculoIssqn(baseCalculoIssqn);
        getObjeto().setValorIssqn(valorIssqn);
        getObjeto().setValorPisIssqn(valorPisIssqn);
        getObjeto().setValorCofinsIssqn(valorCofinsIssqn);

        getObjeto().setValorTotalProdutos(totalProdutos);
        getObjeto().setBaseCalculoIcms(baseCalculoIcms);
        getObjeto().setValorIcms(valorIcms);
        getObjeto().setBaseCalculoIcmsSt(baseCalculoIcmsSt);
        getObjeto().setValorIcmsSt(valorIcmsSt);
        getObjeto().setValorIpi(valorIpi);
        getObjeto().setValorPis(valorPis);
        getObjeto().setValorCofins(valorCofins);

        getObjeto().setValorTotal(valorNotaFiscal);
    }

    private void numeroNfe() throws Exception {
        DecimalFormat formatoNumero = new DecimalFormat("000000000");
        DecimalFormat formatoCodigoNumerico = new DecimalFormat("00000000");
        SimpleDateFormat formatoAno = new SimpleDateFormat("yy");
        SimpleDateFormat formatoMes = new SimpleDateFormat("MM");

        NfeNumero numero = nfeNumeroDao.getBean(NfeNumero.class, new ArrayList<Filtro>());
        if (numero == null) {
            numero = new NfeNumero();
            numero.setEmpresa(getObjeto().getEmpresa());
            numero.setSerie("001");
            numero.setNumero(1);
        } else {
            numero.setNumero(numero.getNumero() + 1);
        }
        nfeNumeroDao.merge(numero);

        getObjeto().setNumero(formatoNumero.format(numero.getNumero()));
        getObjeto().setCodigoNumerico(formatoCodigoNumerico.format(numero.getNumero()));
        getObjeto().setSerie(numero.getSerie());

        getObjeto().setChaveAcesso("" + getObjeto().getEmpresa().getCodigoIbgeUf()
                + formatoAno.format(getObjeto().getDataHoraEmissao())
                + formatoMes.format(getObjeto().getDataHoraEmissao()) + getObjeto().getEmpresa().getCnpj()
                + getObjeto().getCodigoModelo() + getObjeto().getSerie() + getObjeto().getNumero() + "1"
                + getObjeto().getCodigoNumerico());
        getObjeto().setDigitoChaveAcesso(Biblioteca.modulo11(getObjeto().getChaveAcesso()).toString());
    }

    public List<TributOperacaoFiscal> getListaTributOperacaoFiscal(String descricao) {
        List<TributOperacaoFiscal> listaTributOperacaoFiscal = new ArrayList<>();
        try {
            listaTributOperacaoFiscal = operacaoFiscalDao.getBeansLike(TributOperacaoFiscal.class, "descricao",
                    descricao);
        } catch (Exception e) {
            // e.printStackTrace();
        }
        return listaTributOperacaoFiscal;
    }

    public List<Produto> getListaProduto(String descricao) {
        List<Produto> listaProduto = new ArrayList<>();
        try {
            listaProduto = produtoDao.getBeansLike(Produto.class, "descricaoPdv", descricao);
        } catch (Exception e) {
            // e.printStackTrace();
        }
        return listaProduto;
    }

    public List<PessoaCliente> getListaPessoaCliente(String nome) {
        List<PessoaCliente> listaPessoaCliente = new ArrayList<>();
        try {
            listaPessoaCliente = pessoaClienteDao.getBeansLike(PessoaCliente.class, "nome", nome);
        } catch (Exception e) {
            // e.printStackTrace();
        }
        return listaPessoaCliente;
    }

    public List<Transportadora> getListaTransportadora(String nome) {
        List<Transportadora> listaTransportadora = new ArrayList<>();
        try {
            listaTransportadora = transportadoraDao.getBeansLike(Transportadora.class, "pessoa.nome", nome);
        } catch (Exception e) {
            // e.printStackTrace();
        }
        return listaTransportadora;
    }

    public PessoaCliente getPessoaCliente() {
        return pessoaCliente;
    }

    public void setPessoaCliente(PessoaCliente pessoaCliente) {
        this.pessoaCliente = pessoaCliente;
    }

    public NfeDetalhe getNfeDetalhe() {
        return nfeDetalhe;
    }

    public void setNfeDetalhe(NfeDetalhe nfeDetalhe) {
        this.nfeDetalhe = nfeDetalhe;
    }

    public NfeDetalhe getNfeDetalheSelecionado() {
        return nfeDetalheSelecionado;
    }

    public void setNfeDetalheSelecionado(NfeDetalhe nfeDetalheSelecionado) {
        this.nfeDetalheSelecionado = nfeDetalheSelecionado;
    }

    public boolean isPodeIncluirProduto() {
        return podeIncluirProduto;
    }

    public void setPodeIncluirProduto(boolean podeIncluirProduto) {
        this.podeIncluirProduto = podeIncluirProduto;
    }

    public String getSenhaCertificado() {
        return senhaCertificado;
    }

    public void setSenhaCertificado(String senhaCertificado) {
        this.senhaCertificado = senhaCertificado;
    }

    public String getJustificativaCancelamento() {
        return justificativaCancelamento;
    }

    public void setJustificativaCancelamento(String justificativaCancelamento) {
        this.justificativaCancelamento = justificativaCancelamento;
    }

    public NfeTransporteReboque getNfeTransporteReboque() {
        return nfeTransporteReboque;
    }

    public void setNfeTransporteReboque(NfeTransporteReboque nfeTransporteReboque) {
        this.nfeTransporteReboque = nfeTransporteReboque;
    }

    public NfeTransporteReboque getNfeTransporteReboqueSelecionado() {
        return nfeTransporteReboqueSelecionado;
    }

    public void setNfeTransporteReboqueSelecionado(NfeTransporteReboque nfeTransporteReboqueSelecionado) {
        this.nfeTransporteReboqueSelecionado = nfeTransporteReboqueSelecionado;
    }

    public NfeDetalheImpostoIcms getNfeDetalheImpostoIcms() {
        return nfeDetalheImpostoIcms;
    }

    public void setNfeDetalheImpostoIcms(NfeDetalheImpostoIcms nfeDetalheImpostoIcms) {
        this.nfeDetalheImpostoIcms = nfeDetalheImpostoIcms;
    }

}