Subversion Repositories Integrator Subversion

Rev

Rev 548 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

package br.com.ec.controller;

import java.io.Serializable;
import java.util.List;

import javax.inject.Inject;
import javax.inject.Named;

import org.primefaces.model.StreamedContent;
import org.springframework.context.annotation.Scope;

import br.com.ec.controller.consultademanda.NotaFiscalConsultaPorDemanda;
import br.com.ec.core.generic.GenericService;
import br.com.ec.core.util.VerificadorUtil;
import br.com.ec.domain.dto.CompraProdutoDTO;
import br.com.ec.domain.dto.NotaFiscalDTO;
import br.com.ec.domain.dto.NotaFiscalProdutoDTO;
import br.com.ec.domain.dto.ProdutoDTO;
import br.com.ec.domain.dto.consulta.ParametrosConsultaNotaFiscal;
import br.com.ec.domain.model.NotaFiscal;
import br.com.ec.domain.model.Pessoa;
import br.com.ec.domain.model.Transporte;
import br.com.ec.domain.model.Venda;
import br.com.ec.domain.model.nfe.TipoModeloNotaFiscal;
import br.com.ec.domain.model.nfe.TipoNotaFiscal;
import br.com.ec.domain.model.nfe.TipoNotaFiscalConsumidorFinal;
import br.com.ec.domain.model.nfe.TipoNotaFiscalDestino;
import br.com.ec.domain.model.nfe.TipoNotaFiscalIntermediario;
import br.com.ec.domain.model.nfe.TipoNotaFiscalModalidadeFrete;
import br.com.ec.domain.model.nfe.TipoNotaFiscalPresencaComprador;
import br.com.ec.domain.service.CompraProdutoService;
import br.com.ec.domain.service.EmissorRelatorioService;
import br.com.ec.domain.service.NotaFiscalProdutoService;
import br.com.ec.domain.service.NotaFiscalService;
import br.com.ec.domain.service.ProdutoService;
import br.com.ec.web.exception.VerificadorLancamentoException;
import br.com.ec.web.exception.VerificadorLancamentoException.CommandBean;
import br.com.ec.web.exception.VerificadorLancamentoException.CommandRelatorioStreamedContent;
import br.com.ec.web.generic.AbstractBean;
import br.com.ec.web.message.LancadorMensagem;
import br.com.ec.web.util.TipoOperacao;

@Named
@Scope("view")
public class NotaFiscalBean extends AbstractBean<NotaFiscal> implements Serializable {

        private static final long serialVersionUID = 1L;
       
        private String statusSefaz = "";
       
        private ParametrosConsultaNotaFiscal parametrosConsultaNotaFiscal;
        private NotaFiscalConsultaPorDemanda lazy;
       
        private Long sequencialVendaParaVinculo;
        private StreamedContent danfeNfePreVisualizacao;
        private StreamedContent danfeNfe;
       
        private Boolean prepararNotaFiscal;
        private String tipoNotaFiscalParaEmissao;
       
        private String codigoProdutoParaVinculoNotaFiscal = "";
        private ProdutoDTO produtoDTOParaVinculoNotaFiscal;
        private CompraProdutoDTO compraProdutoDTOParaVinculoNotaFiscal;
        private List<CompraProdutoDTO> listaCompraProdutoDTOParaVinculoNotaFiscal;
       
        private String chaveNotaFiscalParaReferenciaNotaFiscal = "";
        private NotaFiscalDTO notaFiscalDTOParaReferenciaNotaFiscal;
        private Transporte transporteSelecionado;
       
        private NotaFiscalService notaFiscalService;
        private NotaFiscalProdutoService notaFiscalProdutoService;
        private ProdutoService produtoService;
        private CompraProdutoService compraProdutoService;
        private EmissorRelatorioService emissorRelatorioService;
       
        @Inject
        public NotaFiscalBean(NotaFiscalConsultaPorDemanda lazy, NotaFiscalService notaFiscalService, NotaFiscalProdutoService notaFiscalProdutoService,
                        ProdutoService produtoService, CompraProdutoService compraProdutoService, EmissorRelatorioService emissorRelatorioService) {
                this.lazy = lazy;
                this.notaFiscalService = notaFiscalService;
                this.notaFiscalProdutoService = notaFiscalProdutoService;
                this.produtoService = produtoService;
                this.compraProdutoService = compraProdutoService;
                this.emissorRelatorioService = emissorRelatorioService;
        }
       
