pdv.backend/app/Services/CashRegisterService.php
Juan Felipe Zapata Moreno 599bb68ce6 ADD: Corte de caja
2025-12-31 13:45:42 -06:00

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'),
];
}
}