# Regras de Negocio - Modulo Finance

> Regras implicitas extraidas do codigo. Comportamento, nao implementacao.
> Gerado em 2026-06-18.

---

## 1. Cobrancas

### 1.1 Criacao

- Uma cobranca so pode ser criada se o projeto tiver um cliente faturavel associado (finance_client_id).
- Toda cobranca nasce com bill_status = "Programado" e bill_stage = 1.
- Se o projeto estiver com send_mail desligado no FinanceProject, a cobranca entra automaticamente no modo resumo (summary = 1). Caso contrario, vai como email individual (summary = 0).
- O tag da cobranca indica sua origem: "Manual" (criada pelo usuario), "Recorrencia" (gerada pelo cron), "Campanha" (importada do Monday), "2a Via" (segunda via de cobranca existente).

### 1.2 Edicao

- Uma cobranca so pode ser editada enquanto estiver em bill_stage = 1 (programada).
- Se ja tem dados de pagamento (boleto emitido, NFS-e criada, URL de pagamento), nao pode mais ser editada.

### 1.3 Emissao de Boleto

- So pode emitir quando bill_stage = 1 e sem dados de pagamento.
- Obrigatorio ter email configurado no contato principal do cliente faturavel.
- Apos emissao: bill_stage vai para 2, bill_status vai para "Pendente".
- Ao emitir pelo Asaas: cria pagamento (boleto), cria NFS-e e aprova NFS-e, tudo em sequencia.
- Ao emitir pelo Iugu: cria pagamento via Iugu e NFS-e via Spedy.
- Multa padrao configurada: percentual do FinanceConfig.fine_percentage (padrao 2%).
- Juros padrao: 1% ao mes (fixo).

### 1.4 Cancelamento

**Cobranca programada (bill_stage = 1):**
- Pode cancelar livremente. Resultado: bill_stage = 3, bill_status = "Cancelado", mail_stage = 9.

**Cobranca emitida (bill_stage >= 2):**
- Precisa ter tanto ID de pagamento quanto ID de NFS-e para cancelar.
- Cancela o pagamento no gateway (Asaas ou Iugu) E cancela a NFS-e no emissor (Asaas ou Spedy).
- Resultado: bill_stage = 3, bill_status = "Cancelado", mail_stage = 9.

### 1.5 Pagamento Externo

- Permite marcar como pago fora do sistema.
- A data de pagamento nao pode ser anterior a data de emissao.
- Resultado: bill_stage = 3, bill_status = "Pago Externamente", mail_stage = 9.
- A acao e sincronizada com o gateway (Asaas ou Iugu).

### 1.6 Segunda Via

- So pode ser criada a partir de cobranca em bill_stage = 2 (pagamento ativo).
- Nao pode criar segunda via de cobranca ja paga ou cancelada.
- A NFS-e original e reaproveitada (nao e cancelada).
- A cobranca original e automaticamente cancelada apos a criacao da segunda via.
- A nova cobranca herda a NFS-e e recebe tag = "2a Via", is_second_copy = true, parent_charge_id apontando para a original.
- Se aplicar multa: valor = valor_original + (valor_original * percentual_multa / 100) + (valor_original * (1% / 100) * (dias_atraso / 30)).

### 1.7 Stages e Status

**bill_stage:**
| Stage | Significado |
|-------|-------------|
| 1 | Programada (draft) |
| 2 | Emitida (boleto ativo) |
| 3 | Finalizada (paga, cancelada ou externa) |

**bill_status (armazenados):**
- Programado, Pendente, Pago, Cancelado, Pago Externamente, Reembolsado, Processando, Em protesto, Em analise, Erro, Expirado

**Status calculado:**
- "Vencido" nao e armazenado. E derivado: cobranca com bill_status = "Pendente" e due_date < hoje.

**mail_stage:**
| Stage | Significado |
|-------|-------------|
| 0 | Nenhum email enviado |
| 1 | Email de cobranca gerada enviado |
| 2 | Email "proximo do vencimento" enviado |
| 3 | Email de cobranca vencida enviado |
| 4 | Segunda via gerada, aguardando primeiro email |
| 5 | Cobranca original cancelada (precisa notificar) |
| 9 | Final — nenhuma notificacao mais |

---

## 2. Recorrencia

### 2.1 Geracao de Cobrancas