        @Override
        public void preCarregamento() {
                parametrosConsultaNotaFiscal = new ParametrosConsultaNotaFiscal();
                prepararConsultaDemanda();
                limparEntidade();
        }

        @Override
        public void limparEntidade() {
                setEntidade(new NotaFiscal());
                setPrepararNotaFiscal(true);
        }

        @Override
        public GenericService<NotaFiscal> getService() {
                return notaFiscalService;
        }
       
        @Override
        public NotaFiscal getEntidade() {
                return entidade;
        }
       
        @Override
        public void preConsultar() {
                setTipoOperacao(TipoOperacao.CONSULTAR);
        }
       
        @Override
        public void preCadastrar() {
                setTransporteSelecionado(new Transporte());
                super.preCadastrar();
        }
       
        @Override
        public void cadastrar() {
                getEntidade().setTransporte(getTransporteSelecionado());
                super.cadastrar();
        }
       
        @Override
        public void preAlterar(NotaFiscal notaFiscal) {
                if (VerificadorUtil.estaNulo(notaFiscal.getTransporte())) {
                        setTransporteSelecionado(new Transporte());
                } else {
                        setTransporteSelecionado(notaFiscal.getTransporte());
                }
                super.preAlterar(notaFiscal);
                setPrepararNotaFiscal(false);
        }
       
        @Override
        public void alterar() {
                getEntidade().setTransporte(getTransporteSelecionado());
                super.alterar();
        }
       
        /*
        @Override
        public void preAlterar(NotaFiscal notaFiscal) {
                NotaFiscal notaFiscalDetalhada = notaFiscalService.detalhar(notaFiscal.getSequencial());
                super.preAlterar(notaFiscalDetalhada);
        }
        */

       
        @Override
        public NotaFiscal getId() {
                return getEntidade();
        }
       
        public ParametrosConsultaNotaFiscal getParametrosConsultaNotaFiscal() {
                return parametrosConsultaNotaFiscal;
        }
        public void setParametrosConsultaNotaFiscal(ParametrosConsultaNotaFiscal parametrosConsultaNotaFiscal) {
                this.parametrosConsultaNotaFiscal = parametrosConsultaNotaFiscal;
        }
       
        public NotaFiscalConsultaPorDemanda getLazy() {
                return lazy;
        }
        public void setLazy(NotaFiscalConsultaPorDemanda lazy) {
                this.lazy = lazy;
        }
        public void prepararConsultaDemanda() {
                lazy.setarParametrosConsulta(getParametrosConsultaNotaFiscal());
        }
       
        public TipoNotaFiscalModalidadeFrete[] getTiposModalidadeFrete() {
                return TipoNotaFiscalModalidadeFrete.values();
        }
       
        public TipoNotaFiscal[] getTiposNotaFiscal() {
                return TipoNotaFiscal.values();
        }
       
        public TipoNotaFiscalConsumidorFinal[] getTiposConsumidorFinal() {
                return TipoNotaFiscalConsumidorFinal.values();
        }
       
        public TipoNotaFiscalPresencaComprador[] getTiposPresencaComprador() {
                return TipoNotaFiscalPresencaComprador.values();
        }
       
        public TipoNotaFiscalIntermediario[] getTiposIntermediario() {
                return TipoNotaFiscalIntermediario.values();
        }
       
        public TipoNotaFiscalDestino[] getTiposDestino() {
                return TipoNotaFiscalDestino.values();
        }
       
        public Long getSequencialVendaParaVinculo() {
                return sequencialVendaParaVinculo;
        }
        public void setSequencialVendaParaVinculo(Long sequencialVendaParaVinculo) {
                this.sequencialVendaParaVinculo = sequencialVendaParaVinculo;
        }
       
        public StreamedContent getDanfeNfePreVisualizacao() {
                return danfeNfePreVisualizacao;
        }
        public void setDanfeNfePreVisualizacao(StreamedContent danfeNfePreVisualizacao) {
                this.danfeNfePreVisualizacao = danfeNfePreVisualizacao;
        }
       
        public StreamedContent getDanfeNfe() {
                return danfeNfe;
        }
        public void setDanfeNfe(StreamedContent danfeNfe) {
                this.danfeNfe = danfeNfe;
        }
       
        public Boolean getPrepararNotaFiscal() {
                return prepararNotaFiscal;
        }
        public void setPrepararNotaFiscal(Boolean prepararNotaFiscal) {
                this.prepararNotaFiscal = prepararNotaFiscal;
        }
       
