JamesProduto · Funcionalidades · Desenvolvimento
Repositório

feature · observed

Cartões de crédito

Cartões, limites, faturas, dias úteis e pagamentos no módulo financeiro.

Visão Geral

O módulo de Cartões de Crédito gerencia limites, datas de vencimento/fechamento e o ciclo de vida das faturas (invoices). Um cartão está sempre vinculado a uma Conta Financeira de onde o dinheiro sairá quando a fatura for paga. O módulo possui inteligência de dias úteis para mover automaticamente datas que caiam em finais de semana ou feriados nacionais.

Tabelas

financial_credit_cards

ColunaTipoDescrição
idbigintChave primária.
financial_account_idforeignIdConta corrente vinculada para débito do pagamento.
namestringNome do cartão (Ex: Nubank Platinum).
credit_limitdecimalLimite de crédito disponível.
closing_dayintegerDia padrão de fechamento da fatura (Ex: 7).
due_dayintegerDia padrão de vencimento da fatura (Ex: 2).
deleted_attimestampSoft deletes (Lixeira).

financial_credit_card_invoices

ColunaTipoDescrição
idbigintChave primária.
financial_credit_card_idforeignIdVínculo com o cartão originador.
reference_monthdateMês/Ano base da fatura (dia é sempre 01).
closing_datedateData ajustada real de fechamento (respeita personalizações e feriados).
due_datedateData ajustada real de vencimento (respeita dias úteis).
amount_paiddecimalValor já pago nesta fatura.
paid_atdateData em que a fatura foi totalmente quitada.
interest_transaction_idforeignIdVínculo com a despesa de juros, caso haja pagamento em atraso.

Diagrama Relacional (ER)

Diagram Design · Mermaid · arraste para mover · Ctrl/⌘ + scroll para zoom

100%Abrir inteiro ↗

Renderizando diagrama declarativo…

Legenda
  • Entidade
  • Chave primária
  • Chave estrangeira
  • Relacionamento
Leitura semântica

Uma conta financeira pode possuir cartões; cada cartão gera faturas, e as faturas agregam transações com os respectivos estados financeiros.

Fonte declarativa: diagrams/sources/cards-model.mmd

Regras de Negócio e Comportamento

Ciclo de Vida e Status da Fatura (InvoiceStatus)

O estado da fatura é computado dinamicamente através do Enum App\Enums\InvoiceStatus:

StatusCaseCorDescrição
PagaInvoiceStatus::PaidVerdeFatura totalmente quitada (amount_paid >= total).
Parcialmente PagaInvoiceStatus::PartiallyPaidAmareloHouve pagamento parcial antes do fechamento/vencimento.
AbertaInvoiceStatus::OpenAzulFatura corrente ainda recebendo novas compras (antes do fechamento).
FechadaInvoiceStatus::ClosedNeutro / CinzaFatura fechada aguardando pagamento (após o fechamento e antes do vencimento).
AtrasadaInvoiceStatus::OverdueVermelhoFatura fechada com vencimento ultrapassado e saldo em aberto.

Centralização da Fatura Corrente (setCurrentInvoice)

O modelo FinancialCreditCard centraliza a lógica de resolução da fatura ativa no método setCurrentInvoice(). Essa abstração calcula dinamicamente o total da fatura aberta, a quantidade de lançamentos e o status de liquidez sem onerar o banco de dados com queries redundantes em loops de listagem.

Lógica de Feriados e Dias Úteis

O sistema integra com a BrasilAPI (via BusinessDayHelper) para buscar os feriados nacionais anuais, mantendo-os em cache:

  • O Fechamento é antecipado para o dia útil anterior caso caia em feriado/final de semana.
  • O Vencimento é postergado para o próximo dia útil caso caia em feriado/final de semana.
  • Fechamento Personalizado: O sistema respeita fechamentos com data customizada (closing_date) definida pelo usuário ou ajustada no banco ao vincular novas transações.

Rolagem e Vinculação de Compras

Ao lançar uma nova compra, o método FinancialCreditCardInvoice::resolveForDate compara a data da transação com a data real (ajustada) de fechamento daquele mês. Se a transação for feita no dia ou antes do fechamento, entra na fatura atual. Se for posterior, rola automaticamente para a fatura do mês subsequente.

Automação (Cron)

O comando php artisan finance:rollover-invoices executa diariamente à meia-noite via Laravel Scheduler. Ele percorre todos os cartões ativos e garante que a fatura do mês de referência exista no banco de dados.

Pagamento da Fatura

Quando o pagamento total é confirmado:

  1. Uma despesa é gerada na Conta Bancária vinculada ao cartão.
  2. Caso informado valor de Juros, uma transação extra de juros é gerada aplicando a tag protegida Juros.
  3. Todas as transações atreladas à fatura têm seu status alterado para TransactionStatus::Posted (posted), consolidando o fluxo financeiro.

Exclusão (Soft Deletes)

Cartões não podem ser excluídos permanentemente (forceDelete) se possuírem faturas ou transações ativas, garantindo a rastreabilidade contábil.