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'),
];
}
}