Sistema Financeiro

Gestão Completa de Finanças

Sistema Financeiro

Gestão completa de doações, campanhas e finanças

"Honra ao Senhor com os teus bens e com as primícias de toda a tua renda"

Provérbios 3:9

Visão Geral

O Sistema Financeiro do CBAV oferece controle total sobre doações, campanhas, dízimos e todas as transações financeiras da igreja. Integrado com múltiplos gateways de pagamento, proporciona transparência e eficiência na gestão financeira.

Múltiplos Gateways

Stripe, Mercado Pago e PIX

Relatórios Avançados

Análises e estatísticas detalhadas

Segurança Total

Proteção e validação de transações

Funcionalidades Principais

Sistema de Doações

Plataforma completa para recebimento de doações com múltiplos gateways de pagamento.

  • • Doações públicas e privadas
  • • Múltiplos gateways (Stripe, MP, PIX)
  • • Comprovantes automáticos
  • • Notificações por email
  • • Histórico completo

Gestão de Campanhas

Criação e gestão de campanhas específicas com metas e relatórios.

  • • Criação de campanhas
  • • Definição de metas
  • • Acompanhamento em tempo real
  • • Relatórios por campanha
  • • Notificações de progresso

Controle de Transações

Sistema completo de controle e validação de todas as transações financeiras.

  • • Registro de todas as transações
  • • Validação automática
  • • Status de processamento
  • • Comprovantes digitais
  • • Auditoria completa

Relatórios Financeiros

Relatórios detalhados e análises avançadas da situação financeira.

  • • Relatórios por período
  • • Análise por campanha
  • • Gráficos interativos
  • • Exportação de dados
  • • Comparativos mensais

Segurança e Validação

Sistema robusto de segurança e validação de todas as transações.

  • • Validação de valores
  • • Proteção contra fraudes
  • • Webhooks seguros
  • • Logs de auditoria
  • • Backup automático

Notificações

Sistema de notificações automáticas para doadores e administradores.

  • • Confirmação de doação
  • • Comprovantes por email
  • • Alertas de campanha
  • • Notificações de meta
  • • Relatórios automáticos

Gateways de Pagamento

Gateways Suportados

Stripe

Gateway internacional com suporte a cartões de crédito e débito.

  • • Cartão de crédito
  • • Cartão de débito
  • • Pagamentos internacionais
  • • Webhooks seguros

Mercado Pago

Gateway brasileiro com múltiplas formas de pagamento.

  • • Cartão de crédito
  • • Boleto bancário
  • • PIX automático
  • • Parcelamento

PIX

Transferência instantânea via PIX do Banco Central.

  • • Transferência instantânea
  • • QR Code dinâmico
  • • Sem taxas
  • • Confirmação automática

Estrutura do Banco de Dados

Tabelas Principais

transacoes

CREATE TABLE transacoes (
    id BIGINT PRIMARY KEY,
    membro_id BIGINT NULL,
    campanha_id BIGINT NULL,
    tipo ENUM('dizimo', 'oferta', 'doacao', 'saida', 'entrada'),
    valor DECIMAL(10,2) NOT NULL,
    descricao TEXT,
    data DATE NOT NULL,
    status ENUM('pendente', 'confirmado', 'cancelado'),
    comprovante VARCHAR(255) NULL,
    dados_extras JSON NULL,
    created_at TIMESTAMP,
    updated_at TIMESTAMP
);

campanhas

CREATE TABLE campanhas (
    id BIGINT PRIMARY KEY,
    nome VARCHAR(255) NOT NULL,
    descricao TEXT,
    valor_meta DECIMAL(10,2),
    valor_atual DECIMAL(10,2) DEFAULT 0,
    data_inicio DATE,
    data_fim DATE,
    ativo BOOLEAN DEFAULT TRUE,
    created_at TIMESTAMP,
    updated_at TIMESTAMP
);

pagamentos

CREATE TABLE pagamentos (
    id BIGINT PRIMARY KEY,
    transacao_id BIGINT,
    gateway ENUM('stripe', 'mercadopago', 'pix'),
    gateway_id VARCHAR(255) NULL,
    gateway_status VARCHAR(255) NULL,
    valor DECIMAL(10,2),
    moeda VARCHAR(10) DEFAULT 'BRL',
    dados_gateway JSON NULL,
    created_at TIMESTAMP,
    updated_at TIMESTAMP
);

