# Aprovação WMS inline no painel da missão — Spec

> Data: 2026-06-26 · Feature: operacao-wms (sub-feature) · Tipo: spec de design (brainstorming)
> Pré-requisitos: a aprovação por movimento (`aprovacao_gestor`, modal `revisar_movimentos_wms`,
> `RevisarMovimentosLaboratorio`, `aprovarOperacaoWms` com snapshot scoping) já está implementada —
> ver `14-aprovacao-movimento-wms-spec.md` e os fixes do code-review no `02-techplan.md`.
> Esta spec **realoca** essa UX para dentro do painel detalhado da missão.

## 1. Problema / intenção

Hoje a revisão/aprovação dos movimentos WMS (switches default-on + "Enviar") vive num **modal
acionado pela lista** (`designacoes_lista`). O painel detalhado (`designacao_painel/{ID}`) — onde o
gestor vê o andamento, stats e progresso da missão — **não** mostra os movimentos nem permite
aprovar (o bloco de aprovação lá está desativado: `designacao_painel.php:212` → `if (false)`).

O gestor quer **ver tudo no mesmo lugar**: progresso/andamento **e** o que será enviado (com os
switches), aprovando ali mesmo. Esta spec leva a seção de movimentos (mesma UX) para dentro do
painel e aposenta o modal como superfície de aprovação.

## 2. Decisões tomadas (brainstorming)

| # | Decisão | Escolha |
|---|---------|---------|
| D1 | Visibilidade dos switches | **Sempre visíveis** no painel; o envio/integração só ocorre ao **Aprovar a missão**. |
| D2 | Switches em `em_andamento` | **Visíveis mas read-only** (acompanhamento ao vivo); editáveis só em `aguardando_aprovacao`. |
| D3 | Layout p/ missão WMS | A seção de movimentos **substitui** a tabela de itens (`missao_logistica_itens`) no painel. |
| D4 | "Aprovar missão" | É o **"Enviar"**: dispara `aprovarOperacaoWms` (commit + conclusão + snapshot scoping). |
| D5 | Botão da lista | "Revisar movimentos" passa a **navegar pro painel**; o modal é aposentado. |
| D6 | Barra de progresso (itens) | **Escondida** p/ WMS; mantém header de stats + contador da própria seção (`ligados/total`). |

## 3. Comportamento por estado da missão (no painel)

Para missões WMS (`tipo_missao_id = ALOCACAO_WMS = 14`), o painel troca a tabela de itens pela
**seção de movimentos** (produto, endereço/origem→destino, qtd, quando, switch):

- **`em_andamento`**: lista os movimentos confirmados ao vivo (via Lab `listar`); switches
  **desabilitados** (todos ON = pendente), sem botão "Aprovar". É acompanhamento.
- **`aguardando_aprovacao`**: switches **editáveis** (toggle persiste na hora via `alternar` /
  `alternarTodos`), atalhos "Confirmar todos"/"Descartar todos", contador, e o botão
  **"Aprovar missão"** (= Enviar) que dispara `aprovarOperacaoWms` (commit por movimento +
  conclusão da missão, com o guard de snapshot scoping já existente).
- **`concluido` / `cancelado`**: movimentos read-only como histórico (enviados vs descartados).

```
┌─ designacao_painel/{ID} — Missão WMS #1234 (aguardando aprovação) ─┐
│  [header: stats, duração, cadência]                                │
├────────────────────────────────────────────────────────────────────┤
│  MOVIMENTOS              [Confirmar todos] [Descartar todos]   2/3  │
│  Produto X (123)   A-01-02     7   João 14h28              [ ON ]   │
│  Produto Y (456)   A-01-03     0   João 14h31              [ ON ]   │
│  Produto Z (789)   A-05 → B-12 3   Ana  14h40             [ OFF ]   │
├────────────────────────────────────────────────────────────────────┤
│                                         [ Aprovar missão (2) ▸ ]    │
└────────────────────────────────────────────────────────────────────┘
```

