validateSection($request); $template->sections()->create($data); return back()->with('success', 'Seksyen ditambah.'); } public function updateSection(Request $request, ChecklistSection $section) { $section->update($this->validateSection($request)); return back()->with('success', 'Seksyen dikemas kini.'); } public function destroySection(ChecklistSection $section) { $section->delete(); return back()->with('success', 'Seksyen dipadam.'); } protected function validateSection(Request $request): array { $data = $request->validate([ 'code' => ['required', 'string', 'max:50'], 'title' => ['required', 'string', 'max:255'], 'description' => ['nullable', 'string', 'max:1000'], 'order' => ['nullable', 'integer', 'min:0'], 'is_formula_enabled' => ['nullable', 'boolean'], ]); $data['is_formula_enabled'] = $request->boolean('is_formula_enabled'); $data['order'] ??= 0; return $data; } // ---------------- Skop ---------------- public function storeScope(Request $request, ChecklistSection $section) { $section->scopes()->create($this->validateScope($request)); return back()->with('success', 'Skop ditambah.'); } public function updateScope(Request $request, ChecklistScope $scope) { $scope->update($this->validateScope($request)); return back()->with('success', 'Skop dikemas kini.'); } public function destroyScope(ChecklistScope $scope) { $scope->delete(); return back()->with('success', 'Skop dipadam.'); } protected function validateScope(Request $request): array { $data = $request->validate([ 'code' => ['required', 'string', 'max:50'], 'title' => ['required', 'string', 'max:255'], 'description' => ['nullable', 'string', 'max:1000'], 'order' => ['nullable', 'integer', 'min:0'], ]); $data['order'] ??= 0; return $data; } // ---------------- Item ---------------- public function storeItem(Request $request, ChecklistSection $section) { $data = $this->validateItem($request); $section->items()->create($data); return back()->with('success', 'Item ditambah.'); } public function updateItem(Request $request, ChecklistItem $item) { $item->update($this->validateItem($request)); return back()->with('success', 'Item dikemas kini.'); } public function destroyItem(ChecklistItem $item) { $item->delete(); return back()->with('success', 'Item dipadam.'); } protected function validateItem(Request $request): array { $data = $request->validate([ 'checklist_scope_id' => ['nullable', 'exists:checklist_scopes,id'], 'code' => ['required', 'string', 'max:50'], 'formula_token' => ['nullable', 'string', 'max:50', 'regex:/^[A-Za-z_][A-Za-z0-9_]*$/'], 'label' => ['required', 'string', 'max:500'], 'description' => ['nullable', 'string', 'max:1000'], 'input_type' => ['required', 'in:'.implode(',', array_keys(ChecklistItem::INPUT_TYPES))], 'options' => ['nullable', 'string'], 'unit' => ['nullable', 'string', 'max:50'], 'is_required' => ['nullable', 'boolean'], 'is_calculated' => ['nullable', 'boolean'], 'formula' => ['nullable', 'string', 'max:500'], 'order' => ['nullable', 'integer', 'min:0'], ], [], ['formula_token' => 'token formula']); $data['is_required'] = $request->boolean('is_required'); $data['is_calculated'] = $request->boolean('is_calculated'); $data['order'] ??= 0; // Tukar senarai pilihan (satu baris satu pilihan) kepada array. if (! empty($data['options'])) { $data['options'] = collect(preg_split('/\r\n|\r|\n/', $data['options'])) ->map(fn ($v) => trim($v))->filter()->values()->all(); } else { $data['options'] = null; } return $data; } // ---------------- Formula ---------------- public function storeFormula(Request $request, ChecklistTemplate $template) { $data = $this->validateFormula($request); $template->formulas()->create($data); return back()->with('success', 'Formula ditambah.'); } public function updateFormula(Request $request, ChecklistFormula $formula) { $formula->update($this->validateFormula($request)); return back()->with('success', 'Formula dikemas kini.'); } public function destroyFormula(ChecklistFormula $formula) { $formula->delete(); return back()->with('success', 'Formula dipadam.'); } protected function validateFormula(Request $request): array { $data = $request->validate([ 'checklist_section_id' => ['nullable', 'exists:checklist_sections,id'], 'result_token' => ['required', 'string', 'max:50', 'regex:/^[A-Za-z_][A-Za-z0-9_]*$/'], 'label' => ['nullable', 'string', 'max:255'], 'expression' => ['required', 'string', 'max:500'], 'unit' => ['nullable', 'string', 'max:50'], 'guard_div_zero' => ['nullable', 'boolean'], 'order' => ['nullable', 'integer', 'min:0'], ], [], ['result_token' => 'token hasil', 'expression' => 'ungkapan']); $data['guard_div_zero'] = $request->boolean('guard_div_zero'); $data['order'] ??= 0; return $data; } }