configuracoes

CREATE TABLE configuracoes (
    id BIGINT PRIMARY KEY,
    chave VARCHAR(255) UNIQUE,
    valor TEXT,
    descricao TEXT,
    tipo ENUM('string', 'number', 'boolean', 'json'),
    created_at TIMESTAMP,
    updated_at TIMESTAMP
);

Controllers e Rotas

Controllers Principais

Admin Controllers

  • FinanceController
  • TransacaoController
  • CampanhaController
  • RelatorioController

Public Controllers

  • PublicDonationController
  • PagamentoController
  • GatewayController

Rotas Principais

// Rotas Públicas de Doação
Route::prefix('doacao')->name('doacao.')->middleware('check.payment.gateways')->group(function () {
    Route::get('/', [PublicDonationController::class, 'index'])->name('index');
    Route::post('/processar', [PublicDonationController::class, 'process'])->name('process');
    Route::get('/confirmacao/{transacao}', [PublicDonationController::class, 'confirmation'])->name('confirmation');
});

// Rotas de Pagamento
Route::prefix('payment')->name('payment.')->group(function () {
    Route::post('/stripe', [PagamentoController::class, 'processStripe'])->name('stripe');
    Route::post('/mercadopago', [PagamentoController::class, 'processMercadoPago'])->name('mercadopago');
    Route::post('/pix', [PagamentoController::class, 'generatePix'])->name('pix');
    Route::post('/webhook/stripe', [PagamentoController::class, 'webhookStripe'])->name('webhook.stripe');
    Route::post('/webhook/mercadopago', [PagamentoController::class, 'webhookMercadoPago'])->name('webhook.mercadopago');
});

// Rotas Admin
Route::prefix('admin/finance')->name('admin.finance.')->middleware(['auth', 'admin'])->group(function () {
    Route::get('/', [FinanceController::class, 'index'])->name('index');
    Route::resource('transactions', TransacaoController::class);
    Route::resource('campaigns', CampanhaController::class);
    Route::get('reports', [RelatorioController::class, 'index'])->name('reports');
});

Models

Models Principais

Transacao Model

class Transacao extends Model
{
    protected $fillable = [
        'membro_id', 'campanha_id', 'tipo', 'valor', 
        'descricao', 'data', 'status', 'comprovante', 'dados_extras'
    ];

    protected $casts = [
        'valor' => 'decimal:2',
        'data' => 'date',
        'dados_extras' => 'array',
    ];

    public function membro()
    {
        return $this->belongsTo(Membro::class);
    }

    public function campanha()
    {
        return $this->belongsTo(Campanha::class);
    }

    public function pagamentos()
    {
        return $this->hasMany(Pagamento::class);
    }
}

Campanha Model

class Campanha extends Model
{
    protected $fillable = [
        'nome', 'descricao', 'valor_meta', 'valor_atual',
        'data_inicio', 'data_fim', 'ativo'
    ];

    protected $casts = [
        'valor_meta' => 'decimal:2',
        'valor_atual' => 'decimal:2',
        'data_inicio' => 'date',
        'data_fim' => 'date',
        'ativo' => 'boolean',
    ];

    public function transacoes()
    {
        return $this->hasMany(Transacao::class);
    }

    public function getProgressoAttribute()
    {
        if ($this->valor_meta > 0) {
            return ($this->valor_atual / $this->valor_meta) * 100;
        }
        return 0;
    }
}

Pagamento Model

class Pagamento extends Model
{
    protected $fillable = [
        'transacao_id', 'gateway', 'gateway_id', 
        'gateway_status', 'valor', 'moeda', 'dados_gateway'
    ];

    protected $casts = [
        'valor' => 'decimal:2',
        'dados_gateway' => 'array',
    ];

    public function transacao()
    {
        return $this->belongsTo(Transacao::class);
    }
}

Exemplos de Uso

Código de Exemplo

Processar Doação