## 4. Arquitetura (reúso máximo — backend não muda)

A lógica de UI já existe inteira no modal `revisar_movimentos_wms.php` (switches, batch
`alternarTodos`, snapshot scoping via `{snapshot_max_id}`, resync na falha, escape XSS,
`rmwRecarregar`). O trabalho é **realocar**, não reescrever.

- **Partial reutilizável**: extrair o conteúdo do modal para um partial parametrizado por
  `missao_id` + `status` (`forms/wms_movimentos_secao.php`). O `status` controla:
  editável vs read-only dos switches (D2) e exibição do botão "Aprovar missão" (só em
  `aguardando_aprovacao`).
- **`designacao_painel.php`**: para missão WMS, inclui o partial de movimentos no lugar do bloco
  da tabela de itens; mantém o header de stats; esconde a barra de progresso baseada em itens (D6).
- **`Designacoes.php`** (controller do painel): expõe à view uma flag `isWms` (e `status`); para
  WMS, pula a montagem/render da tabela de itens.
- **`designacoes_lista.php`**: o branch do botão "Revisar movimentos" (ALOCACAO_WMS) passa a
  **linkar para `designacao_painel/{ID}`** em vez de `abrirModal('revisarMovimentosWms')` (D5).
- **`revisarMovimentosWms`** (controller) + o modal: aposentados como superfície de aprovação. O
  partial passa a ser a única superfície; o método/rota podem ser removidos se nada mais os usa.
- **Backend: nenhuma mudança.** `RevisarMovimentosLaboratorio` (`listar`/`alternar`/
  `alternarTodos`) e `MissoesAprovacao::aprovarOperacaoWms` (commit + CAS + snapshot scoping)
  permanecem idênticos. O "Aprovar missão" usa o mesmo `acaoElemento('aprovarOperacaoWms',
  'missao_id=…&snapshot_max_id={snapshot_max_id}')`.

## 5. Read-only vs editável (D2) — como aplicar

O partial recebe um booleano `editavel = (status === 'aguardando_aprovacao')`:
- `editavel=false`: `<input type="checkbox" ... disabled>`; sem listeners de toggle; sem
  "Confirmar/Descartar todos"; sem botão "Aprovar missão".
- `editavel=true`: comportamento atual do modal (toggle persiste, batch, "Aprovar missão").

Os switches sempre refletem `aprovacao_gestor` (ON = pendente/aprovado, OFF = rejeitado).

## 6. Não-regressão (invariantes)

- O backend de revisão/aprovação não muda → fluxo, gates de integração, snapshot scoping, CAS e
  conclusão seguem idênticos e cobertos pelos 13 testes existentes.
- Missões **não-WMS** no painel: inalteradas (seguem com tabela de itens + barra de progresso).
- A aprovação continua só para gestor logístico, só em `aguardando_aprovacao` (o botão só aparece
  nesse estado).

## 7. Plano de testes

- **Backend**: sem mudança → suíte WMS existente (13 testes / 159 asserts) deve seguir verde.
- **View/controller** (mudanças de apresentação, validadas por `php -l` + smoke no browser):
  - Painel de missão WMS em `aguardando_aprovacao`: renderiza a seção com switches editáveis +
    "Aprovar missão"; aprovar conclui a missão e some/atualiza.
  - Painel de missão WMS em `em_andamento`: seção read-only, sem "Aprovar".
  - Painel de missão **não-WMS**: tabela de itens intacta.
  - Botão da lista navega para o painel.
- **i18n**: strings da seção via `show('texto PT')` nas 3 línguas (auto-harvest + conferir browser).

## 8. Fora de escopo

- Atualização ao vivo (socket/polling) dos movimentos durante `em_andamento` — carrega no open +
  refresh manual; live-update fica para depois.
- Barra de progresso baseada em movimentos (total/aprovados/descartados) — D6 esconde a de itens;
  contador da seção basta por ora.
- Mudanças no fluxo de aprovação backend (já pronto e testado).
- Aprovação de missões não-WMS.
