Olá pessoal!
O envio do MDFe de forma assíncrona está com os dias contados, com a previsão de ser encerrado no dia 30/06/2024.
O tópico abaixo tem mais detalhes a respeito.
Mas fica então o questionamento, o que muda?
Bem, antes de falar sobre isso, vamos responder a outra pergunta: Qual é a diferença entre o envio assíncrono e o envio síncrono?
De maneira bem simples, a diferença entre essas formas de envio é a quantidade de conexões que é feita para com o web service da Sefaz.
No envio assíncrono, primeiro sua aplicação envia o XML para o web service e recebe um número de recibo. Então, a aplicação faz uma nova requisição para o web service consultando o número de recibo para obter as rejeições ou em caso de sucesso o MDFe.
Já no envio síncrono, em uma só requisição é enviado para o web service e na resposta já vem as rejeições ou o MDFe quando em caso de sucesso.
Se você pensou:
Isso se deve ao fato de que visando auxiliar os desenvolvedores que utilizam o componente, esse processo é automatizado, ou seja, a consulta já era feita automaticamente pela solução.
Entendi a diferença entre os modos de envio, mas o que eu preciso mudar na minha aplicação?
A primeira coisa que você deve se atentar é no comando que utiliza para fazer o envio do MDFe para o web service.
Veja quais são os parâmetros do método Enviar no comando nativo.
// Parâmetros do método Enviar:
// ALote = Número do Lote
// AImprimir = Se True imprime automaticamente o DAMDFE
// ASincrono = Se True o envio é no modo Síncrono, caso contrario Assíncrono.
ACBrMDFe.Enviar(Alote, AImprmir, ASincrono);
Estes parâmetros são refletidos também nos comandos tanto da Lib:
MDFE_Enviar(ALote, AImprimir, ASincrono, sResposta, esTamanho);
Quanto do Monitor:
MDFE.ENVIARMDFe(nXMLMDFe, [nLote], [nAssinar],[nImprimi],[nImpressora], [bAssincrono], [bEncerrado] )
Parâmetros:
nXMLMDFe - Caminho do XML do MDF-e
nLote - Número do Lote (opcional)
nAssinar - Assinar o XML (opcional - informe 0 para não assinar)
nImprimi - Imprimir MDF-e (opcional - informe 1 para imprimir)
nImpressora - Nome da Impressora (opcional)
bAssincrono - Por padrão o envio é Assíncrono, informa "False" para envio Sincrono
bEncerrado - Imprimir Mensagem de "MDFe Encerrado", (opcional - informe 1 para imprimir)
Então, a partir de 30/06/2024, será preciso informar corretamente o parâmetro que define o modo de envio, para que o mesmo seja feito de forma síncrona.
No momento de ler o retorno, também serão necessárias mudanças.
Caso utilize o componente nativo para Delphi/Lazarus, a classe que vai ler as informações não é mais a Retorno e sim a Enviar.
//Ao invés de ler as informações de:
ACBrMDFe.WebServices.Retorno.XXXX
//Agora vai ler de:
ACBrMDFe.WebServices.Enviar.XXXX
Se você utiliza o Monitor ou a Lib, a principal diferença será no momento de ler as informações do MDFe.
No envio assíncrono elas ficavam contidas na seção [MDFe + Número do MDFe], no entanto, na resposta do envio síncrono elas ficam em [MDFe+ Chave de Acesso do MDFe].
Mas eu não tenho a Chave de Acesso ainda, como vou conseguir ler?
A chave de acesso de um documento fiscal deve ser montada seguindo uma regra estabelecida no MOC. Por isso, tanto a Lib quanto o Monitor possuem um método específico que se alimentado com as informações necessárias devolvem a chave de acesso montada.
São eles:
MDFe.GerarChave para o Monitor.
MDFe_GerarChave para a Lib.
Portanto, fazendo uso deste método é possível obter a informação que é precisa para realizar a leitura da seção.