-- =====================================================
-- Migration: Sugestões de código de barras pelo operador
-- Data: 2026-05-26
-- =====================================================
--
-- Cada linha é uma sugestão por (missao_origem, produto). UPSERT por
-- (missao_origem_id, produto_id) via unique index parcial sobre status='pendente'.
-- Sugestão cancelada vira soft-delete (status='cancelada').
-- Sugestão consumida pelo callback de finalização guarda link pro ajuste gerado.
--
-- Block columns são populadas pelo framework via customerControl/companyControl;
-- não declarar DEFAULT nem alocar manualmente nas queries.
-- =====================================================

CREATE TABLE missao_codigo_sugestao (
    id SERIAL PRIMARY KEY,

    -- Origem (separação ou carregamento)
    missao_origem_id INTEGER NOT NULL
        REFERENCES missao_logistica(id) ON DELETE CASCADE,

    -- Alvo
    produto_id       INTEGER NOT NULL,
    codigo_sugerido  VARCHAR(64) NOT NULL,

    -- Quem sugeriu (auditoria)
    operador_sugeriu_id INTEGER NOT NULL,

    -- Estado
    status VARCHAR(20) NOT NULL DEFAULT 'pendente',
        -- pendente | consumida | cancelada
    consumida_em_ajuste_id INTEGER
        REFERENCES missao_logistica(id) ON DELETE SET NULL,
    consumida_em           TIMESTAMP WITHOUT TIME ZONE,
    cancelada_em           TIMESTAMP WITHOUT TIME ZONE,

    -- Block padrão Galaxia (preenchido pelo framework)
    data_cadastro       TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW(),
    block_filial_id     INTEGER,
    block_usuario_id    INTEGER,
    usuario_cadastro    VARCHAR(255),
    data_atualizacao    TIMESTAMP WITHOUT TIME ZONE,
    usuario_atualizacao VARCHAR(255),
    block_data          TIMESTAMP WITHOUT TIME ZONE,
    block_quem          VARCHAR(255),
    block               INTEGER,
    block_empresa_id    INTEGER
);

-- Garante 1 sugestão pendente por (origem, produto) — base do upsert idempotente
CREATE UNIQUE INDEX uniq_missao_codigo_sugestao_pendente
    ON missao_codigo_sugestao (missao_origem_id, produto_id, block)
    WHERE status = 'pendente';

-- Lookup pela origem (callback de finalização)
CREATE INDEX idx_missao_codigo_sugestao_origem
    ON missao_codigo_sugestao (missao_origem_id, status, block);

-- Varredura cross-mission de "outras pendentes com mesmo código"
CREATE INDEX idx_missao_codigo_sugestao_codigo_status
    ON missao_codigo_sugestao (codigo_sugerido, status, block);
