-- Migration 002: Ordens recebidas do WMS externo (idempotência + ciclo de report)
-- Fase 2 — Receiver de entrada + tradução (scaffold) + idempotência + origem + ciclo de report
--
-- Regras de tenant:
--   - block_* sem DEFAULT (framework injeta via WmsOrdemSonda::criar())
--   - customerControl=false / companyControl=false: isolamento EXPLÍCITO por
--     block_empresa_id nas queries da Sonda (espelha missao_logistica /
--     IntegracaoWmsConfigSonda) — decisão do techplan: wms_ordens se acopla a
--     missao_logistica (block_empresa_id), NÃO a wms_movimentos (customerControl=true/block).
--   - UNIQUE(block_empresa_id, external_ref): dedup de reenvio (AC6.1/6.2).
--
-- Origem da missão: sem coluna nova em missao_logistica. Quando a Fase 3 plugar
-- tradutores concretos, a missão criada usa referencia_tipo='WMS_ORDEM' +
-- referencia_id=wms_ordens.id (distingue das nativas — AC8.2).
--
-- status: recebida|rejeitada|traduzida|em_execucao|concluida|reportada
--   (Fase 2: só recebida→rejeitada é alcançável — não há tradutor concreto ainda,
--   TraducaoOrdemFactory tem o mapa vazio de propósito. Ver Laboratorios/ReceberOrdemLaboratorio.php)

CREATE TABLE IF NOT EXISTS wms_ordens (
    id                   SERIAL PRIMARY KEY,

    external_ref         VARCHAR(120) NOT NULL, -- id da ordem no WMS — chave de dedup (AC6.1)
    tipo                 VARCHAR(30)  NOT NULL, -- separacao|movimentacao|alocacao|inventario
    contrato_versao      VARCHAR(10)  NOT NULL DEFAULT 'v1',
    status               VARCHAR(20)  NOT NULL DEFAULT 'recebida',

    missao_logistica_id  INTEGER REFERENCES missao_logistica(id) ON DELETE SET NULL,
    motivo               TEXT,        -- razão de rejeição/quarentena (AC5.3, AC4.4) — observabilidade
    payload_bruto        JSONB,       -- envelope recebido (normalizado), p/ reprocesso/auditoria

    recebida_em          TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW(),
    reportada_em         TIMESTAMP WITHOUT TIME ZONE,

    -- multi-tenant: sem DEFAULT (framework injeta via WmsOrdemSonda::criar())
    block_empresa_id INTEGER,
    block_filial_id  INTEGER,
    block_usuario_id INTEGER,
    block            INTEGER,

    data_cadastro        TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW(),
    data_atualizacao     TIMESTAMP WITHOUT TIME ZONE,
    usuario_cadastro     VARCHAR(255),
    usuario_atualizacao  VARCHAR(255)
);

-- idempotência: a mesma ordem reenviada NÃO duplica (AC6.2)
CREATE UNIQUE INDEX IF NOT EXISTS uniq_wms_ordens_ref ON wms_ordens (block_empresa_id, external_ref);
CREATE INDEX IF NOT EXISTS idx_wms_ordens_status ON wms_ordens (status, block_empresa_id);
CREATE INDEX IF NOT EXISTS idx_wms_ordens_missao ON wms_ordens (missao_logistica_id);

-- Corrige ambientes onde a tabela já foi criada sem usuario_cadastro
-- (CREATE TABLE IF NOT EXISTS não altera tabelas existentes — mesma lição do B2
-- da Fase 1, ver PRD/integracao-wms-desacoplada/06-review.md e memória
-- modelinteligencia_create_audit_columns). ModelInteligencia::create() sempre
-- grava usuario_cadastro — sem a coluna, o insert quebra.
ALTER TABLE wms_ordens ADD COLUMN IF NOT EXISTS usuario_cadastro VARCHAR(255);
