Callback de chamadas e Click2Call ligando CRM e PABX nos dois sentidos, com motor de regras e PABX simulado para teste.
O problema
Operação que usa CRM e telefonia separados obriga o agente a registrar a chamada na mão, e o que não é registrado não existe no relatório. A integração ingênua tem dois defeitos previsíveis: o PABX fica esperando o CRM responder, o que atrasa a própria telefonia, e o casamento entre número discado e contato falha porque nenhum banco guarda telefone no mesmo formato que o PABX entrega.
A arquitetura
O callback responde 202 na hora e enfileira, de propósito: o PABX não pode ficar bloqueado esperando o CRM, então o processamento acontece logo depois e o cron serve de rede de segurança. O payload cru é guardado, o que permite reprocessar depois de corrigir uma regra e responder se o evento chegou. O match por telefone compara apenas dígitos e apenas os últimos 8 — a comparação de string inteira erraria quase sempre, porque um número gravado como (11) 3214-5566 nunca casaria com 551132145566 vindo do tronco. As regras são configuráveis em condições JSON, com estratégia de match e política de destino para quando não há vínculo. No sentido inverso, um middleware traduz o HTTP do CRM em Originate na AMI do Asterisk. A segurança do callback tem token comparado com hash_equals, allowlist de IP com CIDR, e X-Forwarded-For só é considerado quando o proxy é declarado confiável — ligá-lo sem proxy à frente tornaria a lista de IPs burlável.
O resultado
Sete cenários validados contra a instalação real, incluindo o reenvio do mesmo uuid, que atualiza em vez de duplicar, e o Click2Call por túnel com as três fases da chamada voltando no mesmo registro. Os testes revelaram dois defeitos que valem para qualquer código que toque o vtiger e ficaram documentados: fetchByAssoc faz HTML-encode por padrão, o que transforma as aspas de um JSON guardado em " e faz o json_decode falhar em silêncio; e a tabela vtiger_pbxmanager não tem coluna callid — o campo de uuid chama-se sourceuuid, e o INSERT falhava calado enquanto o código reportava sucesso. As tabelas são preservadas na desinstalação, porque jogar fora o histórico de chamadas seria destrutivo.


🔒 Código-fonte
git clone https://git.programandosolucoes.com.br/git/repos/vtiger-addon-eventos-discador.git
Código-fonte privado. As credenciais de leitura são liberadas sob solicitação — me chame para conversar sobre o projeto.