Jump to content

Delphi chamada_delphi.png acbr.png

C6 chamada_c6.png botao.png

Eventos S-2400 e S-2410 - Problema de identificação de tipos de eventos


MSS
Go to solution Solved by EMBarbosa,

Recommended Posts

A identificação do tipo de evento errado nos eventos S-2400 e S-2410 causam problemas na geração/carga/assinatura/validação dos XMLs.

Explicação:
- Ao executar a função ACBreSocialEventos -> TEventos.LoadFromString é disparada a execução da função LoadFromString especifica referente ao grupo do evento do XML (pcesPeriodicos -> TPeriodicos.LoadFromString, pcesNaoPeriodicos -> TNaoPeriodicos.LoadFromString, pcesTabelas -> TTabelas.LoadFromString, pcesIniciais -> TIniciais.LoadFromString).
- As funções LoadFromString de cada grupo de eventos utilizam-se da função pcesConversaoeSocial -> StringXMLToTipoEvento para identificar o tipo do evento a partir da identificação contida dentro do XML.
- A função pcesConversaoeSocial -> StringXMLToTipoEvento utiliza um laço no array pcesConversaoeSocial -> TEventoString para localizar o enumerador pcesConversaoeSocial -> TTipoEvento.

Problema:
- O array pcesConversaoeSocial -> TEventoString e o enumerador pcesConversaoeSocial -> TTipoEvento não são equivalentes na quantidade e nem na ordem de ambos; causando assim retorno incorreto pela função pcesConversaoeSocial -> StringXMLToTipoEvento.

Solução:
- Buscando solucionar o problema acima mencionado, evitar maiores impactos em códigos legados e preparar um padrão que atenda aos antigos e novos eventos que estão por vir (S2500, S2501 e S5501 - v. S-1.0 - NDE 02/2021 - Processo Trabalhista) foram realizadas as seguintes alterações:
  - a) Adição de item no enumerador pcesConversaoeSocial -> TeSocialSchema;
  - b) Adição de itens no enumerador pcesConversaoeSocial -> TTipoEvento;
  - c) Criação do enumerador pcesConversaoeSocial -> TMatrixEventoInfo;
  - d) Criação do record pcesConversaoeSocial -> TRecMatrixEventoInfo;
  - e) Criação da constante pcesConversaoeSocial -> __ARRAY_MATRIX_EVENTO_INFO;
  - f) Criação da função pcesConversaoeSocial -> GetMatrixEventoInfo;
  - g) Refatoração da função pcesConversaoeSocial -> StringINIToTipoEvento;
  - h) Refatoração da função pcesConversaoeSocial -> StringXMLToTipoEvento;
  - i) Refatoração da função pcesConversaoeSocial -> TipoEventoToStrEvento;

Observações:
- Todas as alterações foram realizadas na unit pcesConversaoeSocial;
- Todas as alterações estão identificadas e são facilmente localizadas através da palavra "[MSS", contida em comentário, que pode estar em apenas uma linha ou abrindo e fechando um bloco de alterações.

Estou disponibilizando o código para estudos, testes, uso e/ou eventual update no repositório do Projeto ACBr.

[]s,
Mário Soares Santos

pcesConversaoeSocial.pas

  • Like 1
Link to comment
Share on other sites

  • 2 weeks later...
  • Consultores
Em 10/01/2022 at 17:16, MSS disse:

A identificação do tipo de evento errado nos eventos S-2400 e S-2410 causam problemas na geração/carga/assinatura/validação dos XMLs.

[]s,

Mário Soares Santos

pcesConversaoeSocial.pas 144 kB · 1 download

Olá Mário,

   As suas alterações parecem fazer sentido.

   Mas como ninguém mais mencionou esse problema, por acaso você tem um arquivo de exemplo onde essa identificação falha?

   Edit: Adicionado no backlog (TK-2283)

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

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

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link to comment
Share on other sites

2 horas atrás, EMBarbosa disse:

