# Implementação frontend — Fase 1: Tela de config por empresa

## Views criadas

- `componentes/Missoes/Logistica/sinais/IntegracaoWms/html/integracaowms.php` (+`integracaowms.js`) —
  Tela de configuração de integração WMS por empresa. Exibe toolbar Metronic com
  breadcrumb, badges de status (config salva / padrão de fábrica), aviso sobre missões
  futuras, e três cards de formulário (Saída, Credenciais, Entrada). Submit via AJAX,
  resposta processa toastr + atualiza campos sem reload.

## Forms

- `componentes/Missoes/Logistica/sinais/IntegracaoWms/forms/salvar_integracao_wms_config.php` —
  Markup de referência dos campos aceitos por `IntegracaoWms::processarSalvar()` /
  `SalvarConfigLaboratorio::salvar()`. Serve como documentação viva dos campos
  (`provedor_saida`, `ativo_saida`, `endpoint_erp`, `endpoint_wms`, `ativo_entrada`,
  `contrato_versao`, `token_saida_ref`). O formulário na view é inline (não usa
  `visualFormulario`) porque `SalvarConfigLaboratorio` é um Lab de serviço, não um
  Satélite com o constructor Galaxia.

## Controller atualizado

- `componentes/Missoes/Logistica/sinais/IntegracaoWms/IntegracaoWms.php` —
  `start()` implementado: despacha para `processarSalvar()` quando
  `sinalGxData='salvar-config'` (resposta JSON + exit), ou para `renderView()` caso
  contrário (HTML via `visual()` + `addResponse/getResponse`). `bootstrap()` é chamado
  no início de `start()` para garantir que os provedores estejam registrados.

## i18n

28 chaves adicionadas (26 novas + "Início" + "Empresa") nas 3 línguas (pt-br / en / es):

| Chave MD5 | Texto PT | EN | ES |
|---|---|---|---|
| `2ad0b33fe35f04c6b98ddb3cfe62a784` | Integração WMS | WMS Integration | Integración WMS |
| `02fb5d993ca83387d280fc5b44452ab3` | Configuração de integração por empresa | Integration configuration by company | Configuración de integración por empresa |
| `83389e796c381e9f0f09b21f3ce5392d` | Sem configuração salva (padrão de fábrica) | No configuration saved (factory default) | Sin configuración guardada (configuración de fábrica) |
| `04b2b633949bbe26bebac345a62c9fac` | Voltar | Back | Volver |
| `929d97c1f26ac658c0ce02d3e4a86573` | Saída (push para WMS/ERP) | Output (push to WMS/ERP) | Salida (push a WMS/ERP) |
| `7d4b0733e972dd1454851938e33bc091` | Provedor de saída | Output provider | Proveedor de salida |
| `142ff57e3330b1e4fbaccf9c93f19214` | Envio ativo (saída) | Active sending (output) | Envío activo (salida) |
| `3b0a8b8bba3bd9dbf10ce6615261f206` | Entrada (receiver WMS) | Input (WMS receiver) | Entrada (receptor WMS) |
| `72d031575d27a7401ad4c5983c3e478b` | Receiver ativo (entrada) | Active receiver (input) | Receptor activo (entrada) |
| `f53ce1b2ea3ef3fb30d2b8e410014aa9` | Versão do contrato | Contract version | Versión del contrato |
| `59b0884e34acfd7539e5e438d9a327df` | Referência do token de saída | Output token reference | Referencia del token de salida |
| `e128970088cd7232f6fcbfd168d1e352` | Galpão (legado) | Warehouse (legacy) | Almacén (legado) |
| `fde45ae5c0aa1c1464db6304d14a4a2d` | WMS externo (HTTP) | External WMS (HTTP) | WMS externo (HTTP) |
| `52c7d425dbb8154af27b3efd267ff567` | Erro ao salvar configuração WMS. Tente novamente. | Error saving WMS configuration. Please try again. | Error al guardar la configuración WMS. Inténtelo de nuevo. |
| `94db4e176ba1ffd04818a56e13726354` | Início | Home | Inicio |
| `9bc720ee848837cb54773b0888d1aec6` | Empresa | Company | Empresa |
| _(+12 de dicas/hints inline)_ | — | — | — |

Chaves pré-existentes reusadas (já estavam nas 3 linguagens):
- `959171f822deee0a55679de7d0b9fa36` → "Salvar configuração"
- `7090e8d25986f629782c4a5aa3c63ce5` → "Configuração salva"
- `ef2dad27baa0d85baee8a74313a4f41c` → "Empresa não identificada na sessão."
- `9815ac71d8d68066116c7c612b6cf494` → "Configuração salva com sucesso."
- `38fc5b6798a5cb8d8cd3e96833cbfc95` → "Última atualização:"

## Laboratórios consumidos

| Lab | Método | Parâmetros | Retorno |
|---|---|---|---|
| `ConsultarConfigLaboratorio` | `consultar(int $empresaId)` | ID da empresa | `object` (config real ou `configDefault()`) |
| `SalvarConfigLaboratorio` | `salvar(int $empresaId, array $dados)` | ID + campos de config | `array{ok: bool, erro?: string}` |

