Reporte de Corte de Caja
@php // ===================== Filtros desde notas ===================== // Forma de pago: 'Efectivo' | 'Transferencia' | 'Todas' | null $formaFiltro = null; if (is_string($corte->notas_adicionales) && preg_match('/\[FormaPago:\s*(Efectivo|Transferencia|Todas)\]/i', $corte->notas_adicionales, $m)) { $formaFiltro = ucfirst(strtolower($m[1])); } // Helper para filtrar abonos por forma de pago (vive en ventas.forma_pago) $pasaForma = static function ($abono) use ($formaFiltro) { if (!$formaFiltro || $formaFiltro === 'Todas') return true; $fp = $abono->venta->forma_pago ?? null; return $fp === $formaFiltro; }; // Colecciones base $ticketsActivosBase = $abonos->where('estado', 1); $ticketsCanceladosBase = $abonos->where('estado', 0); // Colecciones ya filtradas por forma de pago $ticketsActivos = $ticketsActivosBase->filter($pasaForma)->values(); $ticketsCancelados = $ticketsCanceladosBase->filter($pasaForma)->values(); // ===================== Egresos incluidos/excluidos ===================== $egresosIncluidos = true; if (is_string($corte->notas_adicionales) && preg_match('/\[Egresos:\s*(Incluidos|Excluidos)\]/i', $corte->notas_adicionales, $m)) { $egresosIncluidos = strtolower($m[1]) === 'incluidos'; } // ===================== Totales (respetan filtros) ===================== $totalEntrada = (float) $ticketsActivos->sum('monto'); $totalSalida = $egresosIncluidos ? (float) $gastos->sum('monto') : 0.0; // Por método (si pediste solo uno, el otro quedará en 0) $totalEfectivo = (float) $ticketsActivos ->filter(fn($a) => ($a->venta->forma_pago ?? null) === 'Efectivo') ->sum('monto'); $totalTransferencia = (float) $ticketsActivos ->filter(fn($a) => ($a->venta->forma_pago ?? null) === 'Transferencia') ->sum('monto'); // ===================== Agrupación por Grado y Grupo ===================== $agrupadosEntradas = $ticketsActivos->groupBy(function ($abono) { $alumno = $abono->venta->alumno ?? null; $gradoNombre = $alumno?->grado_actual?->nombre ?? 'SIN GRADO'; $grupoNombre = $alumno?->grupo_actual?->nombre ?? 'SIN GRUPO'; return $gradoNombre . '|||' . $grupoNombre; })->sortKeys(); $agrupadosCancelados = $ticketsCancelados->groupBy(function ($abono) { $alumno = $abono->venta->alumno ?? null; $gradoNombre = $alumno?->grado_actual?->nombre ?? 'SIN GRADO'; $grupoNombre = $alumno?->grupo_actual?->nombre ?? 'SIN GRUPO'; return $gradoNombre . '|||' . $grupoNombre; })->sortKeys(); @endphp {{--===========================================================================--}}

Folio: {{ $corte->folio }}

Fecha de Creación: {{ $corte->created_at->format('d/m/Y H:i:s') }}

Fecha de Inicio: {{ $corte->fecha_inicio->format('d/m/Y H:i:s') }}

Categoría (ingresos): {{ $corte->filtro_categoria_nombre ?? 'Todas las categorías' }}

Egresos: {{ $corte->filtro_egresos }}

{{-- Nueva línea: Forma de pago aplicada --}}

Forma de pago: {{ $formaFiltro ?? 'Todas' }}

@if ($corte->notas_usuario)

Notas Adicionales: {{ $corte->notas_usuario }}

@endif

Fecha de Fin: {{ $corte->fecha_fin->format('d/m/Y H:i:s') }}

