Ir para conteúdo
  • Cadastre-se

dev botao

ACBrReinf - v1_03_00


Ver Solução Respondido por Italo Giurizzato Junior,
  • Este tópico foi criado há 2110 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

  • Consultores

Bom dia,

Segue fonte do Reinf com ajustes no tratamento de respostas do webservice:

- Novas tags da v1_03_00 conforme destacado no exemplo abaixo

- Configurado tratamento para leitura do id da tag evtTotal 

<evtTotal id="ID1234567890">
  <ideEvento>
    <perApur/>
  </ideEvento>
  <ideContri>
    <tpInsc>1</tpInsc>
    <nrInsc>98765432</nrInsc>
  </ideContri>
  <ideRecRetorno>
    <ideStatus>
      <cdRetorno>0</cdRetorno>
      <descRetorno>SUCESSO</descRetorno>
      <regOcorrs>
        <tpOcorr>1</tpOcorr>
        <localErroAviso>
          ERRO
        </localErroAviso>
        <codResp>MS1234</codResp>
        <dscResp>
          TESTE DE ERRO
        </dscResp>
      </regOcorrs>
    </ideStatus>
  </ideRecRetorno>
  <infoRecEv>
    <dhProcess>2018-03-06</dhProcess>
    <tpEv>1000</tpEv>
    <idEv>ID1234567890123456789012345678901234</idEv>
    <hash>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</hash>
  </infoRecEv>
  <infoTotal>
  <nrRecArqBase>12345-67-8901-2345-67890</nrRecArqBase>
  </infoTotal>
</evtTotal>

 

Obs: O evento R2060 está com erro na Receita. Fiz testes em produção restrita e dados fictícios e o problema persistiu. Os demais estão funcionando corretamente.

Erro: MS0025 | Falha no processamento. Favor tentar novamente. Identificador : 2890162031

 

 

AcbrReinf.rar

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Consultores

Bom dia @Juliomar Marchetti,

Segue novo fonte ( com a alteração inicial do post inclusive ) com implementação de nova propriedade para armazenar o Número de Protocolo quando houver retorno "2-Em Processamento"

 { TdadosRecepcaoEvento }
  TdadosRecepcaoEvento = class
  private
    FdhProcessamento: TDateTime;
    FTipoEvento: string;
    FHash: string;
    FIDEvento: string;
    FnrProtEntr: string;
  public
    property dhProcessamento: TDateTime read FdhProcessamento write FdhProcessamento;
    property tipoEvento: string read FTipoEvento write FTipoEvento;
    property IDEvento: string read FIDEvento write FIDEvento;
    property Hash: string read FHash write FHash;
    property nrProtEntr: string read FnrProtEntr write FnrProtEntr;
  end;

!!!!! Obs  !!!!

Não encontrei documentação a respeito dos códigos de status de retorno. Até o momento eu havia me deparado apenas com "0-Sucesso" ou "1-ERRO"

Agora, no envio do R2099, está acusando "2-EM PROCESSAMENTO" e retorna o nrProtEntr ao invés do nrRecArqBase

Cacei na net e encontrei algumas pessoas reclamando do mesmo problema na versão 1_03_00.

Caso alguém tenha detalhes a respeito, agradeço para poder fazer os testes e eventuais implementações que forem necessárias.

Gostaria de saber como consultar o status.

1. Na situação atual, enviei o R2099 e retornou "2-Em Processamento"

1.1. Se tento enviar novamente, acusa <codResp>MS1078</codResp><dscResp>A EFD já foi fechada para o período informado, ou existe um evento de fechamento em processamento</dscResp>

1.2. Se tento enviar R2098, acusa <codResp>MS1060</codResp><dscResp>Não existe evento de fechamento para o período informado.</dscResp> como se não houvesse o R2099 ainda

AcbrReinf001.rar

Link para o comentário
Compartilhar em outros sites

  • Consultores

Bom dia Renato,

Primeiramente muito obrigado pela colaboração, mas não vou poder aceitar pois os seus fontes estão desatualizados.

Por favor atualize todos os fonte de todas as pastas, reinstale os componentes e por fim faça novos testes e as alterações necessárias.

Estando tudo OK, anexe somente as units alteradas.

Consultor SAC ACBr

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

Projeto ACBr

Analista de Sistemas / e-mail: [email protected] / Fone: (16) 9-9701-5030 / Araraquara-SP

Araraquara - A era dos Trólebus

