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) { $sales = Sale::where('cash_register_id', $register->id) ->where('status', 'completed') ->get(); // Calcular efectivo real (recibido - devuelto) $cashSales = $sales->where('payment_method', 'cash') ->sum(function ($sale) { return ($sale->cash_received ?? 0) - ($sale->change ?? 0); }); $totalCashReceived = $sales->where('payment_method', 'cash')->sum('cash_received'); $totalChangeGiven = $sales->where('payment_method', 'cash')->sum('change'); $cardSales = $sales->whereIn('payment_method', ['credit_card', 'debit_card'])->sum('total'); $totalSales = $sales->sum('total'); // Efectivo esperado $expectedCash = $register->initial_cash + $cashSales; // Diferencia (sobrante o faltante) $difference = $data['final_cash'] - $expectedCash; // Cerrar caja $register->update([ 'closed_at' => now(), 'final_cash' => $data['final_cash'], 'expected_cash' => $expectedCash, 'difference' => $difference, 'total_sales' => $totalSales, 'cash_sales' => $cashSales, 'card_sales' => $cardSales, 'total_cash_received' => $totalCashReceived, 'total_change_given' => $totalChangeGiven, 'notes' => $data['notes'] ?? null, 'status' => 'closed', ]); return $register; } /** * Obtener resumen de caja actual */ public function getCurrentSummary(CashRegister $register) { $sales = Sale::where('cash_register_id', $register->id) ->where('status', 'completed') ->get(); // Calcular efectivo real en caja (recibido - devuelto) $cashSales = $sales->where('payment_method', 'cash') ->sum(function ($sale) { return ($sale->cash_received ?? 0) - ($sale->change ?? 0); }); // Confirmación, envio de los totales $totalCashReceived = $sales->where('payment_method', 'cash')->sum('cash_received'); $totalChangeGiven = $sales->where('payment_method', 'cash')->sum('change'); $cardSales = $sales->whereIn('payment_method', ['credit_card', 'debit_card'])->sum('total'); $totalSales = $sales->sum('total'); $transactionCount = $sales->count(); return [ 'id' => $register->id, 'user_id' => $register->user_id, 'status' => $register->status, 'opened_at' => $register->opened_at, 'closed_at' => $register->closed_at, 'initial_cash' => (float) $register->initial_cash, // Totales calculados 'total_sales' => (float) $totalSales, 'transaction_count' => $transactionCount, 'cash_sales' => (float) $cashSales, 'card_sales' => (float) $cardSales, //Desglose de efectivo 'total_cash_received' => (float) $totalCashReceived, 'total_change_given' => (float) $totalChangeGiven, // Efectivo esperado 'expected_cash' => (float) ($register->initial_cash + $cashSales) ]; } }