-- =====================================================
-- Migration 002: Tabela de alocações WMS (1:N produto↔localização)
-- Feature: alocacao-wms
-- Data: 2026-06-08
-- =====================================================
--
-- Cada confirmação de alocação gera uma linha nova (acumula, não sobrescreve).
-- A localização efetiva de um produto é a mais recente (MAX confirmada_em).
-- Colunas integracao_* são indexadas parcialmente para varredura de retry pelo worker.
--
-- Block columns sem DEFAULT (feedback_block_columns); customerControl=true.
-- =====================================================

CREATE TABLE wms_alocacoes (
    id SERIAL PRIMARY KEY,

    -- Vínculo com missão
    missao_logistica_id  INTEGER NOT NULL
        REFERENCES missao_logistica(id) ON DELETE CASCADE,

    -- Item da missão (opcional — para reconciliação de status do item)
    missao_item_id       INTEGER,

    -- Produto alocado
    produto_id           INTEGER NOT NULL,

    -- Localização confirmada
    localizacao_codigo   VARCHAR(64) NOT NULL,
    wms_localizacao_id   INTEGER
        REFERENCES wms_localizacoes(id) ON DELETE SET NULL,

    -- Quantidade informada (NULL quando não obrigatória — decisão #2)
    quantidade           NUMERIC(14,3),

    -- Origem da leitura (AC3.3 — auditoria)
    origem_leitura       VARCHAR(20) NOT NULL DEFAULT 'codigo_barras',
        -- codigo_barras | manual

    -- Estado da alocação
    status               VARCHAR(20) NOT NULL DEFAULT 'confirmada',
        -- confirmada | cancelada

    -- Operador que confirmou
    operador_id          INTEGER NOT NULL,
    confirmada_em        TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW(),

    -- Estados de integração (AC5.2/5.3) — colunas dedicadas para índice parcial e retry
    integracao_erp       VARCHAR(20) NOT NULL DEFAULT 'pendente',
        -- pendente | enviado | falha
    integracao_wms       VARCHAR(20) NOT NULL DEFAULT 'pendente',
    integracao_erp_em    TIMESTAMP WITHOUT TIME ZONE,
    integracao_wms_em    TIMESTAMP WITHOUT TIME ZONE,
    integracao_erro      TEXT,
        -- última mensagem de falha (AC5.3 — não some silenciosamente)

    -- Auditoria — ModelInteligencia::create() injeta estas colunas automaticamente (sem DEFAULT)
    usuario_cadastro     VARCHAR(100),
    data_atualizacao     TIMESTAMP WITHOUT TIME ZONE,
    usuario_atualizacao  VARCHAR(100),
    block_data           TIMESTAMP WITHOUT TIME ZONE,
    block_quem           VARCHAR(100),

    -- Block padrão Galaxia (preenchido pelo framework; sem DEFAULT)
    data_cadastro        TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW(),
    block_filial_id      INTEGER,
    block_usuario_id     INTEGER,
    block_empresa_id     INTEGER,
    block                INTEGER
);

-- Lookup por missão (listar alocações da missão)
CREATE INDEX idx_wms_alocacoes_missao
    ON wms_alocacoes (missao_logistica_id, block);

-- Lookup por produto (histórico de localizações do produto)
CREATE INDEX idx_wms_alocacoes_produto
    ON wms_alocacoes (produto_id, block);

-- Fila de retry ERP — worker varre apenas pendente/falha
CREATE INDEX idx_wms_alocacoes_integ_erp
    ON wms_alocacoes (integracao_erp, block)
    WHERE integracao_erp IN ('pendente', 'falha');

-- Fila de retry WMS — worker varre apenas pendente/falha
CREATE INDEX idx_wms_alocacoes_integ_wms
    ON wms_alocacoes (integracao_wms, block)
    WHERE integracao_wms IN ('pendente', 'falha');
