authorizeMaintenanceAccess('maintenance.inspections.view'); $business_id = $this->maintenanceUtil->getBusinessId(); if ($request->ajax()) { $query = InspectionVisit::where('business_id', $business_id) ->with([ 'equipment:id,name,code', 'project:id,name', 'inspector:id,first_name,last_name', 'serviceProvider:id,name', ]) ->orderByDesc('visit_date'); if ($equipment_id = $request->get('equipment_id')) { $query->where('equipment_id', $equipment_id); } if ($project_id = $request->get('project_id')) { $query->where('project_id', $project_id); } return DataTables::of($query) ->addColumn('equipment_name', fn ($row) => $row->equipment?->name ?? '—') ->addColumn('project_name', fn ($row) => $row->project?->name ?? '—') ->addColumn('inspector_name', function ($row) { if (! $row->inspector) { return '—'; } return trim($row->inspector->first_name.' '.($row->inspector->last_name ?? '')); }) ->addColumn('status_label', fn ($row) => $this->maintenanceUtil->statusLabel($row->status)) ->addColumn('action', function ($row) { $html = ''; if (auth()->user()->can('maintenance.inspections.create')) { $html .= ' '; } return $html; }) ->editColumn('visit_date', fn ($row) => $this->maintenanceUtil->formatDateTime($row->visit_date)) ->editColumn('health_percentage', fn ($row) => $row->health_percentage !== null ? number_format((float) $row->health_percentage, 1).'%' : '—') ->rawColumns(['action']) ->make(true); } return view('maintenance::inspection_visits.index', [ 'equipment' => $this->maintenanceUtil->getEquipmentDropdown($business_id), 'projects' => $this->maintenanceUtil->getProjectsDropdown($business_id), ]); } public function create() { $this->authorizeMaintenanceAccess('maintenance.inspections.create'); $business_id = $this->maintenanceUtil->getBusinessId(); return view('maintenance::inspection_visits.create', [ 'equipment' => $this->maintenanceUtil->getEquipmentDropdown($business_id), 'projects' => $this->maintenanceUtil->getProjectsDropdown($business_id), 'production_lines' => $this->maintenanceUtil->getProductionLinesDropdown($business_id), 'users' => $this->maintenanceUtil->getUsersDropdown($business_id), 'service_providers' => ServiceProvider::where('business_id', $business_id) ->where('is_active', true) ->orderBy('name') ->pluck('name', 'id') ->toArray(), ]); } public function store(Request $request) { $this->authorizeMaintenanceAccess('maintenance.inspections.create'); $business_id = $this->maintenanceUtil->getBusinessId(); $data = $request->validate([ 'project_id' => 'nullable|exists:pjt_projects,id', 'equipment_id' => 'nullable|exists:maintenance_equipment,id', 'production_line_id' => 'nullable|exists:maintenance_production_lines,id', 'visit_date' => 'required|string', 'health_percentage' => 'nullable|numeric|min:0|max:100', 'working_hours_at_visit' => 'nullable|numeric|min:0', 'visit_type' => 'nullable|string|max:100', 'inspector_id' => 'nullable|exists:users,id', 'service_provider_id' => 'nullable|exists:maintenance_service_providers,id', 'summary' => 'nullable|string', 'status' => 'sometimes|in:scheduled,pending,passed,failed,completed', ]); $data['visit_date'] = $this->maintenanceUtil->parseInputDateTime($data['visit_date']); $visit = InspectionVisit::create(array_merge($data, [ 'business_id' => $business_id, 'inspector_id' => $data['inspector_id'] ?? auth()->id(), 'status' => $data['status'] ?? 'completed', ])); return $this->maintenanceUtil->jsonOrRedirect( $request, true, 'بازدید ثبت شد.', action([self::class, 'show'], [$visit->id]) ); } public function show($id) { $this->authorizeMaintenanceAccess('maintenance.inspections.view'); $business_id = $this->maintenanceUtil->getBusinessId(); $business = $this->maintenanceUtil->getBusiness(); $inspection_visit = InspectionVisit::where('business_id', $business_id) ->with([ 'equipment', 'project', 'productionLine', 'inspector', 'serviceProvider', 'items.equipmentPart', 'checklistResponse.template', ]) ->findOrFail($id); $missionPanel = auth()->user()->can('maintenance.mission.view') ? array_merge( $this->missionService->getPanelData($business, 'inspection_visit', (int) $id), [ 'spare_parts' => $this->maintenanceUtil->getSparePartsDropdown($business_id), 'tools' => \Modules\Maintenance\Models\MaintenanceTool::where('business_id', $business_id)->where('status', 'available')->orderBy('name')->pluck('name', 'id'), 'users' => $this->maintenanceUtil->getUsersDropdown($business_id), 'can_manage' => auth()->user()->can('maintenance.mission.manage'), 'can_issue' => auth()->user()->can('maintenance.mission.issue'), 'can_expense' => auth()->user()->can('maintenance.mission.expense'), ] ) : null; return view('maintenance::inspection_visits.show', compact('inspection_visit', 'missionPanel')); } public function edit($id) { $this->authorizeMaintenanceAccess('maintenance.inspections.create'); $business_id = $this->maintenanceUtil->getBusinessId(); $inspection_visit = InspectionVisit::where('business_id', $business_id)->findOrFail($id); return view('maintenance::inspection_visits.edit', [ 'inspection_visit' => $inspection_visit, 'equipment' => $this->maintenanceUtil->getEquipmentDropdown($business_id), 'projects' => $this->maintenanceUtil->getProjectsDropdown($business_id), 'production_lines' => $this->maintenanceUtil->getProductionLinesDropdown($business_id), 'users' => $this->maintenanceUtil->getUsersDropdown($business_id), 'service_providers' => ServiceProvider::where('business_id', $business_id) ->where('is_active', true) ->orderBy('name') ->pluck('name', 'id') ->toArray(), ]); } public function update(Request $request, $id) { $this->authorizeMaintenanceAccess('maintenance.inspections.create'); $business_id = $this->maintenanceUtil->getBusinessId(); $visit = InspectionVisit::where('business_id', $business_id)->findOrFail($id); $data = $request->validate([ 'project_id' => 'nullable|exists:pjt_projects,id', 'equipment_id' => 'nullable|exists:maintenance_equipment,id', 'production_line_id' => 'nullable|exists:maintenance_production_lines,id', 'visit_date' => 'required|string', 'health_percentage' => 'nullable|numeric|min:0|max:100', 'working_hours_at_visit' => 'nullable|numeric|min:0', 'visit_type' => 'nullable|string|max:100', 'inspector_id' => 'nullable|exists:users,id', 'service_provider_id' => 'nullable|exists:maintenance_service_providers,id', 'summary' => 'nullable|string', 'status' => 'sometimes|in:scheduled,pending,passed,failed,completed', ]); $data['visit_date'] = $this->maintenanceUtil->parseInputDateTime($data['visit_date']); $visit->update($data); if (isset($data['health_percentage']) && $visit->equipment_id) { app(\Modules\Maintenance\Services\EquipmentHealthScoreService::class) ->recalculate($this->maintenanceUtil->getBusiness(), $visit->equipment); } return $this->maintenanceUtil->jsonOrRedirect( $request, true, 'بازدید به‌روزرسانی شد.', action([self::class, 'show'], [$visit->id]) ); } public function destroy(Request $request, $id) { $this->authorizeMaintenanceAccess('maintenance.inspections.delete'); $business_id = $this->maintenanceUtil->getBusinessId(); InspectionVisit::where('business_id', $business_id)->findOrFail($id)->delete(); return $this->maintenanceUtil->jsonOrRedirect($request, true, 'بازدید حذف شد.', action([self::class, 'index'])); } }