@php use Illuminate\Support\Facades\DB; $idIgreja = request('idIgreja'); $idBase = request('idBase'); $ini = request('ini'); $fim = request('fim'); $tipo = request('tipo'); // R, D ou null/vazio = todos // ── Nomes de contexto ──────────────────────────────────────────────────── $igreja = $idIgreja ? DB::table('igrejas')->where('idIgreja', $idIgreja)->first() : null; $base = $idBase ? DB::table('financeiro_bases')->where('idBase', $idBase)->first() : null; $nomeIgreja = $igreja ? $igreja->Nome : 'Todas as igrejas'; $nomeCaixa = $base ? $base->Titular : 'Todos os caixas'; // ── Query de lançamentos ───────────────────────────────────────────────── $query = DB::table('financeiro_lancamentos as l') ->leftJoin('financeiro_categorias as cat', 'cat.idCategoria', '=', 'l.idCategoria') ->leftJoin('financeiro_bases as b', 'b.idBase', '=', 'l.idBase') ->where('l.Status', 'C'); // compensado if ($idIgreja) { $query->where('b.idIgreja', $idIgreja); } if ($idBase) { $query->where('l.idBase', $idBase); } if ($ini) { $query->whereDate('l.dtPagamento', '>=', $ini); } if ($fim) { $query->whereDate('l.dtPagamento', '<=', $fim); } if ($tipo === 'R') { $query->where('l.Tipo', 'R'); } elseif ($tipo === 'D') { $query->where('l.Tipo', 'D'); } $lancamentos = $query ->select( 'l.idLancamento', 'l.dtPagamento', 'l.Descricao', 'l.Tipo', 'l.Valor', 'l.Forma', 'cat.Nome as Categoria', 'b.Titular as Caixa' ) ->orderBy('l.dtPagamento') ->orderBy('l.idLancamento') ->get(); // ── Totais gerais ──────────────────────────────────────────────────────── $totalReceitas = $lancamentos->where('Tipo', 'R')->sum('Valor'); $totalDespesas = $lancamentos->where('Tipo', 'D')->sum('Valor'); $saldo = $totalReceitas - $totalDespesas; // ── Subtotais por categoria ────────────────────────────────────────────── $porCategoria = $lancamentos->groupBy('Categoria')->map(function ($items, $cat) { return [ 'nome' => $cat ?: 'Sem categoria', 'receitas' => $items->where('Tipo', 'R')->sum('Valor'), 'despesas' => $items->where('Tipo', 'D')->sum('Valor'), 'qtd' => $items->count(), ]; })->sortKeys(); // ── Helpers ────────────────────────────────────────────────────────────── $fmtMoeda = fn($v) => 'R$ ' . number_format(abs($v), 2, ',', '.'); $fmtData = fn($d) => $d ? \Carbon\Carbon::parse($d)->format('d/m/Y') : '—'; $fmtForma = function($f) { return match($f) { 'D' => 'Dinheiro', 'P' => 'PIX', 'C' => 'Cartão', 'CH' => 'Cheque', 'T' => 'Transferência', 'B' => 'Boleto', default => ($f ?: '—'), }; }; $periodoLabel = ''; if ($ini && $fim) { $periodoLabel = $fmtData($ini) . ' a ' . $fmtData($fim); } elseif ($ini) { $periodoLabel = 'A partir de ' . $fmtData($ini); } elseif ($fim) { $periodoLabel = 'Até ' . $fmtData($fim); } else { $periodoLabel = 'Todo o período'; } @endphp Extrato Financeiro — {{ $nomeIgreja }}
{{-- ── Cabeçalho ── --}}
@include('relatorios.partials.logo-header', ['logoStyle' => 'height:40px;width:auto;object-fit:contain;'])
EXTRATO FINANCEIRO
{{ $nomeIgreja }}
Caixa: {{ $nomeCaixa }}
Tipo: @if($tipo === 'R') Receitas @elseif($tipo === 'D') Despesas @else Todos os lançamentos @endif
Emissão: {{ now()->format('d/m/Y H:i') }}
Período: {{ $periodoLabel }}
{{-- ── Resumo ── --}}
Receitas
{{ $fmtMoeda($totalReceitas) }}
{{ $lancamentos->where('Tipo','R')->count() }} lançamento(s)
Despesas
{{ $fmtMoeda($totalDespesas) }}
{{ $lancamentos->where('Tipo','D')->count() }} lançamento(s)
Saldo
{{ $saldo < 0 ? '− ' : '' }}{{ $fmtMoeda($saldo) }}
{{ $lancamentos->count() }} lançamento(s) total
{{-- ── Tabela principal ── --}}
Lançamentos Detalhados
@if($lancamentos->isEmpty())
Nenhum lançamento encontrado para os filtros selecionados.
@else @foreach($lancamentos as $lanc) @endforeach
Data Descrição Categoria Forma Valor
{{ $fmtData($lanc->dtPagamento) }} {{ $lanc->Descricao ?: '—' }} {{ $lanc->Categoria ?: 'Sem categoria' }} {{ $fmtForma($lanc->Forma) }} {{ $lanc->Tipo === 'D' ? '− ' : '' }}{{ $fmtMoeda($lanc->Valor) }}
Total Receitas: {{ $fmtMoeda($totalReceitas) }}
Total Despesas: {{ $fmtMoeda($totalDespesas) }}
Saldo: {{ $saldo < 0 ? '− ' : '' }}{{ $fmtMoeda($saldo) }}
{{-- ── Subtotais por categoria ── --}} @if($porCategoria->count() > 1)
Resumo por Categoria
@foreach($porCategoria as $cat) @endforeach
Categoria Receitas Despesas Qtd
{{ $cat['nome'] }} {{ $cat['receitas'] > 0 ? $fmtMoeda($cat['receitas']) : '—' }} {{ $cat['despesas'] > 0 ? $fmtMoeda($cat['despesas']) : '—' }} {{ $cat['qtd'] }}
@endif @endif {{-- ── Rodapé ── --}}