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

139 lines
3.9 KiB
PHP

<?php
namespace App\Http\Controllers\App;
use App\Http\Controllers\Controller;
use App\Models\CashRegister;
use App\Services\CashRegisterService;
use Illuminate\Http\Request;
use Notsoweb\ApiResponse\Enums\ApiResponse;
class CashRegisterController extends Controller
{
public function __construct(
protected CashRegisterService $cashRegisterService
) {}
/**
* Listar cortes de caja
*/
public function index(Request $request)
{
$query = CashRegister::with('user')->orderBy('opened_at', 'desc');
// Filtro por rango de fechas
if ($request->has('from') && $request->has('to')) {
$query->whereBetween('opened_at', [$request->from, $request->to]);
}
// Filtro por estado
if ($request->has('status')) {
$query->where('status', $request->status);
}
$registers = $query->paginate(config('app.pagination'));
return ApiResponse::OK->response([
'registers' => $registers
]);
}
/**
* Ver caja actual del usuario
*/
public function current()
{
$register = CashRegister::where('user_id', auth()->id())
->where('status', 'open')
->with(['user', 'sales'])
->first();
if (!$register) {
return ApiResponse::OK->response([
'register' => null,
'message' => 'No tienes una caja abierta.'
]);
}
$summary = $this->cashRegisterService->getCurrentSummary($register);
return ApiResponse::OK->response($summary);
}
/**
* Ver detalle de un corte específico
*/
public function show(CashRegister $register)
{
$register->load(['user', 'sales.details']);
$summary = [
'register' => $register,
'payment_summary' => $register->getTotalsByPaymentMethod(),
];
return ApiResponse::OK->response($summary);
}
/**
* Abrir caja
*/
public function open(Request $request)
{
$request->validate([
'initial_cash' => ['required', 'numeric', 'min:0'],
], [
'initial_cash.required' => 'El efectivo inicial es obligatorio.',
'initial_cash.numeric' => 'El efectivo inicial debe ser un número.',
'initial_cash.min' => 'El efectivo inicial no puede ser negativo.',
]);
try {
$register = $this->cashRegisterService->openRegister([
'user_id' => auth()->id(),
'initial_cash' => $request->initial_cash,
]);
return ApiResponse::CREATED->response([
'model' => $register,
'message' => 'Caja abierta exitosamente.'
]);
} catch (\Exception $e) {
return ApiResponse::BAD_REQUEST->response([
'message' => $e->getMessage()
]);
}
}
/**
* Cerrar caja
*/
public function close(CashRegister $register, Request $request)
{
$request->validate([
'final_cash' => ['required', 'numeric', 'min:0'],
'notes' => ['nullable', 'string', 'max:500'],
], [
'final_cash.required' => 'El efectivo final es obligatorio.',
'final_cash.numeric' => 'El efectivo final debe ser un número.',
'final_cash.min' => 'El efectivo final no puede ser negativo.',
]);
try {
$closedRegister = $this->cashRegisterService->closeRegister($register, [
'final_cash' => $request->final_cash,
'notes' => $request->notes,
]);
return ApiResponse::OK->response([
'model' => $closedRegister,
'message' => 'Caja cerrada exitosamente.'
]);
} catch (\Exception $e) {
return ApiResponse::BAD_REQUEST->response([
'message' => $e->getMessage()
]);
}
}
}