service->paginate($versionId, page: 1, size: PHP_INT_MAX)->items(); }, __('message.fetched')); } public function upsertTemplate(Request $request, int $versionId) { return ApiResponse::handle(function () use ($request, $versionId) { $payload = $request->validate([ 'name' => 'nullable|string|max:100', 'is_primary' => 'boolean', 'notes' => 'nullable|string', ]); return $this->service->upsertTemplate( modelVersionId: $versionId, name: $payload['name'] ?? 'Main', isPrimary: (bool)($payload['is_primary'] ?? true), notes: $payload['notes'] ?? null ); }, __('message.created')); } public function show(int $templateId) { return ApiResponse::handle(fn() => $this->service->show($templateId, true), __('message.fetched')); } public function replaceItems(Request $request, int $templateId) { return ApiResponse::handle(function () use ($request, $templateId) { $payload = $request->validate([ 'items' => 'required|array|min:1', 'items.*.ref_type' => 'required|string|in:MATERIAL,PRODUCT', 'items.*.ref_id' => 'required|integer|min:1', 'items.*.qty' => 'required|numeric|gt:0', 'items.*.waste_rate' => 'nullable|numeric|min:0', 'items.*.uom_id' => 'nullable|integer|min:1', 'items.*.notes' => 'nullable|string|max:255', 'items.*.sort_order' => 'nullable|integer', ]); $this->service->replaceItems($templateId, $payload['items']); return null; }, __('message.bom.bulk_upsert')); } }