Skip to content

Commit 7232101

Browse files
authored
Implementa o Envio Sincrono do MDFe. (#8)
1 parent 65ac1fe commit 7232101

File tree

10 files changed

+180
-4
lines changed

10 files changed

+180
-4
lines changed

DFe.Wsdl/Common/SoapUrls.cs

+2
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ public string GetSoapUrl(TipoEvento tipoEvento)
3333
return "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeStatusServico";
3434
case TipoEvento.MDFeRecepcao:
3535
return "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeRecepcao";
36+
case TipoEvento.MDFeRecepcaoSinc:
37+
return "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeRecepcaoSinc";
3638
case TipoEvento.MDFeRetRecepcao:
3739
return "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeRetRecepcao";
3840
case TipoEvento.MDFeNaoEncerrado:

DFe.Wsdl/Common/TipoEvento.cs

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ public enum TipoEvento
1313

1414
MDFeStatusServico,
1515
MDFeRecepcao,
16+
MDFeRecepcaoSinc,
1617
MDFeRetRecepcao,
1718
MDFeNaoEncerrado,
1819
MDFeConsulta,

MDFe.AppTeste/MDFeTesteModel.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -815,7 +815,7 @@ public void CriarEnviar()
815815

816816
var servicoRecepcao = new ServicoMDFeRecepcao();
817817

818-
var retornoEnvio = servicoRecepcao.MDFeRecepcao(1, mdfe);
818+
var retornoEnvio = servicoRecepcao.MDFeRecepcaoSinc(mdfe);
819819

820820
OnSucessoSync(new RetornoEEnvio(retornoEnvio));
821821

MDFe.Classes/Extensoes/ExtMDFeEnviMDFe.cs

+8
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,14 @@ public static XmlDocument CriaXmlRequestWs(this MDFeEnviMDFe enviMDFe)
7171
return dadosEnvio;
7272
}
7373

74+
public static XmlDocument CriaXmlRequestWs(this Informacoes.MDFe mdfe)
75+
{
76+
var dadosEnvio = new XmlDocument();
77+
dadosEnvio.LoadXml(mdfe.XmlString());
78+
79+
return dadosEnvio;
80+
}
81+
7482
public static string XmlString(this MDFeEnviMDFe enviMDFe)
7583
{
7684
var xmlString = FuncoesXml.ClasseParaXmlString(enviMDFe);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
using DFe.Classes.Entidades;
2+
using DFe.Classes.Extensoes;
3+
using DFe.Classes.Flags;
4+
using DFe.Utils;
5+
using System;
6+
using System.Xml.Serialization;
7+
8+
namespace MDFe.Classes.Retorno.MDFeRetRecepcao.Sincrono
9+
{
10+
[Serializable]
11+
[XmlRoot(Namespace = "http://www.portalfiscal.inf.br/mdfe",
12+
ElementName = "retMDFe")]
13+
public class MDFeRetMDFe: RetornoBase
14+
{
15+
[XmlAttribute(AttributeName = "versao")]
16+
public string Versao { get; set; }
17+
18+
[XmlElement(ElementName = "tpAmb")]
19+
public TipoAmbiente TpAmb { get; set; }
20+
21+
[XmlElement(ElementName = "verAplic")]
22+
public string VerAplic { get; set; }
23+
24+
[XmlElement(ElementName = "nRec")]
25+
public string NRec { get; set; }
26+
27+
[XmlElement(ElementName = "cStat")]
28+
public short CStat { get; set; }
29+
30+
[XmlElement(ElementName = "xMotivo")]
31+
public string XMotivo { get; set; }
32+
33+
[XmlIgnore]
34+
public Estado CUF { get; set; }
35+
36+
[XmlElement(ElementName = "cUF")]
37+
public string CUFProxy
38+
{
39+
get
40+
{
41+
return CUF.GetCodigoIbgeEmString();
42+
}
43+
set { CUF = CUF.CodigoIbgeParaEstado(value); }
44+
}
45+
46+
[XmlElement(ElementName = "protMDFe")]
47+
public MDFeProtMDFe ProtMdFe { get; set; }
48+
49+
public static MDFeRetMDFe LoadXml(string xml)
50+
{
51+
var retorno = FuncoesXml.XmlStringParaClasse<MDFeRetMDFe>(xml);
52+
retorno.RetornoXmlString = xml;
53+
54+
return retorno;
55+
}
56+
public static MDFeRetMDFe LoadXml(string xml, Informacoes.MDFe mdfe)
57+
{
58+
var retorno = LoadXml(xml);
59+
retorno.EnvioXmlString = FuncoesXml.ClasseParaXmlString(mdfe);
60+
61+
return retorno;
62+
}
63+
}
64+
}

MDFe.Servicos/Enderecos/Helper/UrlHelper.cs

+4-2
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ public static UrlMDFe ObterUrlServico(TipoAmbiente ambiente)
4949
MDFeRetRecepcao = "https://mdfe.svrs.rs.gov.br/ws/MDFeRetRecepcao/MDFeRetRecepcao.asmx",
5050
MDFeConsulta = "https://mdfe.svrs.rs.gov.br/ws/MDFeConsulta/MDFeConsulta.asmx",
5151
MDFeRecepcaoEvento = "https://mdfe.svrs.rs.gov.br/ws/MDFeRecepcaoEvento/MDFeRecepcaoEvento.asmx",
52-
MDFeRecepcao = "https://mdfe.svrs.rs.gov.br/ws/MDFerecepcao/MDFeRecepcao.asmx"
52+
MDFeRecepcao = "https://mdfe.svrs.rs.gov.br/ws/MDFerecepcao/MDFeRecepcao.asmx",
53+
MDFeRecepcaoSinc = "https://mdfe.svrs.rs.gov.br/ws/MDFeRecepcaoSinc/MDFeRecepcaoSinc.asmx"
5354
};
5455
case TipoAmbiente.Homologacao:
5556
return new UrlMDFe
@@ -59,7 +60,8 @@ public static UrlMDFe ObterUrlServico(TipoAmbiente ambiente)
5960
MDFeRecepcao = "https://mdfe-homologacao.svrs.rs.gov.br/ws/MDFerecepcao/MDFeRecepcao.asmx",
6061
MDFeRecepcaoEvento = "https://mdfe-homologacao.svrs.rs.gov.br/ws/MDFeRecepcaoEvento/MDFeRecepcaoEvento.asmx",
6162
MDFeRetRecepcao = "https://mdfe-homologacao.svrs.rs.gov.br/ws/MDFeRetRecepcao/MDFeRetRecepcao.asmx",
62-
MDFeStatusServico = "https://mdfe-homologacao.svrs.rs.gov.br/ws/MDFeStatusServico/MDFeStatusServico.asmx"
63+
MDFeStatusServico = "https://mdfe-homologacao.svrs.rs.gov.br/ws/MDFeStatusServico/MDFeStatusServico.asmx",
64+
MDFeRecepcaoSinc = "https://mdfe-homologacao.svrs.rs.gov.br/ws/MDFeRecepcaoSinc/MDFeRecepcaoSinc.asmx"
6365
};
6466
}
6567

