resolveBusiness($request); if (! $business) { return $this->jsonError('کسب‌وکار یافت نشد.', 404); } $query = PreventiveSchedule::where('business_id', $business->id) ->with(['equipment:id,name,code', 'project:id,name', 'productionLine:id,name,code', 'assignedUser:id,name']) ->orderBy('next_due_at'); $this->applyMaintenanceScopeFilters($query, $request); if ($equipmentId = $request->get('equipment_id')) { $query->where('equipment_id', $equipmentId); } if ($request->boolean('due_soon')) { $query->where('next_due_at', '<=', now()->addDays(7)); } $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'], 'frequency_type' => ['required', 'string', 'in:daily,weekly,monthly,quarterly,semi_annual,annual,running_hours,cycle_count,production_quantity'], 'frequency_value' => ['sometimes', 'integer', 'min:1'], 'reminder_days_before' => ['sometimes', 'integer', 'min:0'], 'assigned_user_id' => ['nullable', 'exists:users,id'], 'running_hours_trigger' => ['nullable', 'numeric'], 'cycle_count_trigger' => ['nullable', 'integer'], 'production_quantity_trigger' => ['nullable', 'integer'], ], $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) { $schedule = PreventiveSchedule::create(array_merge($data, [ 'business_id' => $business->id, 'equipment_id' => $equipmentId, 'frequency_value' => $data['frequency_value'] ?? 1, 'reminder_days_before' => $data['reminder_days_before'] ?? 3, ])); $this->scheduleService->updateNextDue($schedule); $created[] = $schedule->load('equipment'); MaintenanceActivityService::log( $business, 'created', 'preventive_schedule', $schedule->id, "برنامه نگهداری «{$schedule->title}» ایجاد شد.", $request->user() ); } $message = count($created) > 1 ? count($created).' برنامه نگهداری برای تجهیزات انتخاب‌شده ایجاد شد.' : 'برنامه نگهداری ایجاد شد.'; return $this->jsonSuccess( count($created) === 1 ? $created[0] : ['items' => $created, 'count' => count($created)], $message, 201 ); } public function update(Request $request, PreventiveSchedule $schedule) { if (! $this->ensureBusinessOwnership($request, $schedule->business_id)) { return $this->jsonError('دسترسی ندارید.', 403); } $data = $request->validate(array_merge([ 'title' => ['sometimes', 'string', 'max:255'], 'description' => ['nullable', 'string'], 'frequency_type' => ['sometimes', 'string'], 'frequency_value' => ['sometimes', 'integer', 'min:1'], 'reminder_days_before' => ['sometimes', 'integer', 'min:0'], 'assigned_user_id' => ['nullable', 'exists:users,id'], 'is_active' => ['sometimes', 'boolean'], 'last_performed_at' => ['nullable', 'date'], ], $this->scopeValidationRules())); try { $data = $this->syncScopeFromLine(array_merge([ 'project_id' => $schedule->project_id, 'production_line_id' => $schedule->production_line_id, ], $data)); } catch (\InvalidArgumentException $e) { return $this->jsonError($e->getMessage(), 422); } $schedule->update($data); $this->scheduleService->updateNextDue($schedule->fresh()); return $this->jsonSuccess($schedule->fresh()->load('equipment'), 'برنامه به‌روزرسانی شد.'); } public function destroy(Request $request, PreventiveSchedule $schedule) { if (! $this->ensureBusinessOwnership($request, $schedule->business_id)) { return $this->jsonError('دسترسی ندارید.', 403); } $schedule->delete(); return $this->jsonSuccess(null, 'برنامه حذف شد.'); } }