Skip to content

Valida data em ISO, agrupa erros com dica da causa e adiciona modelos para download - #5

Merged
diogenesdie merged 1 commit into
developfrom
feature/validacao-formato-data-dicas-modelos
Aug 25, 2026
Merged

Valida data em ISO, agrupa erros com dica da causa e adiciona modelos para download#5
diogenesdie merged 1 commit into
developfrom
feature/validacao-formato-data-dicas-modelos

Conversation

@diogenesdie

Copy link
Copy Markdown
Member

Contexto

Validando um lote real (SPDM) o relatorio ficou inconsistente. Investigando, parte era problema do CSV e parte era problema do validador.

Bug: validacao de data

isDateValue usava new Date(val), que interpreta barra como mm/dd:

"06/08/26"  -> ACEITO  como 2026-06-08 (era 6 de agosto, virou 8 de junho)
"19/08/26"  -> INVALID -> reprovado

Ou seja, o validador so reprovava as datas com dia > 12. No lote testado, com 100% das datas em dd/mm/aa:

Campo Preenchidos Reprovados Aceitos com dia/mes trocado
pessoa.DTNASCIMENTO 29.772 18.271 11.501
pessoa.DTINTERNACAO 29.776 21.580 8.196
cultura.DTCOLETA 1.217 506 711
alergia.CREATED_AT 1.840 1.221 619

Passa a casar formatos ISO explicitos (YYYY-MM-DD, YYYY-MM-DDTHH:MM:SS, YYYY-MM-DD HH:MM:SS) com checagem de calendario, e a mensagem diz o que foi detectado: registro 1, valor "06/08/26" - formato dd/mm/aa (ano de 2 digitos, ambiguo).

Bug: contagem de erros subnotificada

MAX_ERRORS = 200 cortava a lista e a contagem junto. Um arquivo com 46 mil erros aparecia com 201 e quem lia o relatorio nao conseguia dimensionar a gravidade.

Erros iguais agora viram grupos: issueGroups ({ message, count, samples[] }, ate 5 amostras) e issueCount com o total real. issues continua existindo, com uma linha por grupo.

Dicas por erro recorrente

Catalogo HINTS no validator.js — em vez de so dizer que o valor falhou, aponta a causa provavel no arquivo. Aparece agrupado no topo do painel do arquivo.

Erro Dica
Colunas a mais Virgula decimal sem aspas (CUSTO 0,0909 vira duas colunas) -> exportar com ponto
Extras so com digitos Dica reforcada de separador decimal virgula
Data reprovada ISO esperado, por que dd/mm/aa e ambiguo, risco em DTNASCIMENTO
CSV em 1 coluna Linha inteira envolvida em aspas com escape duplicado
Caractere invalido Arquivo em Latin-1/Windows-1252, reexportar em UTF-8
Referencia quebrada Arquivo de dominio incompleto ou extracoes em momentos diferentes

Linha malformada nao gera erro derivado

Linha com contagem de colunas diferente do cabecalho entra em malformedRows e sai das validacoes de conteudo — os valores estao deslocados e so geravam ruido (NRATENDIMENTO deve ser numero 1.204x, DTALTA com valor 6611309). Vira alerta com a contagem.

Deteccao de encoding

Conta caracteres U+FFFD: o arquivo e lido como UTF-8, entao byte invalido denuncia Latin-1 / Windows-1252. Os 9 arquivos do lote testado acusam.

Modelos para download

Nova secao na tela, acima do upload: botao por tipo (CSV/JSON) e "baixar todos". Saem de TEMPLATES no validator.js — lote de 2 registros por arquivo que fecha entre si, todas as FKs dos 9 arquivos resolvem.

tests/validate_templates.js valida esse lote com o proprio motor, entao um modelo que o validador reprovaria quebra o teste. O mesmo arquivo faz a regressao das 4 regras acima.

Relatorio exportado

Passa a omitir o campo parsed, que carregava o dado bruto inteiro: 70 MB -> 39 KB no lote testado.

Como testar

npm install && npm test
python -m http.server 8000   # abrir http://localhost:8000/index.html

Na tela: "Baixar todos (CSV)" -> jogar os 9 no upload em lote -> tem que dar "Validacao concluida sem erros".

Alem do npm test, rodei o app renderizado em DOM headless: 0 erros de runtime, upload + validacao + expansao dos paineis funcionando, lote de modelos validando 9/9.

Fica de fora deste PR (precisa de decisao)

  1. ATIVO = T/F (1.840 registros no lote) — adicionar t/f ao whitelist booleano ou o hospital converte para 1/0? Hoje so entra a dica.
  2. DS_DOENCA_CID, QT_RESULTADO, DS_RESULTADO — entram no allowed ou continuam como campo inesperado?
  3. FKFREQUENCIA numerico (14 de 128) — mantem como erro ou vira alerta?

A validacao de data usava new Date(), que interpreta barra como mm/dd:
"06/08/26" era aceito como 8 de junho e so "19/08/26" reprovava. O
relatorio saia inconsistente, reprovando apenas as linhas com dia > 12,
e as demais seriam ingeridas com dia e mes trocados.

- isDateValue passa a casar formatos ISO explicitos (YYYY-MM-DD,
  YYYY-MM-DDTHH:MM:SS, YYYY-MM-DD HH:MM:SS) com checagem de calendario.
- Erros iguais viram grupos (issueGroups) com contagem real (issueCount)
  e ate 5 amostras. Antes MAX_ERRORS cortava a lista e a contagem junto:
  um arquivo com 46 mil erros aparecia com 201.
- Catalogo HINTS com a causa provavel no arquivo para os erros
  recorrentes (virgula decimal sem aspas, data fora do ISO, arquivo em
  Latin-1, linha inteira entre aspas, delimitador nao identificado).
- Linha com quantidade de colunas diferente do cabecalho entra em
  malformedRows e sai das validacoes de conteudo: os valores estao
  deslocados e so geravam erro derivado.
- Detecta arquivo fora de UTF-8 pelos caracteres U+FFFD.

feat: modelos de arquivo para download

TEMPLATES traz um lote de exemplo por tipo que fecha entre si (as chaves
estrangeiras dos 9 arquivos sao validas), exposto na UI em CSV e JSON.
tests/validate_templates.js valida esse lote com o proprio motor e faz a
regressao das regras acima.

O relatorio exportado passa a omitir o campo parsed, que carregava o dado
bruto inteiro (70 MB no caso testado, contra 39 KB sem ele).
@diogenesdie
diogenesdie merged commit 428d1a1 into develop Aug 25, 2026
2 checks passed
@diogenesdie
diogenesdie deleted the feature/validacao-formato-data-dicas-modelos branch August 25, 2026 18:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants