# Ícone "Endereços" no Carregamento (V2)

**Data:** 2026-07-23
**Escopo:** Estender o ícone "Endereços" (já entregue na Separação/fila única) para a tela de Carregamento V2, que usa um pipeline de renderização diferente (client-side, sem re-render de card por item).

---

## Contexto

A entrega anterior (`2026-07-23-separacao-icone-enderecos-produto-design.md`) construiu:
- `WmsMovimentoSonda::mapaSaldoPorProduto()` — agregação batch produto→endereços+quantidade
- `EnderecosProdutoWmsLaboratorio::resolverMapa()` — fachada sobre a Sonda
- `App::enderecosProdutoWms()` + view do modal — rota interna via `abrirModal()`
- `enderecosProdutoWmsBadge()` — badge PHP estático, plugado em `execucao_card.php` (pipeline "fila única"/Luz)

Essas 4 peças de backend são 100% reaproveitadas aqui, sem nenhuma alteração.

O Carregamento usa um pipeline diferente: `App/html/shared/components/v2/execucao_bipagem.php` (compartilhado com Retorno) + `App/html/carregamento/item.js` (`CarregamentoV2`). O card não é re-renderizado por item — a troca de item é 100% client-side, via `selecionarItem()`/`atualizarTelaExecucao()`. Por isso o badge PHP estático não serve aqui; é preciso o mesmo padrão já usado no próprio `execucao_bipagem.php` pro botão "ACOMPANHAR" (`#btn-status-separacao`): botão renderizado uma vez (oculto), com o `produto_id` reescrito pelo JS a cada troca de item.

---

## Decisões

- **Escopo:** só Carregamento (não Retorno, que usa o mesmo `execucao_bipagem.php`) — novo flag `exibirBadgeEnderecosWms` no `$configTipo`, seguindo o padrão já usado por `exibirBadgeGondola`/`exibirBadgeSequencia`/etc. Retorno não liga o flag, então fica sem o botão (zero mudança pra ele).
- **Fonte do "tem endereço"**: batch precomputado no `CarregamentoPresenter::present()` — 1 chamada a `EnderecosProdutoWmsLaboratorio::resolverMapa()` pra TODOS os produtos da missão (não por item, evita N+1), expondo `tem_enderecos_wms` (bool) em cada item de `jsItensData`. Mesmo espírito do batch de `cubagem_unit` já existente no mesmo Presenter.
- **Botão**: renderizado uma vez em `execucao_bipagem.php`, oculto por padrão (`style="display:none;"`), ao lado do botão "ACOMPANHAR" existente. JS mostra/esconde e reescreve o `produto_id` no `data-galaxia-sinal` a cada troca de item — mesmo mecanismo do `#btn-status-separacao`.
- **Modal**: reaproveita 100% a rota/view já existentes (`App::enderecosProdutoWms()`), sem nenhuma mudança de backend.

---

## Arquivos Tocados

| Arquivo | Mudança |
|---|---|
| `Presenters/CarregamentoPresenter.php` | Batch `EnderecosProdutoWmsLaboratorio::resolverMapa()` + expõe `tem_enderecos_wms` por item |
| `App/html/carregamento/item.php` | Liga `'exibirBadgeEnderecosWms' => true` no `$configTipo` |
| `App/html/shared/components/v2/execucao_bipagem.php` | Lê o flag, renderiza `#btn-enderecos-wms` oculto (condicional) |
| `App/html/carregamento/item.js` (`CarregamentoV2.selecionarItem`) | Mostra/esconde o botão + reescreve `produto_id` a cada troca de item |

**Sem migrations, sem endpoint novo, sem mudança no backend do sinal AlocacaoWms.**

---

## Critérios de Aceitação

1. No Carregamento, produtos com ao menos 1 endereço confirmado exibem o botão "Endereços" ao serem selecionados.
2. Produtos sem endereço não exibem o botão (fica oculto, sem clique em vazio).
3. Ao clicar, abre o mesmo modal já usado na Separação, com a lista de endereços/quantidades do produto atual.
4. Trocar de item atualiza corretamente o botão (mostra/esconde, e o `produto_id` do link é sempre o do item atualmente selecionado).
5. Retorno (que usa o mesmo `execucao_bipagem.php`) não é afetado — o flag nunca é ligado lá.
6. 1 única query nova por carregamento da missão (batch), não 1 por item.