        public String getTipoNotaFiscalParaEmissao() {
                return tipoNotaFiscalParaEmissao;
        }
        public void setTipoNotaFiscalParaEmissao(String tipoNotaFiscalParaEmissao) {
                this.tipoNotaFiscalParaEmissao = tipoNotaFiscalParaEmissao;
        }
       
        public String getCodigoProdutoParaVinculoNotaFiscal() {
                return codigoProdutoParaVinculoNotaFiscal;
        }
        public void setCodigoProdutoParaVinculoNotaFiscal(String codigoProdutoParaVinculoNotaFiscal) {
                this.codigoProdutoParaVinculoNotaFiscal = codigoProdutoParaVinculoNotaFiscal;
        }
       
        public ProdutoDTO getProdutoDTOParaVinculoNotaFiscal() {
                return produtoDTOParaVinculoNotaFiscal;
        }
        public void setProdutoDTOParaVinculoNotaFiscal(ProdutoDTO produtoDTOParaVinculoNotaFiscal) {
                this.produtoDTOParaVinculoNotaFiscal = produtoDTOParaVinculoNotaFiscal;
        }
       
        public CompraProdutoDTO getCompraProdutoDTOParaVinculoNotaFiscal() {
                return compraProdutoDTOParaVinculoNotaFiscal;
        }
        public void setCompraProdutoDTOParaVinculoNotaFiscal(CompraProdutoDTO compraProdutoDTOParaVinculoNotaFiscal) {
                this.compraProdutoDTOParaVinculoNotaFiscal = compraProdutoDTOParaVinculoNotaFiscal;
        }
       
        public List<CompraProdutoDTO> getListaCompraProdutoDTOParaVinculoNotaFiscal() {
                return listaCompraProdutoDTOParaVinculoNotaFiscal;
        }
        public void setListaCompraProdutoDTOParaVinculoNotaFiscal(List<CompraProdutoDTO> listaCompraProdutoDTOParaVinculoNotaFiscal) {
                this.listaCompraProdutoDTOParaVinculoNotaFiscal = listaCompraProdutoDTOParaVinculoNotaFiscal;
        }
       
        public String getChaveNotaFiscalParaReferenciaNotaFiscal() {
                return chaveNotaFiscalParaReferenciaNotaFiscal;
        }
        public void setChaveNotaFiscalParaReferenciaNotaFiscal(String chaveNotaFiscalParaReferenciaNotaFiscal) {
                this.chaveNotaFiscalParaReferenciaNotaFiscal = chaveNotaFiscalParaReferenciaNotaFiscal;
        }
       
        public NotaFiscalDTO getNotaFiscalDTOParaReferenciaNotaFiscal() {
                return notaFiscalDTOParaReferenciaNotaFiscal;
        }
        public void setNotaFiscalDTOParaReferenciaNotaFiscal(NotaFiscalDTO notaFiscalDTOParaReferenciaNotaFiscal) {
                this.notaFiscalDTOParaReferenciaNotaFiscal = notaFiscalDTOParaReferenciaNotaFiscal;
        }
       
        public Transporte getTransporteSelecionado() {
                return transporteSelecionado;
        }
        public void setTransporteSelecionado(Transporte transporteSelecionado) {
                this.transporteSelecionado = transporteSelecionado;
        }
       
        public String getStatusSefaz() {
                return statusSefaz;
        }
        public void setStatusSefaz(String statusSefaz) {
                this.statusSefaz = statusSefaz;
        }
       
        /**************************************************/
       
        public void prepararNotaFiscalParaEmissao() {
                preCadastrar();
                if (getTipoNotaFiscalParaEmissao().equals(TipoNotaFiscal.NFE_SAIDA.getValor())) {
                        getEntidade().prepararNotaFiscalEletronicaVenda();
                }
                if (getTipoNotaFiscalParaEmissao().equals(TipoNotaFiscal.NFE_REMESSA_SAIDA.getValor())) {
                        getEntidade().prepararNotaFiscalEletronicaRemessa();
                }
                if (getTipoNotaFiscalParaEmissao().equals(TipoNotaFiscal.NFE_DEVOLUCAO.getValor())) {
                        getEntidade().prepararNotaFiscalEletronicaDevolucao();
                }
                if (getTipoNotaFiscalParaEmissao().equals(TipoNotaFiscal.NFE_IMPORTACAO.getValor())) {
                        getEntidade().prepararNotaFiscalEletronicaImportacao();
                }
                setPrepararNotaFiscal(false);
        }
       
