internal static WsMobLinkService.Consultar ToWsConsultarService(this ConsultaNfeTo re, WsSoapServices wsSoapServices)
        {
            if (wsSoapServices == WsSoapServices.MobLink)
            {
                return(new WsMobLinkService.Consultar()
                {
                    homologacao = false,
                    cnpj_prestador = re.CnpjPrestador,
                    referencia = re.Referencia
                });
            }

            return(null);
        }
Exemple #2
0
        public async Task <Retorno <NotaFiscalRetornoTo> > ConsultarAsync(ConsultaNfeTo consultaNfeTo)
        {
            var notaFiscalRetornoTo = new NotaFiscalRetornoTo();
            var retorno             = new Retorno <NotaFiscalRetornoTo>()
            {
                Status = ResultadoOperacao.Sucesso
            };

            #region ValidaInicioProcesso

            Retorno <RetornoServicoTo> retornoValidacao = await ValidaInicioProcesso(consultaNfeTo.Autenticacao.Usuario, consultaNfeTo.Autenticacao.Senha, consultaNfeTo.CodigoMunicipio, consultaNfeTo.CnpjPrestador);

            if (retornoValidacao.Status != ResultadoOperacao.Sucesso)
            {
                retorno.Status = ResultadoOperacao.Falha;
                return(retorno);
            }

            #endregion

            var usuario = await _usuarioRepositoy.ObterTodosAsync(consultaNfeTo.Autenticacao.Usuario, consultaNfeTo.Autenticacao.Senha);

            var cidade = await _cidadeNfeRepository.ObterTodosAsync(consultaNfeTo.CodigoMunicipio, string.Empty);

            var parametros = await _parametroRepository.ObterTodosAsync(consultaNfeTo.CodigoMunicipio, consultaNfeTo.CnpjPrestador);

            /* Verifica se nota existe na base */
            var notaAutorizada = await _notaFiscalAutorizadaRepository.ObterTodosAsync(string.Empty, consultaNfeTo.Referencia);

            if (notaAutorizada != null)
            {
                /* Retorno do metodo */
                notaFiscalRetornoTo.Status = string.Format("Nota Fiscal obtida da Base {0}", notaAutorizada.Numero);
                if (Convert.ToInt32(consultaNfeTo.FormaRetorno) == (int)TipoRetorno.Url)
                {
                    notaFiscalRetornoTo.Url = notaAutorizada.UrlPrefeitura;
                }
                else
                {
                    notaFiscalRetornoTo.Imagem = Convert.ToBase64String(notaAutorizada.ImagemNfe);
                }
                notaFiscalRetornoTo.Numero = notaAutorizada.Numero;

                var objRequisicao = new Requisicao()
                {
                    Etapa                  = EtapaRequisicao.RecebidoPedido,
                    TempoExecucao          = 0,
                    Observacao             = string.Format("Nota Fiscal obtida da Base {0}", notaAutorizada.Numero),
                    Cidade                 = cidade,
                    UsuarioId              = usuario.Id,
                    Prestador              = parametros.Prestador,
                    ServicoWsSoap          = parametros.ServicoWsSoap,
                    Referencia             = Convert.ToInt32(consultaNfeTo.Referencia),
                    TipoOperacao           = TipoOperacao.Consulta,
                    NotaFiscalAutorizadaId = notaAutorizada.Id
                };
                await _requisicaoRepository.InserirAsync(objRequisicao);

                retorno.Objeto = notaFiscalRetornoTo;
                retorno.Status = ResultadoOperacao.Sucesso;
                return(retorno);
            }

            ServicoWsSoap servicoWsSoap = new ServicoWsSoap();

            /* Obtem cliente da requisição de autorização*/
            Requisicao requisicaoCliente = null;
            requisicaoCliente = await _requisicaoRepository.ObterTodosPorStatusAsync(Convert.ToInt32(consultaNfeTo.Referencia), TipoOperacao.Autorizacao, EtapaRequisicao.Processada, StatusOperacao.OperacaoEfetivada);

            if (requisicaoCliente == null)
            {
                requisicaoCliente = await _requisicaoRepository.ObterTodosPorStatusAsync(Convert.ToInt32(consultaNfeTo.Referencia), TipoOperacao.Autorizacao, EtapaRequisicao.Processada, StatusOperacao.ProcessandoOperacao);
            }

            if (requisicaoCliente != null)
            {
                /* Cliente pelo qual foi realizada o pedido de autorização (Autorizar a emissão de uma nfe)*/
                servicoWsSoap = requisicaoCliente.ServicoWsSoap;
            }
            else
            {
                servicoWsSoap = parametros.ServicoWsSoap;
            }

            /* Registra a requisição */
            var requisicao = new Requisicao
            {
                TipoOperacao  = TipoOperacao.Consulta,
                Referencia    = Convert.ToInt32(consultaNfeTo.Referencia),
                Etapa         = EtapaRequisicao.RecebidoPedido,
                Status        = StatusOperacao.Indefinido,
                Cidade        = cidade,
                UsuarioId     = usuario.Id,
                Prestador     = parametros.Prestador,
                ServicoWsSoap = parametros.ServicoWsSoap
            };

            int requisicaoId = await _requisicaoRepository.InserirAsync(requisicao);

            try
            {
                Retorno <RetornoWsTo> retornoServicoWs = null;

                /* Emite nota fiscal */
                if (servicoWsSoap.Codigo == (int)WsSoapServices.MobLink)
                {
                    WsMobLinkService.Consultar objConsultar   = consultaNfeTo.ToWsConsultarService(WsSoapServices.MobLink);
                    MobLinkService             mobLinkService = new MobLinkService(_x509Certificate2);
                    retornoServicoWs = await mobLinkService.ConsultarAsync(objConsultar);

                    if (retornoServicoWs.Status != ResultadoOperacao.Sucesso)
                    {
                        var requisicaoErro = await _requisicaoRepository.ObterPorIdAsync(requisicaoId);

                        requisicaoErro.Status = StatusOperacao.Erro;
                        requisicaoErro.Erro   = retornoServicoWs.Mensagens.Count > 0 ? retornoServicoWs.Mensagens[0].Mensagem : string.Empty;
                        requisicaoErro.Etapa  = retornoServicoWs.Objeto != null ? retornoServicoWs.Objeto.Etapa : EtapaRequisicao.PendenteEnvio;
                        _requisicaoRepository.Alterar(requisicaoErro);

                        retorno.Mensagens.AddRange(retornoServicoWs.Mensagens);
                        retorno.Status = retornoServicoWs.Status;
                        return(retorno);
                    }

                    var reqNovaEtapa = await _requisicaoRepository.ObterPorIdAsync(requisicaoId);

                    reqNovaEtapa.Status = retornoServicoWs.Objeto.DeserializedNfe != null?getStatusRequisicao(retornoServicoWs.Objeto.DeserializedNfe.Status) : StatusOperacao.Indefinido;

                    reqNovaEtapa.Observacao = retornoServicoWs.Objeto.DeserializedNfe != null ? retornoServicoWs.Objeto.DeserializedNfe.Status : string.Empty;
                    reqNovaEtapa.Etapa      = retornoServicoWs.Objeto.Etapa;
                    _requisicaoRepository.Alterar(reqNovaEtapa);
                }
                else
                {
                    retorno.Mensagens.Add(new MensagemSistemaDto()
                    {
                        Identificador = "CDXNF0005", Mensagem = string.Format("Não há um serviço soap cadastrado para a cidade de {0} .", cidade.Descricao)
                    });
                    retorno.Status = ResultadoOperacao.Falha;
                    return(retorno);
                }

                if (getStatusRequisicao(retornoServicoWs.Objeto.DeserializedNfe.Status) == StatusOperacao.ProcessandoOperacao || getStatusRequisicao(retornoServicoWs.Objeto.DeserializedNfe.Status) != StatusOperacao.OperacaoEfetivada)
                {
                    notaFiscalRetornoTo.Status = retornoServicoWs.Objeto.DeserializedNfe.Status;
                    retorno.Objeto             = notaFiscalRetornoTo;
                    retorno.Status             = ResultadoOperacao.Alerta;
                    return(retorno);
                }

                /* Obtendo a data de emissão*/
                var             numsegs     = Convert.ToInt32(retornoServicoWs.Objeto.DeserializedNfe.data_emissao.Replace("/Date(", "").Replace(")/", "").Substring(0, 10));
                System.DateTime dtDateTime  = new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc);
                var             dataEmissao = dtDateTime.AddSeconds(numsegs).ToLocalTime();

                var requisicaoAlteracao = await _requisicaoRepository.ObterPorIdAsync(requisicaoId);

                requisicaoAlteracao.Etapa         = EtapaRequisicao.Processada;
                requisicaoAlteracao.TempoExecucao = retornoServicoWs.Objeto.TempoExecucao;
                requisicaoAlteracao.Observacao    = string.Format("{0} {1} {2}", retornoServicoWs.Objeto.Observacao, retornoServicoWs.Objeto.DeserializedNfe != null ? retornoServicoWs.Objeto.DeserializedNfe.Status : string.Empty, retornoServicoWs.Objeto.DeserializedNfe != null ? retornoServicoWs.Objeto.DeserializedNfe.Numero : string.Empty);
                _requisicaoRepository.Alterar(requisicaoAlteracao);

                /* Grava dados da nota fiscal emitida */
                NotaFiscalAutorizada notaFiscalAutorizada = new NotaFiscalAutorizada()
                {
                    UsuarioId         = usuario.Id,
                    Referencia        = retornoServicoWs.Objeto.DeserializedNfe.Ref,
                    Status            = retornoServicoWs.Objeto.DeserializedNfe.Status,
                    Numero            = retornoServicoWs.Objeto.DeserializedNfe.Numero,
                    CodigoVerificacao = retornoServicoWs.Objeto.DeserializedNfe.Codigo_verificacao,
                    DataEmissao       = dataEmissao,
                    UrlPrefeitura     = retornoServicoWs.Objeto.DeserializedNfe.Url,
                    CaminhoNfe        = retornoServicoWs.Objeto.DeserializedNfe.caminho_xml_nota_fiscal,
                    ImagemNfe         = retornoServicoWs.Objeto.DeserializedNfe.Retorno_nota,
                    ServicoWsSoap     = parametros.ServicoWsSoap,
                    Prestador         = parametros.Prestador
                };

                var notaFiscalAutorizadaId = await _notaFiscalAutorizadaRepository.InserirAsync(notaFiscalAutorizada);

                /* Vincular a nota fiscal autorizada a requisição que solicitou a autorização */
                requisicaoCliente.NotaFiscalAutorizadaId = notaFiscalAutorizadaId;
                requisicaoCliente.Observacao             = retornoServicoWs.Objeto.DeserializedNfe != null ? retornoServicoWs.Objeto.DeserializedNfe.Status : string.Empty;
                _requisicaoRepository.Alterar(requisicaoAlteracao);

                /* Retorno do metodo */
                notaFiscalRetornoTo.Status = retornoServicoWs.Objeto.DeserializedNfe.Status;

                if (Convert.ToInt32(consultaNfeTo.FormaRetorno) == (int)TipoRetorno.Url)
                {
                    notaFiscalRetornoTo.Url = retornoServicoWs.Objeto.DeserializedNfe.Url;
                }
                else
                {
                    notaFiscalRetornoTo.Imagem = Convert.ToBase64String(retornoServicoWs.Objeto.DeserializedNfe.Retorno_nota);
                }
                notaFiscalRetornoTo.Numero = retornoServicoWs.Objeto.DeserializedNfe.Numero;

                retorno.Status = ResultadoOperacao.Sucesso;
                retorno.Objeto = notaFiscalRetornoTo;
            }
            catch (Exception ex)
            {
                var mensagem     = string.Format("Não foi possível obter a nota fiscal de referência {0}.", consultaNfeTo.Referencia);
                var requisicaoex = await _requisicaoRepository.ObterPorIdAsync(requisicaoId);

                requisicaoex.Erro       = string.Format("{0} - {1}", ex.Message, ex.InnerException != null ? ex.InnerException.Message : string.Empty);
                requisicaoex.Status     = StatusOperacao.Erro;
                requisicaoex.Observacao = mensagem;
                _requisicaoRepository.Alterar(requisicaoex);

                retorno.Mensagens.Add(new MensagemSistemaDto()
                {
                    Titulo = "Consulta de Nota", Identificador = "CDXNF0001", Mensagem = mensagem
                });
                retorno.Status = ResultadoOperacao.Falha;
            }

            return(retorno);
        }