Link para o comentário
Compartilhar em outros sites

1 hora atrás, Renato Rubinho disse:

1. Na situação atual, enviei o R2099 e retornou "2-Em Processamento"

1.1. Se tento enviar novamente, acusa <codResp>MS1078</codResp><dscResp>A EFD já foi fechada para o período informado, ou existe um evento de fechamento em processamento</dscResp>

1.2. Se tento enviar R2098, acusa <codResp>MS1060</codResp><dscResp>Não existe evento de fechamento para o período informado.</dscResp> como se não houvesse o R2099 ainda

Bom dia!
Aconteceu o mesmo aqui. Ainda não sei como proceder pra reabrir o período.

Link para o comentário
Compartilhar em outros sites

  • Consultores
Em 08/03/2018 at 10:52, Italo Jurisato Junior disse:

Bom dia Renato,

Primeiramente muito obrigado pela colaboração, mas não vou poder aceitar pois os seus fontes estão desatualizados.

Por favor atualize todos os fonte de todas as pastas, reinstale os componentes e por fim faça novos testes e as alterações necessárias.

Estando tudo OK, anexe somente as units alteradas.

Boa tarde @Italo Jurisato Junior,

Desculpe, sempre atualizo os fontes antes de dar manutenção, tinha atualizado segunda-feira e acabei não checando se houveram novas implementações até ontem.

1. Seguem implementações, com o fonte atual, alimentando as propriedades:

EvtTotal.id
EvtTotal.IdeStatus.cdRetorno  
EvtTotal.IdeStatus.descRetorno
EvtTotal.IdeStatus.regOcorrs.tpOcorr        
EvtTotal.IdeStatus.regOcorrs.localErroAviso 
EvtTotal.IdeStatus.regOcorrs.codResp        
EvtTotal.IdeStatus.regOcorrs.dscResp        
EvtTotal.infoRecEv.nrProtEntr
EvtTotal.infoRecEv.dhProcess 
EvtTotal.infoRecEv.tpEv      
EvtTotal.infoRecEv.idEv      
EvtTotal.infoRecEv.hash      
EvtTotal.InfoTotal.nrRecArqBase

2. IEventoReinf >>> function GetEvento: TObject;
Como a propriedade TeventoCollectionItem.FEvento foi criada como interface não é possível fazer o cast para os respectivos eventos (5001 ou 5011) para poder preencher as propriedades.
Para conseguir fazer o cast, criei a função GetEvento para devolver o objeto. A alternativa seria herdar a 5001 e 5011 de uma classe principal e declarar o TeventoCollectionItem.FEvento como a classe principal ao invés da Interface.

Att

 

ACBrReinf002.rar

Link para o comentário
Compartilhar em outros sites

  • Consultores

Bom dia Renato,

Não entendi o motivo da alteração na unit pcnReinfRetEventos sendo que a leitura dessas informações estão na unit pcnReinfR5001.

Consultor SAC ACBr

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

Projeto ACBr

Analista de Sistemas / e-mail: [email protected] / Fone: (16) 9-9701-5030 / Araraquara-SP

Araraquara - A era dos Trólebus

Link para o comentário
Compartilhar em outros sites

  • Consultores

Boa tarde Italo,

Não vi que havia a leitura na 5001 após mudarem o "TEnvioLote.TratarResposta". Desculpe mais uma vez.
Por favor, desconsidere as alterações da unit pcnReinfRetEventos, o problema em si é no item (2) para ler as propriedades após o envio.
Não consigo fazer o cast sem essa implementação que mandei (gera access violation).
Sabe se existe alguma alternativa para conseguir ler as propriedades através da Interface ?

Estou mandando a unit do demo junto deste novo fonte com o cenário do problema para você entender, detalhes abaixo


Exemplo:

    if ACBrReinf1.Enviar then
    begin
      for i:=0 to ACBrReinf1.WebServices.EnvioLote.RetEnvioLote.evento.Count - 1 do
      begin
        // 1. Funcionando: com a implementação da nova função GetEvento
        // with TR5001( ACBrReinf1.WebServices.EnvioLote.RetEnvioLote.evento.Items.Evento.GetEvento ) do

        // 2. Não funcionando: com o fonte anterior, fazendo o cast do Evento dá access violation em qualquer propriedade. Ex: EvtTotal.id
        with TR5001( ACBrReinf1.WebServices.EnvioLote.RetEnvioLote.evento.Items.Evento ) do

        begin
          mmoRet.Lines.Add('EvtTotal.id: '+ EvtTotal.id);

          mmoRet.Lines.Add('cdRetorno: '+ EvtTotal.IdeStatus.cdRetorno);
          mmoRet.Lines.Add('descRetorno: '+ EvtTotal.IdeStatus.descRetorno);

          mmoRet.Lines.Add('nrRecArqBase: '+ EvtTotal.InfoTotal.nrRecArqBase);
        end;  
      end;
 