Olá Mário,

   As suas alterações parecem fazer sentido.

   Mas como ninguém mais mencionou esse problema, por acaso você tem um arquivo de exemplo onde essa identificação falha?

   Edit: Adicionado no backlog (TK-2283)

Olá Elton,

Nesse momento estamos sob tensão total; porque desenvolvemos software exclusivamente para orgãos públicos e o eSocial é o projeto que estou responsável e focando em full time.

Para criar um exemplo prático sobre a questão eu precisaria gastar algum tempo e isso agora é impensável.

Vou tentar conseguir algumas horas livres mais lá pra frente e assim poder criar alguma coisa para apresentar.

Estamos gerando os XML dos eventos através do nosso sistema de RH e alimentando as classes de ACBreSocial através do metodo LoadFromString.

Mas posso adiantar que outros problemas decorrentes da falha na sincronização entre TEventoString e TTipoEvento  irão ocorrer.

[]s,
Mário Soares Santos

Link to comment
Share on other sites

  • Consultores
14 horas atrás, MSS disse:

Para criar um exemplo prático sobre a questão eu precisaria gastar algum tempo e isso agora é impensável.

Vou tentar conseguir algumas horas livres mais lá pra frente e assim poder criar alguma coisa para apresentar.

Estamos gerando os XML dos eventos através do nosso sistema de RH e alimentando as classes de ACBreSocial através do metodo LoadFromString.

Mas posso adiantar que outros problemas decorrentes da falha na sincronização entre TEventoString e TTipoEvento  irão ocorrer.

Oi Mário, talvez não tenha sido claro. Estou tentando fazer a avaliação sem quebrar nada.

Não precisa ser um aplicativo exemplo. Talvez só um xml que demonstre o problema já seja suficiente. Acha possível isso?

De qualquer forma agradecemos muito sua contribuição...

 

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

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

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link to comment
Share on other sites

Em 20/01/2022 at 10:03, EMBarbosa disse:

Oi Mário, talvez não tenha sido claro. Estou tentando fazer a avaliação sem quebrar nada.

Não precisa ser um aplicativo exemplo. Talvez só um xml que demonstre o problema já seja suficiente. Acha possível isso?

De qualquer forma agradecemos muito sua contribuição...

 

Oi, Elton !

Qualquer XML que obedeça a estrutura do S-2400, S-2410 e alguns outros, possíveis, porem ainda não analisados, irão passar pelo mesmo problema na função TEventos.LoadFromString.

Conforme solicitado, segue anexo um XML do S-2400 que ao ser carregado através da função TEventos.LoadFromFile não é identificado corretamente; por causa do mencionado no start deste post.

Os dados utilizados para preenchimento do XML anexo são fictícios.

[]s,
Mário Soares Santos

1455215570001062022012408463305320-S-2400-0.xml

Link to comment
Share on other sites

  • Consultores
3 horas atrás, MSS disse:

Oi, Elton !

Qualquer XML que obedeça a estrutura do S-2400, S-2410 e alguns outros, possíveis, porem ainda não analisados, irão passar pelo mesmo problema na função TEventos.LoadFromString.

Conforme solicitado, segue anexo um XML do S-2400 que ao ser carregado através da função TEventos.LoadFromFile não é identificado corretamente; por causa do mencionado no start deste post.

Os dados utilizados para preenchimento do XML anexo são fictícios.

[]s,
Mário Soares Santos

1455215570001062022012408463305320-S-2400-0.xml 4 kB · 1 download

Muito obrigado. Vou verificar.

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

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

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link to comment
Share on other sites

  • 4 weeks later...
  • Consultores
  • Solution
Em 10/01/2022 at 17:16, MSS disse:

A identificação do tipo de evento errado nos eventos S-2400 e S-2410 causam problemas na geração/carga/assinatura/validação dos XMLs.

