FATOR X — Contacts Batch

Objetivo

Upsert em lote de contatos do Evolution/WhatsApp (payload jsonb) na base, por instância.

Onde está de fato (verificado 2026-08-09 via MCP)

RPC zapp.fn_process_contacts_batch(p_contacts jsonb, p_instance text DEFAULT 'wpp2') no Supabase self-hosted — NÃO no projeto Cloud tdprnylgyrogbbhgdoik como registros antigos sugeriam. SECURITY DEFINER, search_path zapp, evo, monitoring. Retorna (processed, skipped, error_count).

Grava em zapp.evolution_contacts, que é uma view sobre evo.evolution_contacts (tabela física, fonte de verdade). Ver schema-evolution.

O que faz

  • Aceita array ou objeto jsonb; normaliza para array.
  • skipped = itens sem id/remoteJid.
  • Extrai remote_jid, push_name, phone_number, profile_picture_url. Grupos (@g.us), broadcast e newsletter entram com phone_number = NULL; pessoais extraem o número antes do @.
  • UPSERT ON CONFLICT (remote_jid) DO UPDATE. Modo batch (app.batch_mode) quando > 50 itens.

Fix aplicado em 2026-08-09 — isolamento de erro por item

Problema (medido, não suposto): o upsert era um único INSERT..SELECT. Um item inválido caía no EXCEPTION WHEN OTHERS, abortava o lote inteiro e o retorno era processed = 0 — todos os contatos válidos do lote se perdiam silenciosamente.

Solução: caminho rápido set-based preservado (mesma performance no caso normal); se ele falhar, cai num fallback item-a-item, cada item no seu próprio bloco BEGIN/EXCEPTION. Assinatura, tipo de retorno e semântica de skipped inalterados — nenhum chamador quebra.

Evidência (mesmo lote: 1 válido + 1 sem id + 1 com remote_jid de 67 chars estourando varchar(50)):

Versãoprocessedskippederror_count
antes011
depois111

Lote 100% válido continua no caminho rápido (processed = 2, error_count = 0) — sem regressão. Validado antes em função temporária (zapp._fn_pcb_isolation_test, já removida); dados de teste removidos; total de contatos conferido em 20.716 antes e depois.

Migração registrada: supabase_migrations.schema_migrations versão 20260809120000 (fn_process_contacts_batch_isolamento_erro_por_item).

Ainda em aberto

Projeto Cloud tdprnylgyrogbbhgdoik (FATOR X) não pôde ser inspecionado — sem MCP montado.

Funções irmãs (schema zapp)

anonymize_contacts_batch, get_contacts_360_batch, populate_contact_intelligence_batch, rpc_get_contact_summary_batch, trg_process_contact_event.

Relacionado

schema-evolution · schema-zapp · ids-importantes