- So gera cobranca se a recorrencia estiver ativa (active = true) E em stage = 1.
- Gera apenas no dia igual ao issue_day da recorrencia (dia do mes).
- So gera uma cobranca por dia por recorrencia (previne duplicatas).
- Se o ciclo for finito (cycle > 0), para de gerar quando past_cycle >= cycle.
- Se o ciclo for zero, gera indefinidamente.
- Apos gerar: past_cycle incrementa +1, stage muda de 1 para 2.

### 2.2 Reset de Recorrencia

- Recorrencias em stage 2 voltam para stage 1 quando issue_day <= dia atual E ainda tem ciclos disponiveis.
- Resetar ciclos (past_cycle = 0) permite que a recorrencia volte a gerar cobrancas.

### 2.3 Due Date da Recorrencia

- O dia de vencimento e lido de recurrence.due_date (1-31).
- Se o dia nao existe no mes (ex: 31 em fevereiro), ajusta para o ultimo dia do mes.
- Se o cliente tem due_on_working_days_only = true, o vencimento e ajustado para o proximo dia util.

---

## 3. Dias Uteis e Feriados

### 3.1 Definicao de Dia Util

- Dia util = nao e sabado, nao e domingo, nao e feriado.
- Se cai em fim de semana ou feriado, avanca para o proximo dia util.

### 3.2 Feriados Fixos

- 01/01 Confraternizacao Universal
- 21/04 Tiradentes
- 01/05 Dia do Trabalhador
- 07/09 Independencia
- 12/10 Nossa Senhora Aparecida
- 02/11 Finados
- 15/11 Proclamacao da Republica
- 20/11 Consciencia Negra
- 25/12 Natal
- 31/12 Ultimo dia util do ano

### 3.3 Feriados Moveis (baseados na Pascoa)

- Carnaval segunda: Pascoa - 48 dias
- Carnaval terca: Pascoa - 47 dias
- Quarta de Cinzas: Pascoa - 46 dias
- Sexta-feira da Paixao: Pascoa - 2 dias
- Corpus Christi: Pascoa + 60 dias

---

## 4. Resumo de Cobranca (Billing Summary)

### 4.1 Entrada de Projeto no Resumo

- Um projeto so pode entrar no resumo de cobranca se estiver com send_mail = false no FinanceProject.
- Quando o projeto entra no resumo, suas cobrancas recebem summary = 1 (sao agrupadas em vez de enviadas individualmente).

### 4.2 Saida de Projeto do Resumo

- Quando um projeto e removido de um resumo, send_mail e automaticamente reativado (= true) no FinanceProject.
- As cobrancas desse projeto voltam a ser enviadas individualmente.

### 4.3 Sincronizacao de Cobrancas (Bill)

- So entram no bill cobrancas que: bill_status = "Pendente", nfs_status = "authorized", nao vinculadas a outro bill, pertencem aos projetos do resumo.
- Codigo do bill: formato "RC-{summary_id}-{sequencia}".
- Ao criar o bill, todas as cobrancas selecionadas recebem billing_summary_id e summary = true.

### 4.4 Finalizacao Automatica

- Um bill e finalizado automaticamente quando TODAS as cobrancas vinculadas estao em status "Pago", "Pago Externamente" ou "Cancelado".
- Bill finalizado: stage = "Finalizado", mail_stage = 9.

---

## 5. Clientes Faturaveis

### 5.1 Ciclo de Sincronizacao

| Stage | Significado |
|-------|-------------|
| 1 | Novo, precisa sincronizar com API |
| 2 | Modificado, precisa re-sincronizar |
| 3 | Sincronizado com Asaas |

### 5.2 Regras de Sync

- So sincroniza clientes ativos (status = 1).
- CPF/CNPJ e unico — nao permite duplicatas.
- Telefone: >= 11 digitos = celular, >= 10 digitos = fixo.
- Ao criar no Asaas, notificacoes sao desabilitadas (notificationDisabled = true).
- Ao atualizar: somente campos alterados sao enviados (diff entre local e remoto).

---

## 6. Transacoes (Pagamentos Operacionais)

### 6.1 Ciclo de Vida

```
draft → pending → processing → paid
                             → error
                             → rejected
                             → cancelled
draft → scheduled → pending → processing → ...
```

### 6.2 Validacao de Lote

