feat(web+api): contatos vinculados a clientes com sync ERP e base WhatsApp

DB:
- sar.vw_contatos: view sobre gestao.contato com join sig.corrent
  (id_entidade CHAR20 = id_corrent; cod_vendedor para filtro por rep)
- sar.contatos_novos: staging com nome, cargo, departamento, telefone,
  celular, whatsapp, email, dt_aniversario, anotacoes
- trg_contato_novo: AFTER INSERT → gestao.contato; grava id_contato_erp

API:
- GET  /clients/:id/contacts  — lista contatos ativos do cliente
- POST /clients/:id/contacts  — cria via staging; retorna { idContatoErp, sincronizado }

Web:
- ClientContacts: tabela de contatos no detalhe do cliente
- Links diretos WhatsApp (wa.me) + mailto por contato
- Modal "Novo Contato" com todos os campos; feedback de código ERP no sucesso
- whatsapp é o campo principal para envio futuro via ChatWoot

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-24 17:25:48 +00:00
parent 236dd69eba
commit 34368e8006
8 changed files with 574 additions and 0 deletions

View File

@@ -503,6 +503,37 @@ SELECT
nome
FROM gestao.marca;
-- -----------------------------------------------------------------------------
-- Contatos vinculados a clientes (gestao.contato)
-- id_entidade = id_corrent::text (CHAR 20, auto-pad)
-- Usado para envio via WhatsApp / ChatWoot futuramente
-- -----------------------------------------------------------------------------
CREATE OR REPLACE VIEW sar.vw_contatos AS
SELECT
c.id_contato,
c.id_empresa,
TRIM(c.id_entidade)::integer AS id_corrent,
c.id_chatwoot,
TRIM(c.nome) AS nome,
TRIM(c.empresa) AS empresa,
TRIM(c.cargo) AS cargo,
TRIM(c.departamento) AS departamento,
c.dt_aniversario,
TRIM(c.telefone) AS telefone,
TRIM(c.ramal) AS ramal,
TRIM(c.celular) AS celular,
TRIM(c.whatsapp) AS whatsapp,
TRIM(c.email) AS email,
COALESCE(c.ativo, 1) AS ativo,
c.anotacoes,
TRIM(cr.nome) AS nome_cliente,
TRIM(cr.razao::text) AS razao_cliente,
cr.cod_vendedor
FROM gestao.contato c
LEFT JOIN sig.corrent cr
ON cr.id_corrent = TRIM(c.id_entidade)::integer
WHERE TRIM(c.id_entidade) ~ '^\d+$';
-- =============================================================================
-- PARTE 2 — TABELAS DE ESCRITA DO SAR
-- Dados gerados pelo SAR — não existem no ERP.