Compliance de contato
Esta é a garantia central do produto: nenhuma mensagem sai sem passar pelo motor de compliance — avaliado imediatamente antes de cada envio, com o estado mais fresco do banco, e não como uma configuração estática checada uma vez por dia. Cobrar no horário errado, no dia errado ou a pessoa errada não é só má prática: dependendo da UF, é infração legal.
A ordem dos vetos
Antes de todo envio, o motor avalia quatro barreiras, nesta ordem. A primeira que reprovar decide o destino da mensagem:
- Supressão ativa — vence qualquer condição de etapa. Se existe uma supressão cobrindo a pessoa, a dívida ou o canal, a mensagem é suprimida (não sai, com o motivo registrado).
- Trava jurídica (
legal hold) — cobrança sob trava jurídica não gera nenhum contato. - Janela legal da jurisdição — fora da janela de horário permitida na UF do devedor, a mensagem é reagendada para a próxima abertura, nunca descartada.
- Limites por pessoa — teto diário, semanal e intervalo mínimo entre contatos. Estourou, reagenda.
O resultado é sempre um de três: enviar, suprimir (com motivo tipado) ou reagendar (com o próximo horário permitido calculado). Tudo fica registrado.
Janelas legais por UF
Não existe "janela nacional" na lei brasileira — as regras de horário de cobrança são estaduais. O sistema mantém uma biblioteca de políticas por jurisdição, versionada e com vigência:
- São Paulo (
BR-SP) — Lei estadual 15.426/2014: segunda a sexta das 8h às 20h, sábado das 8h às 14h; vedado aos domingos e feriados. - Default conservador nacional (
BR) — aplicado quando não há lei estadual mapeada para a UF do devedor: a mesma janela conservadora (seg–sex 8h–20h, sáb 8h–14h, domingos e feriados vedados).
A jurisdição vem da UF do endereço do devedor; devedor sem UF válida no cadastro cai na regra nacional conservadora. A política pode variar também por canal e por tipo de pessoa (física/jurídica), e a resolução segue a precedência: regra da UF específica da sua organização → regra da UF na biblioteca legal → regra nacional da organização → regra nacional da biblioteca. Se nada casar, vale o default conservador embutido no código.
Os horários são avaliados no fuso da organização (padrão America/Sao_Paulo).
Feriados
Quando a política veda feriados (o padrão), o motor bloqueia os feriados nacionais: os fixos (1º/jan, Tiradentes, 1º/mai, 7/set, 12/out, 2/nov, 15/nov, Consciência Negra — Lei 14.759/2023 — e Natal) e os móveis calculados pela Páscoa (segunda e terça de carnaval, sexta-feira santa e Corpus Christi). Envio que cairia num feriado é reagendado para o próximo dia com janela aberta.
Limites por pessoa — não por cobrança
Os limites de frequência valem para a pessoa, somando todos os canais, todas as cobranças e todas as réguas. Um devedor com cinco dívidas não recebe cinco vezes mais mensagens.
| Limite | Padrão |
|---|---|
| Máximo por dia | 2 contatos |
| Máximo por semana | 6 contatos |
| Intervalo mínimo entre contatos | 4 horas |
Esses são os padrões conservadores; podem ser personalizados por organização (configuração contactPolicy da conta). Contam para o limite apenas mensagens efetivamente enviadas/entregues/lidas — supressões e falhas não consomem cota. Estourou o teto, o envio é reagendado.
Supressões: por que um contato NÃO pode ocorrer
Supressão é um registro tipado, com escopo e evidência — diferente de preferência de canal. "Não quero WhatsApp" é uma coisa; "esta dívida não pode ser cobrada" é outra. Os 12 tipos:
| Tipo | Situação |
|---|---|
opt_out | Devedor pediu para não ser contatado |
third_party | Contato de terceiro (o famoso "não sou eu") |
invalid_contact | E-mail/telefone inválido |
deceased | Pessoa falecida |
fraud | Suspeita de fraude |
dispute | Disputa aberta sobre a dívida |
judicial | Determinação judicial |
lawyer_represented | Devedor representado por advogado |
bankruptcy | Recuperação judicial / falência |
prescription | Dívida prescrita |
vulnerable | Pessoa em situação de vulnerabilidade |
channel_blocked | Canal bloqueado pelo provedor |
Cada supressão tem escopo: pode valer para uma pessoa, para uma dívida específica, ou ambos — e para um canal específico ou todos (channel vazio = todos). Tem também vigência (activeFrom/expiresAt) e pode ser revogada com registro. Na avaliação, basta uma supressão ativa cobrindo pessoa ou dívida, no canal em questão ou em todos, para vetar o envio — e supressão tem precedência sobre tudo: condição de etapa, campanha, urgência da operação.
A criação e a revogação de supressões entram na trilha de auditoria com tipo, escopo, origem e evidência.
Reagendamento — nunca descarte silencioso
Quando o veto é temporal (fora de janela, limite diário/semanal, intervalo mínimo), o motor calcula o próximo instante permitido — a abertura da janela de hoje, o início do próximo dia útil com janela, ou o fim do intervalo mínimo — e reagenda. A mensagem não some: ela sai na primeira oportunidade legal, e o registro mostra o motivo do adiamento (outside_legal_window_BR-SP, daily_contact_limit, min_contact_interval...).
Última linha de defesa: revalidação no worker
Compliance na hora de agendar não basta: o pagamento pode chegar com o job já na fila. Por isso o worker revalida tudo imediatamente antes de entregar ao provedor: cobrança paga, cancelada, baixada ou negociada, "já paguei" pendente de verificação, trava jurídica e régua pausada — qualquer um desses barra o envio no último milissegundo, com o motivo registrado.