Skip to content

Commit

Permalink
Implementa o Envio Sincrono do MDFe.
Browse files Browse the repository at this point in the history
  • Loading branch information
paulohenriquejamsoft committed May 1, 2024
1 parent 65ac1fe commit 24243a1
Show file tree
Hide file tree
Showing 10 changed files with 180 additions and 4 deletions.
2 changes: 2 additions & 0 deletions DFe.Wsdl/Common/SoapUrls.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
1 change: 1 addition & 0 deletions DFe.Wsdl/Common/TipoEvento.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ public enum TipoEvento

MDFeStatusServico,
MDFeRecepcao,
MDFeRecepcaoSinc,
MDFeRetRecepcao,
MDFeNaoEncerrado,
MDFeConsulta,
Expand Down
2 changes: 1 addition & 1 deletion MDFe.AppTeste/MDFeTesteModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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));

Expand Down
8 changes: 8 additions & 0 deletions MDFe.Classes/Extensoes/ExtMDFeEnviMDFe.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
64 changes: 64 additions & 0 deletions MDFe.Classes/Retorno/MDFeRetRecepcao/Sincrono/MDFeRetMDFe.cs
Original file line number Diff line number Diff line change
@@ -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<MDFeRetMDFe>(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;
}
}
}
6 changes: 4 additions & 2 deletions MDFe.Servicos/Enderecos/Helper/UrlHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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"
};
}

Expand Down
1 change: 1 addition & 0 deletions MDFe.Servicos/Enderecos/UrlMDFe.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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; }
Expand Down
13 changes: 12 additions & 1 deletion MDFe.Servicos/Factory/WsdlFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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()
Expand Down
22 changes: 22 additions & 0 deletions MDFe.Servicos/RecepcaoMDFe/ServicoMDFeRecepcao.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down
65 changes: 65 additions & 0 deletions MDFe.Wsdl/MDFeRecepcao/Sincrono/MDFeRecepcaoSinc.cs
Original file line number Diff line number Diff line change
@@ -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;

/// <summary>
/// Cria o cabeçalho do envelope a ser enviado e atribui as configurações do WSDL.
/// </summary>
/// <param name="configuracao"></param>
public MDFeRecepcaoSinc(WsdlConfiguracao configuracao)
{
if (configuracao == null)
throw new ArgumentNullException();

this.configuracao = configuracao;
soapEnvelope = new SoapEnvelope();
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
}

/// <summary>
/// Encapsula os dados da requisição no envelope por meio da serialização das partes e realiza a requisção ao Web Service.
/// </summary>
/// <param name="mdfeDadosMsg"></param>
/// <returns>XmlNode</returns>
public XmlNode mdfeRecepcao(XmlNode mdfeDadosMsg)
{
soapEnvelope.body = new ResponseBody<string>
{
mdfeDadosMsg = Convert.ToBase64String(Compressao.Zip(mdfeDadosMsg.OuterXml))
};
return RequestBuilderAndSender.Execute(soapEnvelope, configuracao, TipoEvento.MDFeRecepcaoSinc, "retMDFe");
}

/// <summary>
/// Classe base para a serialização no formato do envelope SOAP.
/// </summary>
[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<string> body { get; set; }
}

/// <summary>
/// Classe para o corpo do Envelope SOAP
/// </summary>
public class ResponseBody<T> : CommonResponseBody
{
[XmlElement(Namespace = "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeRecepcaoSinc")]
public T mdfeDadosMsg { get; set; }
}
}
}

0 comments on commit 24243a1

Please sign in to comment.