- Para ser processado, cada item draft deve ter: codigo/payload, valor > 0, tipo, descricao, categoria, beneficiario.
- Boleto: codigo de barras de 47 ou 48 digitos (ou 44 convertido). Ultimos 14 digitos todos zero isenta de verificacao de duplicata.
- PIX QR Code: QR Code estatico pode repetir. QR Code dinamico e unico (verifica duplicata pelo payload + conciliation_identifier).
- Transferencia TED: obrigatorio dados bancarios completos. Transferencia PIX: obrigatorio chave PIX.
- Se data de agendamento <= hoje: status vai para "pending" e ProcessPaymentJob e disparado. Se futura: status vai para "scheduled".

### 6.3 Processamento (ProcessPaymentJob)

- Tenta apenas 1 vez (sem retry automatico).
- Se a transacao ja tem ID no gateway e status nao e erro/rejeitado: ignora (idempotencia).
- Asaas: suporta BOLETO, TED, PIX, PIX_QRCODE.
- Iugu: suporta BOLETO, TED, PIX. PIX QR Code NAO e suportado (gera erro).
- Iugu em producao: exige assinatura RSA com chave privada.
- Iugu usa file lock para evitar pagamento duplicado.

### 6.4 Pagamentos Agendados

- Todo dia as 09:00, transacoes com status "scheduled" e schedule_date = hoje sao movidas para "pending" e processadas.
- So processa transacoes que ainda nao tem ID no gateway (id_asaas = null E id_iugu = null).
- Alerta Slack e enviado com a contagem de pagamentos Asaas do dia.

### 6.5 Retry e Exclusao

- So pode reprocessar transacao em status "rejected" ou "error".
- Retry: limpa campos de pagamento, preserva historico no log, muda status para "pending", dispatcha ProcessPaymentJob.
- So pode excluir transacao em status "rejected" ou "error".

### 6.6 Comprovantes

- Comprovante bancario (CB): baixado automaticamente do gateway quando pagamento e confirmado. Armazenado no Google Cloud Storage.
- Comprovante fiscal (CF): vinculado a NF do colaborador quando invoice_expected = true.

---

## 7. Snapshots de Pagamento a Colaboradores

### 7.1 Tipos

**Recorrencia (mensal):**
- Gerado dia 25 de cada mes.
- Inclui todos os colaboradores com pagamento recorrente ativo.
- Valores pre-preenchidos da recorrencia (valor, descricao, prioridade).
- lock_date = ultimo dia do mes.
- Display: referencia o mes seguinte.

**Premio (semestral):**
- Gerado dia 15 de abril e outubro.
- Abril: "Segundo Semestre" — inclui colaboradores que comecaram antes de 31/12 do ano anterior.
- Outubro: "Primeiro Semestre" — inclui colaboradores que comecaram antes de 30/06 do ano corrente.
- Exclui contratos tipo "Estagio" e "Estagio/PJ" (somente PJ).

### 7.2 Ciclo de Vida do Snapshot

```
draft → execution → closed
```

- **Draft**: Itens editaveis. Usuario pode alterar valor, descricao, prioridade, cancelar ou restaurar itens. Valido ate lock_date.
- **Execution**: NFs esperadas ja criadas, transferencias sendo processadas.
- **Closed**: Todos os itens finalizados (paid, cancelled ou error).

### 7.3 Regra de Unicidade

- So pode existir um snapshot por tipo (recurrence/award) por reference_date.

### 7.4 Ciclo de Vida do Item

```
draft → execution → scheduled → paid
                              → error
                              → cancelled
```

- Item sem valor = erro (nao gera NF nem transferencia).
- Item com contrato inelegivel (premio exige PJ; recorrencia aceita PJ ou Estagio/PJ) = erro.

### 7.5 Prioridade de Pagamento

- Prioridade 1: pagamento no dia base (dia 1 para recorrencia).
- Prioridade 2: pagamento no dia base + 1 dia util.
- Prioridade 3: pagamento no dia base + 2 dias uteis.
- Dias uteis consideram feriados e fins de semana.

### 7.6 Geracao de NFs (SnapshotInvoices)

- Executado no dia 1 (recorrencia) ou dia 25 (premio).
- Cria FinanceInvoice com status "expected" para cada item elegivel.
- Recorrencia: reference_date = mes anterior. Premio: reference_date = mes atual.
- Uma NF por colaborador/tipo/reference_date (previne duplicatas).

### 7.7 Geracao de Transferencias (SnapshotTransfers)

- Executado no dia 1 (recorrencia) ou dia 25 (premio).
- Cria transacao PIX via Asaas para cada item em "execution".
- Obrigatorio ter conta bancaria com chave PIX configurada.
- Categoria: "Folha de Pagamento" (recorrencia) ou "Premio" (award).
- Normalizacao de chave PIX: telefone recebe +55, CPF so digitos.

