authorizeMaintenanceAccess('maintenance.tools.view'); $business_id = $this->maintenanceUtil->getBusinessId(); if ($request->ajax()) { $query = MaintenanceTool::where('business_id', $business_id) ->with(['checkedOutUser:id,first_name,last_name']) ->orderBy('name'); return DataTables::of($query) ->addColumn('holder_name', function ($row) { if (! $row->checkedOutUser) { return '—'; } return trim($row->checkedOutUser->first_name.' '.($row->checkedOutUser->last_name ?? '')); }) ->editColumn('status', fn ($row) => $this->maintenanceUtil->toolStatusLabel($row->status)) ->addColumn('action', function ($row) { $html = ''; if (auth()->user()->can('maintenance.tools.update')) { $html .= ''; if ($row->status === 'available') { $html .= ' '; } elseif ($row->status === 'checked_out') { $html .= ' '; } } if (auth()->user()->can('maintenance.tools.delete')) { $html .= ' '; } return $html ?: '—'; }) ->rawColumns(['action']) ->make(true); } return view('maintenance::tools.index'); } public function create() { $this->authorizeMaintenanceAccess('maintenance.tools.create'); return view('maintenance::tools.create', [ 'locations' => $this->maintenanceUtil->getLocationsDropdown($this->maintenanceUtil->getBusinessId()), 'statuses' => $this->maintenanceUtil->toolStatusLabels(), ]); } public function store(Request $request) { $this->authorizeMaintenanceAccess('maintenance.tools.create'); $business_id = $this->maintenanceUtil->getBusinessId(); $data = $this->validateTool($request); MaintenanceTool::create(array_merge($data, [ 'business_id' => $business_id, 'status' => $data['status'] ?? 'available', ])); return $this->maintenanceUtil->jsonOrRedirect($request, true, 'ابزار ثبت شد.'); } public function edit($id) { $this->authorizeMaintenanceAccess('maintenance.tools.update'); $tool = MaintenanceTool::where('business_id', $this->maintenanceUtil->getBusinessId())->findOrFail($id); return view('maintenance::tools.edit', [ 'tool' => $tool, 'locations' => $this->maintenanceUtil->getLocationsDropdown($this->maintenanceUtil->getBusinessId()), 'statuses' => $this->maintenanceUtil->toolStatusLabels(), ]); } public function update(Request $request, $id) { $this->authorizeMaintenanceAccess('maintenance.tools.update'); $tool = MaintenanceTool::where('business_id', $this->maintenanceUtil->getBusinessId())->findOrFail($id); $tool->update($this->validateTool($request)); return $this->maintenanceUtil->jsonOrRedirect($request, true, 'ابزار به‌روزرسانی شد.'); } public function destroy(Request $request, $id) { $this->authorizeMaintenanceAccess('maintenance.tools.delete'); MaintenanceTool::where('business_id', $this->maintenanceUtil->getBusinessId())->findOrFail($id)->delete(); return $this->maintenanceUtil->jsonOrRedirect($request, true, 'ابزار حذف شد.'); } public function checkoutForm($id) { $this->authorizeMaintenanceAccess('maintenance.tools.update'); $business_id = $this->maintenanceUtil->getBusinessId(); $tool = MaintenanceTool::where('business_id', $business_id)->findOrFail($id); return view('maintenance::tools.checkout', [ 'tool' => $tool, 'users' => $this->maintenanceUtil->getUsersDropdown($business_id), 'equipment' => $this->maintenanceUtil->getEquipmentDropdown($business_id), 'work_orders' => \Modules\Maintenance\Models\WorkOrder::where('business_id', $business_id) ->whereIn('status', ['open', 'in_progress']) ->orderByDesc('id') ->limit(100) ->pluck('work_order_number', 'id') ->toArray(), ]); } public function checkout(Request $request, $id) { $this->authorizeMaintenanceAccess('maintenance.tools.update'); $business = $this->maintenanceUtil->getBusiness(); $tool = MaintenanceTool::where('business_id', $business->id)->findOrFail($id); $data = $request->validate([ 'user_id' => ['required', 'exists:users,id'], 'work_order_id' => ['nullable', 'exists:maintenance_work_orders,id'], 'equipment_id' => ['nullable', 'exists:maintenance_equipment,id'], 'expected_return_at' => ['nullable', 'string'], 'notes' => ['nullable', 'string'], ]); try { $this->toolCribService->checkout( $business, $tool, (int) $data['user_id'], $data['work_order_id'] ?? null, $data['equipment_id'] ?? null, ! empty($data['expected_return_at']) ? $this->maintenanceUtil->parseInputDateTime($data['expected_return_at']) : null, $data['notes'] ?? null, auth()->user() ); } catch (\InvalidArgumentException $e) { return $this->maintenanceUtil->jsonOrRedirect($request, false, $e->getMessage()); } return $this->maintenanceUtil->jsonOrRedirect($request, true, 'ابزار تحویل داده شد.'); } public function returnTool(Request $request, $id) { $this->authorizeMaintenanceAccess('maintenance.tools.update'); $business = $this->maintenanceUtil->getBusiness(); $tool = MaintenanceTool::where('business_id', $business->id)->findOrFail($id); try { $this->toolCribService->returnTool($business, $tool, $request->input('notes'), auth()->user()); } catch (\InvalidArgumentException $e) { return $this->maintenanceUtil->jsonOrRedirect($request, false, $e->getMessage()); } return $this->maintenanceUtil->jsonOrRedirect($request, true, 'ابزار برگشت داده شد.'); } protected function validateTool(Request $request): array { return $request->validate([ 'code' => ['required', 'string', 'max:50'], 'name' => ['required', 'string', 'max:255'], 'serial_number' => ['nullable', 'string', 'max:100'], 'category' => ['nullable', 'string', 'max:100'], 'location_id' => ['nullable', 'integer'], 'status' => ['sometimes', 'string', 'in:available,checked_out,maintenance,retired'], 'notes' => ['nullable', 'string'], ]); } }