Ir para conteúdo
  • Cadastre-se

dev botao

  • Este tópico foi criado há 1961 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado

Olá

 

Estou implementando a consulta do MDF-e através da chaveMDF-e, no entanto percebi um inconsistência nos dados retornado quando o MDF-e está cancelado, caso o MDF-e esteja autorizado ou encerrado o retorno esta correto, mas quando esta cancelado está havendo inconsistência, segue abaixo exemplificação do problema:

Estou pegado os dados da seguinte forma:

    // DADOS DE AUTORIZAÇÃO DE ENVIO DO MDFE
    // Aqui é que está o problema, pois quando a consulta é de um MDF-e autorizado ou encerrado, os dados retornando é da Autorização, porem se a consulta é de uma MDF-e cancelado o
    retorno é do evento de cancelamento e não da autorização de envio

    Protocolo :=                      ACBrMDFe.WebServices.Consulta.Protocolo;
    DtAutorizacao :=              ACBrMDFe.WebServices.Consulta.DhRecbto;


    // DADOS DE AUTORIZAÇÃO DO EVENTO DO MDFE QUE PODE SER DE ENCERRAMENTO OU CANCELAMENTO DEPENDO DO STATUS
   // Aqui retorna perfeitamente tanto para MDF-e encerrado quanto para cancelado

    ProtocoloEvento :=          ACBrMDFe.WebServices.Consulta.procEventoMDFe.Items[0].RetEventoMDFe.retEvento.Items[0].RetInfEvento.nProt;
    DtAutorizacaoEvento :=  ACBrMDFe.WebServices.Consulta.procEventoMDFe.Items[0].RetEventoMDFe.retEvento.Items[0].RetInfEvento.dhRegEvento;Cancelado)
    Justificativa :=                  ACBrMDFe.WebServices.Consulta.procEventoMDFe.Items[0].RetEventoMDFe.InfEvento.DetEvento.xJust;

     // Acredito que ficaria mais legível se as propriedades básicas do retorno do evento fossem encapsulados diretamente na consulta, por exemplo
     "ACBrMDFe.WebServices.Consulta.RetEvento.nProt", caso seja necessário pegar outras informações do evento poderia ser feito por "ACBrMDFe.WebServices.Consulta.DetEvento", porem é
     só uma sugestão

    

 

Postado (editado)

Encerrado.png

Cancelado.png

Observação, o fórum poderia ter um botão para visualizar o tópico antes de salvar, ou aumentar o tempo para alteração,  pois tentei melhorar a apresentação do texto e incluir as imagens e não consegui, se tivesse um botão de excluir eu teria excluído e feito novamente, pois como ninguém tinha respondido ainda, não vi motivos para colocar tantas restrições

Editado por Juliano Do Amaral Chaves
Melhor visualização
Postado

Para corrigir o problema fiz as seguintes alterações no ACBr:

1) No arquivo "pmdfeRetConsSitMDFe.pas" na função "TRetConsSitMDFe.LerXml" alterei a condição:

   de:      if FcStat in [100, 132] then
   para:  if FcStat in [100, 101, 132] then

Ou seja, se o MDF-e estiver cancelado, carrega os do protocolo de autorização para o objeto "protMDFe", isso porque acredito que para cancelar um MDF-e ele precisa estar autorizado.

2) No arquivo "ACBrMDFeWebServices.pas" na função "TMDFeConsulta.TratarResposta" fiz a seguintes alterações

  Removi a variavel: "MDFCancelado"

  Removi a linha: "MDFCancelado := False;"

  Removi o bloco:

      if retEvento.Items[J].RetInfEvento.tpEvento = teCancelamento then
        begin
          MDFCancelado := True;
          FProtocolo := retEvento.Items[J].RetInfEvento.nProt;
          FDhRecbto := retEvento.Items[J].RetInfEvento.dhRegEvento;
          FPMsg := retEvento.Items[J].RetInfEvento.xMotivo;
        end;

  Alterei a condição:
    
    De: if (not MDFCancelado) and (NaoEstaVazio(MDFeRetorno.protMDFe.nProt))  then
    
    Para: if (NaoEstaVazio(MDFeRetorno.protMDFe.nProt))  then


Essas alterações faz com que o retorno das propriedades "ACBrMDFe.WebServices.Consulta.Protocolo" e "ACBrMDFe.WebServices.Consulta.DhRecbto" retorne os dados do protocolo de autorização e não do protocolo do evento de cancelamento

Vou anexar o patch

 

 

Cancelado Corrigido.png

MDF-e Consulta Protocolo de Autorização.patch

  • Administradores
Postado

Bom dia.

Por favor anexe os fontes alterados.

Att.

  • Curtir 1
Consultora SAC ACBr

Juliana Tamizou

Gerente de Projetos ACBr / Diretora de Marketing AFRAC
Ajude o Projeto ACBr crescer - Seja Pro

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

  • Administradores
Postado

Boa tarde.

Obrigada pela análise, alteração adicionada para validação.

Att.

  • Curtir 1
Consultora SAC ACBr

Juliana Tamizou

Gerente de Projetos ACBr / Diretora de Marketing AFRAC
Ajude o Projeto ACBr crescer - Seja Pro

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

  • Consultores
Postado

Bom dia Juliano,

