ownerRef($request)) ->orderBy('name') ->paginate(30) ->withQueryString(); return view('pos.products.index', compact('products')); } public function create(): View { return view('pos.products.create', ['product' => new PosProduct([ 'currency' => config('pos.default_currency', 'GHS'), 'is_active' => true, ])]); } public function store(Request $request): RedirectResponse { PosProduct::create([ ...$this->validated($request), 'owner_ref' => $this->ownerRef($request), ]); return redirect()->route('pos.products.index')->with('success', 'Product added.'); } public function edit(Request $request, PosProduct $product): View { $this->authorizeOwner($request, $product); return view('pos.products.edit', compact('product')); } public function update(Request $request, PosProduct $product): RedirectResponse { $this->authorizeOwner($request, $product); $product->update($this->validated($request)); return redirect()->route('pos.products.index')->with('success', 'Product updated.'); } public function destroy(Request $request, PosProduct $product): RedirectResponse { $this->authorizeOwner($request, $product); $product->delete(); return redirect()->route('pos.products.index')->with('success', 'Product removed.'); } /** @return array */ private function validated(Request $request): array { $data = $request->validate([ 'name' => ['required', 'string', 'max:200'], 'sku' => ['nullable', 'string', 'max:80'], 'price' => ['required', 'numeric', 'min:0.01'], 'currency' => ['nullable', 'string', 'size:3'], 'is_active' => ['sometimes', 'boolean'], ]); return [ 'name' => $data['name'], 'sku' => $data['sku'] ?? null, 'price_minor' => (int) round(((float) $data['price']) * 100), 'currency' => strtoupper($data['currency'] ?? config('pos.default_currency', 'GHS')), 'is_active' => $request->boolean('is_active', true), ]; } }