resolveBusiness($request); if (! $business) { return $this->jsonError('کسب‌وکار یافت نشد.', 404); } $query = Overhaul::where('business_id', $business->id) ->with(['equipment:id,name,code', 'supervisor:id,name', 'project:id,name', 'productionLine:id,name,code']) ->orderByDesc('start_date'); $this->applyMaintenanceScopeFilters($query, $request); if ($status = $request->get('status')) { $query->where('status', $status); } if ($equipmentId = $request->get('equipment_id')) { $query->where('equipment_id', $equipmentId); } $paginator = $query->paginate((int) $request->get('per_page', 15)); return $this->jsonSuccess([ 'items' => $paginator->items(), 'pagination' => [ 'total' => $paginator->total(), 'per_page' => $paginator->perPage(), 'current_page' => $paginator->currentPage(), 'last_page' => $paginator->lastPage(), ], ]); } public function store(Request $request) { $business = $this->resolveBusiness($request); if (! $business) { return $this->jsonError('کسب‌وکار یافت نشد.', 404); } $data = $request->validate(array_merge([ 'title' => ['required', 'string', 'max:255'], 'description' => ['nullable', 'string'], 'start_date' => ['nullable', 'date'], 'end_date' => ['nullable', 'date'], 'estimated_duration_hours' => ['nullable', 'numeric'], 'estimated_cost' => ['nullable', 'integer'], 'supervisor_id' => ['nullable', 'exists:users,id'], 'assigned_team' => ['nullable', 'array'], 'contractors' => ['nullable', 'array'], 'required_parts' => ['nullable', 'array'], 'required_tools' => ['nullable', 'array'], 'safety_requirements' => ['nullable', 'string'], 'shutdown_required' => ['sometimes', 'boolean'], 'status' => ['sometimes', 'string', 'in:planned,approved,waiting,in_progress,suspended,completed,cancelled'], ], $this->equipmentIdsValidationRules(), $this->scopeValidationRules())); $equipmentIds = $this->resolveEquipmentIds($data); if (empty($equipmentIds)) { return $this->jsonError('حداقل یک تجهیز انتخاب کنید.', 422); } unset($data['equipment_id'], $data['equipment_ids']); try { $data = $this->syncScopeFromLine($data); } catch (\InvalidArgumentException $e) { return $this->jsonError($e->getMessage(), 422); } $created = []; foreach ($equipmentIds as $equipmentId) { $overhaul = Overhaul::create(array_merge($data, [ 'business_id' => $business->id, 'equipment_id' => $equipmentId, 'status' => $data['status'] ?? 'planned', ])); MaintenanceActivityService::log( $business, 'created', 'overhaul', $overhaul->id, "اورهال «{$overhaul->title}» برنامه‌ریزی شد.", $request->user() ); MaintenanceActivityService::logEquipmentHistory( $business, $overhaul->equipment_id, 'overhaul', $overhaul->title, $overhaul->description, $request->user(), 0, Overhaul::class, $overhaul->id ); $created[] = $overhaul->load(['equipment', 'project']); } $message = count($created) > 1 ? count($created).' اورهال برای تجهیزات انتخاب‌شده ایجاد شد.' : 'اورهال ایجاد شد.'; return $this->jsonSuccess( count($created) === 1 ? $created[0] : ['items' => $created, 'count' => count($created)], $message, 201 ); } public function show(Request $request, Overhaul $overhaul) { if (! $this->ensureBusinessOwnership($request, $overhaul->business_id)) { return $this->jsonError('دسترسی ندارید.', 403); } return $this->jsonSuccess($overhaul->load(['equipment', 'supervisor', 'workOrders', 'project'])); } public function update(Request $request, Overhaul $overhaul) { if (! $this->ensureBusinessOwnership($request, $overhaul->business_id)) { return $this->jsonError('دسترسی ندارید.', 403); } $data = $request->validate(array_merge([ 'title' => ['sometimes', 'string', 'max:255'], 'description' => ['nullable', 'string'], 'start_date' => ['nullable', 'date'], 'end_date' => ['nullable', 'date'], 'estimated_duration_hours' => ['nullable', 'numeric'], 'actual_duration_hours' => ['nullable', 'numeric'], 'estimated_cost' => ['nullable', 'integer'], 'actual_cost' => ['nullable', 'integer'], 'supervisor_id' => ['nullable', 'exists:users,id'], 'assigned_team' => ['nullable', 'array'], 'contractors' => ['nullable', 'array'], 'required_parts' => ['nullable', 'array'], 'required_tools' => ['nullable', 'array'], 'safety_requirements' => ['nullable', 'string'], 'shutdown_required' => ['sometimes', 'boolean'], 'status' => ['sometimes', 'string', 'in:planned,approved,waiting,in_progress,suspended,completed,cancelled'], 'attachments' => ['nullable', 'array'], ], $this->scopeValidationRules())); try { $data = $this->syncScopeFromLine(array_merge([ 'project_id' => $overhaul->project_id, 'production_line_id' => $overhaul->production_line_id, ], $data)); } catch (\InvalidArgumentException $e) { return $this->jsonError($e->getMessage(), 422); } $overhaul->update($data); return $this->jsonSuccess($overhaul->fresh()->load(['equipment', 'project', 'productionLine']), 'اورهال به‌روزرسانی شد.'); } public function destroy(Request $request, Overhaul $overhaul) { if (! $this->ensureBusinessOwnership($request, $overhaul->business_id)) { return $this->jsonError('دسترسی ندارید.', 403); } $overhaul->delete(); return $this->jsonSuccess(null, 'اورهال حذف شد.'); } }