---

## 8. Notas Fiscais de Colaboradores

### 8.1 Quando a NF e Esperada

- Recorrencia: espera-se NF no mes seguinte ao snapshot (referencia = mes anterior).
- Premio: espera-se NF no mes do premio (abril ou outubro).

### 8.2 Validacao Automatica (IA)

- PDF e enviado ao Google Cloud Vision para OCR.
- OpenAI extrai o valor da NF do texto.
- Comparacao: valor extraido == valor esperado (exato, 2 casas decimais).
- Se confere: status = "received", status_value = 1.
- Se diverge: status = "rejected", status_value = 0.
- Se IA falha na extracao: status = "received" (beneficio da duvida), valor_ia = null.

### 8.3 Rejeicao Manual

- Exige motivo.
- Remove o PDF do Google Cloud Storage.
- Email de rejeicao enviado ao colaborador.
- Regra de envio: so envia email se o periodo e valido (recorrencia: mes anterior; premio: mes atual em abr/out).

### 8.4 Nomenclatura de Arquivo

- Recorrencia: `NF_{PRIMEIRO}_{ULTIMO}_{MES}_{ANO}.pdf`
- Premio abril: `NF_{PRIMEIRO}_{ULTIMO}_S2_{ANO-1}.pdf`
- Premio outubro: `NF_{PRIMEIRO}_{ULTIMO}_S1_{ANO}.pdf`

---

## 9. Notificacoes

### 9.1 Cobranca Gerada (para Cliente)

- Enviada a cada 5 minutos.
- Condicao: bill_status = "Pendente", nfs_status = "authorized", tem bill_url e nfs_url, mail_stage = 0.
- Anexa boleto PDF se o cliente tem attached_bill = true.
- Se email falha: failed_mail = true, retry a cada 10 minutos.

### 9.2 Cobranca Proxima do Vencimento (para Cliente)

- Enviada diariamente as 09:00.
- Condicao: vencimento em 3 dias (due_date = hoje + 3), mail_stage = 1.

### 9.3 Cobranca Vencida (para Cliente)

- Cadencia: D+1, D+2, D+5, depois a cada 2 dias uteis.
- Condicao: due_date < hoje, bill_status = "Pendente", mail_stage em [1, 2, 3].
- mail_stage < 4 para evitar notificacao em segunda via.

### 9.4 Resumo de Cobranca (para Cliente)

- Resumo gerado: a cada 5 minutos (mail_stage = 0).
- Status changes: diariamente (inclui cobrancas prox vencimento, vencidas, canceladas).
- Cobranca cancelada no resumo: a cada 5 minutos (mail_stage = 5).

### 9.5 NF Pendente - Recorrencia (para Colaborador)

| Dia | Canal | Acao |
|-----|-------|------|
| 25 | Email + Push | Snapshot gerado, envie sua NF |
| 1 | Email | Primeiro lembrete |
| 3 | Email | Segundo lembrete |
| 4-5 | Slack DM (11h, 15h, 18h) | Cobranca direta 3x/dia |
| 4-5 | Email (admin) | Resumo de NFs pendentes |
| 5 | Email | Ultimo lembrete (urgente) |

### 9.6 NF Pendente - Premio (para Colaborador, abril/outubro)

| Dia | Canal | Acao |
|-----|-------|------|
| 15 | Email + Push | Snapshot gerado, envie sua NF |
| 25 | Email | Primeiro lembrete |
| 28 | Email | Segundo lembrete |
| 29-30 | Slack DM (11h, 15h, 18h) | Cobranca direta 3x/dia |
| 29-30 | Email (admin) | Resumo de NFs pendentes |
| 30 | Email | Ultimo lembrete (urgente) |

### 9.7 Reembolsos Pendentes (para Admin)

- Ancoras: dia 2 e dia 17 do mes (notifica TODOS os pendentes).
- Entre ancoras: a cada 2 dias uteis (so notifica os que ja receberam alerta_sent = 1).
- Cada mes reinicia o ciclo.

### 9.8 Certificado NF (para Admin)

- Alerta enviado exatamente 60 dias e 40 dias antes do vencimento.
- Se ja venceu: nao notifica.
- Fora dos marcos de 60/40: nao notifica.

### 9.9 Limite MEI (para Admin)

