--- name: Auditoria Cobranca/Boleto/NFSe 2026-04-17 description: Pente-fino do mecanismo de boleto/cobranca/NFSe — bugs corrigidos, dados contaminados e endpoints de diagnostico type: project originSessionId: ff25db81-a051-4175-8cdc-bc6303f57bf0 --- # Auditoria pente-fino Cobranca/Boleto/NFSe — 2026-04-17 Usuario pediu: "pente fino em todo o mecanismo de boleto e cobranca tudo deve estar perfeitamente alinhado ate as emissoes de nota fiscal". ## Bugs corrigidos neste dia ### 1. CronBoletos — validacao agressiva demais - Antes: exigia `valorPago > 0` + `dataPagamento` para marcar pago. - Problema: Sicoob retorna `valorPago = 0` mesmo em boletos liquidados. - Fix: validar `situacaoBoleto = liquidado` E presenca de "LIQUIDACAO" em `listaHistorico`. ### 2. CronCobrancaAutomatica — gerava proximo mes com atual vencido - Antes: `if (atual_pago || vencimento_passado) gera proximo`. - Problema: cliente fica com 2 boletos, paga o mais novo, o antigo vira dobrado (caso JAC 13/04). - Fix: `if (atual_pago) gera proximo`. ### 3. buscarAditivoAtivo — ignorava aditivos futuros - Antes: query `data_inicio <= hoje`. - Problema: aditivo que comeca no dia seguinte ao fim do contrato era ignorado ao planejar boletos futuros (caso MISLENE). - Fix: parametro `$dataCobertura` — caller passa data do vencimento pretendido. Detalhes em [[bugs_cron_cobranca_2026_04_17]]. ### 4. CronNfseAutomatica — fallback pegava todos servicos - Antes: se cliente nao tinha servico em `cliente_servicos` com match em `nfse_servicos_config`, pegava todos os 10 servicos ativos. - Problema: NFSe saia com todos os 10 servicos listados na descricao (caso JAC). - Fix: sem fallback — ERRA se nao achar match especifico. ### 5. NfseNotaModel::getNotaByBoleto — nao ignorava canceladas - Antes: `whereNotIn('status', ['erro'])`. - Problema: apos cancelar uma NFSe e tentar re-emitir, sistema dizia "ja existe". - Fix: ignora 'erro' E 'cancelada'. ### 6. Flag `boletos.ignorar_sync_sicoob` - Coluna nova: quando 1, cron Sicoob nao altera status desse boleto. - Uso: para boletos reconciliados manualmente (ex: pagamento de outro boleto aplicado a esse em acordo com cliente). ### 7. processarContratoOtimizado — valor calculado com aditivo de HOJE - Antes: `$valorMensal` calculado no inicio do fluxo chamando `buscarAditivoAtivo` sem `$dataCobertura`. - Problema: aditivo MISLENE comeca 30/04, mas cron rodou em 17/04 e usou valor antigo do contrato (R$300 em vez de R$321). - Fix: antes de cada chamada de `gerarBoleto`, recalcular valor com `buscarAditivoAtivo($contratoId, $dataVencimento)`. ### 8. `if ($boletoId)` tratava string como sucesso - Linha 1555: `gerarBoleto` retornava `'contrato_vencido'` (string truthy) tratada como sucesso. - Fix: `if (is_numeric($boletoId) && $boletoId > 0)`. Aplicado para mes atual e proximo. ## Inconsistencias encontradas - 4 boletos pagos antigos sem NFSe (fora janela de 1 mes do cron): JAC 125, Daniela 99, Mislene 115, Marcio 113. Decisao: deixar como esta. - 3 "duplicatas" NFSe com `cliente_id = NULL` sao Magazine Luiza / DF-e importadas (notas tomadas) — nao e bug. - Integridade geral OK: sem boletos com data_pagamento futura, sem pago sem data, sem cancelado com NFSe autorizada. ## Bloqueios cliente/contrato (4 camadas) Usuario exigiu: "clientes inativo ou sem contrato nao e para criar fazer nada + e os encerrados tambem". **Caminhos de geracao de boleto** (todos aplicam as mesmas validacoes): 1. Cron automatico (`CronCobrancaAutomatica`) 2. Botao manual "Gerar Boleto" no Sicoob (`Sicoob::gerarBoleto`) 3. Criacao manual via tela (`Boleto::create` → `criarBoletoCliente`) **Camadas de bloqueio**: 1. **Query principal do cron** (linha 1018-1034): ```php ->whereIn('contratos.status', ['ativo', 'prorrogado']) ->where('(contratos.data_fim >= HOJE OR EXISTS aditivo vigente)') ->where('contratos.deleted_at', null) ->where('clientes.status', 'ativo') ->where('clientes.gerar_boleto', 1) ``` 2. **`processarContratoOtimizado`** (linha 1178): revalida contrato, bloqueia se nao ativo/prorrogado ou data_fim passada sem aditivo. 3. **`clienteContratoAtivo()`** (linha 82-133): centraliza validacao. Chamada em 5 pontos criticos. 4. **`CronNfseAutomatica`** (linha 189-220): bloqueia cliente inativo E contrato nao ativo/prorrogado E contrato vencido sem aditivo. Status `encerrado` nao entra em `['ativo', 'prorrogado']` → bloqueado automaticamente em todas as camadas. ## Ajuste dados deste dia ### Contrato 12 NUTRIBOM Era `ativo` com `data_fim = 2026-04-09` passada → corrigido para `encerrado`. Total bloqueados apos normalizacao: 7 contratos (Cover with Peel, Dopp, Editora Simetria, Idaly, Nutribom x2, Silvana Colchoes). ### Caso JAC 2026-04 (resolvido) - 11/03 boleto 146 gerado (abril, R$195, venc 10/04). - 10/04 146 venceu sem pagamento. - 13/04 cron gerou indevidamente 162 (maio, venc 11/05) — bug da regra antiga. - 16/04 cliente pagou 162 por engano pensando ser abril. - 17/04 acao: aplicar pagamento ao 146, cancelar 162, cancelar NFSe 44/45 erradas, emitir NFSe 46 com servico "Aluguel de Impressora" e competencia 04/2026. ### Estado final boletos JAC - Boleto 146 (abril): `pago` em 16/04 (R$195), `ignorar_sync_sicoob = 1` (Sicoob ainda mostra em aberto). - Boleto 2536/162 (maio): cancelado. - NFSe 94 (n 44, comp 05/26) cancelada no SEFIN. - NFSe 95 (n 45, comp 04/26) com 10 servicos (bug fallback) cancelada. - NFSe 96 (n 46, comp 04/26) emitida com servico correto, enviada a Roseli via WhatsApp Financeiro `553184932799`. ## Endpoints diagnosticos adicionados - `GET /sicoob/diagnostico-boleto/{nossoNumero}?token={CRON_TOKEN_SECRETO}` — consulta direta Sicoob. - `GET /sicoob/cancelar-diagnostico/{nossoNumero}?token={CRON_TOKEN_SECRETO}` — cancela boleto Sicoob sem auth de sessao. - `GET /nfse/cancelar-diagnostico/{notaId}?token={CRON_TOKEN_SECRETO}&motivo=X` — cancela NFSe no SEFIN. Todos token-guarded com `CRON_TOKEN_SECRETO` do `.env`. ## Casos para monitorar - MISLENE boleto 2541 (R$300, cancelado) precisa ser regerado com R$321. Cron regular vai cuidar no proximo ciclo. - Nutribom contrato 12 vencido em 09/04 sem aditivo — verificar se renova ou desativa. ## Estado do banco apos auditoria - Boletos ativos (16): todos consistentes com Sicoob em "Em Aberto". - Contratos sem aditivo vigente: 2 (Nutribom acabou 09/04, Jesiel Telles teste). - Clientes sem cliente_servicos: 0 (todos com contrato ativo). - Duplicatas NFSe: 0. ## Relacionados - [[bugs_cron_cobranca_2026_04_17]] — fix detalhado do `buscarAditivoAtivo` - [[relatorio_sindicancia_2026_04_17]] — relatorio consolidado da mesma data - [[feedback_financeiro_sessao_wa]] — sessao WhatsApp Financeiro obrigatoria - [[nfse_emissao_sefin]] — fluxo de emissao NFSe