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.' ]); } $service = new CashRegisterService(); $summary = $service->getCurrentSummary($register); return ApiResponse::OK->response(['register' => $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() ]); } } }