Jump to content

dev botao

Geração da ID de eventos


Go to solution Solved by EMBarbosa,
  • Este tópico foi criado há 636 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Bom dia!

Depois de um bom tempo sem atualizar o ACBR, fiz o update e notei que houve uma importante reestruturação na unit ACBrUtil. Realizei então diversos testes com a geração dos eventos do eSocial, e me deparei com um pequeno problema que possivelmente mais alguém possa vir a enfrentar.

O problema consistia em que, ao realizar a validação de schema do XML de um lote de eventos, por vezes aparecia uma mensagem semelhante à seguinte:
Element '{http://www.esocial.gov.br/schema/lote/eventos/envio/v1_1_1}evento', attribute 'Id': 'IDXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' is not a valid value of the atomic type 'xs:ID'.

Analisando o XML do lote gerado, me dei conta de que o erro era devido ao fato haver mais de uma ocorrência de eventos do mesmo tipo com a mesma ID.

Depurei o processo de geração da ID dos eventos, e descobri que por conta da reestruturação, na implementação da função TeSocialEvento.GerarChaveEsocial na unit pcesGerador, o uso da unit ACBrUtil.Base tomou precedência em relação à pcnAuxiliar, e que ambas possuem uma implementação da função IntToStrZero, porém, com comportamentos ligeiramente diferentes. Assim, a função utilizada para gerar o número sequencial da ID dos eventos passou a utilizar a função IntToStrZero da unit nova, e a ter um novo comportamento em alguns casos.

Resumidamente, ambas as funções IntToStrZero retornam uma string com um número inteiro completando com zeros à esquerda, porém, a função IntToStrZero da pcnAuxiliar faz o truncamento do campo à esquerda ("123456" -> "23456"), ao passo que a função IntToStrZero da unit ACBrUtil.Base faz o truncamento à direita ("123456" -> "12345").

Essa diferença no retorno das funções em geral seria irrelevante para a geração da ID do evento, exceto quando o sequencial informado tenha um comprimento maior que cinco dígitos. Por coincidência, este era exatamente o meu caso, pois utilizo um generator de banco de dados para informar o sequencial, cujo valor ultrapassou a casa dos cinco dígitos, fazendo com que eventos gerados para a mesma empresa dentro do mesmo segundo ficassem com o mesmo sequencial, e portanto, a mesma ID.

A mudança no comportamento na geração da ID talvez seja proposital, talvez seja acidental, mas de qualquer maneira, deixo aqui minha sugestão de alteração para que a geração da ID volte a ter o comportamento anterior.

Em anexo está a alteração que realizei na unit pcesGerador, especificando na função TeSocialEvento.GerarChaveEsocial que a chamada à IntToStrZero seja a da que está implementada na unit pcnAuxiliar, tal como era anteriormente.

De qualquer modo, mesmo que a equipe do projeto ACBR decida não acatar a minha sugestão, sabendo o que ocasionou o problema, fica fácil resolver alterando a minha aplicação.

pcesGerador.pas

Link to comment
Share on other sites

  • Administradores

Obrigado pela contribuição, em breve será validada para possível inclusão ao svn

TK-2586

  • Like 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 !!

Link to comment
Share on other sites

  • 1 month later...
  • Consultores
  • Solution
Em 25/04/2022 at 08:49, Danúbio Viana Nogueira disse:

Bom dia!

Depois de um bom tempo sem atualizar o ACBR, fiz o update e notei que houve uma importante reestruturação na unit ACBrUtil. Realizei então diversos testes com a geração dos eventos do eSocial, e me deparei com um pequeno problema que possivelmente mais alguém possa vir a enfrentar.

O problema consistia em que, ao realizar a validação de schema do XML de um lote de eventos, por vezes aparecia uma mensagem semelhante à seguinte:
Element '{http://www.esocial.gov.br/schema/lote/eventos/envio/v1_1_1}evento', attribute 'Id': 'IDXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' is not a valid value of the atomic type 'xs:ID'.

Analisando o XML do lote gerado, me dei conta de que o erro era devido ao fato haver mais de uma ocorrência de eventos do mesmo tipo com a mesma ID.

Depurei o processo de geração da ID dos eventos, e descobri que por conta da reestruturação, na implementação da função TeSocialEvento.GerarChaveEsocial na unit pcesGerador, o uso da unit ACBrUtil.Base tomou precedência em relação à pcnAuxiliar, e que ambas possuem uma implementação da função IntToStrZero, porém, com comportamentos ligeiramente diferentes. Assim, a função utilizada para gerar o número sequencial da ID dos eventos passou a utilizar a função IntToStrZero da unit nova, e a ter um novo comportamento em alguns casos.

Resumidamente, ambas as funções IntToStrZero retornam uma string com um número inteiro completando com zeros à esquerda, porém, a função IntToStrZero da pcnAuxiliar faz o truncamento do campo à esquerda ("123456" -> "23456"), ao passo que a função IntToStrZero da unit ACBrUtil.Base faz o truncamento à direita ("123456" -> "12345").

Essa diferença no retorno das funções em geral seria irrelevante para a geração da ID do evento, exceto quando o sequencial informado tenha um comprimento maior que cinco dígitos. Por coincidência, este era exatamente o meu caso, pois utilizo um generator de banco de dados para informar o sequencial, cujo valor ultrapassou a casa dos cinco dígitos, fazendo com que eventos gerados para a mesma empresa dentro do mesmo segundo ficassem com o mesmo sequencial, e portanto, a mesma ID.

A mudança no comportamento na geração da ID talvez seja proposital, talvez seja acidental, mas de qualquer maneira, deixo aqui minha sugestão de alteração para que a geração da ID volte a ter o comportamento anterior.

Em anexo está a alteração que realizei na unit pcesGerador, especificando na função TeSocialEvento.GerarChaveEsocial que a chamada à IntToStrZero seja a da que está implementada na unit pcnAuxiliar, tal como era anteriormente.

De qualquer modo, mesmo que a equipe do projeto ACBR decida não acatar a minha sugestão, sabendo o que ocasionou o problema, fica fácil resolver alterando a minha aplicação.

pcesGerador.pas 76 kB · 4 downloads

Olá.

Muito obrigado pela sugestão e análise.

Depois de verificar a situação, decidimos subir a alteração por questão de retrocompatibilidade.

Mas por favor, faça a alteração de sua aplicação pois no futuro isso pode ser alterado.

A questão é que o problema acontece se, e somente se, for preenchido o campo "sequencial" com valores maiores do que ele deveria permitir (ou seja, 5 caracteres).

Além disso, a nossa ideia é ir eliminando aos poucos os códigos repetidos ou muito semelhantes. E esse código da específico da PCNAuxiliar já está na nossa mira. :)

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

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

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

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.