Subversion Repositories Integrator Subversion

Rev

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

package br.com.ec.controller.managedbean;

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

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

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

import br.com.ec.core.exception.NegocioException;
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.TransferenciaProdutoDTO;
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.Produto;
import br.com.ec.domain.model.Transferencia;
import br.com.ec.domain.model.TransferenciaProduto;
import br.com.ec.domain.model.Usuario;
import br.com.ec.domain.model.tipos.nfe.TipoModeloNotaFiscal;
import br.com.ec.domain.model.tipos.nfe.TipoNotaFiscal;
import br.com.ec.domain.service.email.impl.GerenciadorEmailImpl;
import br.com.ec.domain.service.fornecedor.FornecedorService;
import br.com.ec.domain.service.loja.LojaService;
import br.com.ec.domain.service.notafiscal.NotaFiscalProdutoService;
import br.com.ec.domain.service.notafiscal.NotaFiscalService;
import br.com.ec.domain.service.produto.ProdutoService;
import br.com.ec.domain.service.produtodaloja.ProdutoLojaService;
import br.com.ec.domain.service.transferencia.TransferenciaService;
import br.com.ec.domain.service.transferenciaproduto.TransferenciaProdutoService;
import br.com.ec.domain.service.usuario.UsuarioService;
import br.com.ec.domain.shared.ConstantesSEC;
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.ec.web.util.TipoOperacao;

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

        private static final long serialVersionUID = 1L;
       
        private Loja lojaSelecionada;
        private Long sequencialLojaSelecionada;
        private String senhaUsuarioTransferencia;
        private Usuario usuarioTransferencia;
       
        private String codigoProduto;
        private Produto produtoSelecionado;
        private TransferenciaProdutoDTO transferenciaProdutoSelecionadoDTO;
        private Integer quantidadeProdutoSelecionado;
        private Boolean indicadorAlterarEstoqueProdutoSelecionado = true;
       
        private String senhaUsuarioTransporte;
        private String senhaUsuarioReceptor;
       
        private TransferenciaService transferenciaService;
        private TransferenciaProdutoService transferenciaProdutoService;
        private LojaService lojaService;
        private UsuarioService usuarioService;
        private ProdutoService produtoService;
        private ProdutoLojaService produtoLojaService;
        private NotaFiscalService notaFiscalService;
        private NotaFiscalProdutoService notaFiscalProdutoService;
        private FornecedorService fornecedorService;
       
        @Inject
        public TransferirProdutoBean(TransferenciaService transferenciaService, TransferenciaProdutoService transferenciaProdutoService,
                        LojaService lojaService, UsuarioService usuarioService, ProdutoService produtoService, ProdutoLojaService produtoLojaService,
                        NotaFiscalService notaFiscalService, NotaFiscalProdutoService notaFiscalProdutoService, FornecedorService fornecedorService) {
                this.transferenciaService = transferenciaService;
                this.transferenciaProdutoService = transferenciaProdutoService;
                this.lojaService = lojaService;
                this.usuarioService = usuarioService;
                this.produtoService = produtoService;
                this.produtoLojaService = produtoLojaService;
                this.notaFiscalService = notaFiscalService;
                this.notaFiscalProdutoService = notaFiscalProdutoService;
                this.fornecedorService = fornecedorService;
        }
       
        @Override
        public void preCarregamento() {
                entidade = new Transferencia();
                entidade.setLojaEntrada(getLojaSelecionada());
                entidade.setLojaSaida(getLojaSelecionada());
                setSenhaUsuarioTransferencia("");
        }
       
        @Override
        public void limparEntidade() {
                setEntidade(new Transferencia());
                setSenhaUsuarioTransferencia("");
                setUsuarioTransferencia(null);
                setLojaSelecionada(null);
                setCodigoProduto("");
        }

        @Override
        public GenericService<Transferencia> getService() {
                return transferenciaService;
        }
       
        @Override
        public Transferencia getEntidade() {
                return entidade;
        }

        @Override
        public Transferencia getId() {
                return getEntidade();
        }
       
        public Loja getLojaSelecionada() {
                if (VerificadorUtil.estaNulo(lojaSelecionada)) {
                        if (VerificadorUtil.naoEstaNulo(getSequencialLojaSelecionada())) {
                                Loja loja = new Loja();
                                loja.setSequencial(getSequencialLojaSelecionada());
                                lojaSelecionada = lojaService.consultarPorId(loja);
                        }
                }
                return lojaSelecionada;
        }
        public void setLojaSelecionada(Loja lojaSelecionada) {
                this.lojaSelecionada = lojaSelecionada;
        }
       
        public Long getSequencialLojaSelecionada() {
                if (VerificadorUtil.naoEstaNulo(getParametro("sequencialLoja"))) {
                        setSequencialLojaSelecionada(new Long(getParametro("sequencialLoja").toString()));
                }
                return sequencialLojaSelecionada;
        }
        public void setSequencialLojaSelecionada(Long sequencialLojaSelecionada) {
                this.sequencialLojaSelecionada = sequencialLojaSelecionada;
        }
       
        public String getSenhaUsuarioTransferencia() {
                return senhaUsuarioTransferencia;
        }
        public void setSenhaUsuarioTransferencia(String senhaUsuarioTransferencia) {
                this.senhaUsuarioTransferencia = senhaUsuarioTransferencia;
        }
       
        public Usuario getUsuarioTransferencia() {
                return usuarioTransferencia;
        }
        public void setUsuarioTransferencia(Usuario usuarioTransferencia) {
                this.usuarioTransferencia = usuarioTransferencia;
        }
        public Boolean possuiUsuarioTransferencia() {
                return VerificadorUtil.naoEstaNulo(getUsuarioTransferencia());
        }
       
        public String getCodigoProduto() {
                return codigoProduto;
        }
        public void setCodigoProduto(String codigoProduto) {
                this.codigoProduto = codigoProduto;
        }
       
        public Produto getProdutoSelecionado() {
                return produtoSelecionado;
        }
        public void setProdutoSelecionado(Produto produtoSelecionado) {
                this.produtoSelecionado = produtoSelecionado;
        }
       
        public TransferenciaProdutoDTO getTransferenciaProdutoSelecionadoDTO() {
                return transferenciaProdutoSelecionadoDTO;
        }
        public void setTransferenciaProdutoSelecionadoDTO(TransferenciaProdutoDTO transferenciaProdutoSelecionadoDTO) {
                this.transferenciaProdutoSelecionadoDTO = transferenciaProdutoSelecionadoDTO;
        }
       
        public Integer getQuantidadeProdutoSelecionado() {
                return quantidadeProdutoSelecionado;
        }
        public void setQuantidadeProdutoSelecionado(Integer quantidadeProdutoSelecionado) {
                this.quantidadeProdutoSelecionado = quantidadeProdutoSelecionado;
        }
       
        public Boolean getIndicadorAlterarEstoqueProdutoSelecionado() {
                return indicadorAlterarEstoqueProdutoSelecionado;
        }
        public void setIndicadorAlterarEstoqueProdutoSelecionado(Boolean indicadorAlterarEstoqueProdutoSelecionado) {
                this.indicadorAlterarEstoqueProdutoSelecionado = indicadorAlterarEstoqueProdutoSelecionado;
        }
       
        public String getSenhaUsuarioTransporte() {
                return senhaUsuarioTransporte;
        }
        public void setSenhaUsuarioTransporte(String senhaUsuarioTransporte) {
                this.senhaUsuarioTransporte = senhaUsuarioTransporte;
        }
       
        public String getSenhaUsuarioReceptor() {
                return senhaUsuarioReceptor;
        }
        public void setSenhaUsuarioReceptor(String senhaUsuarioReceptor) {
                this.senhaUsuarioReceptor = senhaUsuarioReceptor;
        }
       
        /***************************************************************/
       
        public Integer quantidadeTransferencias(Loja loja) {
                return transferenciaService.obterQuantidadeDeTransferenciasAbertas(loja);
        }
       
        @Override
        public void preAlterar(Transferencia transferencia) {
                limparEntidade();
                transferencia.setProdutosDTO(transferenciaService.consultarProdutos(transferencia));
                super.preAlterar(transferencia);
        }
       
        @Override
        public void preDetalhar(Transferencia transferencia) {
                limparEntidade();
                transferencia.setProdutosDTO(transferenciaService.consultarProdutos(transferencia));
                super.preDetalhar(transferencia);
        }
       
        public Boolean todosProdutosRecebidos() {
                for (TransferenciaProdutoDTO produto : getEntidade().getProdutosDTO()) {
                        if (!produto.getRecebido()) {
                                return false;
                        }
                }
                return true;
        }
       
        public void retirarVerificacaoProdutos() {
                for (TransferenciaProdutoDTO produto : getEntidade().getProdutosDTO()) {
                        produto.setRecebido(false);
                }
        }
       
        public void escolherProduto() {
                new VerificadorLancamentoException().tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean() {
                        public void execute() {
                                Produto produtoConsultado = produtoService.consultarProdutoPorCodigoOuCodigoEAN(getCodigoProduto());
                                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);
                setIndicadorAlterarEstoqueProdutoSelecionado(true);
        }
       
        public void adicionarProduto() {
                new VerificadorLancamentoException().tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean() {
                        public void execute() {
                                Usuario usuarioTransferencia = getUsuarioTransferencia();
                                TransferenciaProduto transferenciaProduto = new TransferenciaProduto();
                                transferenciaProduto.setProduto(getProdutoSelecionado());
                                transferenciaProduto.setQuantidadeTransferir(getQuantidadeProdutoSelecionado());
                                transferenciaProduto.setIndicadorAlterarEstoque(getIndicadorAlterarEstoqueProdutoSelecionado());
                                transferenciaProduto.setIndicadorRecebido(false);
                                transferenciaProduto.setTransferencia(getEntidade());
                                transferenciaProduto.setUsuarioSaida(usuarioTransferencia);
                                verificarParametros(transferenciaProduto);
                                verificarAlertas(transferenciaProduto);
                                transferenciaProdutoService.alterar(transferenciaProduto);
                                preAlterar(getEntidade());
                                setCodigoProduto(null);
                                setUsuarioTransferencia(usuarioTransferencia);
                                LancadorMensagem.lancarSucesso("Produto adicionado, código: " + getProdutoSelecionado().getCodigoProdutoPadrao());
                        }
                });
        }
       
        private void verificarAlertas(TransferenciaProduto transferenciaProduto) {
                Integer estoqueProdutoLojaSaida = produtoLojaService.consultarEstoqueProdutoEeLoja(transferenciaProduto.getProduto(), transferenciaProduto.getTransferencia().getLojaSaida());
                if (estoqueProdutoLojaSaida < transferenciaProduto.getQuantidadeTransferir()) {
                        transferenciaProduto.setObservacao("QUANTIDADE SUPERIOR AO ESTOQUE");
                }
                if (estoqueProdutoLojaSaida < 0) {
                        transferenciaProduto.setObservacao("QUANTIDADE SUPERIOR AO ESTOQUE (ESTOQUE NEGATIVO)");
                }
        }

        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!");
                }
        }
       
        public void removerProduto(final TransferenciaProdutoDTO transferenciaProdutoDTO) {
                new VerificadorLancamentoException().tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean() {
                        public void execute() {
                                Usuario usuarioTransferencia = getUsuarioTransferencia();
                                transferenciaProdutoService.excluirTransferenciaProduto(transferenciaProdutoDTO);
                                preAlterar(getEntidade());
                                setUsuarioTransferencia(usuarioTransferencia);
                                LancadorMensagem.lancarSucesso("Produto removido, código: " + transferenciaProdutoDTO.getCodigoProdutoPadrao());
                        }
                });
        }
       
        public void escolherTransferenciaProduto() {
                new VerificadorLancamentoException().tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean() {
                        public void execute() {
                                if (VerificadorUtil.estaNuloOuVazio(getCodigoProduto())) {
                                        LancadorMensagem.lancarErro("Informe o código do produto!");
                                } else {
                                        boolean produtoLocalizado = false;
                                        for (TransferenciaProdutoDTO transferenciaProdutoDTO : getEntidade().getProdutosDTO()) {
                                                if (transferenciaProdutoDTO.verificarSeCodigoEhIgual(getCodigoProduto())) {
                                                        setTransferenciaProdutoSelecionadoDTO(transferenciaProdutoDTO);
                                                        produtoLocalizado = true;
                                                        break;
                                                }
                                        }
                                        if (produtoLocalizado) {
                                                RequestContext.getCurrentInstance().addCallbackParam("confirmado", true);
                                        } else {
                                                LancadorMensagem.lancarErro("Produto não localizado!");
                                        }
                                }
                        }
                });
        }
       
        public void receberProduto() {
                new VerificadorLancamentoException().tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean() {
                        public void execute() {
                                for (TransferenciaProdutoDTO transferenciaProdutoDTO : getEntidade().getProdutosDTO()) {
                                        if (transferenciaProdutoDTO.verificarSeCodigoEhIgual(getCodigoProduto())) {
                                                if (transferenciaProdutoDTO.getRecebido()) {
                                                        LancadorMensagem.lancarErro("Produto já foi recebido anteriormente!");
                                                        break;
                                                }
                                                transferenciaProdutoDTO.setRecebido(true);
                                                receberProduto(transferenciaProdutoDTO);
                                                setCodigoProduto(null);
                                                LancadorMensagem.lancarSucesso("Produto recebido com sucesso!");
                                                break;
                                        }
                                }
                        }
                });
        }
       
        public void receberProduto(final TransferenciaProdutoDTO transferenciaProdutoDTO) {
                new VerificadorLancamentoException().tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean() {
                        public void execute() {
                                Usuario usuarioTransferencia = getUsuarioTransferencia();
                                transferenciaProdutoDTO.setUsuarioEntrada(usuarioTransferencia);
                                transferenciaProdutoService.receberProduto(transferenciaProdutoDTO, transferenciaProdutoDTO.getRecebido());
                                preDetalhar(getEntidade());
                                setUsuarioTransferencia(usuarioTransferencia);
                        }
                });
        }
       
        public void verificarTodasTransferenciaProduto() {
                new VerificadorLancamentoException().tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean() {
                        public void execute() {
                                Usuario usuarioTransferencia = getUsuarioTransferencia();
                                setEntidade(transferenciaService.detalharTransferencia(getEntidade()));
                                List<TransferenciaProduto> produtosRecebidosPosteriormente = new ArrayList<TransferenciaProduto>();
                                for (TransferenciaProduto transferenciaProduto : getEntidade().getListaProdutos()) {
                                        if (!transferenciaProduto.getIndicadorRecebido()) {
                                                produtosRecebidosPosteriormente.add(transferenciaProduto);
                                                transferenciaProduto.setUsuarioEntrada(usuarioTransferencia);
                                                transferenciaProduto.setIndicadorRecebido(true);
                                        }
                                }
                                getService().alterar(getEntidade());
                                preDetalhar(getEntidade());
                                setUsuarioTransferencia(usuarioTransferencia);
                                enviarEmailProcedimentoVerificarTudo(getEntidade(), usuarioTransferencia, produtosRecebidosPosteriormente);
                        }

                        private void enviarEmailProcedimentoVerificarTudo(Transferencia tranferencia, Usuario usuarioTransferencia, List<TransferenciaProduto> produtosRecebidosPosteriormente) {
                                String diaAtual = DataUtils.converterDataParaString(DataUtils.getDataAtual());
                                new GerenciadorEmailImpl()
                                        .comEmailsDestino(ConstantesSEC.DESTINATARIOS_EMAIL_SUPERVISAO)
                                        .comAssunto("ESPAÇO CASE - RECEBIMENTO VERIFICANDO TUDO : " + diaAtual)
                                        .comConteudo(montarDadosDaTransferencia(tranferencia, usuarioTransferencia, produtosRecebidosPosteriormente))
                                        .enviar();
                        }
                       
                        private String montarDadosDaTransferencia(Transferencia tranferencia, Usuario usuarioTransferencia, List<TransferenciaProduto> produtosRecebidosPosteriormente) {
                                StringBuilder conteudo = new StringBuilder();
                                conteudo.append("OPERAÇÃO REALIZADA POR: " + usuarioTransferencia.getNome() + "\n");
                                conteudo.append("LOJA ORIGEM: " + tranferencia.getLojaSaida().getDescricao() + "\n");
                                conteudo.append("LOJA DESTINO: " + tranferencia.getLojaEntrada().getDescricao() + "\n");
                                conteudo.append("DATA DA SOLICITAÇÃO: " + DataUtils.converterDataComHorarioParaString(tranferencia.getDataSolicitacao()) + "\n");
                                conteudo.append("__________________________________________________\n\n");
                                conteudo.append("ITENS RECEBIDOS VERIFICANDO TUDO: " + produtosRecebidosPosteriormente.size() + "\n");
                                conteudo.append("__________________________________________________\n");
                                for (TransferenciaProduto produtoRecebido : produtosRecebidosPosteriormente) {
                                        conteudo.append(produtoRecebido.getProduto().getCodigoProdutoPadrao() + " | ");
                                        conteudo.append(produtoRecebido.getProduto().getDescricaoComModeloCompleta() + ", ");
                                        conteudo.append("QUANTIDADE: " + produtoRecebido.getQuantidadeTransferir());
                                        conteudo.append("\n");
                                }
                                conteudo.append("__________________________________________________\n\n");
                                conteudo.append("TRANSFERÊNCIA:\n");
                                conteudo.append("__________________________________________________\n");
                                for (TransferenciaProduto transferenciaProduto : tranferencia.getListaProdutos()) {
                                        conteudo.append(transferenciaProduto.getProduto().getCodigoProdutoPadrao() + " | ");
                                        conteudo.append(transferenciaProduto.getProduto().getDescricaoComModeloCompleta() + ", ");
                                        conteudo.append("QUANTIDADE: " + transferenciaProduto.getQuantidadeTransferir());
                                        conteudo.append("\n");
                                }
                                conteudo.append("__________________________________________________\n\n");
                                return conteudo.toString();
                        }
                });
        }
       
        public void solicitarTransferencia() {
                new VerificadorLancamentoException().tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean() {
                        public void execute() {
                                getEntidade().setConferido(false);
                                cadastrar();
                        }
                });
        }
       
        public void cadastrarTransferencia() {
                new VerificadorLancamentoException().tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean() {
                        public void execute() {
                                getEntidade().setConferido(true);
                                cadastrar();
                        }
                });
        }
       
        public void cadastrar() {
                new VerificadorLancamentoException().tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean() {
                        public void execute() {
                                Usuario usuarioTransferencia = verificarSenhaUsuario(getSenhaUsuarioTransferencia());
                                usuarioService.naoPermitirPerfilLoja(usuarioTransferencia);
                                getEntidade().setLojaSaida(getLojaSelecionada());
                                getService().cadastrar(getEntidade());
                                preAlterar(getEntidade());
                                setLojaSelecionada(getEntidade().getLojaSaida());
                                setUsuarioTransferencia(usuarioTransferencia);
                                LancadorMensagem.lancarSucesso("TRANSFERÊNCIA INICIADA");
                        }
                });
        }
       
        public void alterarSolicitacaoTransferencia() {
                new VerificadorLancamentoException().tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean() {
                        public void execute() {
                                Usuario usuario = verificarSenhaUsuario(getSenhaUsuarioTransferencia());
                                usuarioService.naoPermitirPerfilLoja(usuario);
                                setUsuarioTransferencia(usuario);
                        }
                });
        }
       
        public void iniciarTransferencia() {
                new VerificadorLancamentoException().tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean() {
                        public void execute() {
                                Usuario usuario = verificarSenhaUsuario(getSenhaUsuarioTransferencia());
                                usuarioService.naoPermitirPerfilLoja(usuario);
                                getEntidade().setConferido(true);
                                retirarVerificacaoProdutos();
                                alterar();
                                LancadorMensagem.lancarSucesso("TRANSFERÊNCIA INICIADA");
                        }
                });
        }
       
        public void solicitarNovamenteTransferencia() {
                new VerificadorLancamentoException().tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean() {
                        public void execute() {
                                Usuario usuario = verificarSenhaUsuario(getSenhaUsuarioTransferencia());
                                usuarioService.naoPermitirPerfilLoja(usuario);
                                getEntidade().setConferido(false);
                                retirarVerificacaoProdutos();
                                alterar();
                                LancadorMensagem.lancarSucesso("SOLICITAÇÃO DE TRANSFERÊNCIA INICIADA");
                        }
                });
        }
       
        private Usuario verificarSenhaUsuario(String senha) {
                return usuarioService.consultarUsuarioPorSenha(senha);
        }
       
        public void receberProdutos() {
                new VerificadorLancamentoException().tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean() {
                        public void execute() {
                                transferenciaService.receberProdutos(getEntidade());
                                setTipoOperacao(TipoOperacao.CONSULTAR);
                                LancadorMensagem.lancarSucesso("TRANSFERÊNCIA CONCLUÍDA COM SUCESSO");
                                Transferencia transferencia = transferenciaService.detalharTransferencia(getEntidade());
                                gerarNotaFiscalRemessa(transferencia);
                                limparEntidade();
                        }
                });
        }
       
        public void excluirTransferencia(final Transferencia transferencia) {
                new VerificadorLancamentoException().tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean() {
                        public void execute() {
                                transferenciaService.excluir(transferencia);
                                LancadorMensagem.lancarSucesso("RANSFERÊNCIA EXCLUÍDA COM SUCESSO");
                        }
                });
        }
       
        public void verificarTodosProdutos() {
                new VerificadorLancamentoException().tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean() {
                        public void execute() {
                                for (TransferenciaProdutoDTO transferenciaProdutoDTO : getEntidade().getProdutosDTO()) {
                                        transferenciaProdutoDTO.setRecebido(true);
                                }
                                LancadorMensagem.lancarSucesso("Produtos verificados com sucesso!");
                        }
                });
        }
       
        public void gerarNotaFiscalRemessa(final Transferencia transferencia) {
                new VerificadorLancamentoException().tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean() {
                        public void execute() {
                                if (sePermitidoEnvio(transferencia)) {
                                        String numeroNota = "" + notaFiscalService.consultarProximoNumeroNotaFiscal(TipoNotaFiscal.NFE_REMESSA_SAIDA.getValor(), transferencia.getLojaSaida().getPessoaJuridica());
                                        NotaFiscal notaFiscal = new NotaFiscal();
                                        notaFiscal.setNumeroNotaFiscal(new Long(numeroNota));
                                        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(transferencia.getLojaSaida().getPessoaJuridica());
                                        notaFiscal.setPessoaDestinatario(transferencia.getLojaEntrada().getPessoaJuridica());
                                        notaFiscalService.cadastrar(notaFiscal);
                                       
                                        // ADICIONAR PRODUTOS COM FORNECEDORES APTOS
                                        NotaFiscal notaFiscalRemessa = notaFiscalService.consultarPeloNumeroEeTipo(notaFiscal.getNumeroNotaFiscal(), notaFiscal.getTipoNotaFiscal());
                                        List<Fornecedor> fornecedoresEmitemNota = fornecedorService.consultarFornecedoresComEmissaoNota();
                                        List<TransferenciaProduto> transferenciaProdutos = transferenciaService.consultarProdutosVerificandoFornecedores(transferencia, fornecedoresEmitemNota);
                                        for (TransferenciaProduto transferenciaProduto : transferenciaProdutos) {
                                                NotaFiscalProduto notaFiscalProduto = new NotaFiscalProduto();
                                                notaFiscalProduto.setNotaFiscal(notaFiscalRemessa);
//                                              notaFiscalProduto.setProduto(transferenciaProduto.getProduto());
                                                notaFiscalProduto.setQuantidade(transferenciaProduto.getQuantidadeTransferir());
                                                notaFiscalProdutoService.cadastrar(notaFiscalProduto);
                                        }
                                        transferencia.setNotaFiscalRemessa(notaFiscalRemessa);
                                        transferenciaService.alterar(transferencia);
                                       
                                        LancadorMensagem.lancarSucesso("NOTA DE REMESSA: INICIADA COM SUCESSO");
                                }
                        }

                        private boolean sePermitidoEnvio(Transferencia transferencia) {
                                if (VerificadorUtil.estaNulo(transferencia.getLojaEntrada().getPessoaJuridica())
                                                || VerificadorUtil.estaNulo(transferencia.getLojaSaida().getPessoaJuridica())) {
                                        return false;
                                }
                                return seEmitenteForMatriz(transferencia) && transferencia.getLojaEntrada().getReceberNotaFiscalRemessa() && !seCnpjsIguais(transferencia);
                        }

                        private boolean seEmitenteForMatriz(final Transferencia transferencia) {
                                return transferencia.getLojaSaida().getPessoaJuridica().getCpfCnpj().equals(ConstantesSEC.Empresa.CNPJ_21494821000100);
                        }

                        private boolean seCnpjsIguais(final Transferencia transferencia) {
                                return transferencia.getLojaSaida().getPessoaJuridica().getCpfCnpj().equals(transferencia.getLojaEntrada().getPessoaJuridica().getCpfCnpj());
                        }
                       
                });
        }

        public void iniciarTransporte(Transferencia transferencia) {
                setEntidade(transferencia);
                transferencia.setProdutosDTO(transferenciaService.consultarProdutos(transferencia));
        }
       
        public void iniciarTransporte() {
                new VerificadorLancamentoException().tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean() {
                        public void execute() {
                                Usuario usuarioTransporte = usuarioService.consultarUsuarioPorSenha(getSenhaUsuarioTransporte());
                                usuarioService.naoPermitirPerfilLoja(usuarioTransporte);
                                getEntidade().setUsuarioTransportador(usuarioTransporte);
                                getEntidade().setDataHoraInicioTransporte(DataUtils.getDataAtual());
                                transferenciaService.alterar(getEntidade());
                                setSenhaUsuarioTransporte("");
                                LancadorMensagem.lancarSucesso("Iniciando transporte da transferência ID: " + getEntidade().getSequencial());
                        }
                });
        }
       
        public void receberTransporte() {
                new VerificadorLancamentoException().tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean() {
                        public void execute() {
                                Usuario usuarioReceptor = usuarioService.consultarUsuarioPorSenha(getSenhaUsuarioReceptor());
                                usuarioService.naoPermitirPerfilLoja(usuarioReceptor);
                                getEntidade().setUsuarioReceptor(usuarioReceptor);
                                transferenciaService.alterar(getEntidade());
                                setSenhaUsuarioReceptor("");
                                LancadorMensagem.lancarSucesso("Transferência recebida com sucesso, ID: " + getEntidade().getSequencial());
                        }
                });
        }
       
}