MDFe.Servicos/Enderecos/UrlMDFe.cs

+1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ public class UrlMDFe
3636
{
3737
public string MDFeRecepcao { get; set; }
3838
public string MDFeRetRecepcao { get; set; }
39+
public string MDFeRecepcaoSinc { get; set; }
3940
public string MDFeRecepcaoEvento { get; set; }
4041
public string MDFeConsulta { get; set; }
4142
public string MDFeStatusServico { get; set; }

MDFe.Servicos/Factory/WsdlFactory.cs

+12-1
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
using MDFe.Wsdl.MDFeConsultaProtoloco;
4242
using MDFe.Wsdl.MDFeEventos;
4343
using MDFe.Wsdl.MDFeRecepcao;
44+
using MDFe.Wsdl.MDFeRecepcao.Sincrono;
4445
using MDFe.Wsdl.MDFeRetRecepcao;
4546

4647
namespace MDFe.Servicos.Factory
@@ -84,7 +85,17 @@ public static MDFeRecepcao CriaWsdlMDFeRecepcao()
8485

8586
var configuracaoWsdl = CriaConfiguracao(url, versaoServico);
8687

87-
return new MDFeRecepcao(configuracaoWsdl); ;
88+
return new MDFeRecepcao(configuracaoWsdl);
89+
}
90+
91+
public static MDFeRecepcaoSinc CriaWsdlMDFeRecepcaoSinc()
92+
{
93+
var url = UrlHelper.ObterUrlServico(MDFeConfiguracao.VersaoWebService.TipoAmbiente).MDFeRecepcaoSinc;
94+
var versaoServico = MDFeConfiguracao.VersaoWebService.VersaoLayout.GetVersaoString();
95+
96+
var configuracaoWsdl = CriaConfiguracao(url, versaoServico);
97+
98+
return new MDFeRecepcaoSinc(configuracaoWsdl);
8899
}
89100

90101
public static MDFeRetRecepcao CriaWsdlMDFeRetRecepcao()

MDFe.Servicos/RecepcaoMDFe/ServicoMDFeRecepcao.cs

