-- =====================================================
-- Tabela de cache do Dashboard Expedicao
-- Granularidade: 1 linha por (block, dia_efetivo, grupo_regiao_id)
-- grupo_regiao_id = 0 → bucket "Outros" (pedidos cuja regiao_id
--                       não está em nenhum grupos_regioes do block)
-- =====================================================

BEGIN;

CREATE TABLE IF NOT EXISTS dashboard_expedicao_cache (
    id SERIAL PRIMARY KEY,
    dia_efetivo DATE NOT NULL,
    grupo_regiao_id INTEGER NOT NULL DEFAULT 0,
    grupo_regiao_nome VARCHAR(255) NOT NULL DEFAULT 'Outros',

    -- Faturamento
    faturamento_total           NUMERIC(18,2) NOT NULL DEFAULT 0,
    faturamento_proprios        NUMERIC(18,2) NOT NULL DEFAULT 0,
    faturamento_terceiros       NUMERIC(18,2) NOT NULL DEFAULT 0,

    -- KM (vem dos plan_* enriquecidos por Analises::romaneios)
    km_total                    NUMERIC(18,4) NOT NULL DEFAULT 0,
    km_ida                      NUMERIC(18,4) NOT NULL DEFAULT 0,
    km_volta                    NUMERIC(18,4) NOT NULL DEFAULT 0,
    km_pedidos                  NUMERIC(18,4) NOT NULL DEFAULT 0,
    km_proprios                 NUMERIC(18,4) NOT NULL DEFAULT 0,
    km_terceiros                NUMERIC(18,4) NOT NULL DEFAULT 0,

    -- Cubagem
    cubagem_utilizada_total     NUMERIC(18,4) NOT NULL DEFAULT 0,
    cubagem_utilizada_proprios  NUMERIC(18,4) NOT NULL DEFAULT 0,
    cubagem_utilizada_terceiros NUMERIC(18,4) NOT NULL DEFAULT 0,
    cubagem_disponivel_total    NUMERIC(18,4) NOT NULL DEFAULT 0,
    cubagem_disponivel_proprios NUMERIC(18,4) NOT NULL DEFAULT 0,
    cubagem_disponivel_terceiros NUMERIC(18,4) NOT NULL DEFAULT 0,

    -- Quantidades
    qtd_pedidos                 INTEGER NOT NULL DEFAULT 0,
    qtd_clientes_distintos      INTEGER NOT NULL DEFAULT 0,
    qtd_cidades_distintas       INTEGER NOT NULL DEFAULT 0,
    qtd_segmentos_distintos     INTEGER NOT NULL DEFAULT 0,
    qtd_produtos_distintos      INTEGER NOT NULL DEFAULT 0,
    qtd_romaneios               INTEGER NOT NULL DEFAULT 0,
    qtd_romaneios_veiculos      INTEGER NOT NULL DEFAULT 0,
    qtd_veiculos_total          INTEGER NOT NULL DEFAULT 0,
    qtd_veiculos_proprios       INTEGER NOT NULL DEFAULT 0,
    qtd_veiculos_terceiros      INTEGER NOT NULL DEFAULT 0,

    -- Volume / peso
    volume_produtos             NUMERIC(18,4) NOT NULL DEFAULT 0,
    peso_bruto                  NUMERIC(18,4) NOT NULL DEFAULT 0,
    peso_liquido                NUMERIC(18,4) NOT NULL DEFAULT 0,

    -- Tempo (numerador/denominador para média ponderada na leitura)
    criacao_minutos_total                  NUMERIC(18,2) NOT NULL DEFAULT 0,
    tempo_medio_entre_pedidos_soma         NUMERIC(18,4) NOT NULL DEFAULT 0,
    tempo_medio_entre_pedidos_amostras     INTEGER       NOT NULL DEFAULT 0,
    distancia_media_entre_pedidos_soma     NUMERIC(18,4) NOT NULL DEFAULT 0,
    distancia_media_entre_pedidos_amostras INTEGER       NOT NULL DEFAULT 0,

    -- Block padrão (preenchido pelo framework via customerControl/companyControl)
    block                  INTEGER NOT NULL,
    block_empresa_id       INTEGER,
    block_filial_id        INTEGER,
    block_usuario_id       INTEGER,
    block_setor_id         INTEGER,
    block_quem             VARCHAR(255),
    block_data             TIMESTAMP WITHOUT TIME ZONE,
    data_cadastro          TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW(),
    data_atualizacao       TIMESTAMP WITHOUT TIME ZONE,
    usuario_cadastro       VARCHAR(255),
    usuario_atualizacao    VARCHAR(255),

    CONSTRAINT dashboard_expedicao_cache_unq UNIQUE (block, dia_efetivo, grupo_regiao_id)
);

CREATE INDEX IF NOT EXISTS dashboard_expedicao_cache_block_dia
    ON dashboard_expedicao_cache (block, dia_efetivo);

COMMIT;