- Verificado dia 6 de cada mes + dia 30 em abril e outubro.
- Periodo: dezembro (ano anterior) a novembro (ano corrente).
- Calcula total de NFs emitidas (com arquivo) por colaborador PJ.
- Se total >= (limite_anual * percentual_notificacao): alerta.
- Email com tabela de colaboradores e percentuais.

### 9.10 Aniversarios (para Slack)

- Diariamente as 09:30.
- Verifica 3 dias antes e no dia do aniversario.
- Envia mensagem no Slack + email para destinatarios configurados.

### 9.11 Erros Financeiros (para Slack)

- A cada 1 minuto.
- Busca logs com operacao "error" ou "critical", nao resolvidos, nao alertados.
- Envia para Slack e marca como alertado.
- Se Slack falha: tenta novamente no proximo minuto.

---

## 10. Sincronizacao (Sync)

### 10.1 Ordem dos Steps

1. Clientes (ClientsSync): sincroniza com Asaas
2. NFS-e (InvoiceCreation): emite NFS-e pendentes
3. Recorrencias (RecurrenceSync): gera cobrancas do dia
4. Emissao (PendingChargesGeneration): emite boletos + NFS-e
5. Verificacao (ChargesSync): atualiza status de cobrancas

### 10.2 Janela de Lock

- Sync manual bloqueada: 07:55-08:05 e 19:55-20:05 (protege execucao do cron).
- Retorna HTTP 429 se tentar durante a janela.
- Sync ja ativa nos ultimos 30 minutos: retorna ID da run existente (idempotente).

### 10.3 Resultados

- Todos os steps executam mesmo se um falhar (nao para no erro).
- Se pelo menos um step falha: status = "partial".
- Se todos ok: status = "success".
- Se falha geral: status = "failed".
- Timeout: 30 minutos.

---

## 11. Campanhas Incorp (Monday.com)

### 11.1 Importacao

- So importa projetos que tem monday_id preenchido.
- Validacao tudo-ou-nada: se qualquer campanha do lote for invalida, nenhuma e salva.
- Campos obrigatorios: v_total, id_project_monday, id_pulse.
- Projeto deve existir no sistema E ter cliente faturavel.
- Status no Monday atualizado: 1 = sincronizado, 2 = erro.

### 11.2 Geracao de Cobrancas

- So gera de campanhas em stage 1 ou 2.
- Uma unica cobranca por campanha (verifica duplicata).
- Due date: usa campanha.due_date → senao preferential_due_date do cliente → senao issue_date + 15 dias.
- Respeita due_on_working_days_only do cliente.

### 11.3 Formulas de Valor

- O valor total da campanha e calculado com base em formulas por versao (VL1P, VLBP8, VLITV, VPlus1, VPremium1, VPremiumE1, VPremiumVitra).
- Cada formula usa a soma de investimento Meta + Google como entrada.
- Faixas de valor escalonadas (ex: VL1P ate 10k = R$2.600, ate 14k = R$3.060, ..., acima de 30k = soma * 19%).
- VLBP8 tem faixas extras ate 100k com teto de 20%.

---

## 12. Conta Corrente

### 12.1 Bancos API (Asaas e Iugu)

- Extratos sincronizados automaticamente as 23:50.
- Lancamentos manuais permitidos apenas para reconciliar (classificar) entradas ja sincronizadas.
- Entrada ja reconciliada (is_reconciled = true) preserva edicoes manuais — sync nao sobrescreve.

### 12.2 Bancos Manuais (BTG, Itau, C6)

- Lancamentos livres (nao dependem de API).
- Exigem saldo inicial cadastrado para calculo correto.

### 12.3 Reconciliacao Automatica

**Asaas:**
1. transferId/billId → FinanceTransaction.id_asaas
2. paymentId → FinanceCharge.id_payment_asaas
3. invoiceId → FinanceCharge.id_nfs

**Iugu:**
1. reference (Invoice/TransferRequest/PaymentRequest) → FinanceCharge ou FinanceTransaction
2. Fallback: amount + entry_date → FinanceTransaction (boleto pago)

### 12.4 Classificacao

- 18 tipos de tarifa Asaas (taxas de transferencia, PIX, boleto, etc).
- Valor > 0: Entrada. Valor < 0: Saida. Tipo de tarifa: Tarifa.
- Iugu: credito = Entrada, debito com credito correspondente = Tarifa, debito com valor igual no BD = Saida.

---

## 13. NFS-e (Nota Fiscal de Servico)

### 13.1 Ciclo de Vida

