feat(resultado): a página Resultado vira a casa da DRE + recorte que não mente - #42
Merged
Conversation
A DRE morava so dentro da Apuracao, que e um lugar de FAZER: o ritual
subir extrato -> categorizar -> ver o resultado. Quem so queria LER o
numero precisava atravessar o fluxo de trabalho inteiro pra chegar nele.
Agora ela e ESPELHADA em /financeiro/resultado, que e o lugar de leitura
("Estou ganhando — e por que?"). Espelhada, nao movida: a Apuracao segue
com a aba `dre` intacta, porque tirar de la deixaria o ritual sem
desfecho. A pagina abre na DRE e mantem o Painel da secao Resultado
(acompanhamento mes a mes · ABC de despesas) na segunda aba; `?aba=`
permite deep-link em qualquer uma.
Isso destampou um bug que so aparece nesta moldura: a DRE tem um botao
"ir para Categorizacao", e `categorizacao` NAO existe em
/financeiro/resultado. O `setAbaEscolhida` renderizaria o conteudo da
Categorizacao SEM entrada na barra de abas — o dono cairia numa tela sem
volta a nao ser pela sidebar. `irParaAba` resolve: se a aba existe nesta
moldura, troca; se nao, navega pra rota dona dela. O parametro e tipado
so com as tres abas do ritual, porque `painel`/`simulador` nao moram na
Apuracao e o fallback iria pro lugar errado.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…celula
Duas metades do mesmo defeito: a tela nao dizia a verdade sobre QUAL
periodo estava mostrando.
1. ANCORA — "Ultimos 3 meses" entregava UM mes
Os presets relativos resolviam contra `new Date()`. Com dado ate junho e
hoje em agosto, "Ultimos 3 meses" virava jun–ago: uma coluna, prometendo
tres. "Mes atual" e "Mes passado" caiam em meses vazios, e o YTD
arrastava colunas fantasma ate o mes corrente.
Agora ancoram no ultimo mes COM DADO (`ancoraDosPresets`). Quando a
ingestao esta em dia a ancora E o mes corrente e nada muda; mes futuro no
dado nao empurra a ancora pra frente. YEAR/COMPARE_YEARS/CUSTOM seguem no
calendario — sao absolutos por definicao.
A convencao ja existia na casa: `defaultPeriodSelection` escolhe o ultimo
mes fechado e a Visao do Projeto trava o YTD em `maxMes`. O picker da DRE
era o fora-da-curva.
Isso destampou uma incoerencia: o default abria em junho com
`presetId: LAST_MONTH` (ancorava em julho e pedia "mes passado"). Com a
ancora nova, reescolher "Mes passado" daria MAIO — mesma opcao, duas
respostas. O default virou `THIS_MONTH` ancorado no mes fechado, e tem
teste travando essa coerencia. Tambem sumiu o "(em curso)" do rotulo
quando a ancora e um mes ja encerrado, e os "ultimos N" passaram a
mostrar a janela concreta ("abr/26 – jun/26") em vez de repetir o texto
do dropdown — era ali que a tela prometia 3 e entregava 1.
2. DRILL-DOWN — sempre abria o periodo inteiro
A linha toda era um alvo unico. Olhando "ultimos 6 meses" nao havia como
ver a composicao de um mes so. Agora o drill-down herda o escopo da
CELULA: coluna de mes abre aquele mes, coluna Total (e o nome da linha)
abre o recorte inteiro. Celula zerada nao e clicavel — nao ha transacao
pra mostrar.
A peca que faltava era a conversao chave->intervalo: a tabela guarda a
coluna como chave ("2026-01", "2026-W03") e o drill-down filtra por data.
`rangeDaChaveDePeriodo` e o inverso de `getPeriodoKey`, coberto por
round-trip contra o gerador REAL — todo dia de 13 meses, nas quatro
granularidades. A semana ISO e a traicoeira (semana 1 contem 4 de janeiro
e atravessa a virada do ano); chave que nao casa com a granularidade
devolve null e cai no periodo cheio em vez de inventar intervalo.
Os dois cliques abririam telas visualmente identicas, entao o subtitulo
do modal passou a carregar o recorte ("Custos (CMV/CPV/CSP) · Jan/26").
Gate: 1486/1486 testes (+21), build ok, 0 erro/warning novo de eslint.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
This pull request has been ignored for the connected project Preview Branches by Supabase. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
A DRE morava só dentro da Apuração, que é um lugar de fazer (subir extrato → categorizar → ver). Quem só queria ler o número atravessava o ritual inteiro pra chegar nele. Agora ela é espelhada na página Resultado, que é o lugar de leitura — e junto vão dois defeitos que apareceram ao usar a tela de verdade.
Dois commits, um por assunto.
91008ba— Resultado vira a casa da DREEspelhada, não movida:
/financeiro/apuracaosegue com a abadreintacta, porque tirar de lá deixaria o ritual sem desfecho. A página abre na DRE e mantém o Painel da seção Resultado (acompanhamento mês a mês · ABC de despesas) na segunda aba.?aba=faz deep-link em qualquer uma.Isso destampou um bug que só existe nesta moldura: a DRE tem um botão "ir para Categorização", e
categorizacaonão é uma aba de/financeiro/resultado. OsetAbaEscolhidarenderizaria o conteúdo da Categorização sem entrada na barra de abas — o dono cairia numa tela sem volta a não ser pela sidebar. OirParaAbaresolve: se a aba existe nesta moldura, troca; se não, navega pra rota dona dela.f8d9619— o recorte para de mentirDuas metades do mesmo defeito: a tela não dizia a verdade sobre qual período estava mostrando.
Âncora — "Últimos 3 meses" entregava um mês
Os presets resolviam contra
new Date(). Com dado até junho e hoje em agosto:Ancoram no último mês com dado. Com ingestão em dia a âncora é o mês corrente e nada muda; mês futuro no dado não empurra a âncora.
YEAR/COMPARE_YEARS/CUSTOMseguem no calendário — são absolutos por definição.A convenção já existia na casa (
defaultPeriodSelectionescolhe o último fechado; a Visão do Projeto trava o YTD emmaxMes) — o picker da DRE era o fora-da-curva.Isso destampou uma incoerência: o default abria em junho com
presetId: LAST_MONTH(ancorava em julho e pedia "mês passado"). Com a âncora nova, reescolher "Mês passado" daria maio — mesma opção, duas respostas. O default virouTHIS_MONTHancorado no mês fechado, com teste travando a coerência. Também sumiu o "(em curso)" sobre um mês já encerrado, e os "últimos N" passaram a mostrar a janela concreta (abr/26 – jun/26) em vez de repetir o texto do dropdown.Drill-down — sempre abria o período inteiro
A linha toda era um alvo único: olhando "últimos 6 meses" não havia como ver a composição de um mês. Agora o drill-down herda o escopo da célula — coluna de mês abre aquele mês, coluna Total (e o nome da linha) abre o recorte inteiro. Célula zerada não é clicável.
A peça que faltava era a conversão chave → intervalo: a tabela guarda a coluna como chave (
"2026-01","2026-W03") e o drill-down filtra por data.rangeDaChaveDePeriodoé o inverso degetPeriodoKey, coberto por round-trip contra o gerador real — todo dia de 13 meses, nas quatro granularidades. A semana ISO é a traiçoeira (semana 1 contém 4 de janeiro e atravessa a virada do ano). Chave que não casa com a granularidade devolvenulle cai no período cheio, em vez de inventar intervalo.Os dois cliques abririam telas visualmente idênticas, então o subtítulo do modal passou a carregar o recorte:
Custos (CMV/CPV/CSP) · Jan/26.Escopo da varredura de seletores
Só o picker da DRE ancorava no calendário. Visão do Projeto e Raio-X do Mês já ancoravam no dado;
/comparativoé placeholder sem seletor; onew Date()doListaPorBancoViewé legítimo (calcula a parcela corrente de um contrato hoje).Gate
next buildokDREPivotTablesão pré-existentes no HEAD — regras de DS sobre overlay e.cockpit-card; confirmado com stash)91008baverificado verde isoladamente num worktree — sem commit intermediário quebrado🤖 Generated with Claude Code