@php $currentUser = Auth::guard('admin')->user() ?? Auth::guard('web')->user() ?? Auth::user(); $cajeroNombre = $currentUser->nombre_completo ?? $currentUser->name ?? 'Cajero'; $cajeroRol = $currentUser->perfil->nombre ?? $currentUser->rol ?? 'Cajero Principal'; $sucursalIdActual = $currentUser->sucursal_asignada_id ?? $currentUser->sucursal_id ?? session('sucursal_id') ?? null; $turnoCodigo = '#TURNO-01'; $openingCash = 0.00; $salesCash = 0.00; $totalEfectivoRecibido = 0.00; $totalVueltoEntregado = 0.00; $totalExpenses = 0.00; $expectedCash = 0.00; $totalPos = 0.00; $totalYape = 0.00; $netSales = 0.00; $tips = 0.00; $totalGross = 0.00; $totalTransactions = 0; $cajaActivaId = null; try { $cajaQ = \Illuminate\Support\Facades\DB::table('Pagos_Cajas_Historial as ch') ->join('Pagos_Cajas_Diarias as cd', 'ch.caja_id', '=', 'cd.id_cajaDi') ->where('cd.estado', 'activo') ->whereNull('ch.fecha_cierre'); $currentUserId = $currentUser->id_usuario ?? $currentUser->id ?? null; $cajaActivaRow = null; if ($currentUserId) { $cajaActivaRow = (clone $cajaQ)->where('cd.usuario_id', $currentUserId)->orderBy('ch.fecha_apertura', 'desc')->first(); } if (empty($cajaActivaRow) && !empty($cajaActivaId)) { $cajaActivaRow = (clone $cajaQ)->where('cd.id_cajaDi', $cajaActivaId)->orderBy('ch.fecha_apertura', 'desc')->first(); } if (empty($cajaActivaRow) && $sucursalIdActual) { $cajaActivaRow = (clone $cajaQ)->where('cd.sucursal_id', $sucursalIdActual)->orderBy('ch.fecha_apertura', 'desc')->first(); } if (empty($cajaActivaRow)) { $cajaActivaRow = (clone $cajaQ)->orderBy('ch.fecha_apertura', 'desc')->first(); } if ($cajaActivaRow) { $cajaActivaId = $cajaActivaRow->caja_id ?? $cajaActivaRow->id_cajaDi; $turnoCodigo = '#TURNO-' . str_pad($cajaActivaRow->id_historial ?? '1', 2, '0', STR_PAD_LEFT); $openingCash = (float) ($cajaActivaRow->monto_inicial ?? 0); $fechaDesde = $cajaActivaRow->fecha_apertura; // Ventas reales del turno $pagos = \Illuminate\Support\Facades\DB::table('Ventas_Pagos') ->where('creado_at', '>=', $fechaDesde) ->where('estado', 'COMPLETED') ->get(); $totalEfectivoRecibido = 0; $totalVueltoEntregado = 0; foreach ($pagos as $p) { $metodo = strtoupper(trim($p->metodo_pago ?? 'EFECTIVO')); $montoVal = (float) $p->monto; $propinaVal = (float) ($p->monto_propina ?? 0); $montoRecibido = $montoVal; $montoVuelto = 0; if (str_contains($metodo, 'YAPE') || str_contains($metodo, 'PLIN') || str_contains($metodo, 'QR') || str_contains($metodo, 'BILLETERA')) { $totalYape += $montoVal; } elseif (str_contains($metodo, 'TARJETA') || str_contains($metodo, 'POS') || str_contains($metodo, 'VISA') || str_contains($metodo, 'MASTERCARD')) { $totalPos += $montoVal; } else { $salesCash += $montoVal; if (preg_match('/Recibido:\s*S\/\s*([0-9.]+)\s*•\s*Vuelto:\s*S\/\s*([0-9.]+)/u', $p->descripcion ?? '', $matches)) { $montoRecibido = (float)$matches[1]; $montoVuelto = (float)$matches[2]; } $totalEfectivoRecibido += $montoRecibido; $totalVueltoEntregado += $montoVuelto; // Auto-sincronizar egreso de vuelto en Pagos_Cajas_Egresos si no existe if ($montoVuelto > 0) { $orderSnippet = substr($p->pedido_id, 0, 8); $existsEgreso = \Illuminate\Support\Facades\DB::table('Pagos_Cajas_Egresos') ->where('caja_diaria_id', $cajaActivaId) ->where(function($q) use ($p, $orderSnippet) { $q->where('observaciones', 'LIKE', "%{$orderSnippet}%") ->orWhere('observaciones', 'LIKE', "%{$p->pedido_id}%"); }) ->exists(); if (!$existsEgreso) { \Illuminate\Support\Facades\DB::table('Pagos_Cajas_Egresos')->insert([ 'id_egreso' => (string) \Illuminate\Support\Str::uuid(), 'caja_diaria_id' => $cajaActivaId, 'monto' => $montoVuelto, 'categoria' => 'CAMBIO', 'observaciones' => "Vuelto entregado en Orden #{$orderSnippet} (Recibido: S/ " . number_format($montoRecibido, 2) . " • Vuelto: S/ " . number_format($montoVuelto, 2) . ")", 'usuario_id' => $cajaActivaRow->usuario_id ?? $p->mesero_id ?? '0', 'creado_at' => $p->creado_at ]); } } } $netSales += $montoVal; $tips += $propinaVal; $totalTransactions++; } // Egresos reales del turno $totalExpenses = (float) \Illuminate\Support\Facades\DB::table('Pagos_Cajas_Egresos') ->where('caja_diaria_id', $cajaActivaId) ->where('creado_at', '>=', $fechaDesde) ->sum('monto'); $egresosCount = \Illuminate\Support\Facades\DB::table('Pagos_Cajas_Egresos') ->where('caja_diaria_id', $cajaActivaId) ->where('creado_at', '>=', $fechaDesde) ->count(); $totalTransactions += $egresosCount; $expectedCash = max(0, $openingCash + $totalEfectivoRecibido - $totalExpenses); $totalGross = $netSales + $tips; } } catch (\Throwable $e) { // Fallback gracefully } $auditData = [ 'caja_id' => $cajaActivaId, 'turno_codigo' => $turnoCodigo, 'opening_cash' => $openingCash, 'sales_cash' => $salesCash, 'total_efectivo_recibido' => $totalEfectivoRecibido, 'total_vuelto_entregado' => $totalVueltoEntregado, 'total_expenses' => $totalExpenses, 'expected_cash' => $expectedCash, 'total_pos' => $totalPos, 'total_yape' => $totalYape, 'net_sales' => $netSales, 'tips' => $tips, 'total_gross' => $totalGross, 'total_transactions' => $totalTransactions, 'formatted_opening_cash' => number_format($openingCash, 2), 'formatted_sales_cash' => number_format($salesCash, 2), 'formatted_total_recibido' => number_format($totalEfectivoRecibido, 2), 'formatted_total_vuelto' => number_format($totalVueltoEntregado, 2), 'formatted_total_expenses' => number_format($totalExpenses, 2), 'formatted_expected_cash' => number_format($expectedCash, 2), 'formatted_total_pos' => number_format($totalPos, 2), 'formatted_total_yape' => number_format($totalYape, 2), 'formatted_net_sales' => number_format($netSales, 2), 'formatted_tips' => number_format($tips, 2), 'formatted_total_gross' => number_format($totalGross, 2), ]; @endphp