Fluxo do controlador:
- **GET (navegação)**: `start()` → `renderView()` → `ConsultarConfigLaboratorio::consultar()` + `WmsProviderRegistry::listar()` → `visual('html/integracaowms')` → `addResponse/getResponse`
- **POST AJAX** (`sinalGxData=salvar-config`): `start()` → `processarSalvar()` → `IntegracaoWmsConfigSonda::resolverEmpresaIdAtual()` → `SalvarConfigLaboratorio::salvar()` → JSON + exit

## Decisões de implementação

1. **Sem `visualFormulario`**: `SalvarConfigLaboratorio` é um Lab de serviço (constructor `consultar/salvar`), não um Satélite Galaxia (constructor `($galaxia, $opcao, $data)`). O formulário é inline na view e o JS faz o AJAX diretamente ao controller com `sinalGxData='salvar-config'`.

2. **URL do AJAX**: injetada no atributo `data-ajax-url` do `<form>` via `goldie_url('missao') . '/Logistica/IntegracaoWms'`. O JS lê via `$('#iwms-form').data('ajax-url')`.

3. **`contrato_versao` desabilitado quando `ativo_entrada=0`**: o JS desabilita o campo via `_toggleContratoVersao()` para sinalizar visualmente que a versão do contrato só é relevante quando o receiver está ativo.

4. **`bootstrap()` em `start()`**: garante que os provedores (`galpao`, `http_wms`) estejam registrados mesmo quando o controller é invocado fora do ciclo normal do `Api/Bootstrap.php`.

## Smoke test sugerido

1. Navegar para `/missao/Logistica/IntegracaoWms` → deve renderizar a tela de config com toolbar Metronic, breadcrumb "Início > Configuração de integração por empresa", badge "Sem configuração salva (padrão de fábrica)" e 3 cards (Saída, Credencial, Entrada).

2. Sem migration aplicada: a tela ainda deve renderizar (guard `obterConfig` captura exceção e retorna `configDefault()`). Toastr de erro ao tentar salvar (tabela ausente).

3. Com migration `001_create_integracao_wms_config.sql` aplicada: preencher Endpoint ERP com `https://exemplo.com/erp`, marcar "Envio ativo", clicar "Salvar configuração" → toastr verde "Configuração salva com sucesso." + badge muda para "Configuração salva" sem reload.

4. Recarregar a página → formulário pré-preenchido com os valores salvos, "Última atualização: DD/MM/AAAA HH:MM".

5. Abrir o select de "Provedor de saída": opção "Galpão (legado)" selecionável; "WMS externo (HTTP) (Fase 2 — em breve)" aparece desabilitada (cinza, não clicável).

6. Desmarcar "Receiver ativo (entrada)" → campo "Versão do contrato" desabilita (opacity 0.5) automaticamente via JS.

7. Verificar empresa sem config: `WmsProviderFactory::build('galpao')` continua funcionando (não-regressão). Rodar `GalpaoProviderParidadeTddTest` para confirmar paridade de payload.

8. (Erro de rede) Desconectar da rede e tentar salvar → toastr de erro deve exibir a string traduzida vinda de `data-str-erro-rede` (não PT hardcoded).

---

## Correções pós-review (06-review.md)

### M2 — Provedor stub `http_wms` desabilitado na UI

**Arquivos alterados**:
- `componentes/Missoes/Logistica/sinais/IntegracaoWms/html/integracaowms.php`
- `componentes/Missoes/Logistica/sinais/IntegracaoWms/forms/salvar_integracao_wms_config.php`

**O que mudou**: O loop de renderização do `<select id="iwms_provedor_saida">` agora detecta `http_wms` como stub de Fase 2. A opção recebe `disabled` e o rótulo ganha o sufixo i18n `show('(Fase 2 — em breve)')`. O gestor vê a opção visivelmente desativada (cinza, não clicável) e entende que virá depois, sem risco de travar o push do tenant.

### m4 (nit) — String PT hardcoded no JS substituída por i18n

**Arquivo alterado**: `componentes/Missoes/Logistica/sinais/IntegracaoWms/html/integracaowms.js` linha ~161

**O que mudou**: `toastr.error('Erro de rede. Verifique a conexão e tente novamente.')` foi substituído por leitura do atributo `data-str-erro-rede` injetado no `<form>` via PHP (`show('Erro de rede. Verifique a conexão e tente novamente.')`). O atributo foi adicionado em `integracaowms.php`. O fallback hardcoded permanece apenas como guard para contextos sem DOM.

### i18n — 2 chaves novas nas 3 línguas

| Chave MD5 | Texto PT | EN | ES |
|---|---|---|---|
| `c78c0961f3b130d1d78e68d30463c4f0` | (Fase 2 — em breve) | (Phase 2 — coming soon) | (Fase 2 — próximamente) |
| `fba31adb5c3cc3209e4178a432343874` | Erro de rede. Verifique a conexão e tente novamente. | Network error. Check your connection and try again. | Error de red. Verifique su conexión e intente de nuevo. |
