@php // Guard defensivo: Laravel convierte cualquier "undefined array key" en excepción (500), // así que normalizamos $corte para que TODAS las claves existan siempre, sin importar // qué versión del controlador esté desplegada. El operador ?? evita el warning. $movimientos = $movimientos ?? collect(); $c = is_array($corte ?? null) ? $corte : []; $corte = [ 'apartados' => ['total' => $c['apartados']['total'] ?? 0, 'count' => $c['apartados']['count'] ?? 0], 'aportaciones' => ['total' => $c['aportaciones']['total'] ?? 0, 'count' => $c['aportaciones']['count'] ?? 0], 'salidas' => ['total' => $c['salidas']['total'] ?? 0, 'count' => $c['salidas']['count'] ?? 0], 'total_ingresos' => $c['total_ingresos'] ?? 0, 'total_salidas' => $c['total_salidas'] ?? 0, 'saldo_esperado' => $c['saldo_esperado'] ?? 0, 'efectivo_esperado'=> $c['efectivo_esperado'] ?? 0, 'by_method' => is_array($c['by_method'] ?? null) ? $c['by_method'] : [], ]; // Clasificación autocontenida (no depende de closures que pase el controlador). $mvType = function ($tx) { if (($tx->type ?? '') === 'expense') return 'Salida'; return str_contains(mb_strtolower((string) ($tx->category ?? '')), 'apartado') ? 'Apartado' : 'Aportación'; }; $mvMethod = function ($tx) { $m = mb_strtolower(trim((string) ($tx->method ?? ''))); if ($m === '') return 'Otro'; if (str_contains($m, 'efectiv')) return 'Efectivo'; if (str_contains($m, 'spei')) return 'SPEI'; if (str_contains($m, 'transfer') || str_contains($m, 'dep')) return 'Transferencia'; if (str_contains($m, 'tarjeta') || str_contains($m, 'tpv')) return 'Tarjeta'; return 'Otro'; }; $period = $period ?? ''; $projectName = $projectName ?? null; $companyName = $companyName ?? ''; $companyAddress = $companyAddress ?? ''; $companyPhone = $companyPhone ?? ''; $generatedAt = $generatedAt ?? now(); $user = $user ?? null; $ti = $corte['total_ingresos'] ?: 0; @endphp Corte diario | {{ $companyName }}
Cerrar
{{ $companyName }} @if($companyAddress || $companyPhone)
{{ $companyAddress }}@if($companyAddress && $companyPhone) · @endif@if($companyPhone)Tel. {{ $companyPhone }}@endif
@endif
Corte Diario
Periodo: {{ $period }}
@if($projectName)
Proyecto: {{ $projectName }}
@endif
Generado: {{ $generatedAt->format('d/m/Y H:i') }}
Elaboró: {{ $user?->name ?? '—' }}
Apartados
${{ number_format($corte['apartados']['total'],2) }}
Aportaciones
${{ number_format($corte['aportaciones']['total'],2) }}
Total Apartados${{ number_format($corte['apartados']['total'],2) }}
Total Aportaciones${{ number_format($corte['aportaciones']['total'],2) }}
Total Ingresos${{ number_format($corte['total_ingresos'],2) }}
Salidas de Caja−${{ number_format($corte['total_salidas'],2) }}
Saldo Esperado en Caja${{ number_format($corte['saldo_esperado'],2) }}
Concentrado por método de pago
@forelse($corte['by_method'] as $bucket => $row) @empty @endforelse @if(! empty($corte['by_method'])) @endif
Método de pagoMovimientosTotal%
{{ $bucket }}{{ $row['count'] }}${{ number_format($row['total'],2) }}{{ $ti > 0 ? number_format($row['total'] / $ti * 100, 1) : '0.0' }}%
Sin ingresos en el periodo.
Total ingresos{{ collect($corte['by_method'])->sum('count') }}${{ number_format($corte['total_ingresos'],2) }}100%
Detalle de movimientos
@forelse($movimientos as $i => $tx) @php $isIn = $tx->type === 'income'; @endphp @empty @endforelse @if($movimientos->count()) @endif
# Fecha / Hora Tipo Cliente Lote Método Importe
{{ $i + 1 }} {{ optional($tx->date)->format('d/m/Y') }}
{{ optional($tx->created_at)->format('h:i A') }}
{{ $mvType($tx) }}@if($tx->description)
{{ \Illuminate\Support\Str::limit(\Illuminate\Support\Str::beforeLast($tx->description, ' - '), 38) }}
@endif
{{ $tx->client?->name ?? '—' }} {{ $tx->lote?->label ?? '—' }} {{ $mvMethod($tx) }} {{ $isIn ? '' : '−' }}${{ number_format($tx->amount,2) }}
Sin movimientos en el periodo seleccionado.
Total ingresos${{ number_format($corte['total_ingresos'],2) }}
Total salidas−${{ number_format($corte['total_salidas'],2) }}
Saldo esperado${{ number_format($corte['saldo_esperado'],2) }}
Observaciones
Elaboró
{{ $user?->name ?? '' }}
Revisó / Autorizó
Documento generado por el sistema el {{ $generatedAt->format('d/m/Y H:i') }}. Refleja los movimientos registrados por fecha de aplicación en el periodo indicado.