Skip to content

fix(jornada): o trilho da configuração inicial não terminava nunca - #36

Merged
BarryBits merged 1 commit into
mainfrom
fix/jornada-nao-fecha
Jul 29, 2026
Merged

fix(jornada): o trilho da configuração inicial não terminava nunca#36
BarryBits merged 1 commit into
mainfrom
fix/jornada-nao-fecha

Conversation

@BarryBits

Copy link
Copy Markdown
Owner

O banner "Configuração inicial · 5/5" ficava pregado na tela mesmo com tudo feito. Visto ao vivo na Vertímetal (produção, 29/07): clicar em "Ver o resultado" trocava pra aba DRE e o banner continuava lá.

Causa

A etapa final da jornada sempre foi manual por desenho — a migration 20260530000000 §7 escreve, na própria fonte: "concluida — cliente abriu a aba Resultado (manual)". As triggers avançam até primeira_dre_gerada e param ali, porque "ver a DRE" não deixa rastro no banco.

Só que ninguém disparava esse último avanço: useAvancarJornada foi exportado e nasceu sem chamador (grep: zero), e o CTA do banner só chamava onIrPara, que troca de aba. jornada_etapa morria em primeira_dre_gerada e calcularProgress devolvia visivel: true pra sempre. Nenhum projeto do banco tem jornada_concluida_em preenchido — o trilho nunca fechou pra ninguém.

É o mesmo defeito que o 0501094 consertou na outra ponta: lá o tour_completo era ação manual que ninguém disparava e o trilho nascia invisível; aqui o concluida é ação manual que ninguém dispara e o trilho não morre.

O fix

deveFecharJornada(etapa, aba) — predicado puro com o critério da migration (primeira_dre_gerada + aba dre). O JornadaBanner o executa e avança pra concluida pela RPC monotônica que já existia.

Pega os dois caminhos até o Resultado: o clique no CTA e a navegação direta pelo stepper. Fechar só no clique deixaria preso quem chegou pela trilha.

Validação

  • vitest 149 arquivos, 1378/1378 — inclui 8 testes novos: critério de fechamento, invariante de que todo passo visível oferece ação+label+destino, monotonicidade de nivelJornada (a RPC depende dela) e o não-atalho (abrir a DRE antes da hora não fecha nada).
  • tsc limpo — os 2 erros restantes são validators velhos em .next/ apontando pra uma rota que não existe mais, não vêm deste diff.
  • eslint 0 nos 4 arquivos.
  • Zero migration.

Smoke que fecha: abrir a Apuração da Vertímetal na aba DRE — o banner some e não volta no reload.

🤖 Generated with Claude Code

O banner "Configuração inicial · 5/5" ficava pregado na tela mesmo com tudo
feito. Visto ao vivo na Vertímetal (produção, 29/07): clicar em "Ver o
resultado" trocava pra aba DRE e o banner continuava lá.

A etapa final da jornada sempre foi manual por desenho — a migration
20260530000000 §7 escreve, na própria fonte: "concluida — cliente abriu a aba
Resultado (manual)". As triggers de `transactions`/`dre_detalhamento`/
`dre_monthly_snapshots` avançam até `primeira_dre_gerada` e param ali, porque
"ver a DRE" não deixa rastro no banco.

Só que ninguém disparava esse último avanço: `useAvancarJornada` foi exportado
e nasceu SEM CHAMADOR (grep: zero), e o CTA do banner só chamava `onIrPara`,
que troca de aba. Resultado: `jornada_etapa` morria em `primeira_dre_gerada` e
`calcularProgress` devolvia `visivel: true` pra sempre. Nenhum projeto do banco
tem `jornada_concluida_em` preenchido — o trilho nunca fechou pra ninguém.

É o MESMO defeito que o commit 0501094 consertou na outra ponta: lá o
`tour_completo` era "ação manual da UI" que ninguém disparava e o trilho nascia
invisível; aqui o `concluida` é ação manual que ninguém dispara e o trilho não
morre. A ponta de baixo foi vista, a de cima não.

## O fix

`deveFecharJornada(etapa, aba)` em jornada-service.ts — predicado puro,
testável, com o critério da migration: etapa `primeira_dre_gerada` + aba `dre`.
O `JornadaBanner` o executa num efeito e avança pra `concluida` via a RPC
monotônica que já existia.

Pega os DOIS caminhos até o Resultado: o clique no CTA (que troca pra `dre`) e
a navegação direta pela trilha da Apuração. Em ambos o cliente viu o que a
jornada prometia — fechar só no clique deixaria preso quem chegou pelo stepper.

O ref não é decoração: sem ele o efeito reenviaria a RPC a cada render até a
invalidação voltar. No erro ele destrava, então uma falha de rede não sela o
banner até o reload.

Testes (149 arquivos, 1378/1378): o critério de fechamento, a invariante de que
todo passo visível oferece ação+label+destino, a monotonicidade de `nivelJornada`
(a RPC depende dela) e o não-atalho — abrir a DRE antes da hora não fecha nada.

tsc limpo (os 2 erros restantes são validators velhos em .next/, apontando pra
uma rota que não existe mais) · eslint 0 nos 4 arquivos.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@vercel

vercel Bot commented Jul 29, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
atr-os Ready Ready Preview, Comment Jul 29, 2026 5:44pm

@supabase

supabase Bot commented Jul 29, 2026

Copy link
Copy Markdown

This pull request has been ignored for the connected project tdlxqqgechxhkygdmsxq because there are no changes detected in supabase directory. You can change this behaviour in Project Integrations Settings ↗︎.


Preview Branches by Supabase.
Learn more about Supabase Branching ↗︎.

@BarryBits
BarryBits merged commit 46b4894 into main Jul 29, 2026
4 checks passed
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.

1 participant