A rotina de tratamento de resposta da consulta que você alterou no ACBrMDFeWebServices é a mesma na NF-e e CT-e.

Note que podemos dividir o XML de retorno a consulta em 3 partes.

Na primeira temos a situação atual do documento que segundo o seu exemplo acusa que o mesmo esta cancelado.

Na segunda temos o grupo <protMDFe> que contem as informações referente ao protocolo de autorização.

A terceira parte só vai constar se o MDF-e possuir eventos vinculados a ele, logo podemos ter uma lista, ou seja, o grupo <procEventoMDFe> pode aparecer diversas vezes.

No seu exemplo como o MDF-e foi cancelado temos apenas um evento que é o de cancelamento e suas informações estão dentro do grupo mencionando acima.

Pela rotina atual temos o seguinte:

// Na linha abaixo temos o protocolo da situação atual do MDFe,
// esse protocolo pode ser de autorização ou de cancelamento ou de encerramento
numProtAtual := ACBrMDFe1.WebServices.Consulta.Protocolo;

// Na linha abaixo temos o protocolo de autorização
numProtAutor := ACBrMDFe1.WebServices.Consulta.protMDFe.nProt;

// Abaixo temos um loop onde temos o numero do protocolo dos eventos vinculados ao MDFe
  for i := 0 to ACBrMDFe1.WebServices.Consulta.procEventoMDFe.Count -1 do
    numProtEvento[ i ] := ACBrMDFe1.WebServices.Consulta.procEventoMDFe.Items[ i ].RetEventoMDFe.retEvento.Items[0].RetInfEvento.nProt;

No meu entendimento ao realizar a consulta, dependendo do que deseja você vai ter que escolher uma das 3 formas acima para obter o numero do protocolo (por exemplo).

  • Curtir 1
Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / Araraquara-SP

Araraquara - A era dos Trólebus

Postado
9 horas atrás, Italo Jurisato Junior disse:

Bom dia Juliano,

A rotina de tratamento de resposta da consulta que você alterou no ACBrMDFeWebServices é a mesma na NF-e e CT-e.

Note que podemos dividir o XML de retorno a consulta em 3 partes.

Na primeira temos a situação atual do documento que segundo o seu exemplo acusa que o mesmo esta cancelado.

Na segunda temos o grupo <protMDFe> que contem as informações referente ao protocolo de autorização.

A terceira parte só vai constar se o MDF-e possuir eventos vinculados a ele, logo podemos ter uma lista, ou seja, o grupo <procEventoMDFe> pode aparecer diversas vezes.

No seu exemplo como o MDF-e foi cancelado temos apenas um evento que é o de cancelamento e suas informações estão dentro do grupo mencionando acima.

Pela rotina atual temos o seguinte:


// Na linha abaixo temos o protocolo da situação atual do MDFe,
// esse protocolo pode ser de autorização ou de cancelamento ou de encerramento
numProtAtual := ACBrMDFe1.WebServices.Consulta.Protocolo;

// Na linha abaixo temos o protocolo de autorização
numProtAutor := ACBrMDFe1.WebServices.Consulta.protMDFe.nProt;

// Abaixo temos um loop onde temos o numero do protocolo dos eventos vinculados ao MDFe
  for i := 0 to ACBrMDFe1.WebServices.Consulta.procEventoMDFe.Count -1 do
    numProtEvento[ i ] := ACBrMDFe1.WebServices.Consulta.procEventoMDFe.Items[ i ].RetEventoMDFe.retEvento.Items[0].RetInfEvento.nProt;

No meu entendimento ao realizar a consulta, dependendo do que deseja você vai ter que escolher uma das 3 formas acima para obter o numero do protocolo (por exemplo).

Boa noite

Entendi, mas neste caso então no caso do MDF-e encerrado está retornando errado, pois esta retornando o protocolo de autorização e não do encerramento,  veja as imagens do debug que postei quando abrir o tópico 
Foi por isso que achei que a propriedade ACBrMDFe1.WebServices.Consulta.Protocolo teria que retornar o protocolo de autorização, achei inconsistente

MDF-e Encerrado : numProtAutor := ACBrMDFe1.WebServices.Consulta.Protocolo;
MDF-e Cancelado: numProtAtual := ACBrMDFe1.WebServices.Consulta.Protocolo;

Da forma que você falou o correto seria:

MDF-e Encerrado : numProtAtual := ACBrMDFe1.WebServices.Consulta.Protocolo;
MDF-e Cancelado: numProtAtual := ACBrMDFe1.WebServices.Consulta.Protocolo ;

De qualquer forma obrigado pela explicação, pois acredito que muito devem se confundir com o esse retorno

Postado
2 horas atrás, Italo Jurisato Junior disse:

Boa tarde Juliano,

Favor atualizar os fontes, fiz um tratamento para os MDF-e que foram encerrados.

Boa tarde

Vi a alteração que você fez, desta forma não vai mais ter inconsistência e propriedade "ACBrMDFe1.WebServices.Consulta.Protocolo" sempre vai retornar o protocolo atual considerando o evento atual ou no caso de não haver evento retorna o protocolo de autorização.

Ainda não testei, mas acredito que vai funcionar

Por mim pode fechar o tópico

Muito Obrigado

  • Curtir 1
  • Este tópico foi criado há 1961 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Visitante
Este tópico está agora fechado para novas respostas
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.