```
created → enqueued → received → authorized (URL do PDF disponivel)
                              → rejected / denied / error (alertas)
                              → canceled
```

### 13.2 Cancelamento

- Status "processing_cancellation" monitorado a cada 2 minutos.
- Resultado possivel: canceled (sucesso), denied (recusado — gera log critico), error.

### 13.3 Alertas

- Spedy: alerta para canceled, rejected, denied, inContingent, removed, disabled.
- Asaas: alerta para CANCELLATION_DENIED e ERROR (CANCELED e intencional, nao alerta).

### 13.4 Descricao Dinamica

- A tag `{mesanocorrente}` na descricao da NFS-e e substituida pelo mes/ano corrente em portugues (ex: "Setembro/2025").

---

## 14. Webhooks e Status

### 14.1 Mapeamento Asaas → Interno (Pagamentos)

| Status Asaas | Status Interno |
|-------------|---------------|
| PENDING, BANK_PROCESSING, AWAITING_CASHOUT | processing |
| DONE, PAID, RECEIVED, CONFIRMED | paid |
| SCHEDULED | scheduled |
| CANCELLED | cancelled |
| FAILED, ERROR | error |
| REFUNDED, REFUSED | rejected |
| OVERDUE | Pendente (exibido como Vencido) |
| RECEIVED_IN_CASH | Pago Externamente |
| REFUND_REQUESTED, DUNNING_REQUESTED | Processando |
| CHARGEBACK_REQUESTED, CHARGEBACK_DISPUTE | Em protesto |
| AWAITING_RISK_ANALYSIS | Em analise |

### 14.2 Webhook Asaas

- Sempre retorna 200 (evita retries do Asaas mesmo em erro).
- Se transacao nao encontrada: ignora silenciosamente.
- Se transacao ja processada (status final): ignora.
- Busca transacao por 3 estrategias: id_asaas, externalReference (numerico), ou valor + CPF/CNPJ.

### 14.3 Reembolsos via Webhook

- Reembolso criado via API externa com status "Pendente".
- Necessita aprovacao manual na interface.
- Cancelamento pelo colaborador: status = "Cancelado", motivo automatico.

---

## 15. Projeto e Cascata

### 15.1 Desativacao de Projeto

- Ao desativar um projeto: TODOS os contratos ativos sao desativados (status = 0, end_date = agora).
- TODAS as configuracoes financeiras ativas sao desativadas (status = 0).
- Operacao atomica (transacao DB).

### 15.2 Edicao de Projeto

- Se o projeto faz parte de um resumo de cobranca e send_mail for habilitado: o projeto e automaticamente removido do resumo.
- Se a recorrencia existir: finance_client_id e atualizado em cascata na recorrencia.

---

## 16. Configuracoes

### 16.1 Limite MEI

- notification_percentage: fracao (ex: 0.80 = 80%).
- limit_value: valor absoluto em reais.
- Alerta quando total_anual >= limit_value * notification_percentage.

### 16.2 Contas Bancarias (Beneficiarios)

- CPF/CNPJ unico por conta cadastrada.
- Tipo: custo_despesa (TED/PIX para terceiros) ou mesma_titularidade (entre contas proprias).
- Preferencia: TED ou PIX.

### 16.3 Beneficiarios Recorrentes

- Tipo: Custo ou Despesa.
- Um beneficiario pode ter multiplos nomes associados (array JSON).
- Nao permite duplicata de beneficiario (mesmo nome no mesmo config).

### 16.4 Ordem das Contas Correntes

- Contas fixas: asaas, btg, itau, c6_bank, iugu.
- Ordem personalizavel. Contas faltantes sao adicionadas no final.

---

## 17. Relatorios

### 17.1 Status Especiais em Relatorios

- "Pendente": bill_status = "Pendente" E paid_at nulo E due_date >= hoje.
- "Vencido": bill_status = "Pendente" E paid_at nulo E due_date < hoje.
- "Pago com atraso": bill_status em ("Pago", "Pago Externamente") E fine_paid = 1.

### 17.2 Filtros de NFS-e

- Exclui cobrancas com tag "2a Via" (NFS-e e reaproveitada da original).
- Status "Emitida" = authorized, inContingent, received.
- Status "Cancelada" = canceled, removed, disabled.

### 17.3 Relatorio Operacional

- Valor exibido: base - desconto + juros + multa (para boletos).
- Transacao com retry: vincula tentativa nova a original via retry_id.