{{-- Totales (recalculados con el filtro aplicado) --}}
TOTAL ENTRADA
{{ number_format($totalEntrada, 2) }} MXN
TOTAL SALIDA
{{ number_format($totalSalida, 2) }} MXN
DIFERENCIA
{{ number_format($totalEntrada - $totalSalida, 2) }} MXN
{{-- Entradas (agrupadas por Grado y Grupo) --}}
Entradas
@php // $ticketsActivos ya viene filtrado por forma de pago arriba (si seguiste mi snippet anterior) // Agrupar por GRADO + GRUPO del alumno (usando tus accessors grado_actual / grupo_actual) $agrupados = $ticketsActivos->groupBy(function ($abono) { $alumno = $abono->venta->alumno ?? null; $gradoNombre = $alumno?->grado_actual?->nombre ?? 'SIN GRADO'; $grupoNombre = $alumno?->grupo_actual?->nombre ?? 'SIN GRUPO'; return $gradoNombre.'|||'.$grupoNombre; })->sortKeys(); @endphp @if ($ticketsActivos->isEmpty())
Ticket Alumno Items Total Pagado Descuento Saldo FP Notas
No hay entradas registradas en este período
@else @foreach ($agrupados as $key => $items) @php [$gradoNombre, $grupoNombre] = explode('|||', $key, 2); @endphp
{{ mb_strtoupper($gradoNombre) }} — GRUPO {{ mb_strtoupper($grupoNombre) }}
{{-- E=Efectivo, T=Transferencia --}} @foreach ($items as $abono) @php // Items list $itemsList = ''; if ($abono->venta && $abono->venta->detalle_ventas) { $itemsList = $abono->venta->detalle_ventas->map(function($d){ $itemName = $d->item->nombre ?? 'Ítem desconocido'; return $itemName . ' x' . $d->cantidad; })->join(', '); } // Alumno $alumnoInfo = ''; if ($abono->venta && $abono->venta->alumno) { $alumnoInfo = trim( ($abono->venta->alumno->nombre ?? '') . ' ' . ($abono->venta->alumno->primer_apellido ?? '') . ' ' . ($abono->venta->alumno->segundo_apellido ?? '') ); } // Letra forma de pago $fpLetra = match($abono->venta->forma_pago ?? null) { 'Efectivo' => 'E', 'Transferencia' => 'T', default => '-', }; @endphp @endforeach
Ticket Alumno Items Total Pagado Descuento Saldo FPNotas
{{ $abono->numero_ticket }} {{ $alumnoInfo }} {{ $itemsList }} {{ number_format($abono->venta->gran_total ?? 0, 2) }} {{ number_format($abono->monto, 2) }} {{ number_format($abono->descuento, 2) }} {{ number_format($abono->saldo_pendiente, 2) }} {{ $fpLetra }} {{ $abono->notas }}
@endforeach @endif
{{-- Salidas (Gastos) --}} {{-- Salidas (Gastos) --}} @if ($egresosIncluidos)
Salidas
@forelse ($gastos as $gasto) @empty @endforelse
Código Nombre del Gasto Cantidad Notas
{{ $gasto->codigo }} {{ $gasto->nombre }} {{ number_format($gasto->monto, 2) }} {{ $gasto->notas_adicionales }}
No hay salidas registradas en este período
@endif {{-- Tickets Cancelados --}} @if ($ticketsCancelados->isNotEmpty())
Tickets Cancelados
{{-- NUEVA --}} @foreach ($ticketsCancelados as $abono) @php $itemsList = ''; if ($abono->venta && $abono->venta->detalle_ventas) { $itemsList = $abono->venta->detalle_ventas->map(function($d){ $itemName = $d->item->nombre ?? 'Ítem desconocido'; return $itemName . ' x' . $d->cantidad; })->join(', '); } $alumnoInfo = ''; if ($abono->venta && $abono->venta->alumno) { $alumnoInfo = trim( ($abono->venta->alumno->nombre ?? '') . ' ' . ($abono->venta->alumno->primer_apellido ?? '') . ' ' . ($abono->venta->alumno->segundo_apellido ?? '') ); } $fpLetra = match($abono->venta->forma_pago ?? null) { 'Efectivo' => 'E', 'Transferencia' => 'T', default => '-', }; @endphp {{-- NUEVA --}} @endforeach
Ticket Alumno Items Total Monto Cancelado Fecha FPNotas
{{ $abono->numero_ticket }} {{ $alumnoInfo }} {{ $itemsList }} {{ number_format($abono->venta->gran_total ?? 0, 2) }} {{ number_format($abono->monto, 2) }} {{ $abono->created_at->format('d/m/Y H:i') }} {{ $fpLetra }}{{ $abono->notas }}
Total Cancelado: {{ number_format($ticketsCancelados->sum('monto'), 2) }} MXN
@endif {{-- ===== Resumen de Totales (al pie) ===== --}} @php $colsPie = $egresosIncluidos ? 5 : 4; @endphp
Totales
TOTAL EFECTIVO
{{ number_format($totalEfectivo, 2) }} MXN
TOTAL TRANSFERENCIAS
{{ number_format($totalTransferencia, 2) }} MXN
TOTAL DE ENTRADAS
{{ number_format($totalEntrada, 2) }} MXN
@if ($egresosIncluidos)
TOTAL DE GASTOS
{{ number_format($totalSalida, 2) }} MXN
@endif
DIFERENCIA
{{ number_format($totalEntrada - $totalSalida, 2) }} MXN