96 lines
3.1 KiB
PHP
96 lines
3.1 KiB
PHP
<?php
|
|
|
|
namespace App\Services;
|
|
|
|
use App\Models\CashRegister;
|
|
use App\Models\Sale;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class CashRegisterService
|
|
{
|
|
/**
|
|
* Abrir caja
|
|
*/
|
|
public function openRegister(array $data)
|
|
{
|
|
// Verificar que el usuario no tenga una caja abierta
|
|
$openRegister = CashRegister::where('user_id', $data['user_id'])
|
|
->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'),
|
|
];
|
|
}
|
|
}
|