+22
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
using MDFe.Classes.Extencoes;
3737
using MDFe.Classes.Flags;
3838
using MDFe.Classes.Retorno.MDFeRecepcao;
39+
using MDFe.Classes.Retorno.MDFeRetRecepcao.Sincrono;
3940
using MDFe.Classes.Servicos.Autorizacao;
4041
using MDFe.Servicos.Factory;
4142
using MDFe.Utils.Configuracoes;
@@ -87,6 +88,27 @@ public MDFeRetEnviMDFe MDFeRecepcao(long lote, MDFeEletronico mdfe)
8788
return retorno;
8889
}
8990

91+
public MDFeRetMDFe MDFeRecepcaoSinc(MDFeEletronico mdfe)
92+
{
93+
mdfe.InfMDFe.InfModal.VersaoModal = MDFeVersaoModal.Versao300;
94+
mdfe.InfMDFe.Ide.ProxyDhIniViagem = mdfe.InfMDFe.Ide.DhIniViagem.ParaDataHoraStringUtc();
95+
mdfe.Assina(GerouChave, this);
96+
97+
if (MDFeConfiguracao.IsAdicionaQrCode)
98+
{
99+
mdfe.infMDFeSupl = mdfe.QrCode(MDFeConfiguracao.X509Certificate2);
100+
}
101+
102+
mdfe.Valida();
103+
mdfe.SalvarXmlEmDisco();
104+
105+
var webService = WsdlFactory.CriaWsdlMDFeRecepcaoSinc();
106+
var retornoXml = webService.mdfeRecepcao(mdfe.CriaXmlRequestWs());
107+
108+
var retorno = MDFeRetMDFe.LoadXml(retornoXml.OuterXml, mdfe);
109+
return retorno;
110+
}
111+
90112
protected virtual void OnAntesDeEnviar(MDFeEnviMDFe enviMdfe)
91113
{
92114
var handler = AntesDeEnviar;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
using CTe.CTeOSDocumento.Common;
2+
using DFe.Utils;
3+
using System;
4+
using System.Net;
5+
using System.Xml;
6+
using System.Xml.Serialization;
7+
8+
namespace MDFe.Wsdl.MDFeRecepcao.Sincrono
9+
{
10+
public class MDFeRecepcaoSinc
11+
{
12+
private readonly SoapEnvelope soapEnvelope;
13+
14+
//Configurações do WSDL para estabelecimento da comunicação
15+
private readonly WsdlConfiguracao configuracao;
16+
17+
/// <summary>
18+
/// Cria o cabeçalho do envelope a ser enviado e atribui as configurações do WSDL.
19+
/// </summary>
20+
/// <param name="configuracao"></param>
21+
public MDFeRecepcaoSinc(WsdlConfiguracao configuracao)
22+
{
23+
if (configuracao == null)
24+
throw new ArgumentNullException();
25+
26+
this.configuracao = configuracao;
27+
soapEnvelope = new SoapEnvelope();
28+
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
29+
}
30+
31+
/// <summary>
32+
/// Encapsula os dados da requisição no envelope por meio da serialização das partes e realiza a requisção ao Web Service.
33+
/// </summary>
34+
/// <param name="mdfeDadosMsg"></param>
35+
/// <returns>XmlNode</returns>
36+
public XmlNode mdfeRecepcao(XmlNode mdfeDadosMsg)
37+
{
38+
soapEnvelope.body = new ResponseBody<string>
39+
{
40+
mdfeDadosMsg = Convert.ToBase64String(Compressao.Zip(mdfeDadosMsg.OuterXml))
41+
};
42+
return RequestBuilderAndSender.Execute(soapEnvelope, configuracao, TipoEvento.MDFeRecepcaoSinc, "retMDFe");
43+
}
44+
45+
/// <summary>
46+
/// Classe base para a serialização no formato do envelope SOAP.
47+
/// </summary>
48+
[XmlRoot(ElementName = "Envelope", Namespace = "http://www.w3.org/2003/05/soap-envelope")]
49+
public class SoapEnvelope : CommonSoapEnvelope
50+
{
51+
52+
[XmlElement(ElementName = "Body", Namespace = "http://www.w3.org/2003/05/soap-envelope")]
53+
public ResponseBody<string> body { get; set; }
54+
}
55+
56+
/// <summary>
57+
/// Classe para o corpo do Envelope SOAP
58+
/// </summary>
59+
public class ResponseBody<T> : CommonResponseBody
60+
{
61+
[XmlElement(Namespace = "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeRecepcaoSinc")]
62+
public T mdfeDadosMsg { get; set; }
63+
}
64+
}
65+
}

0 commit comments

Comments
 (0)