where('status', 'open') ->first(); if ($openRegister) { throw new \Exception('Ya tienes una caja abierta. Debes cerrarla antes de abrir una nueva.'); } return CashRegister::create([ 'user_id' => $data['user_id'], 'opened_at' => now(), 'initial_cash' => $data['initial_cash'] ?? 0, 'status' => 'open', ]); } /** * Cerrar caja */ public function closeRegister(CashRegister $register, array $data) { if ($register->status === 'closed') { throw new \Exception('Esta caja ya está cerrada.'); } return DB::transaction(function () use ($register, $data) { // Calcular ventas en efectivo $cashSales = Sale::where('cash_register_id', $register->id) ->where('payment_method', 'cash') ->where('status', 'completed') ->sum('total'); // Calcular efectivo esperado $expectedCash = $register->initial_cash + $cashSales; // Calcular diferencia $finalCash = $data['final_cash']; $difference = $finalCash - $expectedCash; // Actualizar caja $register->update([ 'closed_at' => now(), 'final_cash' => $finalCash, 'expected_cash' => $expectedCash, 'difference' => $difference, 'total_sales' => Sale::where('cash_register_id', $register->id) ->where('status', 'completed') ->sum('total'), 'sales_count' => Sale::where('cash_register_id', $register->id) ->where('status', 'completed') ->count(), 'notes' => $data['notes'] ?? null, 'status' => 'closed', ]); return $register->fresh(['user', 'sales']); }); } /** * Obtener resumen de caja actual */ public function getCurrentSummary(CashRegister $register) { $sales = Sale::where('cash_register_id', $register->id) ->where('status', 'completed') ->get(); return [ 'register' => $register, 'total_cash' => $sales->where('payment_method', 'cash')->sum('total'), 'total_credit_card' => $sales->where('payment_method', 'credit_card')->sum('total'), 'total_debit_card' => $sales->where('payment_method', 'debit_card')->sum('total'), 'total_sales' => $sales->sum('total'), 'sales_count' => $sales->count(), 'expected_cash' => $register->initial_cash + $sales->where('payment_method', 'cash')->sum('total'), ]; } }