Class ColunasConteudo

java.lang.Object
br.com.vantroba.bi.transporte.processamento.ColunasConteudo

public final class ColunasConteudo extends Object
Fonte de verdade única das colunas relevantes ao caminho idempotente UPSERT diff-aware (spec 004 — § 4.2 e § 5.4).

O BulkUpserter consome estas listas para gerar SQL parametrizado (cláusulas SET, WHERE IS DISTINCT FROM e ON CONFLICT). Listas separadas por tabela e papel (UK natural × colunas de conteúdo) — a alteração em qualquer uma delas impacta diretamente o predicado de diff e exige revisão das migrations correspondentes.

Conformidade com o schema deve ser garantida por teste de integração que compara FATURAMENTO_UK e MOVIMENTO_UK com pg_constraint (spec § 9.5 — runbook obrigatório se a chave for alterada).

  • Field Details

    • FATURAMENTO

      public static final List<String> FATURAMENTO
      bi_faturamento — 22 colunas comparadas no WHERE IS DISTINCT FROM do UPSERT. Tudo que não está em FATURAMENTO_UK nem é id ou serie (decisão § 4.2.a: série de NF é praticamente imutável; mudanças nela não disparam UPDATE, evitando churn desnecessário).
    • FATURAMENTO_UK

      public static final List<String> FATURAMENTO_UK
      bi_faturamento — 10 colunas da chave natural (UK uq_bi_faturamento_natural com NULLS NOT DISTINCT).
    • MOVIMENTO

      public static final List<String> MOVIMENTO
      bi_movimento — 11 colunas comparadas no WHERE IS DISTINCT FROM do UPSERT. Tudo que não está em MOVIMENTO_UK (que já inclui as 16 cols da chave + o desempate seq_dentro_grupo) nem é id.
    • MOVIMENTO_UK

      public static final List<String> MOVIMENTO_UK
      bi_movimento — 17 colunas da chave natural (UK uq_bi_movimento_natural). As primeiras 16 são o "evento físico" (atomicidade do lançamento contábil); seq_dentro_grupo desempata duplicatas legítimas (ver spec § 4.1.b).
    • MOVIMENTO_CHAVE_GRUPO

      public static final List<String> MOVIMENTO_CHAVE_GRUPO
      bi_movimento — 16 colunas da chave do "evento físico" (sem seq_dentro_grupo). Usada pelo BulkUpserter ao calcular o seq em Java (Map+AtomicInteger) antes do COPY.
    • PRESERVAR_SE_VAZIO_NA_ENTRADA

      public static final List<String> PRESERVAR_SE_VAZIO_NA_ENTRADA
      Subconjunto de FATURAMENTO e MOVIMENTO cujo valor de entrada "vazio" — NULL, string vazia ou 0 — não sobrescreve o valor já gravado no UPSERT (extensão da spec 004; ver javadoc do BulkUpserter).

      São os cinco campos de cadastro de veículo/frota. A planilha da origem com frequência não os traz preenchidos, e um SET col = EXCLUDED.col cego apagaria correções de cadastro aplicadas direto no banco. O BulkUpserter resolve isso aplicando COALESCE(NULLIF(EXCLUDED.col, <sentinela>), <tabela>.col) tanto na cláusula SET quanto no WHERE IS DISTINCT FROM.

      Consequência: uma vez preenchidos, esses campos só podem ser limpos ou zerados via script no banco — nunca por um upload de Excel.

    • SENTINELAS_TEXTO

      public static final Map<String, List<String>> SENTINELAS_TEXTO
      Sentinelas textuais de "vazio na entrada" por coluna — usadas pelo BulkUpserter.valorEfetivo(String, String) para encadear NULLIFs e proteger contra sobrescrita por placeholders do ERP ('SEM MARCA'/'SEM MODELO').

      A primeira sentinela é sempre "" (string vazia); placeholders específicos vêm depois. Spec 006 — Req. 7 (reforço da preservação).

      Colunas numéricas (ano_construcao, ano_modelo) não aparecem aqui — usam NULLIF(col, 0) no BulkUpserter.