# Modal "Cálculos & Informações" — Dashboard Logística

**Data:** 2026-05-12
**Sinal:** `componentes/Missoes/Logistica/sinais/Dashboard`
**Escopo:** Adicionar um modal informativo acessível de qualquer aba do Dashboard Operacional.

---

## Problema

O Dashboard exibe métricas calculadas (score de separação, assertividade, lead time, etc.) sem explicar ao usuário o que cada uma significa ou como são calculadas. Usuários precisam consultar documentação externa ou o código-fonte.

## Solução

Um botão `?` (ícone `bi-info-circle`) fixo na linha de abas do dashboard abre um modal Bootstrap com seções por contexto, explicando cada métrica em linguagem operacional.

---

## Botão de Acesso

- Posicionado no final da `dash-tabs-row`, após a última aba (Pesagem)
- Separado visualmente das abas por um divisor `|`
- Estilo: mesma classe utilitária `dash-btn-calendario` (2.4rem × 2.4rem, tema dark)
- Ícone: `bi-info-circle`, tooltip "Cálculos & Informações"
- ID: `btn-dash-info`

---

## Modal

- ID: `modal-dash-calculos`
- Classe Bootstrap: `modal-xl modal-dialog-scrollable`
- Header: título "Cálculos & Informações" + `bi-calculator`, botão fechar
- Body: seções descritas abaixo
- Footer: nenhum
- Background dark consistente com o tema do dashboard

---

## Seções e Conteúdo

### 1. KPIs — Visão Geral

| Métrica | Descrição |
|---|---|
| Separações | Quantidade de missões de tipo separação (tipo_missao_id = 2) concluídas no período. |
| Carregamentos | Quantidade de missões de tipo carregamento (tipo_missao_id = 3) concluídas no período. |
| Itens Separados | Soma de todos os itens bipados nas missões de separação do período. |
| Cubagem Total | Soma do volume (m³) dos itens nas missões de separação. |
| Lead Time Sep→Carg | Mediana (em minutos) entre o fim de uma separação e o início do carregamento do mesmo romaneio. Mede a agilidade da transição entre etapas. |
| Overnight | Romaneios cuja separação foi concluída num dia mas o carregamento só iniciou no dia seguinte (ou posterior). |

### 2. Separação

**Assertividade**
- Fórmula: `itens_corretos / itens_total × 100`
- Um item é "errado" quando o conferente acusa `separou_errado = 1` no carregamento.
- Retorna `—` quando o separador não tem itens no período.
- Faixas semafóricas: ≥ 95% verde | ≥ 88% amarelo | < 88% vermelho

**Score de Separador (0–100)**
- Fórmula ponderada: `assertividade×0,40 + velocidade×0,40 + volume×0,20`
  - **Assertividade (40%):** `(assertividade_pct / 100) × 40`
  - **Velocidade (40%):** `min(1, tempo_ref / tempo_item) × 40` — quanto mais rápido que a mediana do período, maior o score
  - **Volume (20%):** `min(1, itens / 200) × 20` — normalizado contra referência de 200 itens
- Faixas semafóricas: ≥ 70 verde | ≥ 45 amarelo | < 45 vermelho

**Retrabalho**
- Índice de retrabalho: percentual de missões que precisaram ser refeitas.
- Faixas semafóricas (taxa de acerto = 100 − retrabalho_pct): ≥ 95% verde | ≥ 85% amarelo | < 85% vermelho

**Tempo por Item**
- Média de segundos por item separado no período.
- Comparado à mediana geral do período (usado como referência de velocidade no score).

### 3. Carregamento

**Cubagem de Carregamento**
- Soma do volume (m³) dos itens bipados nas missões de carregamento (tipo_missao_id = 3).
- Pode diferir da cubagem de separação quando há ajustes no carregamento.

**Lead Time Sep→Carg**
- Calculado por romaneio: `inicio_carregamento − fim_separacao` (em minutos).
- Valor exibido = mediana de todos os romaneios do período.
- Romaneios sem separação registrada são excluídos do cálculo.

### 4. Ranking

**Score de Conferente (0–100)**
- Fórmula: `acurácia×0,60 + baixo_retrabalho×0,40`
  - **Acurácia (60%):** `(1 − erros/cargas) × 60` — menor taxa de erros = maior score
  - **Baixo Retrabalho (40%):** `(1 − retrabalho_pct/100) × 40`
- Faixas semafóricas: mesmas do score de separador (≥ 70 / ≥ 45 / < 45)

**Erros de Conferência**
- Contados pelo campo `separou_errado = 1` nos itens de carregamento.
- Cada (pedido_id, produto_id) acusado conta como 1 erro, independentemente da quantidade.
- O conferente que acusa o erro é quem registra `separou_errado`; o separador associado é o `concluido_por` da missão de separação correspondente.

**Liderança de Rota**
- Um separador é "líder" numa rota quando é o `responsavel_id` da missão de separação.
- O ranking conta quantas rotas distintas cada separador liderou no período.

### 5. Pesagem

**O que é pesagem**
- Registro do peso real dos volumes/caixas no momento do carregamento.
- Permite comparar peso conferido vs peso esperado (do sistema/ERP).

**Divergência de Peso**
- Diferença absoluta e percentual entre peso_conferido e peso_esperado.
- Acima de um threshold configurable, o item é marcado como divergente.

**Métricas de Pesagem**
- Total de pesagens no período.
- Peso total conferido (kg).
- Percentual de itens dentro da tolerância.
- Ranking de conferentes por volume pesado.

### 6. Erros

**Erros de Separação vs Erros de Carregamento**
- **Erro de separação:** identificado durante o carregamento (`separou_errado = 1`). Responsabilidade do separador.
- **Erro de carregamento:** registrado durante o próprio carregamento (quantidade_carregada ≠ quantidade_esperada). Responsabilidade do motorista/conferente.

**O que aciona cada tipo**
- Erro de separação: conferente bipa um item e detecta que foi separado incorretamente (produto errado, quantidade errada no nível do SKU).
- Erro de carregamento: discrepância entre o que foi carregado no caminhão e o manifesto da rota.

---

## Implementação

### Arquivos modificados
- `html/dashboard.php` — adicionar botão `?` na `dash-tabs-row`, adicionar HTML do modal no final (antes do modal de drill-down existente), adicionar CSS no bloco `<style>` existente
- `html/dashboard.js` — nenhuma mudança necessária (Bootstrap modal abre via `data-bs-toggle`)

### CSS (prefix `dash-info-`)
- `.dash-info-secao` — título de seção com divisor
- `.dash-info-card` — card de definição com borda sutil
- `.dash-info-formula` — bloco de código com fundo escuro para exibir fórmulas
- `.dash-info-semaforo` — linha com badge colorido + threshold

### Nenhum backend necessário
Todo o conteúdo é estático. Nenhuma query, nenhum handler de API, nenhuma migration.

---

## Não está no escopo

- Editar textos das explicações via admin/CMS
- Internacionalização (i18n) — conteúdo em PT-BR apenas
- Links âncora diretos para métricas específicas
- Versão móvel dedicada (Bootstrap responsivo já cobre)
