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 semid/remoteJid.- Extrai
remote_jid,push_name,phone_number,profile_picture_url. Grupos (@g.us), broadcast e newsletter entram comphone_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ão | processed | skipped | error_count |
|---|---|---|---|
| antes | 0 | 1 | 1 |
| depois | 1 | 1 | 1 |
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.