MódulosCompras e Suprimentos

CNDs — Certidões Negativas

Cadastro de certidões do fornecedor com classificação automática de status e cron diário de vencimento

Por que importa

Pagar fornecedor com CND vencida cria responsabilidade solidária para a incorporadora — especialmente em empreitada (Lei 9.711/1998 e CLT). Pode gerar passivo trabalhista, previdenciário ou fiscal.

OctaBuild força o registro e monitoramento das CNDs antes de cada pagamento.

Tipos cobertos

TipoEmissor
FederalRFB / PGFN (CND Federal Conjunta)
FGTSCaixa (CRF-FGTS)
TrabalhistaTST (CNDT)
EstadualSEFAZ do estado
MunicipalPrefeitura (ISS)

Cadastrar

Financeiro → Fornecedores → menu ⋮ → Qualificação → aba CNDs

Campos:

  • Tipo (federal / fgts / trabalhista / estadual / municipal)
  • Emissor (UF para estadual, código IBGE para municipal)
  • Número da certidão
  • Validade até (data — campo crítico)
  • Arquivo (PDF/imagem — upload para compras-cnds/ no Supabase Storage)
  • Observações

Status automático

Trigger SQL classifica conforme validade_ate:

StatusQuando
vigenteValidade > 30 dias no futuro
a_vencerValidade entre hoje e +30 dias
vencidaValidade no passado
irregularMarcado manualmente — fornecedor com pendências fiscais
positiva_com_efeitos_negativaManual — para fornecedor com débito mas com situação juridicamente equiparada à negativa

Reclassificação automática a cada update da validade_ate.

Cron diário

/api/cron/cnds-vencimento roda às 14:00 UTC (11h BRT):

  1. Força reclassificação de todas as CNDs (refresca status)
  2. Para cada CND vencida ou a vencer (≤ 7 dias), busca admins/financeiro da org
  3. Envia digest por email (Resend) com lista agrupada:
    • CNDs vencidas (vermelho)
    • CNDs a vencer (amarelo)
  4. Idempotente: não envia mais que 1 email por dia por CND (via ultima_notificacao_em)

Verificação no pagamento

Quando você gera CAP via recebimento ou medição, sistema chama checkSupplierCnds(supplierId):

{
  ok: false,
  bloqueia: true,           // tem vencidas ou irregulares
  alertas: [                // tudo que o usuário precisa ver
    "CND Federal VENCIDA em 15/04/2026",
    "CRF FGTS a vencer em 02/05/2026"
  ],
  bloqueios: [              // só o que MOTIVA o bloqueio (vencidas + irregulares)
    "CND Federal VENCIDA em 15/04/2026"
  ],
  vencidas: [...],
  a_vencer: [...],
  irregulares: [...]
}

Response da geração de CAP retorna cnd_warnings[] e cnd_bloqueia_pagamento. UI mostra alerta antes do pagamento ser efetivado.

Bloqueio rígido (opt-in por organização)

O bloqueio rígido está disponível via configuração e vem desligado: o switch "Bloquear contas a pagar com CND vencida ou irregular", em Configurações → Compras (compras:manage), grava compras_config.bloquear_pagamento_cnd_vencida.

Ligado, a geração da conta a pagar é recusada com 422 nas duas portas — recebimento de material e medição de contrato — e a mensagem lista as certidões de bloqueios para o financeiro saber qual documento renovar. Certidão apenas a vencer nunca bloqueia, e a recusa não consome o direito de gerar o título: regularizada a certidão, o mesmo recebimento vira CAP pelo botão manual.

Por que o default é desligado: a empreitada tem responsabilidade solidária (INSS/FGTS), mas travar pagamento por certidão vencida trava obra — a escolha é da incorporadora. Falha ao ler a configuração também libera o pagamento (fail-open), pelo mesmo motivo.

Visualização

Aba CNDs no qualification dialog mostra cada certidão com:

  • Ícone colorido (verde/amarelo/vermelho)
  • Tipo + emissor
  • "Validade dd/mm/aaaa (em N dias)" ou "(vencida há N dias)"
  • Badge de status
  • Botão para baixar PDF (URL assinada 60s)
  • Botão deletar

Permissões

PermissãoEscopoDefault
cnds:readglobalTodos os roles
cnds:writeglobalFinanceiro, administrativo, diretor, proprietário
cnds:manageglobalFinanceiro, diretor, proprietário (consultas automáticas — phase 2+)

Consulta automática

Para Phase 2.1+: integração com APIs públicas para buscar CNDs automaticamente:

  • Receita Federal (CND Federal)
  • Caixa (FGTS)
  • TST (CNDT)
  • SEFAZ (algumas UFs)

Hoje é cadastro manual + arquivo. Trigger ainda assim mantém o status sempre atual.

Storage

Bucket compras-cnds (privado):

  • RLS por organização: <org_id>/<entity_id>/<filename>
  • Apenas membros da org acessam
  • URL assinada de 60s para download — não fica público

On this page