Ir para conteúdo
  • Cadastre-se

dev botao

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


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

Recommended Posts

Postado

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

  • Curtir 1
  • 2 semanas depois ...
  • Consultores
Postado
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.
Postado
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

  • Consultores
Postado
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.
Postado
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

  • Consultores
Postado
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.
  • 4 semanas depois ...
  • Consultores
  • Solution
Postado
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.
  • Consultores
Postado

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.
Postado

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

Postado
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

  • Curtir 1
  • Consultores
Postado
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.
  • Este tópico foi criado há 1011 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • 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.