/// <summary> /// Consulta situação do Lote de MDFe (método acionado pelo usuário) /// </summary> /// <param name="idManifestoEletronico"></param> /// <returns></returns> public static string ConsultaSitLoteMDFe(int idManifestoEletronico) { var mdfe = ManifestoEletronicoDAO.Instance.ObterManifestoEletronicoPeloId(idManifestoEletronico); var protocolo = ProtocoloMDFeDAO.Instance.GetElement(idManifestoEletronico, (int)ProtocoloMDFe.TipoProtocoloEnum.Autorizacao); #region Monta XML de requisição de situação do lote if (protocolo == null || string.IsNullOrEmpty(protocolo.NumRecibo)) { throw new Exception("O MDFe não foi emitido. Não há número de recibo."); } string strXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<consReciMDFe xmlns=\"http://www.portalfiscal.inf.br/mdfe\" " + "versao=\"" + ConfigMDFe.VersaoRecepcao + "\">" + "<tpAmb>" + (int)ConfigMDFe.TipoAmbiente + "</tpAmb>" + "<nRec>" + protocolo.NumRecibo.PadLeft(15, '0') + "</nRec></consReciMDFe>"; XmlDocument xmlRetRecep = new XmlDocument(); xmlRetRecep.LoadXml(strXml); #endregion #region Valida XML try { ValidaXML.Validar(xmlRetRecep, ValidaXML.TipoArquivoXml.ConsultaRecibo); } catch (Exception ex) { throw ex; } #endregion // Guarda o status do lote var cStat = 0; var xMotivo = string.Empty; XmlNode xmlRetorno = null; // Salva o callback padrão do WebService System.Net.Security.RemoteCertificateValidationCallback callback = System.Net.ServicePointManager.ServerCertificateValidationCallback; try { // Altera o callback de validação do WebService System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate(object sender, System.Security.Cryptography.X509Certificates.X509Certificate cert, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors error) { // Verifica se a data do certificado é válida DateTime beginDate = DateTime.Parse(cert.GetEffectiveDateString()); DateTime endDate = DateTime.Parse(cert.GetExpirationDateString()); bool isDateValid = (DateTime.Now >= beginDate) && (DateTime.Now <= endDate); // Retorna o resultado da função return(isDateValid); }; #region Envia o arquivo e recebe o retorno if (mdfe.TipoEmissao == Glass.Data.Model.TipoEmissao.Normal) { if (ConfigMDFe.TipoAmbiente == ConfigMDFe.TipoAmbienteMDFe.Producao) { xmlRetorno = GetWebService.PSVRSMDFeRetornoRecepcao(mdfe, null).mdfeRetRecepcao(xmlRetRecep); } // TipoAmbienteMDFe.Homologacao else { xmlRetorno = GetWebService.HSVRSMDFeRetornoRecepcao(mdfe, null).mdfeRetRecepcao(xmlRetRecep); } } // TipoEmissao.Contingencia else { if (ConfigMDFe.TipoAmbiente == ConfigMDFe.TipoAmbienteMDFe.Producao) { xmlRetorno = GetWebService.PSVRSMDFeRetornoRecepcao(mdfe, null).mdfeRetRecepcao(xmlRetRecep); } // TipoAmbienteMDFe.Homologacao else { xmlRetorno = GetWebService.HSVRSMDFeRetornoRecepcao(mdfe, null).mdfeRetRecepcao(xmlRetRecep); } } #endregion } catch (Exception ex) { throw new Exception(Glass.MensagemAlerta.FormatErrorMsg("Falha ao chamar WebService.", ex)); } finally { // Restaura o callback padrão para o WebService System.Net.ServicePointManager.ServerCertificateValidationCallback = callback; } // Se o lote já tiver sido processado, sai do loop if (xmlRetorno != null) // Lote processado { cStat = Conversoes.StrParaInt(xmlRetorno["cStat"].InnerXml); xMotivo = xmlRetorno["xMotivo"].InnerXml; } // Verifica o status do lote if (cStat == 104) // Lote processado { XmlNodeList protMDFeList = ((XmlElement)xmlRetorno).GetElementsByTagName("protMDFe"); // Para cada protocolo de autorização de uso (inicialmente será só um, pois cada nota está sendo enviada em um lote distinto) foreach (XmlNode protMDFeNode in protMDFeList) { return(ManifestoEletronicoDAO.Instance.RetornoEmissaoMDFe(idManifestoEletronico, protMDFeNode)); } return("Lote processado"); } else if (cStat == 105) // Lote em processamento { if (mdfe.Situacao != SituacaoEnum.ContingenciaOffline) { ManifestoEletronicoDAO.Instance.AlteraSituacao(idManifestoEletronico, SituacaoEnum.ProcessoEmissao); } return("Este MDFe ainda está sendo processado pela SEFAZ, aguarde para realizar uma nova consulta."); } else if (cStat == 106) // Lote não encontrado { if (mdfe.Situacao != SituacaoEnum.ContingenciaOffline) { ManifestoEletronicoDAO.Instance.AlteraSituacao(idManifestoEletronico, SituacaoEnum.FalhaEmitir); } LogMDFeDAO.Instance.NewLog(idManifestoEletronico, "Consulta", cStat, "Falha na emissão do MDFe. " + xMotivo); return("Falha na consulta. Não foi encontrado o lote de envio."); } else // Lote rejeitado { if (mdfe.Situacao != SituacaoEnum.ContingenciaOffline) { ManifestoEletronicoDAO.Instance.AlteraSituacao(idManifestoEletronico, SituacaoEnum.FalhaEmitir); } LogMDFeDAO.Instance.NewLog(idManifestoEletronico, "Consulta", cStat, xMotivo); string msgErro = "Falha na consulta. "; if (cStat == 215 || cStat == 243 || cStat == 630) { msgErro += "Mensagem de consulta inválida. "; } return(msgErro + cStat + " - " + CustomizaMensagemRejeicao(idManifestoEletronico, xMotivo)); } }
/// <summary> /// Consulta situação do MDFe /// </summary> /// <param name="idManifestoEletronico"></param> public static string ConsultaSitMDFe(int idManifestoEletronico) { // Busca dados do Manifesto Eletronico var mdfe = ManifestoEletronicoDAO.Instance.ObterManifestoEletronicoPeloId(idManifestoEletronico); #region Monta XML XmlDocument xmlConsSitMDFe = new XmlDocument(); XmlNode declarationNode = xmlConsSitMDFe.CreateXmlDeclaration("1.0", "UTF-8", null); xmlConsSitMDFe.AppendChild(declarationNode); XmlElement consSitMDFe = xmlConsSitMDFe.CreateElement("consSitMDFe"); consSitMDFe.SetAttribute("xmlns", "http://www.portalfiscal.inf.br/mdfe"); consSitMDFe.SetAttribute("versao", ConfigMDFe.VersaoConsulta); xmlConsSitMDFe.AppendChild(consSitMDFe); ManipulacaoXml.SetNode(xmlConsSitMDFe, consSitMDFe, "tpAmb", ((int)ConfigMDFe.TipoAmbiente).ToString()); ManipulacaoXml.SetNode(xmlConsSitMDFe, consSitMDFe, "xServ", "CONSULTAR"); ManipulacaoXml.SetNode(xmlConsSitMDFe, consSitMDFe, "chMDFe", mdfe.ChaveAcesso); #endregion #region Valida XML //try //{ // ValidaXML.Validar(xmlConsSitMDFe, ValidaXML.TipoArquivoXml.ConsultaSituacaoMDFe); //} //catch (Exception ex) //{ // throw new Exception("XML inconsistente." + ex.Message); //} #endregion // Salva o callback padrão do WebService System.Net.Security.RemoteCertificateValidationCallback callback = System.Net.ServicePointManager.ServerCertificateValidationCallback; XmlNode xmlRetorno = null; try { // Altera o callback de validação do WebService System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate(object sender, System.Security.Cryptography.X509Certificates.X509Certificate cert, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors error) { // Verifica se a data do certificado é válida DateTime beginDate = DateTime.Parse(cert.GetEffectiveDateString()); DateTime endDate = DateTime.Parse(cert.GetExpirationDateString()); bool isDateValid = (DateTime.Now >= beginDate) && (DateTime.Now <= endDate); // Retorna o resultado da função return(isDateValid); }; #region Envia o arquivo e recebe o retorno if (mdfe.TipoEmissao == Glass.Data.Model.TipoEmissao.Normal) { if (ConfigMDFe.TipoAmbiente == ConfigMDFe.TipoAmbienteMDFe.Producao) { xmlRetorno = GetWebService.PSVRSMDFeConsulta(mdfe, null).mdfeConsultaMDF(xmlConsSitMDFe); } // TipoAmbienteMDFe.Homologacao else { xmlRetorno = GetWebService.HSVRSMDFeConsulta(mdfe, null).mdfeConsultaMDF(xmlConsSitMDFe); } } // TipoEmissao.Contingencia else { if (ConfigMDFe.TipoAmbiente == ConfigMDFe.TipoAmbienteMDFe.Producao) { xmlRetorno = GetWebService.PSVRSMDFeConsulta(mdfe, null).mdfeConsultaMDF(xmlConsSitMDFe); } // TipoAmbienteMDFe.Homologacao else { xmlRetorno = GetWebService.HSVRSMDFeConsulta(mdfe, null).mdfeConsultaMDF(xmlConsSitMDFe); } } #endregion } catch (Exception ex) { throw new Exception(Glass.MensagemAlerta.FormatErrorMsg("Falha ao chamar WebService.", ex)); } finally { // Restaura o callback padrão para o WebService System.Net.ServicePointManager.ServerCertificateValidationCallback = callback; } // Executa ações de acordo com o retorno return(ManifestoEletronicoDAO.Instance.RetornoConsSitMDFe(idManifestoEletronico, xmlRetorno)); }
/// <summary> /// Envia pedido de consulta não encerrados para SEFAZ /// </summary> /// <param name="idLoja"></param> /// <returns></returns> public static string EnviaConsultaNaoEncerrados(uint idLoja) { try { var tipoEmissao = Configuracoes.FiscalConfig.ManifestoEletronico.ContingenciaMDFe == Helper.DataSources.TipoContingenciaMDFe.NaoUtilizar ? TipoEmissao.Normal : TipoEmissao.Contingencia; var lojaEmitente = LojaDAO.Instance.GetElement(idLoja); // Busca XML de encerramento XmlDocument xmlConsMDFeNaoEnc = ManifestoEletronicoDAO.Instance.GerarXmlMDFeConsultaNaoEncerrados(lojaEmitente); #region Envia XML // Salva o callback padrão do WebService System.Net.Security.RemoteCertificateValidationCallback callback = System.Net.ServicePointManager.ServerCertificateValidationCallback; // Instancia xml de retorno XmlNode xmlRetorno = null; // Realiza 3 tentativas de envio, se não funcionar, gera mensagem de erro for (int i = 0; i < 3; i++) { try { // Altera o callback de validação do WebService System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate(object sender, System.Security.Cryptography.X509Certificates.X509Certificate cert, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors error) { // Verifica se a data do certificado é válida DateTime beginDate = DateTime.Parse(cert.GetEffectiveDateString()); DateTime endDate = DateTime.Parse(cert.GetExpirationDateString()); bool isDateValid = (DateTime.Now >= beginDate) && (DateTime.Now <= endDate); // Retorna o resultado da função return(isDateValid); }; #region Envia o arquivo e recebe o retorno if (tipoEmissao == TipoEmissao.Normal) { if (ConfigMDFe.TipoAmbiente == ConfigMDFe.TipoAmbienteMDFe.Producao) { xmlRetorno = GetWebService.PSVRSMDFeConsultaNaoEncerrado(lojaEmitente, null).mdfeConsNaoEnc(xmlConsMDFeNaoEnc); } // TipoAmbienteMDFe.Homologacao else { xmlRetorno = GetWebService.HSVRSMDFeConsultaNaoEncerrado(lojaEmitente, null).mdfeConsNaoEnc(xmlConsMDFeNaoEnc); } } // TipoEmissao.Contingencia else { if (ConfigMDFe.TipoAmbiente == ConfigMDFe.TipoAmbienteMDFe.Producao) { xmlRetorno = GetWebService.PSVRSMDFeConsultaNaoEncerrado(lojaEmitente, null).mdfeConsNaoEnc(xmlConsMDFeNaoEnc); } // TipoAmbienteMDFe.Homologacao else { xmlRetorno = GetWebService.HSVRSMDFeConsultaNaoEncerrado(lojaEmitente, null).mdfeConsNaoEnc(xmlConsMDFeNaoEnc); } } #endregion break; } catch (Exception ex) { if (i == 2) { throw new Exception(ex.Message); } } finally { // Restaura o callback padrão para o WebService System.Net.ServicePointManager.ServerCertificateValidationCallback = callback; } } #endregion #region Lê Xml de retorno do consulta não encerrados return(ManifestoEletronicoDAO.Instance.RetornoConsultaNaoEncerrados(xmlRetorno)); #endregion } catch (Exception ex) { throw ex; } }
/// <summary> /// Envia a MDFe para a SEFAZ via Webservice /// </summary> /// <param name="xmlMDFe"></param> /// <param name="idManifestoEletronico"></param> public static string EnviaMDFe(XmlDocument xmlMDFe, int idManifestoEletronico) { try { // Monta o lote XmlDocument xmlLote = CriaLote(xmlMDFe, idManifestoEletronico); // Busca dados do Manifesto Eletronico var mdfe = ManifestoEletronicoDAO.Instance.ObterManifestoEletronicoPeloId(idManifestoEletronico); #region Envia XML // Instancia xml de retorno XmlNode xmlRetorno = null; // Salva o callback padrão do WebService System.Net.Security.RemoteCertificateValidationCallback callback = System.Net.ServicePointManager.ServerCertificateValidationCallback; // Realiza 3 tentativas de envio, se não funcionar, gera mensagem de erro for (int i = 0; i < 3; i++) { try { // Altera o callback de validação do WebService System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate(object sender, System.Security.Cryptography.X509Certificates.X509Certificate cert, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors error) { // Verifica se a data do certificado é válida DateTime beginDate = DateTime.Parse(cert.GetEffectiveDateString()); DateTime endDate = DateTime.Parse(cert.GetExpirationDateString()); bool isDateValid = (DateTime.Now >= beginDate) && (DateTime.Now <= endDate); // Retorna o resultado da função return(isDateValid); }; #region Envia o arquivo e recebe o retorno if (mdfe.TipoEmissao == Glass.Data.Model.TipoEmissao.Normal) { if (ConfigMDFe.TipoAmbiente == ConfigMDFe.TipoAmbienteMDFe.Producao) { xmlRetorno = GetWebService.PSVRSMDFeRecepcao(mdfe, null).mdfeRecepcaoLote(xmlLote); } // TipoAmbienteMDFe.Homologacao else { xmlRetorno = GetWebService.HSVRSMDFeRecepcao(mdfe, null).mdfeRecepcaoLote(xmlLote); } } // TipoEmissao.Contingencia else { if (ConfigMDFe.TipoAmbiente == ConfigMDFe.TipoAmbienteMDFe.Producao) { xmlRetorno = GetWebService.PSVRSMDFeRecepcao(mdfe, null).mdfeRecepcaoLote(xmlLote); } // TipoAmbienteMDFe.Homologacao else { xmlRetorno = GetWebService.HSVRSMDFeRecepcao(mdfe, null).mdfeRecepcaoLote(xmlLote); } } #endregion break; } catch (Exception ex) { if (i == 3) { LogMDFeDAO.Instance.NewLog(idManifestoEletronico, "Emissão", 1, "Falha ao enviar lote. " + ex.Message); if (mdfe.Situacao != SituacaoEnum.ContingenciaOffline) { ManifestoEletronicoDAO.Instance.AlteraSituacao(idManifestoEletronico, Glass.Data.Model.SituacaoEnum.FalhaEmitir); } return("Falha ao enviar lote. " + ex.Message); } } finally { // Restaura o callback padrão para o WebService System.Net.ServicePointManager.ServerCertificateValidationCallback = callback; } } #endregion #region Lê Xml de retorno do envio do lote // Verifica se o Xml de Retorno é válido if (xmlRetorno == null) { LogMDFeDAO.Instance.NewLog(idManifestoEletronico, "Emissão", 2, "Falha ao enviar lote. Retorno de envio do lote inválido."); if (mdfe.Situacao != SituacaoEnum.ContingenciaOffline) { ManifestoEletronicoDAO.Instance.AlteraSituacao(idManifestoEletronico, Glass.Data.Model.SituacaoEnum.FalhaEmitir); } return("Falha ao enviar lote. Retorno de envio do lote inválido."); } // Lê Xml de retorno do envio do lote var cStat = Conversoes.StrParaInt(xmlRetorno["cStat"].InnerXml); var xMotivo = xmlRetorno["xMotivo"].InnerXml; if (cStat == 103) // Lote recebido com sucesso { LogMDFeDAO.Instance.NewLog(idManifestoEletronico, "Emissão", cStat, xMotivo); // Pega o número do recibo do lote string numReciboLote = xmlRetorno["infRec"]["nRec"].InnerXml; // Salva no MDFe o número do recibo do lote ManifestoEletronicoDAO.Instance.SalvaReciboProtocoloAutorizacao(idManifestoEletronico, numReciboLote); return(xMotivo); } else if (cStat > 200) // Lote foi rejeitado pela SEFAZ { LogMDFeDAO.Instance.NewLog(idManifestoEletronico, "Emissão", cStat, xMotivo); if (mdfe.Situacao != SituacaoEnum.ContingenciaOffline) { ManifestoEletronicoDAO.Instance.AlteraSituacao(idManifestoEletronico, Glass.Data.Model.SituacaoEnum.FalhaEmitir); } return(xMotivo); } else { LogMDFeDAO.Instance.NewLog(idManifestoEletronico, "Emissão", cStat, xMotivo); return(xMotivo); } #endregion } catch (Exception ex) { LogMDFeDAO.Instance.NewLog(idManifestoEletronico, "Emissão", 1, MensagemAlerta.FormatErrorMsg("Falha ao enviar lote.", ex)); return(MensagemAlerta.FormatErrorMsg("Falha ao enviar lote.", ex)); } }
/// <summary> /// Envia pedido de encerramento do MDFe para SEFAZ /// </summary> /// <param name="idManifestoEletronico"></param> /// <returns></returns> public static string EnviaEncerramento(int idManifestoEletronico) { ManifestoEletronico mdfe = null; try { // Busca dados do MDFe mdfe = ManifestoEletronicoDAO.Instance.ObterManifestoEletronicoPeloId(idManifestoEletronico); // Busca XML de encerramento XmlDocument xmlEncerramento = ManifestoEletronicoDAO.Instance.GerarXmlMDFeEncerramento(mdfe); #region Envia XML // Salva o callback padrão do WebService System.Net.Security.RemoteCertificateValidationCallback callback = System.Net.ServicePointManager.ServerCertificateValidationCallback; // Instancia xml de retorno XmlNode xmlRetorno = null; // Realiza 3 tentativas de envio, se não funcionar, gera mensagem de erro for (int i = 0; i < 3; i++) { try { // Altera o callback de validação do WebService System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate(object sender, System.Security.Cryptography.X509Certificates.X509Certificate cert, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors error) { // Verifica se a data do certificado é válida DateTime beginDate = DateTime.Parse(cert.GetEffectiveDateString()); DateTime endDate = DateTime.Parse(cert.GetExpirationDateString()); bool isDateValid = (DateTime.Now >= beginDate) && (DateTime.Now <= endDate); // Retorna o resultado da função return(isDateValid); }; #region Envia o arquivo e recebe o retorno if (mdfe.TipoEmissao == TipoEmissao.Normal) { if (ConfigMDFe.TipoAmbiente == ConfigMDFe.TipoAmbienteMDFe.Producao) { xmlRetorno = GetWebService.PSVRSMDFeRecepcaoEvento(mdfe, null).mdfeRecepcaoEvento(xmlEncerramento); } // TipoAmbienteMDFe.Homologacao else { xmlRetorno = GetWebService.HSVRSMDFeRecepcaoEvento(mdfe, null).mdfeRecepcaoEvento(xmlEncerramento); } } // TipoEmissao.Contingencia else { if (ConfigMDFe.TipoAmbiente == ConfigMDFe.TipoAmbienteMDFe.Producao) { xmlRetorno = GetWebService.PSVRSMDFeRecepcaoEvento(mdfe, null).mdfeRecepcaoEvento(xmlEncerramento); } // TipoAmbienteMDFe.Homologacao else { xmlRetorno = GetWebService.HSVRSMDFeRecepcaoEvento(mdfe, null).mdfeRecepcaoEvento(xmlEncerramento); } } #endregion break; } catch (Exception ex) { if (i == 2) { LogMDFeDAO.Instance.NewLog(idManifestoEletronico, "Encerramento", 1, "Falha ao encerrar MDFe. " + ex.Message); ManifestoEletronicoDAO.Instance.AlteraSituacao(idManifestoEletronico, SituacaoEnum.FalhaEncerrar); throw new Exception(ex.Message); } } finally { // Restaura o callback padrão para o WebService System.Net.ServicePointManager.ServerCertificateValidationCallback = callback; } } #endregion #region Lê Xml de retorno do envio do encerramento // Realiza procedimentos de encerramento de MDFe return(ManifestoEletronicoDAO.Instance.RetornoEventoMDFe(idManifestoEletronico, xmlRetorno, "110112")); #endregion } catch (Exception ex) { LogMDFeDAO.Instance.NewLog(idManifestoEletronico, "Encerramento", 1, "Falha ao encerrar MDFe. " + ex.Message); if (mdfe.Situacao != SituacaoEnum.Encerrado) { ManifestoEletronicoDAO.Instance.AlteraSituacao(idManifestoEletronico, SituacaoEnum.FalhaEncerrar); } throw ex; } }