        public void atualizarStatusSefaz() {
                setStatusSefaz(notaFiscalService.retornarStatusSefaz());
        }
       
        public void desvincularVenda() {
                new VerificadorLancamentoException().tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean() {
                        public void execute() {
                                notaFiscalService.desvincularVenda(getEntidade().getSequencial());
                                getEntidade().setVenda(null);
                                LancadorMensagem.lancarSucesso("VENDA DESVINCULADA COM SUCESSO");
                        }
                });
        }
       
        public void vincularVenda() {
                new VerificadorLancamentoException().tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean() {
                        public void execute() {
                                Venda vendaVinculada = notaFiscalService.vincularVenda(getEntidade().getSequencial(), getSequencialVendaParaVinculo());
                                getEntidade().setVenda(vendaVinculada);
                                LancadorMensagem.lancarSucesso("VENDA VINCULADA COM SUCESSO");
                        }
                });
        }
       
        public void emitirDanfeNfe(Long sequencialNotaFiscal) {
                setDanfeNfePreVisualizacao(notaFiscalService.gerarDanfeNfePreVisualizacao(sequencialNotaFiscal));
                setDanfeNfe(notaFiscalService.gerarDanfeNfe(sequencialNotaFiscal));
        }
       
        public void emitirDanfeNfePreVisualizacao(Long sequencialNotaFiscal) {
                setDanfeNfePreVisualizacao(notaFiscalService.gerarDanfeNfePreVisualizacao(sequencialNotaFiscal));
                setDanfeNfe(notaFiscalService.gerarDanfeNfe(sequencialNotaFiscal));
                /*
                return new VerificadorLancamentoException().verificarLancamentoException(new CommandRelatorioStreamedContent() {
                        @Override
                        public StreamedContent execute() {
                                return notaFiscalService.gerarDanfeNfe(getEntidade().getSequencial());
                        }
                });
                */

        }
       
        public StreamedContent downloadNotaFiscal() {
                return new VerificadorLancamentoException().verificarLancamentoException(new CommandRelatorioStreamedContent() {
                        @Override
                        public StreamedContent execute() {
                                return getDanfeNfe();
                        }
                });
        }
       
        public void emitirDanfeNfeTeste() {
                Long sequencialNotaFiscal = new Long(168722);
                setDanfeNfePreVisualizacao(notaFiscalService.gerarDanfeNfePreVisualizacao(sequencialNotaFiscal));
                setDanfeNfe(notaFiscalService.gerarDanfeNfe(sequencialNotaFiscal));
        }
       
        public void visualizarDanfe() {
                Long sequencialNotaFiscal = getEntidade().getSequencial();
                setDanfeNfePreVisualizacao(notaFiscalService.gerarDanfeNfePreVisualizacao(sequencialNotaFiscal));
        }
       
        public StreamedContent downloadNotaFiscalPreVisualizada() {
                return new VerificadorLancamentoException().verificarLancamentoException(new CommandRelatorioStreamedContent() {
                        @Override
                        public StreamedContent execute() {
                                return getDanfeNfePreVisualizacao();
                        }
                });
        }
       
        public void selecionarEmitente(final Pessoa pessoa) {
                new VerificadorLancamentoException().tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean() {
                        public void execute() {
                                getEntidade().setPessoaEmitente(pessoa);
                                adicionandoParametroArgsConfirmandoAcao(true);
                        }
                });
        }
       
        public void retirarEmitente() {
                getEntidade().setPessoaEmitente(null);
        }
       
        public void selecionarDestinatario(final Pessoa pessoa) {
                new VerificadorLancamentoException().tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean() {
                        public void execute() {
                                getEntidade().setPessoaDestinatario(pessoa);
                                adicionandoParametroArgsConfirmandoAcao(true);
                        }
                });
        }
       
        public void retirarDestinatario() {
                getEntidade().setPessoaDestinatario(null);
        }
       
        public void emitirNotaFiscal() {
                new VerificadorLancamentoException().tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean() {
                        public void execute() {
                                notaFiscalService.alterar(getEntidade());
                                notaFiscalService.emitirNotaFiscalEletronica(getEntidade());
                                LancadorMensagem.lancarSucesso("NOTA FISCAL DE " + getEntidade().descricaoTipoNotaFiscalNaturezaOperacao() + " EMITIDA COM SUCESSO");
                        }
                });
        }
       
        public void cancelarNotaFiscal() {
                new VerificadorLancamentoException().tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean() {
                        public void execute() {
                                notaFiscalService.cancelarNotaFiscalEletronica(getEntidade());
                                LancadorMensagem.lancarSucesso("NOTA FISCAL CANCELADA COM SUCESSO");
                        }
                });
        }
       
        public void consultarProdutosVinculados() {
                getEntidade().setListaProdutosVinculadosDTO(notaFiscalService.consultarProdutosVinculados(getEntidade().getSequencial()));
        }
       
        public void selecionarCompraProdutoParaVinculoNotaFiscal(CompraProdutoDTO compraProdutoDTO) {
                compraProdutoDTO.setValorProdutoParaVinculoNotaFiscal(compraProdutoDTO.getValorCompra());
                setCompraProdutoDTOParaVinculoNotaFiscal(compraProdutoDTO);
        }
       
        public void excluirVinculoNotaFiscalProduto(NotaFiscalProdutoDTO notaFiscalProdutoDTO) {
                new VerificadorLancamentoException().tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean() {
                        public void execute() {
                                notaFiscalProdutoService.excluirNotaFiscalProduto(notaFiscalProdutoDTO);
                                consultarProdutosVinculados();
                                LancadorMensagem.lancarSucesso("VÍNCULO EXCLUÍDO COM SUCESSO");
                        }
                });
        }
       
        public void consultarProdutoParaVinculoNotaFiscal() {
                setProdutoDTOParaVinculoNotaFiscal(produtoService.consultarProdutoDTOPorCodigoOuCodigoEAN(getCodigoProdutoParaVinculoNotaFiscal()));
                setListaCompraProdutoDTOParaVinculoNotaFiscal(produtoService.consultarComprasDoProduto(getProdutoDTOParaVinculoNotaFiscal().getSequencial()));
        }
       
        public void vincularProdutoNaNotaFiscal() {
                new VerificadorLancamentoException().tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean() {
                        public void execute() {
                                notaFiscalProdutoService.vincularProdutoNaNotaFiscal(getEntidade().getSequencial(),
                                                getProdutoDTOParaVinculoNotaFiscal(),
                                                getCompraProdutoDTOParaVinculoNotaFiscal());
                                setCodigoProdutoParaVinculoNotaFiscal("");
                                setProdutoDTOParaVinculoNotaFiscal(null);
                                setCompraProdutoDTOParaVinculoNotaFiscal(null);
                                consultarProdutosVinculados();
                                LancadorMensagem.lancarSucesso("PRODUTO VINCULADO COM SUCESSO");
                        }
                });
        }
       
        public void consultarNotaFiscalParaReferenciarNotaFiscal() {
                setNotaFiscalDTOParaReferenciaNotaFiscal(notaFiscalService.consultarPorChave(getChaveNotaFiscalParaReferenciaNotaFiscal()));
        }
       
        public void gerarDadosAdicionais() {
                consultarProdutosVinculados();
               
                StringBuilder dadosAdicionais = new StringBuilder("");
               
                if (getEntidade().ehNotaFiscalDeRemessa() || getEntidade().ehNotaFiscalDeDevolucao()) {
                        if (!VerificadorUtil.isListaNulaOuVazia(getEntidade().getListaProdutosVinculadosDTO())) {
                                dadosAdicionais.append("Devolução parcial das Notas Fiscais abaixo:\n");
                                for (NotaFiscalProdutoDTO notaFiscalProdutoDTO : getEntidade().getListaProdutosVinculadosDTO()) {
                                        NotaFiscalDTO notaFiscalDTOCompra = notaFiscalProdutoDTO.getCompraProdutoDTO().getCompraDTO().getNotaFiscalDTO();
                                        if (!dadosAdicionais.toString().contains(notaFiscalDTOCompra.getChave())) {
                                                dadosAdicionais.append(notaFiscalDTOCompra.getNumero());
                                                dadosAdicionais.append(", Chave de acesso: ");
                                                dadosAdicionais.append(notaFiscalDTOCompra.getChave());
                                                dadosAdicionais.append(", emitida em ");
                                                dadosAdicionais.append(notaFiscalDTOCompra.getDataEmissaoFormatada());
                                                dadosAdicionais.append(" | ");
                                        }
                                }
                                dadosAdicionais.append("\n");
                        }
                }
               
                // EMAIL DO DESTINATÁRIO
                dadosAdicionais.append(getEntidade().getPessoaDestinatario().getEmail());
                dadosAdicionais.append(". ");
               
                getEntidade().setDescricaoComplementares(dadosAdicionais.toString());
        }
       
}