ensurePortalAccess(); $contactId = $this->contactId(); $configurations = CpqConfiguration::forBusiness($this->businessId()) ->where('contact_id', $contactId) ->with('productPlatform') ->latest('id') ->paginate(20); return view('industrialengineering::portal.cpq.index', compact('configurations')); } public function create(CpqService $cpq) { $this->ensurePortalAccess(); $platforms = ProductPlatform::where('business_id', $this->businessId()) ->where('status', 'active') ->orderBy('name') ->get() ->filter(fn ($p) => ! empty($cpq->getConfigurator($this->businessId(), $p->id)['groups'])); return view('industrialengineering::portal.cpq.create', compact('platforms')); } public function configure($platformId, CpqService $cpq) { $this->ensurePortalAccess(); $platform = ProductPlatform::where('business_id', $this->businessId())->findOrFail($platformId); $configurator = $cpq->getConfigurator($this->businessId(), (int) $platformId); return view('industrialengineering::portal.cpq.configure', compact('platform', 'configurator')); } public function store(Request $request, CpqService $cpq) { $this->ensurePortalAccess(); $validated = $request->validate([ 'product_platform_id' => 'required|integer', 'name' => 'required|string|max:255', 'selected_options' => 'nullable|array', ]); $selected = $cpq->applyRules($validated['selected_options'] ?? [], $this->businessId()); $cpq->buildConfiguration($this->businessId(), array_merge($validated, [ 'contact_id' => $this->contactId(), 'selected_options' => $selected, ])); return redirect()->action([self::class, 'index']) ->with('status', ['success' => 1, 'msg' => __('industrialengineering::lang.cpq_created')]); } public function show($id) { $this->ensurePortalAccess(); $configuration = CpqConfiguration::forBusiness($this->businessId()) ->where('contact_id', $this->contactId()) ->with('productPlatform') ->findOrFail($id); return view('industrialengineering::portal.cpq.show', compact('configuration')); } }