Subversion Repositories Integrator Subversion

Rev

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

package br.com.ec.controller.managedbean;

import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;

import org.primefaces.context.RequestContext;
import org.springframework.context.annotation.Scope;

import br.com.ec.controller.managedbean.consultademanda.NotaFiscalConsultaPorDemanda;
import br.com.ec.core.generic.GenericService;
import br.com.ec.core.util.DataUtils;
import br.com.ec.core.util.VerificadorUtil;
import br.com.ec.domain.dto.ParametrosConsultaNotaFiscalDTO;
import br.com.ec.domain.dto.ParametrosConsultaProdutoDTO;
import br.com.ec.domain.dto.nfce.NotaFiscalRemessaDTO;
import br.com.ec.domain.model.Fornecedor;
import br.com.ec.domain.model.Loja;
import br.com.ec.domain.model.NotaFiscal;
import br.com.ec.domain.model.NotaFiscalProduto;
import br.com.ec.domain.model.Pessoa;
import br.com.ec.domain.model.Produto;
import br.com.ec.domain.model.ProdutoLoja;
import br.com.ec.domain.model.tipos.TipoRelatorio;
import br.com.ec.domain.model.tipos.nfe.TipoModeloNotaFiscal;
import br.com.ec.domain.model.tipos.nfe.TipoNotaFiscal;
import br.com.ec.domain.service.emissor.notafiscal.EmissorDiretoNotaFiscalService;
import br.com.ec.domain.service.emissor.notafiscal.EmissorNotaFiscalEletronicaService;
import br.com.ec.domain.service.notafiscal.NotaFiscalProdutoService;
import br.com.ec.domain.service.notafiscal.NotaFiscalService;
import br.com.ec.domain.service.pessoa.PessoaService;
import br.com.ec.domain.service.produto.ProdutoService;
import br.com.ec.domain.service.produtodaloja.ProdutoLojaService;
import br.com.ec.web.exception.VerificadorLancamentoException;
import br.com.ec.web.exception.VerificadorLancamentoException.CommandBean;
import br.com.ec.web.generic.AbstractBean;
import br.com.ec.web.message.LancadorMensagem;
import br.com.swconsultoria.nfe.dom.enuns.DocumentoEnum;

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

        private static final long serialVersionUID = 1L;
       
        private NotaFiscalService notaFiscalService;
        private ProdutoService produtoService;
        private NotaFiscalProdutoService notaFiscalProdutoService;
        private EmissorNotaFiscalEletronicaService emissorNotaFiscalEletronicaService;
        private EmissorDiretoNotaFiscalService emissorDiretoNotaFiscalService;
        private PessoaService pessoaService;
        private ProdutoLojaService produtoLojaService;
       
        private String codigoProdutoRemessa;
        private Produto produtoSelecionado;
        private Integer quantidadeProdutoSelecionado;
        private NotaFiscalRemessaDTO notaFiscalRemessa;
       
        private Fornecedor fornecedorParaRemessa;
        private Loja lojaParaRemessa;
       
        private NotaFiscalConsultaPorDemanda lazy;
       
        @Inject
        public NotaFiscalBean(NotaFiscalService notaFiscalService, ProdutoService produtoService, NotaFiscalProdutoService notaFiscalProdutoService,
                        EmissorNotaFiscalEletronicaService emissorNotaFiscalEletronicaService, EmissorDiretoNotaFiscalService emissorDiretoNotaFiscalService,
                        PessoaService pessoaService, NotaFiscalConsultaPorDemanda lazy,
                        ProdutoLojaService produtoLojaService) {
                this.notaFiscalService = notaFiscalService;
                this.produtoService = produtoService;
                this.notaFiscalProdutoService = notaFiscalProdutoService;
                this.emissorNotaFiscalEletronicaService = emissorNotaFiscalEletronicaService;
                this.emissorDiretoNotaFiscalService = emissorDiretoNotaFiscalService;
                this.pessoaService = pessoaService;
                this.lazy = lazy;
                this.produtoLojaService = produtoLojaService;
        }      
       
        @Override
        public void preCarregamento() {
                entidade = new NotaFiscal();
                parametrosConsulta = new ParametrosConsultaNotaFiscalDTO();
                parametrosConsulta.setEntidade(entidade);
        }
       
        @Override
        public void limparEntidade() {
                setEntidade(new NotaFiscal());
        }

        @Override
        public GenericService<NotaFiscal> getService() {
                return notaFiscalService;
        }
       
        @Override
        public NotaFiscal getEntidade() {
                return entidade;
        }

        @Override
        public NotaFiscal getId() {
                return getEntidade();
        }
       
        public String getCodigoProdutoRemessa() {
                return codigoProdutoRemessa;
        }
        public void setCodigoProdutoRemessa(String codigoProdutoRemessa) {
                this.codigoProdutoRemessa = codigoProdutoRemessa;
        }
       
        public Produto getProdutoSelecionado() {
                return produtoSelecionado;
        }
        public void setProdutoSelecionado(Produto produtoSelecionado) {
                this.produtoSelecionado = produtoSelecionado;
        }
       
        public Integer getQuantidadeProdutoSelecionado() {
                return quantidadeProdutoSelecionado;
        }
        public void setQuantidadeProdutoSelecionado(Integer quantidadeProdutoSelecionado) {
                this.quantidadeProdutoSelecionado = quantidadeProdutoSelecionado;
        }
       
        public NotaFiscalRemessaDTO getNotaFiscalRemessa() {
                return notaFiscalRemessa;
        }
        public void setNotaFiscalRemessa(NotaFiscalRemessaDTO notaFiscalRemessa) {
                this.notaFiscalRemessa = notaFiscalRemessa;
        }
       
        public Fornecedor getFornecedorParaRemessa() {
                return fornecedorParaRemessa;
        }
        public void setFornecedorParaRemessa(Fornecedor fornecedorParaRemessa) {
                this.fornecedorParaRemessa = fornecedorParaRemessa;
        }
       
        public Loja getLojaParaRemessa() {
                return lojaParaRemessa;
        }
        public void setLojaParaRemessa(Loja lojaParaRemessa) {
                this.lojaParaRemessa = lojaParaRemessa;
        }
       
        public NotaFiscalConsultaPorDemanda getLazy() {
                prepararConsultaDemanda();
                return lazy;
        }
        public void setLazy(NotaFiscalConsultaPorDemanda lazy) {
                this.lazy = lazy;
        }
        public void prepararConsultaDemanda() {
                lazy.setarParametrosConsulta(getParametrosConsulta());
        }
       
        public TipoNotaFiscal[] getTiposNotaFiscal() {
                return TipoNotaFiscal.values();
        }
       
        public void prepararParaCadastrarNFeRemessa() {
                setNotaFiscalRemessa(new NotaFiscalRemessaDTO());
                preRealizar();
        }
       
        /***************************************************************/
       
        @Override
        public void cadastrar(final NotaFiscal notaFiscal) {
                new VerificadorLancamentoException().tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean() {
                        public void execute() {
                                notaFiscal.setDataHoraEmissao(DataUtils.getDataAtual());
                                notaFiscal.setTipoNotaFiscal(TipoNotaFiscal.NFCE_SAIDA.getValor());
                                notaFiscal.setTipoModeloNotaFiscal(TipoModeloNotaFiscal.MODELO_NFCE_65.getValor());
                                getService().cadastrar(notaFiscal);
                                limparEntidade();
                                LancadorMensagem.lancarSucesso(getMensagens().get(IDENTIFICADOR_MENSAGEM_CADASTRADO_COM_SUCESSO));
                        }
                });
        }
       
        @Override
        public void excluir(final NotaFiscal notaFiscal) {
                new VerificadorLancamentoException().tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean() {
                        public void execute() {
                                getService().excluir(notaFiscal);
                                limparEntidade();
                                LancadorMensagem.lancarSucesso(getMensagens().get(IDENTIFICADOR_MENSAGEM_EXCLUIDO_COM_SUCESSO));
                        }
                });
        }
       
        public void cancelarNotaFiscal(final NotaFiscal notaFiscal) {
                new VerificadorLancamentoException().tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean() {
                        public void execute() {
                                LancadorMensagem.lancarSucesso("OPERAÇÃO NÃO IMPLEMENTADA");
//                              notaFiscalService.cancelarNFCe(notaFiscal);
//                              LancadorMensagem.lancarSucesso("NOTA FISCAL CANCELADA COM SUCESSO");
                        }
                });
        }
       
        public void detalharNotaFiscal(NotaFiscal notaFiscal) {
                setEntidade(notaFiscalService.detalhar(notaFiscal));
                getEntidade().setListaNFRemessaProdutos(notaFiscalProdutoService.consultarProdutosDaNotaFiscal(getEntidade()));
        }
       
        public void iniciarNfeRemessa() {
                new VerificadorLancamentoException().tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean() {
                        public void execute() {
                                NotaFiscal notaFiscal = new NotaFiscal();
                                notaFiscal.setTipoModeloNotaFiscal(TipoModeloNotaFiscal.MODELO_NFE_55.getValor());
                                notaFiscal.setTipoNotaFiscal(TipoNotaFiscal.NFE_REMESSA_SAIDA.getValor());
                                notaFiscal.setSerie(TipoNotaFiscal.NFE_REMESSA_SAIDA.getSerie());
                                notaFiscal.setDataHoraEmissao(DataUtils.getDataAtual());
                                notaFiscal.setPessoaEmitente(getNotaFiscalRemessa().getLojaEmitente().getPessoaJuridica());
                                notaFiscal.setPessoaDestinatario(getNotaFiscalRemessa().getLojaDestino().getPessoaJuridica());
                                notaFiscalService.alterar(notaFiscal);
                                getNotaFiscalRemessa().preencherDadosNotaFiscal(notaFiscal);
                                getNotaFiscalRemessa().setPessoaEmitente(getNotaFiscalRemessa().getLojaEmitente().getPessoaJuridica());
                                getNotaFiscalRemessa().setPessoaDestinatario(getNotaFiscalRemessa().getLojaDestino().getPessoaJuridica());
                                setCodigoProdutoRemessa(null);
                                LancadorMensagem.lancarSucesso("REMESSA INICIADA COM SUCESSO");
                        }
                });
        }
       
        public void consultarNfeRemessa(final NotaFiscal nf) {
                new VerificadorLancamentoException().tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean() {
                        public void execute() {
                                preRealizar();
                                setEntidade(notaFiscalService.detalhar(nf));
                                getEntidade().setListaNFRemessaProdutos(notaFiscalProdutoService.consultarProdutosDaNotaFiscal(getEntidade()));
                                setNotaFiscalRemessa(new NotaFiscalRemessaDTO());
                                getNotaFiscalRemessa().preencherDadosNotaFiscal(getEntidade());
                        }
                });
        }
       
        public void escolherProduto() {
                new VerificadorLancamentoException().tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean() {
                        public void execute() {
                                Produto produtoConsultado = produtoService.consultarProdutoPorCodigoOuCodigoEAN(getCodigoProdutoRemessa());
                                if (VerificadorUtil.estaNulo(produtoConsultado)) {
                                        LancadorMensagem.lancarErro("Produto não encontrado!");
                                } else {
                                        setProdutoSelecionado(produtoConsultado);
                                        setQuantidadeProdutoSelecionado(1);
                                        RequestContext.getCurrentInstance().addCallbackParam("confirmado", true);
                                }
                        }
                });
        }
       
        public void escolherProduto(Produto produto) {
                setProdutoSelecionado(produto);
                setQuantidadeProdutoSelecionado(1);
        }
       
        public void adicionarProduto() {
                new VerificadorLancamentoException().tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean() {
                        public void execute() {
                                NotaFiscalProduto notaFiscalRemessaProduto = new NotaFiscalProduto();
//                              notaFiscalRemessaProduto.setProduto(getProdutoSelecionado());
                                notaFiscalRemessaProduto.setQuantidade(getQuantidadeProdutoSelecionado());
                                notaFiscalRemessaProduto.setNotaFiscal(notaFiscalService.consultarPorId(getNotaFiscalRemessa().getNotaFiscal()));
                                notaFiscalProdutoService.cadastrar(notaFiscalRemessaProduto);
//                              verificarParametros(notaFiscalRemessaProduto);
                                consultarNfeRemessa(getNotaFiscalRemessa().getNotaFiscal());
                                setCodigoProdutoRemessa(null);
                                LancadorMensagem.lancarSucesso("Produto adicionado, código: " + getProdutoSelecionado().getCodigoProdutoPadrao());
                        }
                });
        }
       
        public void removerProduto(final NotaFiscalProduto notaFiscalProduto) {
                new VerificadorLancamentoException().tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean() {
                        public void execute() {
                                notaFiscalProdutoService.excluir(notaFiscalProduto);
                                consultarNfeRemessa(notaFiscalProduto.getNotaFiscal());
                                LancadorMensagem.lancarSucesso("Produto removido com sucesso");
                        }
                });
        }
       
        public void emitirNfeRemessa() {
                new VerificadorLancamentoException().tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean() {
                        public void execute() {
                                NotaFiscal notaFiscal = notaFiscalService.detalhar(getEntidade());
                                notaFiscal.setPessoaEmitente(pessoaService.detalharPessoa(notaFiscal.getPessoaEmitente()));
                                notaFiscal.setPessoaDestinatario(pessoaService.detalharPessoa(notaFiscal.getPessoaDestinatario()));
                                notaFiscal.setListaNFRemessaProdutos(notaFiscalProdutoService.consultarProdutosDaNotaFiscal(getEntidade()));
                                emissorNotaFiscalEletronicaService.enviarNotaFiscalEletronicaRemessa(notaFiscal);
                                LancadorMensagem.lancarSucesso("NOTA FISCAL DE REMESSA: EMITIDA COM SUCESSO");
                        }
                });
        }
       
        // TODO: MÉTODO PROVISÓRIO
        public void emitirNfeDevolucao() {
                new VerificadorLancamentoException().tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean() {
                        public void execute() {
                                emissorDiretoNotaFiscalService.emitirNotaFiscalDireto(TipoModeloNotaFiscal.MODELO_NFE_55.getValor(), DocumentoEnum.NFE);
                                LancadorMensagem.lancarSucesso("NOTA FISCAL: EMITIDA COM SUCESSO");
                        }
                });
        }
       
        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);
        }
       
        /*
        private void verificarParametros(TransferenciaProduto transferenciaProduto) {
                if (VerificadorUtil.estaNulo(transferenciaProduto.getQuantidadeTransferir()) || transferenciaProduto.getQuantidadeTransferir().equals(0)) {
                        throw new NegocioException("Obrigatório informar a quantidade para transferência.");
                }
                verificarSeProdutoJaFoiAdicionado(transferenciaProduto.getSequencialDoProduto());
        }
       
        protected void verificarSeProdutoJaFoiAdicionado(Long sequencialProduto) {
                if (getEntidade().verificarSeProdutoJaConstaNaLista(sequencialProduto)) {
                        throw new NegocioException("Produto já foi adicionando anteriormente!");
                }
        }
        */

       
        // MÉTODO PARCIAL
        public void adicionarEstoqueProdutos() {
                // FORNECEDORES: "MULTILASER" 29, "VIVONA25" 25, "JBL HARMAN" 38, "HUSKY" 40, "BHX ENERGY" 37, "KINGO" 30, "GBMAX" 70,
                // "GIFFY" 32, "RCELL" 34, "TTNT" 60, "YASIN" 68, "DL COMERCIO" 71
                /*1;"LOJA POÇO"
                2;"QUIOSQUE EXTRA"
                3;"QUIOSQUE HIPER"
                4;"LOJA VIVO"
                5;"QUIOSQUE PÁTIO"
                6;"LOJA MATRIZ"
                7;"FARMÁCIA"
                8;"LOJA MACEIÓ"
                9;"ESTOQUE"
                13;"QUIOSQUE ANTARES"*/


                // FORNECEDORES APTOS
//              List<Integer> sequenciaisFornecedor = new ArrayList<>(Arrays.asList(29, 25, 38, 40, 37, 30, 70, 32, 34, 60, 68, 71));
//              List<Integer> sequenciaisFornecedor = new ArrayList<>(Arrays.asList(38));
                new VerificadorLancamentoException().tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean() {
                        public void execute() {
                                ParametrosConsultaProdutoDTO parametrosConsultaProduto = new ParametrosConsultaProdutoDTO();
                                parametrosConsultaProduto.setTipoRelatorioProduto(TipoRelatorio.PRODUTOS_COM_ESTOQUE.getValor());
                                if (VerificadorUtil.naoEstaNulo(getLojaParaRemessa())) {
                                        parametrosConsultaProduto.setLojaSelecionada(getLojaParaRemessa().getSequencial());
                                } else {
                                        LancadorMensagem.lancarErro("Selecione a loja do estoque");
                                }
                                if (VerificadorUtil.naoEstaNulo(getFornecedorParaRemessa())) {
                                        parametrosConsultaProduto.setFornecedor(getFornecedorParaRemessa());
                                } else {
                                        LancadorMensagem.lancarErro("Selecione o fornecedor");
                                }
                               
                                List<Produto> produtosAptos = produtoService.consultarProdutoPorParametros(parametrosConsultaProduto);
                                for (Produto produto : produtosAptos) {
                                        ProdutoLoja produtoLoja = null;
                                        if (VerificadorUtil.naoEstaNulo(getLojaParaRemessa())) {
                                                produtoLoja = produtoLojaService.consultarProdutoLoja(produto, getLojaParaRemessa());
                                        }
                                        NotaFiscalProduto notaFiscalProduto = new NotaFiscalProduto();
//                                      notaFiscalProduto.setProduto(produto);
                                        notaFiscalProduto.setQuantidade(produtoLoja.getQuantidadeEstoque());
                                        notaFiscalProduto.setNotaFiscal(getEntidade());
                                        notaFiscalProdutoService.cadastrar(notaFiscalProduto);
                                }
                                consultarNfeRemessa(getEntidade());
                        }
                });
        }
       
        public void retirarEstoqueProdutos() {
                for (NotaFiscalProduto notaFiscalProduto : getEntidade().getListaNFRemessaProdutos()) {
                        notaFiscalProdutoService.excluir(notaFiscalProduto);
                }
                consultarNfeRemessa(getEntidade());
        }
       
        public void abrirLinkCaminhoQrcode() {
                try {
                        FacesContext.getCurrentInstance().getExternalContext().redirect(getEntidade().getCaminhoQrcode());
                } catch (IOException e) {
                        e.printStackTrace();
                }
        }
       
        public static void main(String[] args) {
                List<Integer> sequenciaisFornecedor = new ArrayList<>(Arrays.asList(29, 25, 38, 40, 37, 30, 70, 32, 34, 60, 68, 71));
                for (Integer sequencialFornecedor : sequenciaisFornecedor) {
                        System.out.println(sequencialFornecedor);
                }
        }
       
}