Explicação:
- Ao executar a função ACBreSocialEventos -> TEventos.LoadFromString é disparada a execução da função LoadFromString especifica referente ao grupo do evento do XML (pcesPeriodicos -> TPeriodicos.LoadFromString, pcesNaoPeriodicos -> TNaoPeriodicos.LoadFromString, pcesTabelas -> TTabelas.LoadFromString, pcesIniciais -> TIniciais.LoadFromString).
- As funções LoadFromString de cada grupo de eventos utilizam-se da função pcesConversaoeSocial -> StringXMLToTipoEvento para identificar o tipo do evento a partir da identificação contida dentro do XML.
- A função pcesConversaoeSocial -> StringXMLToTipoEvento utiliza um laço no array pcesConversaoeSocial -> TEventoString para localizar o enumerador pcesConversaoeSocial -> TTipoEvento.

Problema:
- O array pcesConversaoeSocial -> TEventoString e o enumerador pcesConversaoeSocial -> TTipoEvento não são equivalentes na quantidade e nem na ordem de ambos; causando assim retorno incorreto pela função pcesConversaoeSocial -> StringXMLToTipoEvento.

Solução:
- Buscando solucionar o problema acima mencionado, evitar maiores impactos em códigos legados e preparar um padrão que atenda aos antigos e novos eventos que estão por vir (S2500, S2501 e S5501 - v. S-1.0 - NDE 02/2021 - Processo Trabalhista) foram realizadas as seguintes alterações:
  - a) Adição de item no enumerador pcesConversaoeSocial -> TeSocialSchema;
  - b) Adição de itens no enumerador pcesConversaoeSocial -> TTipoEvento;
  - c) Criação do enumerador pcesConversaoeSocial -> TMatrixEventoInfo;
  - d) Criação do record pcesConversaoeSocial -> TRecMatrixEventoInfo;
  - e) Criação da constante pcesConversaoeSocial -> __ARRAY_MATRIX_EVENTO_INFO;
  - f) Criação da função pcesConversaoeSocial -> GetMatrixEventoInfo;
  - g) Refatoração da função pcesConversaoeSocial -> StringINIToTipoEvento;
  - h) Refatoração da função pcesConversaoeSocial -> StringXMLToTipoEvento;
  - i) Refatoração da função pcesConversaoeSocial -> TipoEventoToStrEvento;

Observações:
- Todas as alterações foram realizadas na unit pcesConversaoeSocial;
- Todas as alterações estão identificadas e são facilmente localizadas através da palavra "[MSS", contida em comentário, que pode estar em apenas uma linha ou abrindo e fechando um bloco de alterações.

Estou disponibilizando o código para estudos, testes, uso e/ou eventual update no repositório do Projeto ACBr.

[]s,
Mário Soares Santos

pcesConversaoeSocial.pas 144 kB · 3 downloads

Muito obrigado pela contribuição.
Fiz a implementação baseada nela.
Subi as alterações para o SVN na Revisão  123.

Tive que fazer algumas modificações por conta das modificações recentes.

Queira por favor atualizar, testar e reportar qualquer problema. Como você foi o originador da contribuição, é a melhor pessoa para poder nos dar um retorno.

Mais uma vez obrigado.

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

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

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link to comment
Share on other sites

  • Consultores

EDIT: Eu tive que fazer alguns ajustes por conta da compilação no Delphi 7.

Creio que esteja tudo correto. Mas as validações são importantes nesses casos.

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

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

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link to comment
Share on other sites

Olá,

A alteração gerou um problema na identificação do evento S2220, no meu caso.

O inicio do XML contém:

<?xml version="1.0" encoding="UTF-8"?><eSocial xmlns="http://www.esocial.gov.br/schema/evt/evtMonit/v_S_01_00_00"><evtMonit Id="ID2040074 .....

 

Na linha 2821, do arquivo pcesConversaoeSocial está o seguinte código:

strSearchValue := Trim(Copy(s, intChar + 1, intLastPos - intChar - 1));

Utilizando o trecho do XML de exemplo, o valor atribuido a variável strSearchValue foi: "vtMonit I"

Esse evento não existe, a função copiou um caracter pra frente, deixei da seguinte forma:

strSearchValue := Trim(Copy(s, intChar, intLastPos - intChar - 1));

Apenas removi o "+ 1" e no meu caso resolveu. Passou a retornar: "evtMonit".