Obrigado

 

ACBrReinf003.rar

Link para o comentário
Compartilhar em outros sites

Em 08/03/2018 at 09:48, Renato Rubinho disse:

Não encontrei documentação a respeito dos códigos de status de retorno. Até o momento eu havia me deparado apenas com "0-Sucesso" ou "1-ERRO"

Agora, no envio do R2099, está acusando "2-EM PROCESSAMENTO" e retorna o nrProtEntr ao invés do nrRecArqBase

Cacei na net e encontrei algumas pessoas reclamando do mesmo problema na versão 1_03_00.

Caso alguém tenha detalhes a respeito, agradeço para poder fazer os testes e eventuais implementações que forem necessárias.

Gostaria de saber como consultar o status.

1. Na situação atual, enviei o R2099 e retornou "2-Em Processamento"

1.1. Se tento enviar novamente, acusa <codResp>MS1078</codResp><dscResp>A EFD já foi fechada para o período informado, ou existe um evento de fechamento em processamento</dscResp>

1.2. Se tento enviar R2098, acusa <codResp>MS1060</codResp><dscResp>Não existe evento de fechamento para o período informado.</dscResp> como se não houvesse o R2099 ainda

O R-2099 é diferente dos demais eventos pois é assíncrono. Por isso ele possui o status em processamento.

Ele retorna um numero de protocolo para consultar o resultado do processamento posteriormente através do R-5011.

Está nos itens 6.1 e 6.2 do manual de orientação desenvolvedor v1.3.

O problema que eu tenho é que o R-5011 está retornando sempre MS0010 - Nenhuma informacao encontrada para os parametros informados.

Alguém conseguiu executar o o R-5011?

Link para o comentário
Compartilhar em outros sites

  • Consultores
10 minutos atrás, RKawano disse:

O R-2099 é diferente dos demais eventos pois é assíncrono. Por isso ele possui o status em processamento.

Ele retorna um numero de protocolo para consultar o resultado do processamento posteriormente através do R-5011.

Está nos itens 6.1 e 6.2 do manual de orientação desenvolvedor v1.3.

O problema que eu tenho é que o R-5011 está retornando sempre MS0010 - Nenhuma informacao encontrada para os parametros informados.

Alguém conseguiu executar o o R-5011?

Só vou consegui testar segunda-feira, mas ainda não fiz nada do 5011.

Você pode passar o exemplo que está utilizando?

Link para o comentário
Compartilhar em outros sites

  • Consultores

Renato,

De uma olhada no botão [Consultar] do programa exemplo do eSocial existe um exemplo de como ler os dados dos eventos de retorno.

Acredito que de para aplicar a mesma solução.

Consultor SAC ACBr

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

Projeto ACBr

Analista de Sistemas / e-mail: [email protected] / Fone: (16) 9-9701-5030 / Araraquara-SP

Araraquara - A era dos Trólebus

Link para o comentário
Compartilhar em outros sites

  • Consultores
17 horas atrás, Italo Jurisato Junior disse:

Renato,

De uma olhada no botão [Consultar] do programa exemplo do eSocial existe um exemplo de como ler os dados dos eventos de retorno.

Acredito que de para aplicar a mesma solução.

Bom dia Italo,

Ok.  Vou ver, estou em outro projeto é assim que possível vejo se coloco essa consulta no componente. Quando criei as outras classes, não tinha o 5011 ainda na versão 1_02.

Quando puder, só dá uma olhada no cast por favor, para ver se deixamos com a função para retornar o objeto,  se substituimos a interface por classe ou se tem alguma forma de fazer o cast como está agora. Pelo que pesquisei, do jeito que tá só vi opção criando uma função.

 

 

Link para o comentário
Compartilhar em outros sites

  • Consultores
23 minutos atrás, Rafael Dias disse:

Funciona normalmente é só fazer o cast correto que vai funcionar, interface é apenas um contrato na verdade ali você tem o evento que você quer.


