authorizeMaintenanceAccess('maintenance.checklists.view'); $business_id = $this->maintenanceUtil->getBusinessId(); if ($request->ajax()) { $templates = ChecklistTemplate::where('business_id', $business_id) ->with(['category:id,name', 'equipment:id,name,code']) ->withCount('items') ->orderBy('name'); return DataTables::of($templates) ->addColumn('scope', function ($row) { if ($row->equipment) { return e($row->equipment->name); } if ($row->category) { return e($row->category->name); } return '—'; }) ->addColumn('action', function ($row) { $html = ''; if (auth()->user()->can('maintenance.checklists.update')) { $html .= ''; } if (auth()->user()->can('maintenance.checklists.delete')) { $html .= ' '; } return $html ?: '—'; }) ->editColumn('is_active', fn ($row) => $row->is_active ? __('maintenance::lang.active') : __('maintenance::lang.inactive')) ->editColumn('items_count', fn ($row) => (int) $row->items_count) ->rawColumns(['action']) ->make(true); } return view('maintenance::checklists.index'); } public function create() { $this->authorizeMaintenanceAccess('maintenance.checklists.create'); $business_id = $this->maintenanceUtil->getBusinessId(); return view('maintenance::checklists.create', [ 'categories' => $this->maintenanceUtil->getCategoriesDropdown($business_id), 'equipment' => $this->maintenanceUtil->getEquipmentDropdown($business_id), 'item_types' => $this->itemTypeLabels(), ]); } public function store(Request $request) { $this->authorizeMaintenanceAccess('maintenance.checklists.create'); $business_id = $this->maintenanceUtil->getBusinessId(); $data = $this->validateTemplate($request); DB::transaction(function () use ($business_id, $data) { $template = ChecklistTemplate::create([ 'business_id' => $business_id, 'name' => $data['name'], 'description' => $data['description'] ?? null, 'equipment_category_id' => $data['equipment_category_id'] ?? null, 'equipment_id' => $data['equipment_id'] ?? null, 'is_active' => $data['is_active'] ?? true, ]); $this->syncItems($template, $data['items'] ?? []); }); return $this->maintenanceUtil->jsonOrRedirect( $request, true, 'چک‌لیست ایجاد شد.', action([self::class, 'index']) ); } public function edit($id) { $this->authorizeMaintenanceAccess('maintenance.checklists.update'); $business_id = $this->maintenanceUtil->getBusinessId(); $template = ChecklistTemplate::where('business_id', $business_id) ->with('items') ->findOrFail($id); return view('maintenance::checklists.edit', [ 'template' => $template, 'categories' => $this->maintenanceUtil->getCategoriesDropdown($business_id), 'equipment' => $this->maintenanceUtil->getEquipmentDropdown($business_id), 'item_types' => $this->itemTypeLabels(), ]); } public function update(Request $request, $id) { $this->authorizeMaintenanceAccess('maintenance.checklists.update'); $business_id = $this->maintenanceUtil->getBusinessId(); $template = ChecklistTemplate::where('business_id', $business_id)->findOrFail($id); $data = $this->validateTemplate($request, true); DB::transaction(function () use ($template, $data, $request) { $template->update([ 'name' => $data['name'], 'description' => $data['description'] ?? null, 'equipment_category_id' => $data['equipment_category_id'] ?? null, 'equipment_id' => $data['equipment_id'] ?? null, 'is_active' => $request->boolean('is_active'), ]); if (array_key_exists('items', $data)) { $template->items()->delete(); $this->syncItems($template, $data['items']); } }); return $this->maintenanceUtil->jsonOrRedirect( $request, true, 'چک‌لیست به‌روزرسانی شد.', action([self::class, 'index']) ); } public function destroy(Request $request, $id) { $this->authorizeMaintenanceAccess('maintenance.checklists.delete'); $business_id = $this->maintenanceUtil->getBusinessId(); $template = ChecklistTemplate::where('business_id', $business_id)->findOrFail($id); $template->items()->delete(); $template->delete(); return $this->maintenanceUtil->jsonOrRedirect($request, true, 'چک‌لیست حذف شد.', action([self::class, 'index'])); } protected function validateTemplate(Request $request, bool $partial = false): array { $required = $partial ? 'sometimes' : 'required'; return $request->validate([ 'name' => [$required, 'string', 'max:255'], 'description' => ['nullable', 'string'], 'equipment_category_id' => ['nullable', 'exists:maintenance_equipment_categories,id'], 'equipment_id' => ['nullable', 'exists:maintenance_equipment,id'], 'is_active' => ['sometimes', 'boolean'], 'items' => ['sometimes', 'array'], 'items.*.label' => ['required_with:items', 'string', 'max:255'], 'items.*.item_type' => ['sometimes', 'string', 'in:text,number,yes_no,photo,signature'], 'items.*.is_required' => ['sometimes', 'boolean'], ]); } protected function syncItems(ChecklistTemplate $template, array $items): void { foreach ($items as $i => $item) { if (empty($item['label'])) { continue; } ChecklistItem::create([ 'template_id' => $template->id, 'label' => $item['label'], 'item_type' => $item['item_type'] ?? 'text', 'is_required' => ! empty($item['is_required']), 'sort_order' => $i, ]); } } protected function itemTypeLabels(): array { return [ 'text' => __('maintenance::lang.checklist_type_text'), 'number' => __('maintenance::lang.checklist_type_number'), 'yes_no' => __('maintenance::lang.checklist_type_yes_no'), 'photo' => __('maintenance::lang.checklist_type_photo'), 'signature' => __('maintenance::lang.checklist_type_signature'), ]; } }