Anexei o arquivo com o ajuste.

Obs.: Utilizo a versão 2005 do delphi.

pcesConversaoeSocial.pas

Link to comment
Share on other sites

Em 20/02/2022 at 22:21, EMBarbosa disse:

EDIT: Eu tive que fazer alguns ajustes por conta da compilação no Delphi 7.

Creio que esteja tudo correto. Mas as validações são importantes nesses casos.

Oi, Elton !

Verifiquei os ajustes que você realizou e a principio não vi nada que pudesse ser causador de problemas na alteração principal.

Porem; o próximo post veio demonstrar que uma coisa simples do ajuste quebraria todo o sentido da alteração principal.

 

19 horas atrás, Lucas G. dos Santos disse:

Olá,

A alteração gerou um problema na identificação do evento S2220, no meu caso.

O inicio do XML contém:

<?xml version="1.0" encoding="UTF-8"?><eSocial xmlns="http://www.esocial.gov.br/schema/evt/evtMonit/v_S_01_00_00"><evtMonit Id="ID2040074 .....

Na linha 2821, do arquivo pcesConversaoeSocial está o seguinte código:

strSearchValue := Trim(Copy(s, intChar + 1, intLastPos - intChar - 1));

Utilizando o trecho do XML de exemplo, o valor atribuido a variável strSearchValue foi: "vtMonit I"

Esse evento não existe, a função copiou um caracter pra frente, deixei da seguinte forma:

strSearchValue := Trim(Copy(s, intChar, intLastPos - intChar - 1));

Apenas removi o "+ 1" e no meu caso resolveu. Passou a retornar: "evtMonit".

Anexei o arquivo com o ajuste.

Obs.: Utilizo a versão 2005 do delphi.

 

Oi, Lucas.

Você foi o felizardo premiado em descobrir o primeiro problema.

A correção que você fez funciona, mas ela não resolve a causa do problema na raiz, resolve parte do efeito causado.

A seguir apresento o que detectei debugando o metodo StringXMLToTipoEvento() e a correção aplicada.

O metodo LastIndexOf() retorna a ultima posicão encontrada da string e o metodo PosLast() retorna a proxima posição após encontrar a string; e isso gera inconsistências no processamento do metodo StringXMLToTipoEvento().

A correção foi aplicada nas linhas que utilizam o metodo PosLast(); corrigindo assim a informação desde o inicio e evitando-se que, ao debugar o código, as informações fiquem inconsistentes até o ponto de ajuste.

[]s,

Mário Soares Santos

pcesConversaoeSocial.pas

  • Like 1
Link to comment
Share on other sites

  • Consultores
3 horas atrás, MSS disse:

Oi, Elton !

Verifiquei os ajustes que você realizou e a principio não vi nada que pudesse ser causador de problemas na alteração principal.

Porem; o próximo post veio demonstrar que uma coisa simples do ajuste quebraria todo o sentido da alteração principal.

 

Oi, Lucas.

Você foi o felizardo premiado em descobrir o primeiro problema.

A correção que você fez funciona, mas ela não resolve a causa do problema na raiz, resolve parte do efeito causado.

A seguir apresento o que detectei debugando o metodo StringXMLToTipoEvento() e a correção aplicada.

O metodo LastIndexOf() retorna a ultima posicão encontrada da string e o metodo PosLast() retorna a proxima posição após encontrar a string; e isso gera inconsistências no processamento do metodo StringXMLToTipoEvento().

A correção foi aplicada nas linhas que utilizam o metodo PosLast(); corrigindo assim a informação desde o inicio e evitando-se que, ao debugar o código, as informações fiquem inconsistentes até o ponto de ajuste.

[]s,

Mário Soares Santos

pcesConversaoeSocial.pas 143 kB · 0 downloads

Muito obrigado pela contribuição @MSS e pelo relato @Lucas G. dos Santos

Subi as alterações para o SVN na Revisão  24703.
Pelo que vi está tudo certo.
Queira por favor atualizar, testar e reportar qualquer problema.

Mais uma vez obrigado aos dois.

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

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

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.