feat: item 11 do roadmap -- construtor de analytics customizado #62

Merged
jhony75 merged 3 commits from feature/custom-analytics-builder into develop 2026-09-10 21:08:35 -03:00
Owner

Implementa o item 11 do roadmap: construtor de analytics customizado -- o usuario escolhe assunto/metrica/quebra/filtros em vez de um grafico fixo.

Escopo confirmado com o usuario: assuntos Report e Issue (reaproveita apply_report_filters ja existente), graficos deliberadamente efemeros (nada persiste no backend -- so a ultima configuracao fica no localStorage do navegador, decisao explicita do usuario).

GET /api/analytics/custom (novo, em modules/reporting/ -- mesmo modulo que ja tem /api/metrics): subject (report|issue), metric (count, e avg_score so pra report), breakdown e os mesmos filtros que /api/reports//api/issues ja aceitam. Decisao de design: category/severidade so valem como QUEBRA pro assunto Issue (campo proprio, sem ambiguidade) -- pro assunto Report, category/severidade continuam valendo como FILTRO (atravessa pra Issue, comportamento ja existente do ReportList), mas nao como quebra, porque um report com achados de categorias diferentes tornaria a contagem por report vs. por achado ambigua.

Frontend: nova pagina /analytics-customizado, reaproveitando recharts/vocabularios (CATEGORIES/SEVERITIES/STATUSES/etc.) ja existentes. Adicionei htmlFor/id nos campos do formulario -- ganho real de acessibilidade que aproveitei pra corrigir enquanto construia a tela (o padrao .field usado no resto do app so tinha label/input como irmaos, sem associacao).

Verificacao: 201 testes de backend (11 novos), 136 de frontend (5 novos), tsc/lint/build/build-storybook OK, walkthrough manual completo contra o banco de dev real (troca de assunto reports/achados, todas as quebras, os 4 tipos de grafico, e persistencia via localStorage confirmada com reload de pagina).

Implementa o item 11 do roadmap: construtor de analytics customizado -- o usuario escolhe assunto/metrica/quebra/filtros em vez de um grafico fixo. Escopo confirmado com o usuario: assuntos Report e Issue (reaproveita `apply_report_filters` ja existente), graficos deliberadamente efemeros (nada persiste no backend -- so a ultima configuracao fica no localStorage do navegador, decisao explicita do usuario). `GET /api/analytics/custom` (novo, em `modules/reporting/` -- mesmo modulo que ja tem `/api/metrics`): `subject` (report|issue), `metric` (count, e avg_score so pra report), `breakdown` e os mesmos filtros que `/api/reports`/`/api/issues` ja aceitam. Decisao de design: category/severidade so valem como QUEBRA pro assunto Issue (campo proprio, sem ambiguidade) -- pro assunto Report, category/severidade continuam valendo como FILTRO (atravessa pra Issue, comportamento ja existente do ReportList), mas nao como quebra, porque um report com achados de categorias diferentes tornaria a contagem por report vs. por achado ambigua. Frontend: nova pagina `/analytics-customizado`, reaproveitando recharts/vocabularios (CATEGORIES/SEVERITIES/STATUSES/etc.) ja existentes. Adicionei `htmlFor`/`id` nos campos do formulario -- ganho real de acessibilidade que aproveitei pra corrigir enquanto construia a tela (o padrao `.field` usado no resto do app so tinha label/input como irmaos, sem associacao). Verificacao: 201 testes de backend (11 novos), 136 de frontend (5 novos), tsc/lint/build/build-storybook OK, walkthrough manual completo contra o banco de dev real (troca de assunto reports/achados, todas as quebras, os 4 tipos de grafico, e persistencia via localStorage confirmada com reload de pagina).
feat: item 11 do roadmap -- construtor de analytics customizado
All checks were successful
EEG QA CI / Frontend (pull_request) Successful in 2m6s
EEG QA CI / Deploy production (pull_request) Has been skipped
EEG QA CI / Detectar o que mudou (pull_request) Successful in 8s
EEG QA CI / Backend (pull_request) Successful in 1m32s
EEG QA CI / Build e publicação de imagens (pull_request) Successful in 1m25s
EEG QA CI / Deploy development (pull_request) Has been skipped
55df2beed1
GET /api/analytics/custom deixa o usuario escolher assunto (Report ou
Achado), metrica (contagem, e nota media so pra Report), quebra
(status/fabricante/build/tipo/ambiente/tag/mes pra Report; status/
categoria/severidade/tag/mes pra Achado) e os mesmos filtros que as
listagens ja usam -- em vez de um grafico fixo pre-definido.

Decisoes de escopo confirmadas com o usuario: so Report+Achado por ora
(reaproveita apply_report_filters ja existente); category/severidade
so valem como quebra de Achado, nunca de Report (um report pode ter
achados de categorias diferentes, quebra por report ficaria ambigua --
seguem valendo como FILTRO de Report, comportamento ja existente);
graficos sao efemeros, nada persiste no backend -- a ultima
configuracao escolhida fica so no localStorage do navegador.

Nova pagina /analytics-customizado, reaproveita recharts/CATEGORIES/
SEVERITIES/STATUSES ja existentes. Adiciona htmlFor/id nos campos do
formulario (ganho real de acessibilidade, gap pre-existente no padrao
`.field` usado no resto do app).
Merge remote-tracking branch 'origin/develop' into feature/custom-analytics-builder
Some checks failed
EEG QA CI / Detectar o que mudou (pull_request) Successful in 10s
EEG QA CI / Backend (pull_request) Successful in 1m29s
EEG QA CI / Frontend (pull_request) Successful in 3m4s
EEG QA CI / Build e publicação de imagens (pull_request) Failing after 14m27s
EEG QA CI / Deploy production (pull_request) Has been cancelled
EEG QA CI / Deploy development (pull_request) Has been cancelled
5bb61a33cb
# Conflicts:
#	frontend/src/test/setup.ts
#	frontend/src/types/models.ts
ci: re-trigger apos reinicio do runner (job anterior morreu no restart)
All checks were successful
EEG QA CI / Detectar o que mudou (pull_request) Successful in 6s
EEG QA CI / Backend (pull_request) Successful in 1m34s
EEG QA CI / Frontend (pull_request) Successful in 3m32s
EEG QA CI / Build e publicação de imagens (pull_request) Successful in 1m19s
EEG QA CI / Deploy development (pull_request) Has been skipped
EEG QA CI / Deploy production (pull_request) Has been skipped
73249aae03
jhony75 merged commit 17037e5462 into develop 2026-09-10 21:08:35 -03:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
jhony75/eeg-qa!62
No description provided.