// PublicDonationController.php
public function process(Request $request)
{
    $request->validate([
        'valor' => 'required|numeric|min:1',
        'campanha_id' => 'nullable|exists:campanhas,id',
        'gateway' => 'required|in:stripe,mercadopago,pix',
        'dados_pagamento' => 'required|array'
    ]);

    $transacao = Transacao::create([
        'tipo' => 'doacao',
        'valor' => $request->valor,
        'campanha_id' => $request->campanha_id,
        'data' => now(),
        'status' => 'pendente',
        'dados_extras' => $request->dados_pagamento
    ]);

    // Processar pagamento baseado no gateway
    switch ($request->gateway) {
        case 'stripe':
            return $this->processStripe($transacao, $request->dados_pagamento);
        case 'mercadopago':
            return $this->processMercadoPago($transacao, $request->dados_pagamento);
        case 'pix':
            return $this->processPix($transacao, $request->dados_pagamento);
    }
}

Criar Campanha

// CampanhaController.php
public function store(Request $request)
{
    $request->validate([
        'nome' => 'required|string|max:255',
        'descricao' => 'nullable|string',
        'valor_meta' => 'required|numeric|min:0',
        'data_inicio' => 'required|date',
        'data_fim' => 'nullable|date|after:data_inicio'
    ]);

    $campanha = Campanha::create([
        'nome' => $request->nome,
        'descricao' => $request->descricao,
        'valor_meta' => $request->valor_meta,
        'valor_atual' => 0,
        'data_inicio' => $request->data_inicio,
        'data_fim' => $request->data_fim,
        'ativo' => true
    ]);

    return redirect()->route('admin.finance.campaigns.index')
        ->with('success', 'Campanha criada com sucesso!');
}

Relatório Financeiro

// RelatorioController.php
public function relatorioFinanceiro(Request $request)
{
    $dataInicio = $request->get('data_inicio', now()->startOfMonth());
    $dataFim = $request->get('data_fim', now()->endOfMonth());

    $transacoes = Transacao::whereBetween('data', [$dataInicio, $dataFim])
        ->where('status', 'confirmado')
        ->with(['membro', 'campanha'])
        ->get();

    $estatisticas = [
        'total_doacoes' => $transacoes->where('tipo', 'doacao')->sum('valor'),
        'total_dizimos' => $transacoes->where('tipo', 'dizimo')->sum('valor'),
        'total_ofertas' => $transacoes->where('tipo', 'oferta')->sum('valor'),
        'quantidade_transacoes' => $transacoes->count(),
        'media_por_transacao' => $transacoes->avg('valor'),
        'doacoes_por_gateway' => $transacoes->groupBy('gateway')
    ];

    return view('admin.finance.reports.financial', compact('transacoes', 'estatisticas'));
}

Relatórios e Estatísticas

Relatórios Disponíveis

Relatório de Doações

Análise detalhada de todas as doações recebidas.

  • • Total de doações por período
  • • Média por doação
  • • Distribuição por gateway
  • • Tendências temporais

Relatório de Campanhas

Acompanhamento do progresso das campanhas ativas.

  • • Progresso por campanha
  • • Metas vs. realização
  • • Tempo restante
  • • Performance comparativa

Relatório de Gateway

Análise de performance dos gateways de pagamento.

  • • Volume por gateway
  • • Taxa de sucesso
  • • Tempo de processamento
  • • Custos por gateway

Relatório de Crescimento

Análise do crescimento financeiro da igreja.

  • • Crescimento mensal
  • • Comparativo anual
  • • Projeções futuras
  • • Sazonalidade

Segurança e Validações

Medidas de Segurança

Validações

  • Valores mínimos e máximos
  • Formato de valores (BRL)
  • Gateway configurado
  • Transação válida
  • Permissões de acesso

Proteções

  • CSRF Protection
  • Rate Limiting
  • Input Sanitization
  • SQL Injection Protection
  • XSS Protection

Webhooks Seguros

// PagamentoController.php
public function webhookStripe(Request $request)
{
    $payload = $request->getContent();
    $sig_header = $request->header('Stripe-Signature');
    $endpoint_secret = config('services.stripe.webhook_secret');

    try {
        $event = \Stripe\Webhook::constructEvent(
            $payload, $sig_header, $endpoint_secret
        );
    } catch(\UnexpectedValueException $e) {
        return response('Invalid payload', 400);
    } catch(\Stripe\Exception\SignatureVerificationException $e) {
        return response('Invalid signature', 400);
    }

    // Processar evento
    switch ($event->type) {
        case 'payment_intent.succeeded':
            $this->handlePaymentSuccess($event->data->object);
            break;
        case 'payment_intent.payment_failed':
            $this->handlePaymentFailure($event->data->object);
            break;
    }

    return response('Webhook handled', 200);
}