-- =====================================================
-- Migration 005: Divergências de inventário (fase 2)
-- Feature: inventario-ciclico
-- Data: 2026-06-29
-- =====================================================
--
-- Uma divergência por (ciclo, alvo, produto) quando |contado - esperado| > tolerância.
-- A cadeia de recontagens é representada por `rodada` (1ª contagem, 2ª, …).
--
-- Conjunto COMPLETO de colunas de auditoria/block (espelha wms_movimentos) — exigido
-- por ModelInteligencia::create() (memória modelinteligencia_create_audit_columns).
-- =====================================================

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

    plano_id            INTEGER       NOT NULL,
    ciclo_id            INTEGER       NOT NULL,
    missao_logistica_id INTEGER,                            -- missão do ciclo; usada pela correção de ajuste (FK wms_movimentos)
    alvo_id             INTEGER,
    produto_id          INTEGER       NOT NULL,
    localizacao_codigo  VARCHAR(120),

    qtd_esperada        NUMERIC(14,4) NOT NULL DEFAULT 0,
    qtd_contada         NUMERIC(14,4) NOT NULL DEFAULT 0,
    diferenca           NUMERIC(14,4) NOT NULL DEFAULT 0,   -- contado - esperado (sinal indica sobra/falta)

    rodada              INTEGER       NOT NULL DEFAULT 1,
    status              VARCHAR(20)   NOT NULL DEFAULT 'aberta', -- aberta|recontagem|escalada|ajustada|resolvida|descartada
    conferente_id       INTEGER,
    resolvida_em        TIMESTAMP WITHOUT TIME ZONE,

    -- Audit/block padrão Galaxia (injetado pelo framework no create/update; sem DEFAULT)
    data_cadastro       TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW(),
    usuario_cadastro    VARCHAR(120),
    data_atualizacao    TIMESTAMP WITHOUT TIME ZONE,
    usuario_atualizacao VARCHAR(120),
    block_data          TIMESTAMP WITHOUT TIME ZONE,
    block_quem          VARCHAR(120),
    block_filial_id     INTEGER,
    block_usuario_id    INTEGER,
    block_empresa_id    INTEGER,
    block               INTEGER
);

CREATE INDEX IF NOT EXISTS idx_inv_diverg_plano  ON inventario_divergencias (plano_id, block);
CREATE INDEX IF NOT EXISTS idx_inv_diverg_ciclo  ON inventario_divergencias (ciclo_id, block);
CREATE INDEX IF NOT EXISTS idx_inv_diverg_status ON inventario_divergencias (plano_id, status);
