Changelog

v5.10.0.23

Formato: vX.Y.Z.WX = Novo Modulo, Y = Feature, Z = Melhoria, W = Correcao

v5.9.10.4
2026-04-29 — Book: banner de progresso real do paged.js (sem timer arbitrário) atual
Correção (W)
Hook `PagedConfig.after(flow)` — disparado quando fragmentação termina de verdade
Banner fica VERDE com ✓ e mostra total de páginas geradas
Auto-remove após 6s
Hook `PagedConfig.afterPageLayout` — atualiza progresso página a página
Spinner girando no banner pra indicar atividade
v5.10.0.23
2026-05-03 — Dashboard de Avaliações: capacidade total + filtros consistentes
Correção (W) — Charts mostravam só "top talents"
`[:500]` removido — view processa TODAS avaliações (~2k registros, fast em Python)
`[:60]` removido — `for r in rankings:` itera sobre TODOS colaboradores avaliados
Visual: opacidade compensa saturação
`lineStyle.opacity: 0.18` em cada linha (era 0.55-0.6)
Hover destaca: `width: 4, opacity: 1, focus: 'series'`
Nine-box: removido label permanente ao lado da bolinha (com 432 nomes ficaria poluído). Tooltip on hover continua
Feature (Y) — Filtros consistentes com /avaliar/
Busca por nome/função
Select Função (todas funções dos avaliados)
Select Área (cascata para Subárea)
Select Subárea
Botão limpar filtros
Contador "X de Y colaboradores"
v5.10.0.22
2026-05-03 — Grupos granulares: Gantt de Recursos + Comissionamento (8 novos)
Feature (Y)
Gantt de Recursos (2 grupos)
**"Gantt de Recursos — Visualização"** — `view_gantt_recursos` + `view_projeto` + `view_tarefa` + `view_recursoprojeto`
**"Gantt de Recursos — Operação"** — Visualização + `add_recursoprojeto` + `change_recursoprojeto` + `delete_recursoprojeto` + `gerenciar_equipe`
Comissionamento (6 grupos por papel)
**"Comissionamento — Visualização"** — só leitura
**"Comissionamento — Operação (Executor)"** — view + `executar_teste` + `criar_punch` + `resolver_punch` (técnico de campo)
**"Comissionamento — QC (Testemunha)"** — view + `testemunhar_teste` + `criar_punch` (inspetor)
**"Comissionamento — QA (Aprovador)"** — view + `aprovar_teste` + `emitir_certificado` + `criar_punch` (engenheiro QA)
**"Comissionamento — Engenharia (Templates/Sistemas)"** — view + `manage_sistema` + `editar_protocolo`
**"Comissionamento — Admin Total"** — todas as 9 permissões
Procfile: bootstrap_groups roda em cada deploy
Como usar
v5.10.0.21
2026-05-02 — PDF Servidor: remove overlay "Pronto!" antes de capturar PDF
Correção (W) URGENTE
v5.10.0.20
2026-05-02 — Top Críticas: SEM LIMITE quando marcadas manualmente
Correções (W)
`collector.py`: query de marcadas SEM `[:15]` — todas vão pro book. Auto-rank só ativa se NÃO há marcadas.
`_renderTopCriticas`: separa marcadas vs auto-rankeadas. Mostra TODAS marcadas (sem cap). Fallback de 5 só quando sem marcadas.
User tem controle total: marca quantas quiser, todas aparecem.
v5.10.0.19
2026-05-02 — Fix urgente: PATCH tarefa invalida cache do book
Correção (W) URGENTE
Itera pelos masters que contêm `tarefa.projeto` e deleta `ai_book:master_dados:<master_id>`
Também limpa caches de projeto: `proj_<pk>_eap`, `_kpis`, `_curva`, `_spi`, `_aderencia`, `_critico`, `_backlog`
v5.10.0.18
2026-05-02 — Top Críticas curado: contexto + seleção manual + cache fresh
Feature (Y) — Seleção manual de "Top Atividades Críticas" no EAP
Novo campo `Tarefa.incluir_top_critica` (BooleanField) + migration `0050`
Botão **estrela ⭐** em cada linha do EAP (cor amber se marcada, cinza se não). Click toggle via PATCH `/api/projetos/<pk>/eap/<tarefa_id>/` com `incluir_top_critica`.
Collector prioriza tarefas com `incluir_top_critica=True` no Top 15. Se vazio, fallback pro ranking automático antigo.
Feature (Y) — Contexto do pai nas atividades críticas
`TarefaData` agora inclui `parent_nome` (nome do resumo pai)
`_renderTopCriticas` mostra "**Picador 04** → Desmontar" em vez de só "Desmontar"
Correção (W) — Book sempre busca dados FRESH
Padronização adicional
`_renderTopCriticas` agora usa `toFixed(2)` (era `toFixed(1)`) — alinhado com v5.10.0.17
Pendente
(próxima sessão) Migration auto-aplicada via Heroku release command (já está no Procfile)
v5.10.0.17
2026-05-02 — Padronização: 2 casas decimais em TODOS displays de %
Correção (W) — fim das inconsistências entre views
`projetos/templates/projetos/lista.html`: `floatformat:0` e `:1` → `:2` (mini-pct + cards expandidos + JS toFixed)
`master/templates/master/home.html`: JS `toFixed(1)` → `toFixed(2)` em prev/real/desvio
`master/templates/master/dashboard.html`: tabela projetos `toFixed(1)` → `toFixed(2)` em prev/real/desvio/aderência
`projetos/templates/projetos/batch_avanco.html`: `floatformat:1` → `:2` em pct atual/novo/delta
Fix 3 — Tooltips KPI cards do Master Dashboard
v5.10.0.16
2026-05-02 — PDF Servidor REFATORADO: usa MESMO HTML do client (sem standalone)
Refatoração arquitetural CRÍTICA (Y)
Removido (deprecated)
`book_master_pdf_standalone.html` — não é mais usado (mantido em disco mas inerte)
Logic de `pdf_input_<task_id>` cache key (substituída por `pdf_snapshot_<sessionId>`)
footerTemplate inline no script Node (paged.js running-footer já cobre)
BOOK_LOGO_B64 env var (logo já inline no template original)
Resultado
✅ Bootstrap CSS + Bootstrap Icons via CDN (mesmas fontes/ícones)
✅ Roboto via Google Fonts CDN
✅ paged.js fragmenta com running-footer (logo + texto + Página X de N)
✅ Emojis renderizados nativamente (Chrome carrega CDN durante render)
✅ Sem regex de remoção emoji (não é mais necessário)
✅ Sem standalone template pra manter sincronizado
✅ Qualquer feature visual nova aparece no PDF automaticamente
v5.10.0.15
2026-04-29 — Portal /avaliar/: fix comment multi-line vazando
Correção (W) URGENTE
v5.10.0.14
2026-04-29 — Portal /avaliar/: botão "Reavaliar" pra quem já avaliou
Melhoria (Z)
View `portal_avaliar`: percorre `AvaliacaoColaboradorProjeto`, identifica IDs onde `avaliador_id == request.user.id`, monta `ja_avaliei_set`. Cada colaborador no contexto recebe flag `ja_avaliei`.
Template `portal_avaliar.html`: se `c.ja_avaliei`, botão vira **azul "Reavaliar"** com ícone `pencil-square`. Senão, fica amarelo "Avaliar" tradicional.
Pendente (próximo deploy)
v5.10.0.13
2026-04-29 — PDF: regex Unicode property + walker robusto pra hr
Correções (W)
Próximo passo (proposto)
v5.10.0.12
2026-04-29 — PDF: regex emoji corrigido (cobre TODOS Unicode emojis)
Correção (W) URGENTE — análise raiz do bug emoji
🟢 (U+1F7E2) = `🟢` — trail surrogate **\uDFE2 NÃO** estava no range
🟫 (U+1F7EB) = `🟫` — idem
🟠 (U+1F7E0) = `🟠` — idem
`[\uD83C-\uD83E][\uDC00-\uDFFF]` → todos high+low surrogate pairs em U+1F000-U+1FFFF (cobre TODAS colored circles, squares, arrows, etc)
`[☀-➿]` → BMP Misc Symbols + Dingbats
`[⬀-⯿]` → Misc Symbols and Arrows
`[️‍]` → variation selector + ZWJ (pra emojis compostos)
Bonus
Logo PDF height 36 → 48px (mais visível)
margin.bottom 28 → 30mm (espaço pra logo maior)
Console.log diagnóstico no preprocessor (`[pdf preprocess] emoji removed: X chars from Y nodes`)
Underscores convertidos em `<hr>` agora pega TODO `[contenteditable="true"]` (não só `.user-html`)
v5.10.0.11
2026-04-29 — PDF: remove emoji bullets + converte underscores em hr
Correções (W)
TreeWalker remove caracteres emoji bullets (🔴🟠🟡🟢🔵🟣🟤⚫⚪🔘🟥🟧🟨🟩🟦🟪🟫⬛⬜) de todos textNodes
Limpa whitespace duplicado que sobra após remover emoji
Em `.user-html`, regex `/_{4,}/g` substitui sequências longas de underscores por `<hr>` (com styling explícito do partial CSS — linha fina #e5e7eb)
v5.10.0.10
2026-04-29 — PDF Servidor: Bootstrap Icons + Bootstrap CSS + hr styling
Análise profunda HTML vs PDF (em modo planejamento)
Correções (W) — P0 (crítico)
Correções (W) — P1 (polimento)
P2/P3 deferred (próximo deploy se necessário)
Tabelas com `<thead>` (header repete em quebras)
Symbol fonts adicionais (≥ ≤ → ↑ ↓)
Selector ECharts ampliado (charts dinâmicos)
v5.10.0.9
2026-04-29 — PDF Servidor: lote de fixes (comments + logo + fontes + emojis + cards + Roboto via CDN)
Correções (W)
`-webkit-font-smoothing: antialiased` em `*`
`font-feature-settings: 'kern' 1, 'liga' 1`
KPI val `font-weight: 700 → 600` + `letter-spacing: -0.5px`
Border-radius cards 6 → 8px (mais suave)
v5.10.0.8
2026-04-29 — PDF Servidor Passo 2: Puppeteer-core (logo no rodapé + qualidade pro)
Feature crítica (Y) — Migração Chrome subprocess → Puppeteer-core via Node.js
❌ Antes: `chrome --print-to-pdf` CLI não expõe CDP, rodapé só com `counter()`/`string` — sem logo
❌ Antes: subprocess Chrome aplica downsampling, qualidade visual inferior
✅ Agora: Puppeteer expõe `page.pdf({ headerTemplate, footerTemplate })` com HTML inline + `<img>`
✅ Agora: `deviceScaleFactor: 2` → DPI alto, render nítido
✅ Agora: `printBackground: true` → cores garantidas
✅ Agora: `waitUntil: 'networkidle0'` + `document.fonts.ready` → fontes carregadas
Arquivos novos
**`bin/generate_pdf_book.js`** — script Node (~80 linhas) que:
Recebe `<input_html> <output_pdf>` via argv
Lê `BOOK_LOGO_B64` do env
Lança Chrome via `puppeteer-core` no `GOOGLE_CHROME_BIN` (heroku-buildpack-chrome-for-testing)
Configura footer template HTML com texto + numeração + `<img>` da logo
`page.pdf({ format: 'A4', margin, displayHeaderFooter, footerTemplate })`
Arquivos modificados
**`ai_book/tasks.py`**: `gerar_pdf_servidor_task` substitui `cmd = [chrome_bin, ...]` por `cmd = ['node', script_path, html_path, pdf_path]` com `env['BOOK_LOGO_B64']` e `script_path = settings.BASE_DIR / 'bin' / 'generate_pdf_book.js'`. Mensagem de erro inclui stdout/stderr pra debug.
**`book_master_pdf_standalone.html`**: removidas `@page @bottom-*` rules e `@page :first` — Puppeteer's `footerTemplate` substitui essas zonas via CDP, conflito se ambos definidos. Mantido só `@page { size: A4; margin: ... }` básico.
**`package.json`** (já em v675): `puppeteer-core: ^21.11.0`
Footer no PDF (via Puppeteer footerTemplate)
**Esquerda:** texto institucional D.Solutions Hub
**Centro:** Página X / Y (pageNumber/totalPages auto via Chrome CDP)
**Direita:** logo D.Solutions inline base64 (height: 14px, controlado)
Trade-off aceito
v5.10.0.7
2026-04-29 — Book: PDF Servidor reusa CSS COMPLETO da tela (espelho real)
Refatoração CRÍTICA — fim da divergência tela vs PDF
Extraído `<style>` block do `book_master.html` pra novo partial **`_book_master_styles.html`** (todo CSS — 300+ linhas)
`book_master_pdf_standalone.html` agora `{% include %}` o partial
Standalone só adiciona overrides ESPECÍFICOS pra modo PDF servidor:
`@page` rules com texto + numeração no rodapé
Force Roboto/Liberation (Linux Heroku)
Esconde elementos de UI/edição
`print-color-adjust: exact` em `*` (força cores)
Aptfile: + fonts-noto-color-emoji
v5.10.0.6
2026-04-29 — Book: fontes instaladas via Aptfile (sem Google CDN)
Melhoria (Z)
Adicionado `heroku-buildpack-apt` na posição 1 dos buildpacks
`Aptfile` instala fontes nativas Linux:
`fonts-liberation` (clones de Helvetica/Arial/Times)
`fonts-roboto` (Google Roboto)
`fonts-noto-core` (Noto Sans — UTF-8 amplo, português perfeito)
`fonts-dejavu-core` (fallback Linux default)
Template standalone agora usa stack `'Roboto', 'Liberation Sans', 'Noto Sans', 'DejaVu Sans'` direto, sem `<link>` pra Google Fonts
Render mais rápido + sem dep de rede
v5.10.0.5
2026-04-29 — Book: PDF Servidor — fonte Roboto + logo via url() no rodapé
Correções (W)
v5.10.0.4
2026-04-29 — Book: PDF Servidor — fix race condition cache HTML
Correção (W) URGENTE
v5.10.0.3
2026-04-29 — Book: curvas idênticas ao master/EAP + rodapé PDF em 1 linha
Correções (W)
Previsto: `smooth: true`, `width: 2`
Realizado verde: `smooth: false`, `width: 2.5`
Realizado vermelho: `smooth: false`, `width: 2.5`
Texto encurtado: "D.Solutions Hub · Book Final de Parada"
Numeração: "Página X / Y" (em vez de "Página X de Y")
`font-size: 7-8pt` (era 8-9pt)
`white-space: nowrap` em todas as 3 zonas
Margin bottom: 26mm → 22mm
v5.10.0.2
2026-04-29 — Book: PDF Servidor — fix TypeError no status (kwarg master_id)
Correção (W) URGENTE
v5.10.0.1
2026-04-29 — Book: PDF Servidor — fix HTTP 400 (DATA_UPLOAD_MAX 2.5MB→100MB)
Correção (W)
`settings.py`: `DATA_UPLOAD_MAX_MEMORY_SIZE = 100 * 1024 * 1024` (100MB)
`FILE_UPLOAD_MAX_MEMORY_SIZE = 100 * 1024 * 1024` (idem)
`DATA_UPLOAD_MAX_NUMBER_FIELDS = 5000` (default 1000)
Cliente: melhorada mensagem de erro pra mostrar corpo da resposta real (json/text), facilitando debug
v5.10.0.0
2026-04-29 — Book: PDF Servidor (Chrome headless server-side)
Feature CRÍTICA (Y) — geração server-side de PDF
**Sem limite de tamanho** — books de 500+ páginas funcionam
**Browser-agnóstico** — usuário Firefox/Safari/iPad recebe o mesmo PDF de qualidade que Chrome
**Memória dedicada** do servidor (não compete com tabs do usuário)
**Padrão profissional** de relatórios corporativos
`POST /book/master/<id>/pdf-servidor/enqueue/` recebe snapshot HTML, salva no Redis cache (key `pdf_input_<task_id>`), enfileira `gerar_pdf_servidor_task`
Worker Celery lê HTML, renderiza template `book_master_pdf_standalone.html`, salva temp file, chama Chrome subprocess (`--print-to-pdf` com `--virtual-time-budget=180000`), salva PDF binário em Redis (key `pdf_output_<task_id>`)
`GET /book/master/<id>/pdf-servidor/status/<task_id>/` polling a cada 2s no client (estados: pending → started → success/failure)
`GET /book/master/<id>/pdf-servidor/download/<task_id>/` stream do PDF, deleta do Redis após
TTL de 10min em ambas keys do Redis
Arquivos novos
`ai_book/tasks.py` — `gerar_pdf_servidor_task` (Celery, time_limit 5min)
`ai_book/views.py` — `pdf_servidor_enqueue` / `pdf_servidor_status` / `pdf_servidor_download`
`ai_book/urls.py` — 3 routes novas
`ai_book/templates/ai_book/book_master_pdf_standalone.html` — template servidor (sem JS, só CSS @page + body com snapshot)
`ai_book/templates/ai_book/book_master.html` — novo botão "PDF Servidor" + função `gerarPDFServidor()` (~110 linhas JS)
Versão promovida (X.Y → 5.10)
v5.9.10.14
2026-04-29 — Book: fragmentação correta de Pontos de Atenção em múltiplas páginas
Correção (W)
`.book-page { break-inside: auto !important; page-break-inside: auto !important }` — permite fragmentação interna do contêiner principal
`.ia-bloco { break-inside: auto !important }` + `.ia-bloco ul { break-inside: auto !important }` — permite fragmentação entre itens
`.ponto-item { break-inside: avoid !important }` + `.ia-bloco li { break-inside: avoid !important }` — item individual NÃO quebra no meio (mantém integridade visual)
v5.9.10.13
2026-04-29 — Book: filtro de páginas vazias conservador + indicador visual de quebra
Correções (W)
Margin entre páginas aumentado: 18px → 32px
Sombra reforçada: `0 4px 14px rgba(13, 43, 69, .12)` (azul institucional, mais profunda)
**NOVO:** indicador "— quebra de página —" aparece centralizado na lacuna entre cada folha (pseudo-element `::before` em `.book-page + .book-page` e `.page-break-hard + .book-page`)
Indicador escondido em `@media print` (não aparece no PDF)
v5.9.10.12
2026-04-29 — Book: snapshot via IndexedDB + numeração de página no preview HTML
CRÍTICO — bug que cortava books grandes (>5MB)
Snapshot migrado pra **IndexedDB** (helpers `_idbPut` / `_idbGetAndDelete`)
Limite efetivo: ~50% do disco disponível (gigabytes), sem cortes silenciosos
`localStorage` mantido como fallback pra browsers sem IDB
`abrirVistaPDF` agora é `async` — aguarda IDB write antes de abrir nova aba
Bootstrap da nova aba reestruturado em `_bootstrap()` async — aguarda leitura do IDB antes de decidir entre snapshot ou AJAX (corrige race condition)
`_iniciarFluxoAJAX()` extraído como função reutilizável
Feature (Y) — Numeração de página no HTML preview da tela
`_injetarRodapes()` agora cria 3 colunas no `.page-footer-screen`:
**Esquerda:** texto institucional D.Solutions
**Centro (NOVO):** "Página X de N" — capa fica vazia, numeração começa em 1 na 2ª folha
**Direita:** logo
CSS `.pf-num`: `flex: 0 0 auto; min-width: 90px; text-align: center; color: #6b7280`
Idêntico ao formato do rodapé do PDF — consistência visual screen ↔ print
v5.9.10.11
2026-04-29 — Book: lições aprendidas formato uniforme (sem "Tema:" antes do título)
Correção (W)
Adicionada regra explícita: "NUNCA escreva a palavra 'Tema' antes do título. Escreva DIRETAMENTE o nome do tema em negrito."
Inclui EXEMPLO CORRETO e EXEMPLO ERRADO no prompt pra IA não confundir
Resultado: novas gerações IA produzem `<b>Andaimes como gargalo</b>: ...`
Pra lições JÁ geradas (cacheadas) com formato antigo, JS limpa antes do paged.js fragmentar:
`<b>Tema</b>: NomeReal: descrição` → `<b>NomeReal</b>: descrição`
`<strong>Tema</strong>: NomeReal: descrição` → `<strong>NomeReal</strong>: descrição`
Texto puro `Tema: ` no início → removido
Aplicado em ambos fluxos (snapshot + AJAX)
v5.9.10.10
2026-04-29 — Book: visual consistente IA + remove páginas vazias
Correções (W)
v5.9.10.9
2026-04-29 — Book: snapshot preserva edits + IA + lições aprendidas no PDF
CRÍTICO — bug que perdia trabalho do usuário
Edições manuais em campos `[contenteditable="true"]` (textos, títulos, legendas)
Consolidações com IA dos pontos de atenção (geradas via Celery worker)
Lições aprendidas geradas com IA
Linhas de tabela apagadas (botão × por linha)
`abrirVistaPDF()` clona profundamente o `#book-root` da aba atual
Captura PNG de cada chart ECharts (canvas não sobrevive serialização HTML) e substitui no clone
Salva `{html, ts}` em `localStorage` com chave `pdf_snapshot_${MASTER_ID}`
Aba original NÃO é mutada (charts continuam editáveis)
Nova aba detecta snapshot, restaura `book-root.innerHTML`, **pula o AJAX e o renderBook**, vai direto pro paged.js
Snapshot consumido (deleted após leitura) pra evitar reuso acidental
Stale check: snapshot >10min é descartado
Fallback elegante se localStorage QuotaExceededError (book muito grande): confirm dialog avisando que conteúdo será refeito do servidor
CSS @media print — esconde casca de UI dos blocos IA
v5.9.10.8
2026-04-29 — Book: numeração de página no rodapé central (pula capa)
Feature (Y)
**Esquerda:** texto institucional ("D.Solutions Hub — Book Final de Parada · Gestão física: Andritz")
**Centro:** "Página X de N" — começa em "1" na segunda folha (capa fica sem numeração, padrão profissional de relatório)
**Direita:** logo D.Solutions
v5.9.10.7
2026-04-29 — Book: remove page-break-hard em modo paged.js (era página em branco)
Correção (W)
v5.9.10.6
2026-04-29 — Book: overlay elegante imediato + captura síncrona instantânea
CRÍTICO — bug do paged.js carregado 2x
Performance — captura síncrona (era 17 charts × 1500ms timeout)
Patch `echarts.init` em modo paginar=1 → injeta `animation: false` em todo `setOption`. Charts vão pro estado final IMEDIATO (sem animação de 1000ms).
Removido `Promise.all([...].map(_captureChart))` com `setTimeout(1500)` por chart
Substituído por loop síncrono simples: `chartList.forEach(div => getDataURL(...))`
Captura inteira de 17 charts agora demora ~200ms (era 1500ms+)
UX — overlay elegante mostrado IMEDIATAMENTE ao abrir aba
Script síncrono no topo do `<body>` detecta `?paginar=1` antes do AJAX
Adiciona `html.paginar-mode` que esconde topbar + book-root via CSS
Mostra `#pdf-overlay` (card branco centralizado, borda fina, sombra suave, padrão D.Solutions)
Status atualiza em tempo real: "Buscando dados..." → "Renderizando..." → "Capturando gráficos..." → "Paginando... página X" → "Pronto! N páginas geradas"
Visual igual ao gerar PDF do master (card profissional ao invés de overlay translúcido)
v5.9.10.5
2026-04-29 — Book: ECharts captura aguarda 'finished' + Curva S Geral no Resumo
Correção (W) — Charts em PDF estavam tortos (barras tiny, curvas mínimas)
Helper `_captureChart(div)` retorna Promise que escuta evento `inst.on('finished', ...)` do ECharts (dispara quando todas animações + renders terminam)
Fallback `setTimeout(1500)` caso 'finished' não dispare (chart já estava completo)
`Promise.all([..._chartDivs].map(_captureChart))` aguarda TODOS antes de carregar paged.js
Status overlay atualiza: "Convertendo X gráficos..." → "Carregando paged.js..." → "Pronto!"
Feature (Y) — Curva S Geral (Master) no Resumo Gerencial
v5.9.10.4
2026-04-29 — Book: ECharts→PNG, rodapé injetado em cada A4, spinner central
Correções (W) — 3 bugs ligados na vista paged.js
Removido
Banner amarelo no topo (substituído por overlay central)
v5.9.10.3
2026-04-29 — Book: paged.js carregado tardio + page-break com cinto-e-suspensórios
Correções (W) — 2 bugs ligados
Adicionado `break-after: page !important` (sintaxe moderna) + `page-break-after: always !important` (legacy) com `!important` no `@media print`
`display: block !important` no print pra anular o flex residual que confundia Chrome
Cinto-e-suspensórios: `<div class="page-break-hard"></div>` injetado por JS entre cada `.book-page` (exceto último). Funciona como fallback explícito caso CSS de break ainda seja ignorado em algum elemento
Removido `<script paged.polyfill>` fixo do `<head>`
Carregamento DINÂMICO dentro do `.then(renderBook)`, **depois** que conteúdo + rodapés foram injetados
2× `requestAnimationFrame` antes pra garantir que ECharts/imagens pintaram
Banner amarelo "Paginando para PDF... aguarde" enquanto fragmenta (~1-3s)
paged.js carregado tardiamente em document já completo → fragmenta o book inteiro corretamente
Removido
`paginar` no contexto Django (agora lido via `URLSearchParams` direto no JS)
v5.9.10.2
2026-04-29 — Book: paged.js só ativa em vista PDF (tela volta normal)
Correção (W)
paged.js agora carrega APENAS quando URL contém `?paginar=1`
Botão "Imprimir / PDF" abre **nova aba** com `?paginar=1` — paged.js fragmenta SÓ ali
Aba original continua editável e centralizada como antes
Tela normal (sem `?paginar=1`): zero overhead, sem fragmentação, sem regressão visual
v5.9.10.1
2026-04-29 — Book: paged.js para PDF profissional (CSS Paged Media)
Refatoração crítica (Y)
`position: fixed` em `@media print` não repete confiavelmente em cada folha
`@page @bottom-right` aceita texto/counter mas NÃO `<img>` em Chrome nativo
Elementos podem ser cortados no meio sem `break-inside: avoid`
`@page` rule com `margin: 18mm 18mm 28mm 18mm` (folha A4 padrão)
`@bottom-right { content: element(running-footer) }` (rodapé na borda inferior direita)
`.running-footer` no DOM com `position: running(running-footer)` — paged.js move o elemento pro `@bottom-right` de cada folha
Suporta `<img>` no rodapé (Chrome nativo não)
Fragmenta DOM respeitando `break-inside: avoid`, sem cortar gráficos/tabelas
Mantidos da v5.9.10.0
`.page-footer-screen` na tela como preview visual em cada `.book-page`
Sombra+gap entre `.book-page` na tela (preview de folhas)
v5.9.10.0
2026-04-29 — Book: 2 rodapés (tela vs PDF) — solução profissional planejada
Diagnóstico real
HTML é **conteúdo fluído** — não há jeito CSS puro de "limitar até onde escrever" sem cortar conteúdo
`position: absolute` no rodapé é fixo na altura calculada, mas conteúdo passa por cima quando excede
Bibliotecas profissionais (paged.js, Prince) implementam CSS Paged Media via fragmentação de DOM. Pesado pra esse caso
Solução adotada (padrão da indústria)
`margin-top: auto` em flexbox column da `.book-page`
Empurra pro fim de cada seção, em fluxo normal
**Jamais sobrepõe** conteúdo — não é position absolute
Serve como preview do que vai sair no PDF
`position: fixed; bottom: 8mm` — fixed elements em `@media print` são RE-RENDERIZADOS pelo browser em CADA folha física automaticamente (comportamento documentado/padrão)
1 elemento DOM, repete em todas as folhas do PDF
`@page { margin-bottom: 30mm }` reserva área da folha pra esse rodapé
Conteúdo flui livremente, browser pagina automaticamente respeitando as margens
Resultado
**Tela**: cada `.book-page` mostra rodapé no fim do conteúdo, sem sobreposição
**PDF**: cada folha A4 tem o rodapé fixo na borda inferior; conteúdo é paginado pelo browser respeitando `@page margin`. Sem cálculo manual de altura, sem fragmentação, sem cortar elementos no meio
v5.9.9.8
2026-04-29 — Book: rodapé como flexbox na tela (não sobrepõe + segue conteúdo)
Correção (W) crítica
`.page-footer` estava com `position: absolute; bottom: 10mm` na tela
Quando uma `.book-page` tinha conteúdo > min-height (297mm), a box crescia mas o rodapé absolute ficava SOLTO no fim da box, e texto extra fluía POR CIMA dele
**Tela**: `.book-page` vira `display: flex; flex-direction: column`. `.page-footer` usa `margin-top: auto` (flexbox empurra ele pro fim). Como é elemento de fluxo normal, NUNCA sobrepõe. Conteúdo termina, rodapé desce, borda inferior fica em sequência
**Print**: `.page-footer` volta a ser `position: absolute; bottom: 15mm` (1,5cm da borda da folha A4 — padrão de relatório). `.book-page` desfaz o flex (`display: block`)
Resultado
**Tela**: rodapé sempre visível no fim de cada `.book-page`, jamais sobreposto. Mantém preview de quebras (sombra+margin)
**PDF**: rodapé fixo na borda inferior da folha A4, com 45mm de zona de exclusão pra conteúdo não invadir
v5.9.9.7
2026-04-29 — Book: zona de exclusão do rodapé (texto não invade mais)
Correção (W)
**Texto cortado pelo rodapé no PDF** — `padding-bottom` da `.book-page` no print era 30mm, mas o rodapé ocupa de bottom:15mm até bottom:31mm (height:16mm). Conteúdo terminava em 30mm da borda → encavalava o rodapé visualmente
**Fix**: `padding-bottom: 45mm` reserva **zona de exclusão de 45mm** na parte inferior da folha. Rodapé ocupa 15-31mm; conteúdo termina em 45mm; resta **14mm de respiro visual** entre o último texto e a linha do rodapé
v5.9.9.6
2026-04-29 — Book: rodapé do PDF a 1,5cm da borda da folha (padrão relatório)
Correção (W) crítica
`.book-page` no print tinha `min-height: 247mm` (área útil A4 com margens)
Mas `.page-footer` tem `position: absolute; bottom: 10mm` — relativo à `.book-page`, não à folha física
O `@page margin: 10mm 10mm 22mm` adicionava 22mm de margem inferior NA FOLHA, encima dos 10mm relativos à página → rodapé ficava a uns 32-50mm da borda real
`@page margin: 0` (sem margem do nível da página)
`.book-page` usa `width: 210mm; height: 297mm; box-sizing: border-box` (folha A4 exata)
`.page-footer` no print: `bottom: 15mm` = exatos **1,5cm da borda inferior da folha A4** (padrão profissional de relatório)
`padding: 18mm 18mm 30mm` reserva margem interna pra conteúdo + espaço pro rodapé
v5.9.9.5
2026-04-29 — Book: Lições do book inteiro (6 pts) + rodapé fixo no PDF + preview de quebras
Correção (W) crítica
**Rodapé indo pro meio da página no PDF**: causa raiz era `min-height: auto` no `@media print` da `.book-page` — a página encolhia até o conteúdo, e o rodapé `position: absolute; bottom: 10mm` ficava relativo a uma página curta (parecia estar no meio). Agora usa `min-height: 247mm` (área útil A4 com margens), forçando a folha inteira mesmo com pouco conteúdo. Rodapé fica corretamente no fim da página
Melhoria (Z)
**Lições Aprendidas reformulado** — prompt agora pede EXATAMENTE 6 lições do **book inteiro**, focando em padrões recorrentes que aparecem em múltiplos RDOs/áreas, não em incidentes isolados. Cada lição traz Tema + causa + recomendação acionável (pra servir de referência em paradas futuras)
**Pré-visualização de quebras de página na tela** — cada `.book-page` agora tem sombra suave (`box-shadow`) + `margin-bottom: 18px` + bordas arredondadas, simulando folhas separadas. Permite visualizar quebras antes de imprimir/exportar PDF. Tudo zerado no `@media print`
v5.9.9.4
2026-04-29 — Book: Curva S agregada vermelha quando atrasada + colunas redimensionáveis
Correção (W)
**Curva S Agregada por Área**: linha do realizado agora segmenta verde (≥ previsto) / vermelho (< previsto), mesma lógica usada na Curva S por projeto (`renderCurvaS`). Antes era só verde fixo, mascarando atrasos. A linha continua verde até cruzar abaixo do previsto, aí vira vermelha; volta a verde se recuperar
Aplicado em `_initResumoGerencialCharts` para a curva agregada por área
Melhoria (Z)
**Colunas redimensionáveis nas tabelas `.tbl-book`** — `resize: horizontal` no `<th>` permite arrastar o canto inferior-direito de cada cabeçalho pra ajustar largura quando o texto da célula é longo (Chrome/Edge/Firefox). Mantido oculto no print
v5.9.9.3
2026-04-29 — Book: KPI cards coloridos por faixa + Estrutura em árvore + Cores nos pontos consolidados
Melhoria (Z)
**KPI card de Avanço agora colorido por faixa** (era sempre verde, mascarava atrasos):
≥99,5% verde "Concluído"
80-99% amarelo "Em finalização"
<80% vermelho "Atrasado"
Aplicado no Panorama Executivo, Resumo Gerencial por Área, Sumário Executivo e Indicadores Consolidados Finais
**Estrutura do Trabalho em árvore** — indentação visual por nível do código EAP. Ex: `1` no topo, `1.1` indentado 18px, `2.5.1` indentado 36px, com conector `└` cinza. Nível 0 (raízes) em negrito navy, demais em texto comum
**Cores nos pontos consolidados pela IA**: prompt atualizado pra IA já formatar atrasos com `<span style="color:#dc3545">↓ 10,8h</span>` (vermelho ↓) e antecipações com `<span style="color:#16a34a">↑ 2h</span>` (verde ↑). Pós-processamento JS `_coloreDesvios()` reforça caso a IA não obedeça (regex pra padrões "atraso de Xh", "antecipação de Xh", "+X p.p.", "-X p.p.")
v5.9.9.2
2026-04-29 — Book: critério "Mais adiantado" robusto contra replanejamentos
Correção (W) crítica — validação com dados reais
v5.9.9.1
2026-04-29 — Book: REMOVE logo do topo da capa (fica só no rodapé direito)
Correção (W) — entendi finalmente o pedido
v5.9.9.0
2026-04-29 — Book: rodapé refeito do zero — DOM real injetado por JS
Refeito do zero (Y)
`<span class="pf-text">` (texto à esquerda)
`<img class="pf-logo">` com `src="data:image/png;base64,..."` (logo à direita)
Por que essa abordagem é robusta
Logo é um **elemento DOM real** (`<img>`), não pseudo-element. Browser RENDERIZA. Sem ambiguidade
`src="data:image/png;base64,..."` está literal no HTML — sem fetch, sem cache, sem async
Aplica-se em CADA `.book-page` (capa, ficha técnica, panorama, etc.) automaticamente
Funciona em tela, print, PDF export, Save-as-Image — tudo via mesma estrutura
v5.9.8.7
2026-04-29 — Book: logo do rodapé EMBEDADA EM BASE64 INLINE (solução definitiva)
Correção (W) — DEFINITIVA
`book_master_html` view agora lê `core/static/images/logo_diretiva_solutions_book.png` (12KB) e converte pra base64 ASCII (~16KB)
Passa a string `logo_b64` no contexto do template
Tanto o `.book-page::after` (CSS background na tela) quanto o `<img>` no `.print-footer` (PDF/print) usam `src="data:image/png;base64,{{ logo_b64 }}"`
A logo está LITERALMENTE dentro do HTML — não depende de fetch externo, cache, preload, async ou qualquer condição de rede
Funciona offline, em PDF gerado pelo navegador, em "Save as Image", em qualquer contexto
v5.9.8.6
2026-04-29 — Book: rodapé da TELA também usa logo 12KB + preload no <head>
Correção (W) crítica — diagnóstico final
Fiz `Invoke-WebRequest -Method Head` em produção pras 2 logos: ambas retornam 200 OK (`logo_diretiva_solutions_sem_fundo.png` 1.4MB e `logo_diretiva_solutions_book.png` 12KB). URL não é o problema
O CSS `.book-page::after` (rodapé na TELA, via background-image) ainda apontava pra **versão de 1.4MB**. O browser tarda muito pra baixar essa imagem grande, então em screenshots e prints a logo ainda não tinha aparecido
A v5.9.8.5 só tinha trocado o `.print-footer` pra usar a versão otimizada — esqueci do CSS da tela
`.book-page::after { background: url(logo_book.png) ... }` agora usa a versão de 12KB
Adicionado `<link rel="preload" as="image">` no `<head>` pra forçar o browser a baixar a logo logo no carregamento inicial, antes mesmo do CSS pedir
Adicionado `<link rel="icon">` (favicon) usando a mesma logo
v5.9.8.5
2026-04-29 — Book: logo otimizada (12KB) + verde só em área concluída (≥99.5%)
Correção (W) crítica
**Logo do rodapé otimizada** — versão antiga tinha 1.4MB (PNG sem fundo). Ao imprimir, o Chrome disparava `window.print()` ANTES da imagem terminar de baixar → logo invisível no PDF. Criada versão `logo_diretiva_solutions_book.png` (12KB, 180x180, otimizada via PIL). Agora a img carrega instantaneamente
**Threshold de cor das áreas corrigido**: verde só quando ≥99.5% (concluído). Pmad com 90.8% estava aparecendo VERDE (sugerindo "ok"), o que era enganoso. Agora 80-99.5% = amarelo "Em finalização", 50-79% = amarelo "Em andamento", <50% = vermelho "Atrasado", ≥99.5% = verde "Concluído"
v5.9.8.4
2026-04-29 — Book: logo no rodapé do print via <table> (4ª tentativa, método 100% confiável)
Correção (W) crítica
**Logo do rodapé impresso usando `<table>` em vez de `position: absolute` ou `background-image`**.
v5.9.7.2: `<img>` com flexbox — não renderizava no PDF
v5.9.8.0: `background-image` no `.print-footer` — depende de "Gráficos de fundo" do Chrome
v5.9.8.1: `<img>` com `position: absolute` dentro de `position: fixed` — não imprimia
**Solução final**: `<table>` de 1 linha com 2 células (texto à esquerda + logo à direita com `width="65"`). Tables são tratadas como conteúdo estrutural pelo browser e imprimem corretamente em todos os contextos (Chrome, Firefox, Edge, "Save as PDF", export Word). Removi `display: none` específico do `.pf-logo` que pode estar vencendo o `@media print`
v5.9.8.3
2026-04-29 — Book: fila visual de tasks IA + cliques simultâneos liberados
Feature (Y)
**Indicador de fila de IA no canto inferior-direito** — badge roxo fixo mostrando `🤖 N tasks de IA em processamento` com lista das primeiras 3 + tempo decorrido. Click no badge abre alert com detalhes de todas as tasks rolando
**Cliques simultâneos em consolidar/gerar lições** — agora é explícito que dá pra acionar várias IA em paralelo sem comprometer. Cada bloco (Pontos de atenção / Lições aprendidas) fica desabilitado individualmente enquanto sua task processa, mas outros blocos seguem clicáveis. O Celery worker (concurrency=2) processa 2 simultaneamente; o restante fica na fila do Redis automaticamente
Toast atualizado: `Consolidando em segundo plano · clique em outros blocos pra adicionar à fila`
v5.9.8.2
2026-04-29 — Book: fix "Gerar Lições com IA" (task background) + portal pré-seleção projeto
Correção (W) crítica
**"Gerar Lições com IA" voltava "Erro: desconhecido"** — quando movi a consolidação pra background na v5.9.8.0, atualizei só o `consolidarComIA`. A função `gerarLicoesIA` continuou esperando resposta síncrona `{ok, html, custo_usd}` mas o endpoint agora devolve `{ok, task_id, status: 'pending'}`. Refatorada pra usar o mesmo fluxo de polling: toast `💡 Gerando lições em segundo plano` + checagem a cada 4s + scroll suave até o card quando termina
Feature (Y)
**Portal `/avaliar/` agora pula o modal "Escolher Projeto" quando há 1 match óbvio com a designação** — ao clicar Avaliar:
Cruza áreas/subáreas designadas do colaborador (`DesignacaoColaborador`) com `Projeto.area/subarea`
**1 projeto compatível** → abre modal de avaliação direto, com aviso verde "Projeto pré-selecionado pela área designada" + botão "Trocar projeto" caso queira mudar
**Múltiplos compatíveis** → abre modal de escolher já filtrado, com link "Ver todos os projetos (X)" pra ampliar
**Nenhum compatível** → modal completo (comportamento antigo)
Reduz cliques drasticamente pro caso comum (avaliar profissional na área onde ele está designado)
v5.9.8.1
2026-04-29 — Book: critérios de destaque baseados em trajetória + setas/cores em desvios + logo via <img>
Correção (W) crítica
**"Mais avançado/atrasado" agora usa TRAJETÓRIA, não estado final** — antes ordenava por `pct_total` (que é quase sempre 100% por obrigação contratual), o que premiava projetos que SUFRIAM pra terminar mas eventualmente chegavam lá. Agora usa **média de (realizado − previsto) ao longo dos RDOs**:
Média positiva = consistentemente adiantado durante a execução
Média negativa = consistentemente atrasado
Aplica-se em **Top 3 Destaques** (Resumo Gerencial) e **Destaques da Operação** (Considerações Finais)
**Logo no rodapé impresso: voltei pra `<img>`** posicionado absolutamente (não mais `background-image`). Tags `<img>` são tratadas como conteúdo pelo browser e SEMPRE imprimem, independente da opção "Gráficos de fundo" do diálogo de print. CSS `position: absolute; top:3mm; right:0; width:65px`
Melhoria (Z)
**Setas + cores em desvios em todo o relatório** — ↑ verde / ↓ vermelho / ⚠ amarelo:
Considerações Finais > Distribuição: cada projeto agora aparece com cor da faixa (verde ≥99,5%, amarelo 80-99%, vermelho <80%)
Considerações Finais > Destaques: aderência baixa = ✓ verde, eficiência = ↑ verde, atraso = ↓ vermelho, antecipação = ↑ verde
Top 3 Destaques: badge de trajetória "+X p.p." verde ↑ ou "-X p.p." vermelho ↓
**Sem truncamento "..." nos projetos concluídos** — antes mostrava só os 6 primeiros + "...". Agora lista TODOS (transparência > brevidade)
Pendência registrada
Export para Word com qualidade visual abaixo do online — corrigir em rodada futura (manter mesmo padrão visual da tela)
v5.9.8.0
2026-04-29 — Book: Consolidar IA em background (Celery) + fix logo rodapé impresso
Feature (Y)
**"Consolidar com IA" agora roda em background no worker Celery** ([ai_book/tasks.py](ai_book/tasks.py)) — sem o limite de 30s do roteador HTTP do Heroku, voltamos pra `gpt-5.4` (qualidade > velocidade) com prompt rico e até 60 itens (cada um até 500 chars). Tempo típico: 20-60s, mas o usuário pode continuar editando o book enquanto processa
Endpoint POST `/book/consolidar-ia/` agora enfileira a task e devolve `{task_id, status: 'pending'}`
Novo endpoint GET `/book/consolidar-ia/status/<task_id>/` pra polling
JS faz polling a cada 4s, com timeout total de 5min
Toast `🤖 Consolidando em segundo plano · você pode continuar editando o book` aparece imediatamente
Quando finaliza: aplica HTML resultado, mostra `✅ Consolidação concluída · R$ X` e faz scroll suave até o bloco
Mensagens de erro úteis (sessão expirada, falha no worker, timeout do polling)
**`_showToast` agora aceita duração customizável** e suporta tipos `info/success/warning/danger`
Correção (W)
**Logo D.Solutions no rodapé direito do PDF/print/Word** — `<img>` tag não estava renderizando confiavelmente em PDF gerado pelo browser. Trocado pra `background-image` (mesmo padrão do `.book-page::after` que já funcionava na tela) + `print-color-adjust: exact !important` (força browser a renderizar imagens). Margem inferior do `@page` aumentada de 18mm → 22mm pra garantir que o footer não seja cortado
v5.9.7.3
2026-04-29 — Book: fix timeout do "Consolidar com IA" (Heroku 30s)
Correção (W)
**Bug "Erro de rede: Unexpected token '<'"** ao consolidar pontos de atenção — o endpoint `/book/consolidar-ia/` estava demorando >30s (limite do Heroku), retornando uma página HTML de timeout. O JS tentava fazer `r.json()` no HTML e estourava esse erro genérico
**Causa raiz**: combinação de gpt-5.4 (modelo robusto mas lento) + 60 itens longos sem trunca + max_tokens 2500
**Mitigações aplicadas**:
Modelo: `gpt-5.4` → `gpt-5.4-mini` (5-10s vs 20-40s, qualidade ainda boa pra essa task estruturada)
Limite de itens: 60 → 40
Truncar cada item a 350 caracteres (entradas longas comem tokens à toa)
max_tokens: 2500 → 1800
Prompt mais enxuto (mantém os 5 campos: equipamento, o-quê, quando, por-quê, impacto)
**Tratamento de erro melhorado** no JS: detecta `Content-Type` não-JSON e mostra mensagem útil:
504/503: "A IA demorou demais (timeout). Reduza o nº de itens ou consolide em partes"
401/403/302: "Sessão expirou, faça login novamente"
Outros: "Servidor retornou HTTP <status> (resposta não-JSON)"
v5.9.7.2
2026-04-28 — Book: logo D.Solutions no rodapé direito (PDF/Word/print)
Correção (W)
**Logo D.Solutions ausente no rodapé impresso** — `.print-footer` em [ai_book/templates/ai_book/book_master.html](ai_book/templates/ai_book/book_master.html) renderizava só o texto centralizado, sem logo. Convertido pra flexbox com `justify-content: space-between`: texto à esquerda + logo PNG à direita (60px). Aplica-se a impressão direta (window.print), PDF nativo do browser e exportação .doc
v5.9.7.1
2026-04-28 — Logout: fix HTTP 405 + página de despedida com agradecimento
Correção (W)
**Bug HTTP 405 ao sair pelo portal /avaliar/**: o link "Sair" estava como `<a href>` (GET), mas Django 5+ exige POST no LogoutView. Convertido pra `<form method="post">` com CSRF token (mesmo padrão usado em `home.html`)
Feature (Y)
**Nova página de despedida** em `/sessao-encerrada/` ([core/templates/core/logout_done.html](core/templates/core/logout_done.html)) — após logout, usuário vê tela com check verde, logo D.Solutions, mensagem "Obrigado por usar o D.Solutions Hub!" e botões "Entrar novamente" / "Voltar à página inicial". Visual standalone com gradient azul-escuro
`LOGOUT_REDIRECT_URL` e `ACCOUNT_LOGOUT_REDIRECT_URL` (allauth) apontam para `core:logout_done`
v5.9.7.0
2026-04-28 — DesignacaoColaborador como amarra cross-frente
Feature (Y)
**Histórico do Colaborador** ([fieldservice/templates/fieldservice/historico_colaborador.html](fieldservice/templates/fieldservice/historico_colaborador.html)) — nova seção "Designações ativas" com badges verdes mostrando todas as subáreas onde o colaborador está designado (ex: `Manutenção › Secagem › Cortadeira`)
**Equipe do Projeto** ([projetos/templates/projetos/equipe.html](projetos/templates/projetos/equipe.html)) — abaixo do nome de cada pessoa aparecem suas designações ativas como tags verdes (mesmo style). Designações também ficam pesquisáveis pela busca global
**RDO Efetivo Detalhado** ([projetos/templates/projetos/rdo.html](projetos/templates/projetos/rdo.html)) — ao lado/abaixo do nome no efetivo, mostra até 2 designações primárias (`+N` se tem mais). Permite verificar visualmente se o colaborador no efetivo bate com sua designação habitual
Backend
**Endpoint** `GET /api/projetos/<pk>/equipe/` — agora retorna campo `designacoes: [...]` (lista de caminhos completos `Pacote > Área > Subárea`) por recurso
**Endpoint** `GET /api/projetos/<pk>/rdo/<pk>/efetivo/` — idem
**View** `fieldservice.views.historico_colaborador` — agora passa `designacoes_ativas` no contexto
Performance
Querie bounded pela equipe do projeto (não puxa todo o banco)
`select_related('subarea', 'subarea__parent', 'subarea__parent__parent')` evita N+1 ao montar `caminho_completo`
Reuso
Mesma fonte canônica `DesignacaoColaborador` (929 registros prod) usada em:
v5.9.6.5
2026-04-28 — Portal /avaliar/: fonte de área/subárea trocada para DesignacaoColaborador
Correção (W) crítica
**Portal de avaliação agora usa `DesignacaoColaborador` (mesma fonte do Control iD)** em vez de derivar área via `RecursoProjeto.colaborador → projeto.area`
Antes: portal só conhecia 1 colaborador na "Secagem" (Fernando), porque os 6 dos 7 projetos da Secagem estavam com `RecursoProjeto` vazio
Depois: portal puxa as 929 designações ativas (campo `subarea` é FK pra `SetorAcesso` tipo='subarea'; o `parent` é a Área). Mesma estrutura hierárquica usada no acesso da catraca/Control iD: Pacote > Área > Subárea
Cada colaborador agora aparece com TODAS suas áreas/subáreas designadas, e os filtros de Área/Subárea com cascata refletem corretamente
Arquivos
[fieldservice/views.py:portal_avaliar](fieldservice/views.py) — query trocada: `DesignacaoColaborador.objects.filter(ativo=True).select_related('subarea', 'subarea__parent')` em vez do loop sobre RecursoProjeto
v5.9.6.4
2026-04-28 — Avaliação aberta: pode_avaliar = qualquer login (sem perm granular)
Correção (W)
**Botão "Avaliar" em `projetos/equipe.html` agora aparece pra qualquer login** (antes estava gateado pela perm `projetos.gerenciar_equipe` por engano de leitura inicial). Avaliar profissionais é função aberta — quanto mais avaliadores, melhor a média ponderada. A constraint `UniqueConstraint(avaliador, colaborador, projeto)` no modelo já impede duplicação por avaliador
Endpoint `GET /api/projetos/<pk>/avaliacoes/` agora retorna `pode_avaliar: True` constante pra qualquer login
v5.9.6.3
2026-04-28 — Portal /avaliar/: cascata Área → Subárea + split de vírgulas + favicon
Melhoria (Z)
**Cascata Área → Subárea no portal** — ao selecionar uma área, o dropdown de subárea passa a mostrar APENAS as subáreas que aparecem em projetos daquela área (mesmo padrão do módulo Master). Quando a área é limpa, todas as subáreas voltam à lista
**Split por vírgula em campos area/subarea** — alguns projetos têm múltiplas subáreas concatenadas no mesmo campo (ex: `"Cozimento,Branqueamento,Lavagem"`). O view agora separa por vírgula e trata cada uma individualmente (filtro, dropdown, exibição no card)
Correção (W)
**Favicon "globinho" do Chrome substituído pela logo D.Solutions** nas páginas que estavam sem `<link rel="icon">`: `projetos/rdo.html`, `projetos/equipe.html`, `fieldservice/portal_avaliar.html` e `fieldservice/base.html` (que cobre todas as outras páginas do app)
v5.9.6.2
2026-04-28 — Portal /avaliar/: filtros por Área e Subárea (em vez de Localidade)
Melhoria (Z)
**Filtros do portal agora são Área + Subárea** (antes era um único filtro "Localidade / Fábrica" baseado em `Colaborador.localidade`)
**Áreas/subáreas vêm dos projetos onde o colaborador atuou** — agregadas via `RecursoProjeto.colaborador → projeto.area / projeto.subarea`
Card do colaborador também mostra as áreas/subáreas (substituindo a linha de localidade)
1 query única pra agregar áreas (sem N+1) com `.exclude(colaborador__isnull=True).select_related('projeto').only(...)`
v5.9.6.1
2026-04-28 — Avaliar: link descobrível em home + topbar do fieldservice
Melhoria (Z)
**Home topbar**: novo link "⭐ Avaliar" (cor amber) visível pra qualquer usuário autenticado, apontando pra `/avaliar/`
**Fieldservice topbar**: mesmo link "⭐ Avaliar" colocado entre "Colaboradores" e "Turnos", pra quem já está navegando no módulo de field service
v5.9.6.0
2026-04-28 — Avaliação 5★ na Equipe + RDO + Portal isolado /avaliar/
Feature (Y)
**Estrelinha de avaliação na Equipe do Projeto** ([projetos/templates/projetos/equipe.html](projetos/templates/projetos/equipe.html)) — nova coluna "Avaliação" na tabela de Pessoas com badge (média + classificação), 5 estrelas, contador de avaliadores e botão "Avaliar/Editar minha". Modal completo embutido com 5 dimensões (Técnica/Segurança/Pontualidade/Equipe/Iniciativa), comentários por dimensão, comentário geral, recomendação de recontratação e contador de incidentes — mesmo padrão visual de `fieldservice/historico_colaborador.html`. Reutiliza endpoints `POST /fieldservice/avaliacao/salvar/` e `GET /fieldservice/avaliacao/<pk>/`. Permissão de avaliar gateada por `projetos.gerenciar_equipe` (o badge é visível pra qualquer login)
**Estrelas read-only no RDO Efetivo Detalhado** ([projetos/templates/projetos/rdo.html](projetos/templates/projetos/rdo.html)) — badge `efetivo-aval` com média + classificação ao lado do nome de cada pessoa do efetivo (ocultado em equipamentos). Tooltip mostra classificação + nº de avaliadores
**Portal isolado de avaliação `/avaliar/`** ([fieldservice/templates/fieldservice/portal_avaliar.html](fieldservice/templates/fieldservice/portal_avaliar.html)) — página standalone (header próprio, sem topbar do D.Solutions) acessível por qualquer usuário autenticado. Grid de cards de colaboradores com avatar, nome, função, localidade, badge de média e estrelas. Filtros client-side: busca por nome/matrícula/função, dropdown de função (área de atuação) e localidade (fábrica). Click "Avaliar" abre modal "Escolher Projeto" → modal "Avaliação". Reutiliza 100% dos endpoints existentes. URL ao nível raiz pra ser compartilhável
Backend
**Novo endpoint** `GET /api/projetos/<pk>/avaliacoes/` ([projetos/api_views.py:projeto_avaliacoes_resumo](projetos/api_views.py)) — retorna resumo agregado de avaliações por colaborador_id (média ponderada das médias_ponderadas individuais, classificação, cor do badge, nº de avaliadores, ID da avaliação do request.user se houver). Login obrigatório (`IsAuthenticated`); flag `pode_avaliar` baseada em `projetos.gerenciar_equipe`
**Augmenta** `GET /api/projetos/<pk>/equipe/` — adiciona campo `colaborador_id` na resposta (e `select_related('colaborador')` pra evitar N+1)
**Augmenta** `GET /api/projetos/<pk>/rdo/<rdo_pk>/efetivo/` — adiciona `colaborador_id` (idem)
**Nova view** `portal_avaliar(request)` em `fieldservice/views.py` — login required, agrega 1 query de todas as avaliações + classifica cada colaborador
Reutilização (sem reescrita)
Modelo `AvaliacaoColaboradorProjeto` (5 dimensões com pesos, snapshot histórico imutável, constraint 1-por-avaliador) — usado como está
Endpoints `/fieldservice/avaliacao/salvar/`, `/fieldservice/avaliacao/<pk>/` e `/fieldservice/avaliacoes/listar-projetos/` — usados como estão pelos novos templates
v5.9.5.0
2026-04-28 — Book: Análise multi-critério, toggle HHT, edição de tabelas
Feature (Y)
**Toggle "Mostrar HHT" no modal** — opção no grupo "Opções de Conteúdo" que oculta todas as referências de HHT (KPIs, colunas de tabela, gráfico de Distribuição de Efetivo, bullets de Objeto/Escopo) quando desativado. Default: ativado. Propagado via `?mostrar_hht=0` na query string
**Excluir linhas das tabelas** — botão "×" aparece no hover sobre qualquer linha de `.tbl-book` (Status Geral, Relação de Projetos, Principais Frentes, Estrutura do Trabalho, etc.); pede confirmação; some no print/PDF/Word
**Considerações Finais — Distribuição da Execução** — agrupa projetos em concluídos (≥99,5%), avançados (80-99%) e com avanço parcial (<80%), listando os primeiros 6 de cada
**Considerações Finais — Destaques multi-critério (justos)** — substitui o "maior/menor avanço" simples por 5 dimensões: maior avanço final, conclusão antecipada (primeiro a 100% por data_fim), maior aderência ao planejamento (menor desvio plano×real por RDO), melhor eficiência operacional (% por dia trabalhado) e maior atraso recorrente
**Lições Aprendidas master-level** — agora card laranja inline (`ia-bloco`) com botão "Gerar com IA", padrão visual igual aos outros cards de IA do book
Melhoria (Z)
**Introdução enriquecida** — passa a trazer hora de corte, período (com nº dias corridos), localidades, gerentes de campo, subáreas e total de apontamentos. **Objeto** virou bullet list de 5 itens + parágrafo de destinatários. **Escopo** virou bullet list com critério de inclusão explícito (excluindo cancelados e estruturas hierárquicas)
**Prompt de "Consolidar com IA" reescrito** — agora exige extração estruturada por item: EQUIPAMENTO/FRENTE, O QUÊ, QUANDO (datas/horas), POR QUÊ (causa), IMPACTO (atraso em horas, perda de produtividade). Modelo trocado de `gpt-5.4-mini` → `gpt-5.4` (mais robusto pra análise estruturada). Preserva números, datas e nomes técnicos exatamente
**Botão "Gerar Lições com IA" da toolbar removido** — substituído pelo card laranja inline na seção de Lições Aprendidas (UX consistente com os demais cards de IA)
Correção (W)
**Bug crítico: "Consolidar com IA" cobrava sem aplicar resultado** — função `consolidarComIA` em `book_master.html` procurava `div[contenteditable]` ou `ul[contenteditable]` que não existem mais no novo formato dos Pontos Consolidados (que usa `.ponto-item` divs). Resultado: chamada IA acontecia (custo cobrado), mas HTML retornado não era aplicado ao DOM. Substituído por `.children` que pega o filho que não é o `.ia-bloco-hdr`
**Função duplicada `gerarLicoesIA()` removida** — havia duas funções com o mesmo nome (uma per-área com 3 parâmetros, outra master-level sem parâmetros). A segunda sobrescrevia a primeira, fazendo o botão dos cards por área ignorar parâmetros e tentar gerar pra `#licoes-conteudo` (seção da finalização)
**KPI "Tarefas" do book agora exclui marcos** — `collector.py` filtrava só `resumo=False`, deixando marcos/milestones contarem como "tarefas executáveis". Filtro agora é `resumo=False, marco=False`. KPI cai pra ~atividades reais de campo
v5.9.4.2
2026-04-28 — Book: Exportação para Word funcional
Feature (Y)
**Botão "Exportar Word" agora gera arquivo `.doc`** real (era placeholder com alerta)
Estratégia HTML→DOC client-side (sem backend): clona o `#book-root`, converte gráficos ECharts (Curva S + Resumo Gerencial) em imagens PNG via `getDataURL()`, embute o CSS inline do template, monta HTML com namespaces do Office, cria Blob com mimetype `application/msword` e dispara download
Nome do arquivo: `Book_<NomeMaster>_YYYY-MM-DD.doc`
Preserva: texto, tabelas, fotos (Cloudinary), KPI cards, formatação básica
Quebra de página automática entre `.book-page` no Word
Curvas S exportadas como PNG 2x (alta resolução)
v5.9.4.1
2026-04-28 — Book: Finalização + Identidade visual + Permissão granular
Melhoria (Z)
**Capa do Book**: vídeo grande (310px) substituído por logo PNG sem fundo (140px) alinhada à esquerda — visual mais limpo e profissional
**Rodapé do Book**: logo D.Solutions no canto direito + texto à esquerda (antes era texto centralizado sem logo)
**Capitalização inteligente de nomes próprios** (`tProp()`): preserva siglas (`PG`, `TL`, `RDO`), mantém preposições minúsculas (`de`, `do`, `da`) e capitaliza nomes próprios automaticamente. Ex: `"PG suzano TL"` → `"PG Suzano TL"`
**Texto institucional atualizado**: `"sistema de gestão digital D.Solutions Hub"` → `"Sistema de Gestão Operacional Integrada — Diretiva Solutions"`
Feature (Y) — Seções de Finalização do Book
**Considerações Finais** (texto template editável com KPIs do master)
**Indicadores Consolidados Finais** (KPIs grandes: avanço, tarefas, RDOs, HHT, fotos, projetos, período)
**Lições Aprendidas** (geradas via IA — botão `Gerar Lições com IA` na toolbar usa endpoint `consolidar_ia` existente, analisa pontos de atenção dos RDOs)
**Aceite e Assinaturas** (página formal com declaração + 4 campos: Cliente / Andritz / Equipe Técnica / Diretiva Solutions)
Cada seção é checkbox no modal, default = todas marcadas
Permissões
**Nova permissão `master.gerar_book`** (`Gerar Book Final de Parada`) substitui o gate `is_superuser` em todas as 6 views do módulo `ai_book`
**Link "Book Final" no topbar do home** visível pra quem tem a permissão (cor verde `#10b981`)
Migration `master/0004_alter_masterplan_options` adiciona a permissão
v5.9.4.0
2026-04-28 — Book: Modal de Configuração antes de Gerar
Feature (Y)
**Modal de configuração ao clicar no card do Master** (em `/book/`) substitui o link direto. Permite escolher exatamente o que entrar no Book antes de gerar — reduz tamanho do PDF final
**Seleção granular de seções**:
Abertura: Ficha Técnica, Índice, Introdução, Resumo Gerencial por Área, Sumário Executivo (Capa sempre incluída)
Por projeto: Panorama Executivo, Estrutura do Trabalho, Diário de Obra
**Seleção individual de projetos**: lista de checkboxes com todos os projetos do Master, com botões "Todos" / "Nenhum" e contador
**Limites configuráveis**: nº de tarefas Top do Panorama (default 8), nº de tarefas na Estrutura (default 30), nº de RDOs no Diário (default 0 = todos)
**Compatibilidade**: se o user acessar `/book/master/<id>/` sem query params, comportamento atual preservado (book completo)
**Numeração inteligente**: sub-capítulos (X.1, X.2, X.3) renumeram automaticamente quando alguma seção é desligada
**Cabeçalho do capítulo** se ajusta — aparece no primeiro bloco habilitado de cada projeto
Implementação
Frontend: query string (`?secoes=...&projetos=...&max_top=...`) lida pelo `_parseBookConfig()` no JS do book_master
Backend: `book_lista_masters` agora retorna lista de projetos (id+nome) por master pra popular o modal
Render: cada bloco do `renderBook()` envolto em `if (bookConfig.X)`; chamadas a `renderCurvaS` e `_initResumoGerencialCharts` condicionadas
v5.9.3.2
2026-04-28 — Topbar: Menu de Conta no perfil (estilo admin)
Melhoria (Z)
**Menu de Conta** no topbar do home (substitui os 2 botões soltos "Trocar senha" e "Sair")
Visual inspirado no admin (Jazzmin): ícone de pessoa + dropdown com:
Cabeçalho "Conta" + nome/e-mail do usuário
Alterar senha (ícone azul)
Encerrar sessão (ícone vermelho)
Em telas md+, mostra o nome ao lado do ícone; em mobile, só ícone (economiza espaço)
v5.9.3.1
2026-04-28 — Auth: Aviso OAuth no reset + comando users_email_status
Melhoria (Z)
**Aviso visual nas telas de reset de senha** (`password_reset_form` e `password_reset_done`) explicando que usuários Google/Microsoft devem usar o botão social na tela de login em vez de tentar redefinir senha. Resolve confusão silenciosa onde reset era ignorado pra usuários OAuth-only
**Management command `users_email_status`**: lista total/ativos/sem-email/OAuth-only — útil pra diagnosticar quem não consegue receber e-mail de reset. Roda via `heroku run python manage.py users_email_status`
v5.9.3.0
2026-04-28 — Auth: Olhinho de senha, Trocar senha logado, E-mail de reset customizado
Feature (Y)
**Olhinho mostrar/ocultar senha** no login e na tela de troca de senha (toggle `bi-eye` ↔ `bi-eye-slash`)
**Tooltip explicativo no "Lembrar de mim"** com hint sobre os 30 dias de sessão estendida
**Tela de Trocar Senha** (`/accounts/password_change/`) com 3 campos (senha atual + nova + confirmar), todos com olhinho. Tela de sucesso com check verde
**Link "Trocar senha"** no topbar do home (entre nome do usuário e botão Sair) e também no card de login (ao lado de "Esqueceu a senha?")
**E-mail de reset de senha customizado**: novos templates `password_reset_email.html` e `password_reset_subject.txt` com texto profissional em PT-BR (substitui o default Django em inglês)
**Site name atualizado**: `Site` configurado para `D Solutions` / `dsolutionshub.com` (era `FSS_Dev` / `127.0.0.1:8000`)
v5.9.2.0
2026-04-28 — Comissionamento: Export/Import CSV (Itens, Punch, Protocolos)
Feature (Y)
**Itens Taguados**: export CSV completo, import via cole-texto OU upload .csv. Upsert por (sistema_codigo, tag) — atualiza existentes ou cria novos. Botões na árvore de Sistemas
**Punch List**: export CSV de todas pendências, import (sempre cria novas — sem chave natural). Suporta data em YYYY-MM-DD ou DD/MM/YYYY. Botões na lista de Punch
**Protocolos de Teste**: export CSV (passos serializados em JSON), import com upsert por nome. Coluna `passos` aceita JSON array OU texto com `|` separando passos (vira critério padrão E). Botões na lista de Protocolos
**Modelo CSV vazio** (só cabeçalho) baixável em cada entidade — facilita preenchimento
Helper genérico `comissionamento/import_export.py` (separador `;` ou `,`, BOM UTF-8 pra Excel BR)
Importação só pra superusers (proteção contra alterações em massa); export aberto a todos autenticados
v5.9.1.1
2026-04-27 — Checklists form: chevron pra recolher/expandir seções
Melhoria (Z)
No formulário de criar/editar checklist, **cabeçalhos agora têm chevron** (▼/▶) clicável que recolhe os itens da seção (até o próximo cabeçalho). Ajuda a organizar visualmente listas grandes durante a edição
Chevron fica invisível em rows que não são cabeçalho (sem afetar layout)
v5.9.1.0
2026-04-27 — Checklists: estrutura com seções colapsáveis (cabeçalhos)
Feature (Y)
Campo `tipo` em ChecklistItem: `cabecalho` (sem checkbox, agrupa) ou `verificacao` (item normal). Default = verificacao
**Form novo**: cada linha tem botão pra alternar entre item ☐ e cabeçalho 📁. Cabeçalhos ficam azuis e em CAIXA ALTA
**Parser de import inteligente**: detecta automaticamente cabeçalhos (linha em CAIXA ALTA + curta + seguida por linhas com `-/*/•`)
**Detalhe**: seções com header azul clicável, chevron, **expand/collapse** persistente em `localStorage` por checklist. Contador `feitos/total` por seção atualiza ao vivo
**Progresso geral** ignora cabeçalhos (só conta itens checáveis)
v5.9.0.2
2026-04-27 — Book: Pontos de Atenção Consolidados organizados (não textão)
Correção (W)
**Pontos de Atenção Consolidados** no Book agora ficam **estruturados em lista** (mesma estética bonita do RDO), não mais textão sem pé nem cabeça
Nova função `_renderTextoOrganizado()` com 5 estratégias em cascata:
Cabeçalho de cada bloco com ícone de pasta + data alinhada à direita
v5.9.0.1
2026-04-27 — Checklists: drag & drop + import Excel/texto + filtro projetos ativos
Melhoria (Z)
**Importar itens em massa** no formulário de novo Checklist: cole texto do Excel/Word/notas (1 linha = 1 item) ou faça upload de `.txt/.csv/.xlsx`. Parser remove numeração automática (1., 1), -, *, •, ✓), dedup case-insensitive, preview ao vivo, modo "substituir" ou "adicionar ao final"
**Drag & drop** nos itens via SortableJS — segura no ícone ⋮ pra reordenar antes de salvar
Filtro de **projetos ativos**: dropdown agora mostra só projetos com status='ativo' (exclui rascunho/concluído/cancelado)
v5.9.0.0
2026-04-27 — Comissionamento: Checklists Rápidos
Feature (Y)
**Checklists Rápidos** — nova aba `/comissionamento/checklists/` complementar a Punch List e Protocolos. Para verificações ad-hoc (inspeção de turno, partida, preparação, etc) sem precisar criar protocolo formal
Modelos `ChecklistRapido` (nome, descrição, vínculos opcionais a projeto/sistema/item, status, is_template) + `ChecklistItem` (descrição, feito, foto, observação)
3 telas: **Lista** (filtros + busca + barra de progresso por card), **Criar** (form com itens dinâmicos, Enter adiciona linha), **Detalhe** (checkbox por item + foto/observação inline; auto-status concluído quando todos itens marcados)
**Templates**: marcar checklist como template e duplicar pra reusar (botão "Usar template" no header)
Aberto a todos usuários autenticados; deletar só superuser ou criador
Auto-progressão: ao marcar 1º item → status "Em andamento"; todos itens → "Concluído" automaticamente
v5.8.3.2
2026-04-27 — Fix: PgBouncer + cursor inválido em /comissionamento/
Correção (W)
Adicionado `DISABLE_SERVER_SIDE_CURSORS=True` quando pgbouncer está ativo (Heroku). Resolve erro 500 `InvalidCursorName: cursor "_django_curs_..." does not exist` em diversas views (`/comissionamento/punch/novo/`, queries com iterator()). PgBouncer em transaction mode não preserva server-side cursors entre transações — força Django a usar client-side
v5.8.3.1
2026-04-27 — Fix: Curva S re-carrega ao trocar de RDO
Correção (W)
Ao trocar entre RDOs (clicar em outro na sidebar), a Curva S agora é recarregada automaticamente com o `rdo_id` correto. Antes só carregava na 1ª abertura, então abrindo um RDO antigo a curva mostrava ainda do RDO anterior (ou hoje). Trigger: após `setModoCongelado` em `carregarRDO`, se accordion da Curva S está aberto, força `carregarCurvaSRdo()`
v5.8.3.0
2026-04-27 — Curva S do RDO IMUTÁVEL (auditoria estrita) + backfill retroativo
Feature (Y)
**Curva S do RDO consolidado é agora SNAPSHOT IMUTÁVEL persistido no banco**, não mais recálculo dinâmico. Garantia de auditoria 100% — mesmo que apontamentos sejam editados depois, o snapshot do RDO permanece intacto
Novo campo JSONField `curva_snapshot` em `RelatorioRDO` (nullable, sem impacto pra dados existentes)
Geração automática ao consolidar (`rdo_nova_revisao`): `congelado=True` agora também salva `curva_snapshot=lista_de_pontos`
Endpoint `/api/projetos/<pk>/curva-s/?rdo_id=<id>` prevalece sobre cálculo: se o RDO está congelado e tem snapshot, retorna ele direto (com flag `imutavel=true`); senão cai em recálculo dinâmico via `data_referencia=rdo.data`
Frontend RDO passa `rdo_id=<id>` em vez de `data_referencia` quando o RDO está congelado
Backfill retroativo
Migration `0049_backfill_curva_snapshot_rdos_congelados` percorre TODOS os RDOs já congelados sem snapshot e gera retroativamente com `data_referencia=rdo.data`. Aplica auditoria imutável a todo o histórico existente sem precisar re-consolidar manualmente
Tolerante a falhas: se 1 RDO falhar, segue pros próximos (loga e continua). Reversível via `migrate projetos 0048`
v5.8.2.4
2026-04-27 — Curva S snapshot por RDO + datas no Book usam cronograma
Correção (W)
**Curva S do RDO consolidado agora é SNAPSHOT do dia do RDO** — quando você abre um RDO já congelado, a curva mostra o estado do projeto NAQUELA data (realizado para de subir na data do RDO, não vai até hoje). Adicionado parâmetro `data_referencia` em `calcular_curva_s_diaria` + endpoint `/api/projetos/<pk>/curva-s/?data_referencia=YYYY-MM-DD`. Quando o RDO está editável, mantém comportamento atual (real-time)
**Datas no Book** ("Período de execução") agora usam `projeto.data_inicio_previsto/fim_previsto` (cronograma atualizado) em vez de min/max das datas dos RDOs (que ficavam congeladas no último RDO existente, ignorando re-importações de cronograma estendido)
v5.8.2.3
2026-04-27 — Curva S: realizado só até hoje + Pontos Atenção sem truncar
Correção (W)
**Realizado da Curva S não invade mais o futuro**: para datas > hoje, realizado = null (era carry-forward indevido que mostrava 100% no dia 30 quando hoje é 27). Aplicado no agregado por área e no renderCurvaS por projeto. Previsto continua até data_fim_previsto (é planejamento)
**Pontos de Atenção Consolidados** agora exibe **texto completo** (sem truncar em 200 chars) e **preserva HTML do user** (negritos, listas, bolinhas em linhas separadas via sanitizeUserHtml). Sem limite de 12 itens — mostra todos os pontos únicos. Botão "Consolidar com IA" continua funcional (faz a deduplicação inteligente quando clicado)
v5.8.2.2
2026-04-27 — Curva S do Book: monotônica + carry-forward + trunca em 100%
Correção (W)
**Curva S agregada por área no Resumo Gerencial não decresce mais** quando um projeto da área termina antes — aplica carry-forward (mantém último valor conhecido) por projeto antes de agregar
Forçada monotonicidade no agregado (% cumulativo nunca cai)
Cap em 100% (valores acima são truncados)
Trunca série após 1º ponto que atinge 100% (mantém o ponto de conclusão)
Mesma proteção defensiva aplicada na curva S por projeto (renderCurvaS)
v5.8.2.1
2026-04-27 — Avaliação manual: escolher projeto sem precisar de vínculo
Correção (W)
Botão "Avaliar em projeto..." no topo do histórico do colaborador — abre modal com lista buscável de projetos. Permite avaliar **qualquer colaborador em qualquer projeto** mesmo quando não há `RecursoProjeto` vinculado (resolve casos de homônimos / nomes diferentes entre Colaborador e MS Project)
Endpoint `/fieldservice/avaliacoes/listar-projetos/` retorna lista pra busca
v5.8.2.0
2026-04-27 — Filtros Avançados (KPIs) + 9-Box + Parallel Coordinates
Feature (Y) — KPIs por Projeto
**Botão "Filtros Avançados"** na página `/projetos/<pk>/kpis/` abre modal com 3 análises:
**Não iniciados**: tarefas com pct=0 e início previsto já passou
**Iniciados em atraso**: tarefas com data_inicio_real > data_inicio_previsto
**Pra entregar até próximo corte**: tarefas com fim_previsto entre corte atual e janela configurável (12h/24h/48h/72h/7d)
Endpoint `/api/projetos/<pk>/filtros-avancados/?tipo=...&parent=...&janela_h=...`
Modal mostra tabela completa, badges com contadores, destaque para caminho crítico, exporta CSV. Não altera nenhum KPI existente — só adiciona um popup "modo gerencial avançado"
Feature (Y) — Dashboard de Avaliações (charts modernos)
**9-Box Talent Matrix** (padrão McKinsey/GE) — Performance × Confiabilidade em grid 3×3 com 9 zonas semânticas (Top Talent, Future Star, Solid Performer, Risco, etc). Cada colaborador é um bubble; tamanho proporcional a nº de avaliações; click leva ao histórico
**Parallel Coordinates** — cada colaborador é uma linha atravessando os 5 eixos (Técnica, Segurança, Pontualidade, Equipe, Iniciativa). Cor por classificação. Padrão moderno de people analytics
Gráfico pizza original mantido como complemento
v5.8.1.0
2026-04-27 — Estrelinha global + Snapshots imutáveis de avaliações
Feature (Y)
**Estrelinha global** ao lado de qualquer nome de colaborador na plataforma — clique abre histórico de avaliação. Cor: cinza (sem avaliação) → dourada (com média). Hover anima e mostra média atual via tooltip
Template tag reutilizável `{% colab_star colab %}` (carregue `colab_extras`) — pode ser usada em qualquer template
Cache de médias em memória do processo evita N+1 em listas grandes (1 query agregada na 1ª chamada)
Aplicada em: lista de colaboradores + board de equipe (mais visíveis)
Schema (W)
Novo modelo `AvaliacaoSnapshot` — snapshot **imutável** do estado anterior em cada edição de avaliação. **Nenhuma versão é perdida** mesmo após múltiplas revisões
Admin do AvaliacaoSnapshot é read-only (sem add/edit/delete) — auditoria garantida
`salvar_avaliacao` cria snapshot automaticamente ANTES de sobrescrever os campos
v5.8.0.2
2026-04-27 — Avaliação aberta a todos os usuários autenticados
Melhoria (Z)
Botão "Avaliar" agora aparece pra **todo usuário logado** (não exige permissão específica)
Cada usuário tem 1 avaliação por (colaborador, projeto) — pode revisar a sua sempre
Card do projeto e dashboard mostram média ponderada COLETIVA — quanto mais avaliadores, mais robusta a média
Pra restringir avaliação a um grupo no futuro, basta ajustar o check em `avaliacao_salvar`
v5.8.0.1
2026-04-27 — Avaliação coletiva: média de múltiplos avaliadores + 1 por avaliador
Melhoria (Z)
Card do projeto agora mostra **média ponderada COLETIVA** (de todos avaliadores) + contagem de avaliadores
Badge "Você avaliou: X★ (versão N)" indica quando o usuário atual já avaliou
Botão muda dinamicamente: "Avaliar" (1ª vez) → "Revisar minha avaliação" (já avaliou)
Schema (W)
UniqueConstraint `aval_unique_avaliador_colab_projeto` — 1 avaliação por (avaliador, colaborador, projeto). Avaliador NULL não conflita
Backend `avaliacao_salvar` faz UPSERT por (avaliador, colaborador, projeto): se usuário já avaliou esse colaborador no mesmo projeto, edita a sua (incrementa versão); senão, cria nova
Proteção: só o próprio avaliador OU superuser pode editar uma avaliação existente
v5.8.0.0
2026-04-27 — Sistema de Avaliação 360° + Histórico Unificado de Colaboradores
Feature (X — módulo novo)
**Histórico unificado de colaboradores** (`/fieldservice/colaboradores/<pk>/historico/`):
Cards "Projetos onde atuou" agregando RecursoProjeto + EfetivoRDO + dias de presença
Resumo strip: nº projetos · média geral ★ · acessos catraca · avaliações
Radar chart (ECharts) de perfil de competências nas 5 dimensões
Tabela de histórico de avaliações
**Sistema de Avaliação 360° (5 pilares)** — novo modelo `AvaliacaoColaboradorProjeto`:
Técnica/Execução (30%) · Segurança/HSE (25%) · Pontualidade (15%) · Trabalho em Equipe (15%) · Iniciativa (15%)
Estrelas 1-5 + comentário por dimensão + comentário geral
Sinalização: recomenda recontratação + incidentes de segurança
Versionamento (incrementa em cada edição) + snapshot da função
Cálculo automático de média ponderada e classificação (Excelente/Bom/Regular/Insatisfatório/Crítico)
**Modal de avaliação inline** — abre via botão "Avaliar/Editar" em cada projeto do histórico
**Dashboard de Avaliações** (`/fieldservice/avaliacoes/dashboard/`) — KPIs, top 10 performers, alertas (média < 2.5 ou ≥ 2 incidentes), distribuição por classificação (gráfico pizza ECharts)
Schema (W)
Campo `colaborador` (FK opcional) adicionado em `RecursoProjeto` — destrava rastreamento de histórico por colaborador
Migration `0045_vincular_recurso_colaborador_por_nome` — casa nomes existentes (case/accent-insensitive, só vincula em match único)
Admin
`AvaliacaoColaboradorProjeto` registrado com fieldsets organizados (Vínculos / Período / Notas / Comentários / Sinalizações / Auditoria)
`RecursoProjeto` agora tem autocomplete de Colaborador
v5.7.2.2
2026-04-25 — Book: revisão IA desativada + áreas normalizadas no banco
Correção (W)
Revisão ortográfica IA temporariamente desativada (auto-trigger ao carregar removido + botão da topbar oculto). Custo OpenAI estava alto demais. Reativar trocando `display:none` → `''` quando quota for ajustada
Áreas/subáreas duplicadas case-insensitive ("Linha de Fibras" vs "Linha de fibras") agora são normalizadas direto no banco via script `_normalize_areas.py` — adota o casing mais usado como canônico
v5.7.2.1
2026-04-25 — Book: revisão fallback 1-a-1 + agrupamento case-insensitive
Melhoria (Z)
Resumo Gerencial agrupa áreas case-insensitive ("Linha de Fibras" = "Linha de fibras") com display normalizado em title-case
Popup da revisão ortográfica mostra amostra dos textos não revisados (até 5 por lote falhado) em vez de só o contador
Correção (W)
Quando IA retorna nº errado de itens no split (lote falha), agora faz fallback automático revisando texto-por-texto. Garante que nenhum texto fica sem revisão (custo um pouco maior mas resultado sempre completo)
v5.7.2.0
2026-04-25 — Book Final: Resumo Gerencial Híbrido + fonte canônica de dados
Feature (Y)
**Resumo Gerencial Híbrido** no Book Final (após item 3 Escopo): página de visão geral comparativa por área (KPIs coloridos por status, comparativo gráfico ECharts, status semáforo, top 3 destaques) + 1 página por área (KPIs, curva S agregada ponderada, distribuição de efetivo, top atividades críticas, pontos de atenção consolidados via IA, lições aprendidas via IA)
Endpoint `/ai_book/consolidar-ia/` para consolidação de pontos de atenção (gpt-5.4-mini) e lições aprendidas (gpt-5.4) sob demanda
Popup com diff visual (vermelho riscado vs verde) ao final da revisão ortográfica, com alerta específico se erro for quota OpenAI
Melhoria (Z)
Modelos OpenAI agora usam `gpt-5.4-mini` (revisão ortográfica + consolidação de pontos) e `gpt-5.4` (lições aprendidas) em vez de `gpt-5/5-mini` (modelos reasoning que desperdiçavam tokens "pensando" antes de responder texto)
Bolinhas emoji (🔴🟠🟢...) inline em pontos de atenção do RDO agora quebram em linhas separadas no Book
Correção (W)
**`pct_total` do projeto no Book agora usa `projeto.percentual_realizado` (fonte canônica do sistema)** em vez de `tarefa raiz MPTT.percentual_realizado` que retornava 0% quando MS Project importa "Milestones" como 1ª raiz. Agora bate exatamente com o card "REALIZADO" do EAP/RDO/KPIs (afetava todos os projetos com múltiplas raízes — área Secagem mostrava 0% incorretamente)
v5.7.1.2
2026-04-13 — Fotos RDO print + siglas preservadas + galeria zoom out
Correção (W)
Fotos do cronograma RDO não estouram mais o card na impressão (CSS reforçado com !important em position/overflow/display)
Área/Subárea de projetos preservam siglas maiúsculas (WLP, DDW, TG) quando é uma única palavra
Galeria de projetos: botão direito na imagem do lightbox agora diminui zoom (antes só tinha o botão)
v5.7.1.1
2026-04-13 — RDO lock: mostra usuário e SU pode derrubar
Melhoria (Z)
Mensagem "RDO sendo editado em outra aba" agora mostra nome do usuário
Superusuário pode derrubar a sessão e assumir a edição (confirm)
Lock no localStorage agora salva: timestamp + tab_id + username
v5.7.1.0
2026-04-13 — Turnos de Trabalho + Cross-filter Dashboard
Feature (Y)
Modelo TurnoTrabalho (nome, horário, dias semana, cor, ativo/inativo)
Tela CRUD /fieldservice/turnos/ com modal arrastável e toggle ativo
Cards por turno no dashboard (entradas/saídas/presentes/negados por turno)
Filtro por turno na presença e export Excel (via FK colaborador)
Coluna Turno nos colaboradores com dropdown inline editável
Link Turnos na topbar e hub
Melhoria (Z)
Cross-filter entre gráficos: clicar Contrato filtra Funções e vice-versa
Chips de filtro ativo com botão Limpar
KPI Colaboradores mostra filtrados/total quando filtro ativo
Modal fullscreen para todos os gráficos (com datalabels)
Modal Presença 30 dias (números pretos, datas maiores)
Modal Últimos Acessos: 500 registros, filtros (tipo/turno/área/subárea/data), export
Range de datas no filtro de presença (data início + data fim)
Busca multi-termo: vírgula=OU, espaço=E
Busca em todas as colunas de colaboradores
Card Dispositivos removido do dashboard (info já nos cards individuais)
v5.6.0.2
2026-04-13 — Master: hora de corte em areas/subareas/curva S + mobile sincronizado
Correção (W)
Master: listar_areas() e listar_subareas() usam hora de corte (antes usavam datetime.now)
Master: calcular_curva_s_consolidada() usa get_corte_dia() quando sem data_ref
Master: api_areas e api_subareas leem hora_corte do request
Master: JS passa hora_corte em carregarAreas, onAreaChange e relatório gerencial
Mobile: lê hora de corte do EAP (localStorage) em vez de 8 fixo
v5.6.0.1
2026-04-12 — Presença: Excel corrigido, filtro hora, catraca, cards minimizados
Correção (W)
Excel presença: horário convertido de UTC para local (UTC-4 Campo Grande)
Excel + tabela: coluna "Catraca" com nome do device (extraído do observações)
Filtro por hora início/fim na página e no export
Export Excel segue todos os filtros aplicados (data, hora, setor)
Cards de área iniciam minimizados por padrão (localStorage invertido)
Auto-refresh de 15s removido (causava flash/piscar na tela)
v5.6.0.0
2026-04-08 — Status Fotos, Export Designações, Biometria Upload, Field Service
Feature (Y)
Dashboard: 4 cards de status fotos Control iD (OK/Pendentes/Rejeitadas/Sem Foto)
Exportar status fotos em XLSX colorido (view + URL)
Exportar designações: lista todos colaboradores + dropdown subáreas
Biometria: botão upload de foto do computador (além da câmera)
Melhoria (Z)
Setores: filtrar serviços já usados como subárea (backend, por parent)
Mapa designações: remover filtros Idade, Localidade, Status
Gráfico Top 10 Funções: altura 300px (era 160px)
Importação XLSX: StatusDisponibilidade auto-criado (get_or_create)
Correção (W)
RDO print: ResizeObserver na Curva S (adapta ao zoom sem estourar)
RDO print: chart temporário para PDF (não mexe no chart da tela)
RDO print: relógios margin-top 20px, scale 0.45 na curva
Exportar XLSX colaboradores: dropdowns nas colunas corretas
Exportar designações: campo tipo (não nivel)
v5.5.0.0
2026-04-07 — Relatório Gerencial: Gauges + Atrasadas por Área + Popup Seleção
Feature (Y)
Relatório Gerencial: 8 cards (4+4) com gauges ECharts reais (SPI, Aderência, Prev vs Real)
Atividades atrasadas por área no relatório (backend atrasadas_geral com peso HH e datas)
Popup de seleção: escolher quais atividades atrasadas entram no relatório antes de imprimir
Botão "Pular" para gerar sem atrasadas
Correção (W)
Exportar XLSX colaboradores: dropdowns nas colunas corretas (classificacao_mo, contrato, ativo, status)
Importação XLSX: StatusDisponibilidade criado automaticamente (get_or_create)
v5.4.0.1
2026-04-07 — Perfil Gerente Viewer
Correção (W)
Perfil Gerente Projetos: grupo com 10 permissões de leitura via management command
Home: card e link Master visíveis para quem tem view_master (não só superuser)
EAP: toggle Físico/Tempo escondido para viewer (change_tarefa)
EAP: edição inline de info do projeto protegida por CAN_EDIT
Revert topbar projetos ao padrão original
v5.4.0.0
2026-04-07 — Permissões Master, Relatório Histórico, Topbar Mobile, Curva S Monotônica
Feature (Y)
Master: permissões granulares (view_master + manage_master) em vez de superuser-only
Master relatório gerencial: seletor de data/hora para emitir relatórios históricos
RDO: todos os toggles/seções persistem no localStorage (padrão: expandido)
Skill /deploy: fluxo de versionamento vX.Y.Z.W automatizado
Melhoria (Z)
Topbar projetos (EAP, KPIs, RDO): padrão fieldservice — lista vertical no mobile com ícone + texto
Curvas S do PDF: segmentação verde/vermelho (realizado vs previsto)
Mini-curvas do relatório: título mostra subárea + nome do projeto
Card Atraso Real: usa dias de calendário (não HH/hpd)
Toggle Físico/Tempo protegido por permissão change_tarefa
Template RDO config: acessível com permissão relatorio_rdo (era staff_member_required)
PDF relatório: sempre em modo Registro (acumulado_fim)
Correção (W)
Curva S monotônica: realizado acumulado nunca decresce (master + projetos)
Curva S proporcional: ratio < 0.01 usa 1.0 (batch de apontamentos)
Curva S: restaurar tamanho original após captura PNG do relatório
Mobile: botões EAP em linha (nowrap), nome tarefa com ellipsis
Mobile: Início/Término em linha, RDO header flex-wrap
Mobile: Curva S captura min 800px para relatório técnico
RDO: erro de clima silencioso (console.warn, não alert)
Badges desvio negativo em vermelho no PDF (inline styles)
v5.3.0.0
2026-04-06 — Master Dashboard: Hora de Corte + Relatório Gerencial
Feature (Y)
Seletor de hora de corte no Master Dashboard (Settings Menu ⋮) com persistência localStorage
Toggle ao vivo (broadcast) integrado no popup de configurações
Relatório Gerencial imprimível (2 páginas A4 paisagem):
Página 1: cabeçalho dark, 5 KPIs com barras de progresso, Curva S consolidada, resumo por área, tabela com mini-progresso
Página 2: mini-curvas S individuais agrupadas por área com badges coloridos
Melhoria (Z)
Tooltips dark estilizados com seta em todos os 8 cards do dashboard
Gauge Backlog%: labels 22px bold fixos na base das barras
Card Atraso Real: total de horas/dias/gap em cada coluna
Curva S: espaçamento entre datas e legenda corrigido
Settings Menu expansível para futuras configurações
v5.2.0.0
2026-04-06 — Relatório Técnico Chrome PDF, Remotion Heroku, Gauges 8 Níveis
Feature (Y)
Relatório Técnico: PDF em alta qualidade via Chrome headless (botão "Rel. Técnico" no RDO)
Relatório Executivo: renomeado de "PDF" para "Rel. Executivo" (IA gpt-4o-mini)
HTML standalone para PDF: charts SVG, gauges, fotos, Curva S com dados inline
Respeita seções abertas/recolhidas da tela do RDO
Remotion + Node.js + FFmpeg + Chrome no Heroku (buildpacks)
Video render: Cloudinary upload com resource_type='video' (secure_url)
Gauges de desvio: suporte até 8 subníveis (era 2-3)
Labels dos gauges: removido codigo_eap, mostra apenas nome da tarefa
Melhoria (Z)
PDF Técnico via Celery worker (thread no uvicorn morria silenciosamente)
Tratamento de erro detalhado no PDF Técnico (mensagem no toast + cache)
Notificação global do Rel. Técnico persiste ao navegar entre páginas
Monitor Heroku: HEROKU_API_KEY configurada para aba Custos
AdminBrandColorMiddleware: logo MP4 + cores #000410 no admin Jazzmin
Correção (W)
Fix: URL de vídeo no Cloudinary (image/upload → video/upload via secure_url)
Fix: node_modules no Heroku via symlink para raiz
Fix: shell=True com string cmd (Linux ignora args em lista)
Fix: NODE_PATH para Remotion encontrar módulos
v5.1.0.0
2026-03-30 — Identidade Visual: Logo MP4, Cores #000410, Admin Dark
Feature (Y)
Logo animada MP4 em todas as páginas (topbar, footer, mobile, admin)
Animação: autoplay ao carregar, replay ao hover/click
Cor #000410 unificada em todos os cabeçalhos (topbar, sidebar, footer)
Admin Jazzmin: sidebar/navbar #000410 via middleware CSS injection (variáveis AdminLTE)
Admin Jazzmin: logo MP4 animada substituindo imagem estática
Admin Jazzmin: texto "D_Solutions" removido, só logo clicável
Logo PNG gerada do último frame do vídeo (favicon/admin fallback)
Middleware NoCacheStaticMiddleware: no-store em arquivos estáticos em DEBUG
Cores antigas (#003A70, bg-dark, var(--ds-navy)) substituídas por #000410 hardcoded
v5.0.1.0
2026-03-29 — Painel Control iD: Firmware, Serial e Views
Melhoria (Z)
Painel Control iD: toggle Card/Lista para visualização dos dispositivos
Painel Control iD: cards colapsáveis com mini-stats (iniciam minimizados)
Painel Control iD: firmware, produto (iDFace Max) e serial do hardware auto-detectados via system_information
Painel Control iD: campo serial_hardware separado do device ID
Correção (W)
Fix: parsing da resposta system_information (JSON aninhado em {"response": "..."})
Fix: div extra no template quebrava collapse e toggle lista/card
Fix: sync Control iD — resetar acesso_sincronizado ao re-sincronizar
Fix: garantir grupo/regra de acesso em todas as operações de sync
v5.0.0.0
2026-03-29 — Ferramentaria Completa + Versionamento
Novo (Y)
Ferramentaria: Import/Export de ferramentas via XLSX (modelo + importação)
Ferramentaria: Import/Export de consumíveis via XLSX (modelo + importação)
Ferramentaria: Import/Export de solicitantes via XLSX (modelo + importação)
Ferramentaria: Gestão de Centros de Custo (CRUD + XLSX import/export)
Ferramentaria: Busca de colaboradores do Field Service para solicitantes
Ferramentaria: Conferência de estoque
Ferramentaria: Manutenção e aferição de ferramentas
Melhoria (Z)
Ferramentaria: Filtros instantâneos sem botão "Filtrar"
Ferramentaria: Botões "Apagar Todos" para superusuários (6 módulos)
Sistema de versionamento automático (vX.Y.Z.W) com changelog integrado
Versão dinâmica no footer lida do arquivo VERSION
Correção (W)
Fix: crash ao listar CCs com responsável nulo
Fix: erro 500 ao apagar ferramentas/CCs com vínculos (ProtectedError)
Fix: Kit/Maleta bloqueando exclusão de Centros de Custo
v4.0.0.0
— Cronograma e Curva S
Novo
Módulo Projetos: EAP hierárquica (MPTT), importação MS Project (XML)
RDO automatizado: cockpit diário com clima, efetivo, fotos
Curva S: modos proporcional, cronograma e tempo real
KPIs de projeto: SPI, aderência, backlog, caminho crítico
Tela mobile de campo para apontamento e fotos
v3.0.0.0
— Projetos e EAP
Novo
Módulo Projetos: gestão de obras com tarefas hierárquicas
Calendários e dependências entre tarefas
Recursos de projeto e equipe
v2.0.0.0
— Field Service
Novo
Módulo Field Service: board de equipe com alocações visuais
Dashboard de métricas com Chart.js
Importação/Exportação XLSX de colaboradores
Histórico de alocações por colaborador
Notificações por email em alocações
19 testes automatizados
v1.0.0.0
Fundação
Novo
Core: autenticação tradicional + OAuth (Google/Microsoft) via django-allauth
Home institucional com landing page
IA: consultas em linguagem natural (Text-to-SQL + fallback genérico)
Página de contato com envio de email
PWA: Service Worker para cache offline
Sentry integrado para monitoramento de erros
D.Solutions — Diretiva Solutions Tecnologia Ltda.