if (evento.Items[i].Evento.TipoEvento = teR5001) then
begin
  R5001 := TR5001(evento.Items[i].Evento);
  Id := R5001.EvtTotal.Id;
end;

 

Obrigado pelo retorno Rafael.
Eu também havia testado atribuindo à variável conforme seu exemplo, não dá erro para compilar mas também dava access violation ao tentar ler as propriedades. Vi agora que no exemplo que passei não coloquei o índice da collection, mas no meu sistema tenho quase certeza que estava correto senão nem compilaria. 
Cheguei a encontrar artigos na internet referente a problemas de cast com interface no Delphi 7, dando como solução, funções monstruosas para resolver o problema.
Não estou com o ambiente aqui para testar, na segunda-feira eu testo novamente e aviso. 
 

Link para o comentário
Compartilhar em outros sites

  • Consultores
Em 10/03/2018 at 12:06, Rafael Dias disse:

Funciona normalmente é só fazer o cast correto que vai funcionar, interface é apenas um contrato na verdade ali você tem o evento que você quer.


if (evento.Items[i].Evento.TipoEvento = teR5001) then
begin
  R5001 := TR5001(evento.Items[i].Evento);
  Id := R5001.EvtTotal.Id;
end;

 

Bom dia,

Efetuei o teste novamente conforme exemplo abaixo e, mesmo atribuindo à variável ( R5001: TR5001) ocorre access violation ao tentar ler as propriedades.

Debug.gif.5b97a9dc7b634b8011977dfff7963acd.gif

Link para o comentário
Compartilhar em outros sites

  • Consultores
8 minutos atrás, Rafael Dias disse:

o Campo ID tava com erro na leitura pode ser este o motivo do access violation, eu vou conferir a leitura para ver se tem problema.
O erro era que na leitura estava Id e no xml que você me envio esta id.

Não acredito que seja algo tão simples, mas espero seja... :-D

Como você disse que no eSocial funciona, já é uma boa notícia.

Obs: O problema aparentemente não está no id apenas. A menos que o erro no id (mesmo sem ser acionado) desencadeie erros nas demais propriedades. Qualquer propriedade do EvtTotal apresenta o mesmo problema. 

Segue outro exemplo, comentei a linha da leitura do id e a próxima também apresentou o mesmo problema.

image.thumb.png.0b2c44dd949df7246c5be682dddd72a1.png

 

Seguem links sobre o que falei a respeito do problema de cast no Delphi 7:

http://hallvards.blogspot.com.br/2004/07/hack-7-interface-to-object-in-delphi.html

http://blog.barrkel.com/2011/03/ugly-alternative-to-interface-to-object.html

 

Link para o comentário
Compartilhar em outros sites

  • Consultores

Da uma olhada se a forma como fiz o GetEvento no Reinf ( interface + TR5001 + TR5011 ) está de acordo. Já está no svn.

Caso precise fazer algo diferente, vamos implementar no Reinf tbm para padronizar este tipo de tratamento.

Veja se acha melhor alterar de interface para uma classe ancestral em comum que resolveria o problema sem necessidade da função.

 

Link para o comentário
Compartilhar em outros sites

Olá!

Pelo que sei os registros 5001 e 5011 são retornados pelo Webservice de consulta. Como vocês estão consumindo o Webservice de consulta.

Teriam algum exemplo de xml para requisição para consumir o Webservice de consulta? https://preprodefdreinf.receita.fazenda.gov.br/ConsultasReinf.svc?singleWSDL

Criei um Post no grupo para que pudessem me ajudar, pois estou efetuando a implementação da consulta e somente me retorna erro. Segue abaixo o post criado.

 

 

Link para o comentário
Compartilhar em outros sites

  • Consultores

Bom dia Marlon,

Implementei o método Consultar no componente ACBrReinf.

Fiz um teste e obtive como reposta a mensagem de erro que o Web Service de Consulta esta inativo.

Sendo assim no momento não tem como realizar testes de consulta.

Não sei se a montagem do layout do XML de consulta esta correto, pois falta o Schema (arquivo XSD) referente a consulta para comparar e fazer as correções necessárias.

Consultor SAC ACBr

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

Projeto ACBr

Analista de Sistemas / e-mail: [email protected] / Fone: (16) 9-9701-5030 / Araraquara-SP

Araraquara - A era dos Trólebus

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 2110 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.