diff --git a/DFe.Wsdl/Common/SoapUrls.cs b/DFe.Wsdl/Common/SoapUrls.cs index 09960194..b18a093c 100644 --- a/DFe.Wsdl/Common/SoapUrls.cs +++ b/DFe.Wsdl/Common/SoapUrls.cs @@ -33,6 +33,8 @@ public string GetSoapUrl(TipoEvento tipoEvento) return "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeStatusServico"; case TipoEvento.MDFeRecepcao: return "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeRecepcao"; + case TipoEvento.MDFeRecepcaoSinc: + return "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeRecepcaoSinc"; case TipoEvento.MDFeRetRecepcao: return "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeRetRecepcao"; case TipoEvento.MDFeNaoEncerrado: diff --git a/DFe.Wsdl/Common/TipoEvento.cs b/DFe.Wsdl/Common/TipoEvento.cs index 416834d0..7fe85bc6 100644 --- a/DFe.Wsdl/Common/TipoEvento.cs +++ b/DFe.Wsdl/Common/TipoEvento.cs @@ -13,6 +13,7 @@ public enum TipoEvento MDFeStatusServico, MDFeRecepcao, + MDFeRecepcaoSinc, MDFeRetRecepcao, MDFeNaoEncerrado, MDFeConsulta, diff --git a/MDFe.AppTeste/MDFeTesteModel.cs b/MDFe.AppTeste/MDFeTesteModel.cs index aaf31885..379d24a1 100755 --- a/MDFe.AppTeste/MDFeTesteModel.cs +++ b/MDFe.AppTeste/MDFeTesteModel.cs @@ -815,7 +815,7 @@ public void CriarEnviar() var servicoRecepcao = new ServicoMDFeRecepcao(); - var retornoEnvio = servicoRecepcao.MDFeRecepcao(1, mdfe); + var retornoEnvio = servicoRecepcao.MDFeRecepcaoSinc(mdfe); OnSucessoSync(new RetornoEEnvio(retornoEnvio)); diff --git a/MDFe.Classes/Extensoes/ExtMDFeEnviMDFe.cs b/MDFe.Classes/Extensoes/ExtMDFeEnviMDFe.cs index 389acec4..fa90a5d1 100644 --- a/MDFe.Classes/Extensoes/ExtMDFeEnviMDFe.cs +++ b/MDFe.Classes/Extensoes/ExtMDFeEnviMDFe.cs @@ -71,6 +71,14 @@ public static XmlDocument CriaXmlRequestWs(this MDFeEnviMDFe enviMDFe) return dadosEnvio; } + public static XmlDocument CriaXmlRequestWs(this Informacoes.MDFe mdfe) + { + var dadosEnvio = new XmlDocument(); + dadosEnvio.LoadXml(mdfe.XmlString()); + + return dadosEnvio; + } + public static string XmlString(this MDFeEnviMDFe enviMDFe) { var xmlString = FuncoesXml.ClasseParaXmlString(enviMDFe); diff --git a/MDFe.Classes/Retorno/MDFeRetRecepcao/Sincrono/MDFeRetMDFe.cs b/MDFe.Classes/Retorno/MDFeRetRecepcao/Sincrono/MDFeRetMDFe.cs new file mode 100644 index 00000000..8aeca30d --- /dev/null +++ b/MDFe.Classes/Retorno/MDFeRetRecepcao/Sincrono/MDFeRetMDFe.cs @@ -0,0 +1,64 @@ +using DFe.Classes.Entidades; +using DFe.Classes.Extensoes; +using DFe.Classes.Flags; +using DFe.Utils; +using System; +using System.Xml.Serialization; + +namespace MDFe.Classes.Retorno.MDFeRetRecepcao.Sincrono +{ + [Serializable] + [XmlRoot(Namespace = "http://www.portalfiscal.inf.br/mdfe", + ElementName = "retMDFe")] + public class MDFeRetMDFe: RetornoBase + { + [XmlAttribute(AttributeName = "versao")] + public string Versao { get; set; } + + [XmlElement(ElementName = "tpAmb")] + public TipoAmbiente TpAmb { get; set; } + + [XmlElement(ElementName = "verAplic")] + public string VerAplic { get; set; } + + [XmlElement(ElementName = "nRec")] + public string NRec { get; set; } + + [XmlElement(ElementName = "cStat")] + public short CStat { get; set; } + + [XmlElement(ElementName = "xMotivo")] + public string XMotivo { get; set; } + + [XmlIgnore] + public Estado CUF { get; set; } + + [XmlElement(ElementName = "cUF")] + public string CUFProxy + { + get + { + return CUF.GetCodigoIbgeEmString(); + } + set { CUF = CUF.CodigoIbgeParaEstado(value); } + } + + [XmlElement(ElementName = "protMDFe")] + public MDFeProtMDFe ProtMdFe { get; set; } + + public static MDFeRetMDFe LoadXml(string xml) + { + var retorno = FuncoesXml.XmlStringParaClasse(xml); + retorno.RetornoXmlString = xml; + + return retorno; + } + public static MDFeRetMDFe LoadXml(string xml, Informacoes.MDFe mdfe) + { + var retorno = LoadXml(xml); + retorno.EnvioXmlString = FuncoesXml.ClasseParaXmlString(mdfe); + + return retorno; + } + } +} diff --git a/MDFe.Servicos/Enderecos/Helper/UrlHelper.cs b/MDFe.Servicos/Enderecos/Helper/UrlHelper.cs index 681a5c52..da0aba43 100644 --- a/MDFe.Servicos/Enderecos/Helper/UrlHelper.cs +++ b/MDFe.Servicos/Enderecos/Helper/UrlHelper.cs @@ -49,7 +49,8 @@ public static UrlMDFe ObterUrlServico(TipoAmbiente ambiente) MDFeRetRecepcao = "https://mdfe.svrs.rs.gov.br/ws/MDFeRetRecepcao/MDFeRetRecepcao.asmx", MDFeConsulta = "https://mdfe.svrs.rs.gov.br/ws/MDFeConsulta/MDFeConsulta.asmx", MDFeRecepcaoEvento = "https://mdfe.svrs.rs.gov.br/ws/MDFeRecepcaoEvento/MDFeRecepcaoEvento.asmx", - MDFeRecepcao = "https://mdfe.svrs.rs.gov.br/ws/MDFerecepcao/MDFeRecepcao.asmx" + MDFeRecepcao = "https://mdfe.svrs.rs.gov.br/ws/MDFerecepcao/MDFeRecepcao.asmx", + MDFeRecepcaoSinc = "https://mdfe.svrs.rs.gov.br/ws/MDFeRecepcaoSinc/MDFeRecepcaoSinc.asmx" }; case TipoAmbiente.Homologacao: return new UrlMDFe @@ -59,7 +60,8 @@ public static UrlMDFe ObterUrlServico(TipoAmbiente ambiente) MDFeRecepcao = "https://mdfe-homologacao.svrs.rs.gov.br/ws/MDFerecepcao/MDFeRecepcao.asmx", MDFeRecepcaoEvento = "https://mdfe-homologacao.svrs.rs.gov.br/ws/MDFeRecepcaoEvento/MDFeRecepcaoEvento.asmx", MDFeRetRecepcao = "https://mdfe-homologacao.svrs.rs.gov.br/ws/MDFeRetRecepcao/MDFeRetRecepcao.asmx", - MDFeStatusServico = "https://mdfe-homologacao.svrs.rs.gov.br/ws/MDFeStatusServico/MDFeStatusServico.asmx" + MDFeStatusServico = "https://mdfe-homologacao.svrs.rs.gov.br/ws/MDFeStatusServico/MDFeStatusServico.asmx", + MDFeRecepcaoSinc = "https://mdfe-homologacao.svrs.rs.gov.br/ws/MDFeRecepcaoSinc/MDFeRecepcaoSinc.asmx" }; } diff --git a/MDFe.Servicos/Enderecos/UrlMDFe.cs b/MDFe.Servicos/Enderecos/UrlMDFe.cs index 2f456aa2..68864d44 100644 --- a/MDFe.Servicos/Enderecos/UrlMDFe.cs +++ b/MDFe.Servicos/Enderecos/UrlMDFe.cs @@ -36,6 +36,7 @@ public class UrlMDFe { public string MDFeRecepcao { get; set; } public string MDFeRetRecepcao { get; set; } + public string MDFeRecepcaoSinc { get; set; } public string MDFeRecepcaoEvento { get; set; } public string MDFeConsulta { get; set; } public string MDFeStatusServico { get; set; } diff --git a/MDFe.Servicos/Factory/WsdlFactory.cs b/MDFe.Servicos/Factory/WsdlFactory.cs index 4d044ef2..6be63f87 100644 --- a/MDFe.Servicos/Factory/WsdlFactory.cs +++ b/MDFe.Servicos/Factory/WsdlFactory.cs @@ -41,6 +41,7 @@ using MDFe.Wsdl.MDFeConsultaProtoloco; using MDFe.Wsdl.MDFeEventos; using MDFe.Wsdl.MDFeRecepcao; +using MDFe.Wsdl.MDFeRecepcao.Sincrono; using MDFe.Wsdl.MDFeRetRecepcao; namespace MDFe.Servicos.Factory @@ -84,7 +85,17 @@ public static MDFeRecepcao CriaWsdlMDFeRecepcao() var configuracaoWsdl = CriaConfiguracao(url, versaoServico); - return new MDFeRecepcao(configuracaoWsdl); ; + return new MDFeRecepcao(configuracaoWsdl); + } + + public static MDFeRecepcaoSinc CriaWsdlMDFeRecepcaoSinc() + { + var url = UrlHelper.ObterUrlServico(MDFeConfiguracao.VersaoWebService.TipoAmbiente).MDFeRecepcaoSinc; + var versaoServico = MDFeConfiguracao.VersaoWebService.VersaoLayout.GetVersaoString(); + + var configuracaoWsdl = CriaConfiguracao(url, versaoServico); + + return new MDFeRecepcaoSinc(configuracaoWsdl); } public static MDFeRetRecepcao CriaWsdlMDFeRetRecepcao() diff --git a/MDFe.Servicos/RecepcaoMDFe/ServicoMDFeRecepcao.cs b/MDFe.Servicos/RecepcaoMDFe/ServicoMDFeRecepcao.cs index 00f99740..771d8209 100644 --- a/MDFe.Servicos/RecepcaoMDFe/ServicoMDFeRecepcao.cs +++ b/MDFe.Servicos/RecepcaoMDFe/ServicoMDFeRecepcao.cs @@ -36,6 +36,7 @@ using MDFe.Classes.Extencoes; using MDFe.Classes.Flags; using MDFe.Classes.Retorno.MDFeRecepcao; +using MDFe.Classes.Retorno.MDFeRetRecepcao.Sincrono; using MDFe.Classes.Servicos.Autorizacao; using MDFe.Servicos.Factory; using MDFe.Utils.Configuracoes; @@ -87,6 +88,27 @@ public MDFeRetEnviMDFe MDFeRecepcao(long lote, MDFeEletronico mdfe) return retorno; } + public MDFeRetMDFe MDFeRecepcaoSinc(MDFeEletronico mdfe) + { + mdfe.InfMDFe.InfModal.VersaoModal = MDFeVersaoModal.Versao300; + mdfe.InfMDFe.Ide.ProxyDhIniViagem = mdfe.InfMDFe.Ide.DhIniViagem.ParaDataHoraStringUtc(); + mdfe.Assina(GerouChave, this); + + if (MDFeConfiguracao.IsAdicionaQrCode) + { + mdfe.infMDFeSupl = mdfe.QrCode(MDFeConfiguracao.X509Certificate2); + } + + mdfe.Valida(); + mdfe.SalvarXmlEmDisco(); + + var webService = WsdlFactory.CriaWsdlMDFeRecepcaoSinc(); + var retornoXml = webService.mdfeRecepcao(mdfe.CriaXmlRequestWs()); + + var retorno = MDFeRetMDFe.LoadXml(retornoXml.OuterXml, mdfe); + return retorno; + } + protected virtual void OnAntesDeEnviar(MDFeEnviMDFe enviMdfe) { var handler = AntesDeEnviar; diff --git a/MDFe.Wsdl/MDFeRecepcao/Sincrono/MDFeRecepcaoSinc.cs b/MDFe.Wsdl/MDFeRecepcao/Sincrono/MDFeRecepcaoSinc.cs new file mode 100644 index 00000000..a673160b --- /dev/null +++ b/MDFe.Wsdl/MDFeRecepcao/Sincrono/MDFeRecepcaoSinc.cs @@ -0,0 +1,65 @@ +using CTe.CTeOSDocumento.Common; +using DFe.Utils; +using System; +using System.Net; +using System.Xml; +using System.Xml.Serialization; + +namespace MDFe.Wsdl.MDFeRecepcao.Sincrono +{ + public class MDFeRecepcaoSinc + { + private readonly SoapEnvelope soapEnvelope; + + //Configurações do WSDL para estabelecimento da comunicação + private readonly WsdlConfiguracao configuracao; + + /// + /// Cria o cabeçalho do envelope a ser enviado e atribui as configurações do WSDL. + /// + /// + public MDFeRecepcaoSinc(WsdlConfiguracao configuracao) + { + if (configuracao == null) + throw new ArgumentNullException(); + + this.configuracao = configuracao; + soapEnvelope = new SoapEnvelope(); + ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; + } + + /// + /// Encapsula os dados da requisição no envelope por meio da serialização das partes e realiza a requisção ao Web Service. + /// + /// + /// XmlNode + public XmlNode mdfeRecepcao(XmlNode mdfeDadosMsg) + { + soapEnvelope.body = new ResponseBody + { + mdfeDadosMsg = Convert.ToBase64String(Compressao.Zip(mdfeDadosMsg.OuterXml)) + }; + return RequestBuilderAndSender.Execute(soapEnvelope, configuracao, TipoEvento.MDFeRecepcaoSinc, "retMDFe"); + } + + /// + /// Classe base para a serialização no formato do envelope SOAP. + /// + [XmlRoot(ElementName = "Envelope", Namespace = "http://www.w3.org/2003/05/soap-envelope")] + public class SoapEnvelope : CommonSoapEnvelope + { + + [XmlElement(ElementName = "Body", Namespace = "http://www.w3.org/2003/05/soap-envelope")] + public ResponseBody body { get; set; } + } + + /// + /// Classe para o corpo do Envelope SOAP + /// + public class ResponseBody : CommonResponseBody + { + [XmlElement(Namespace = "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeRecepcaoSinc")] + public T mdfeDadosMsg { get; set; } + } + } +}