filter(fn($item) => $item->options->type == 'sale'); $stockIds = $cart_contents->pluck('options.stock_id')->filter()->unique(); $batchNos = Stock::whereIn('id', $stockIds)->pluck('batch_no', 'id'); foreach ($cart_contents as $cartItem) { $stockId = $cartItem->options->stock_id ?? null; if ($stockId && isset($batchNos[$stockId])) { $newOptions = $cartItem->options->merge([ 'batch_no' => $batchNos[$stockId], ]); Cart::update($cartItem->rowId, [ 'qty' => $cartItem->qty, 'options' => $newOptions, ]); } } $modules = product_setting()->modules ?? []; return view('business::sales.cart-list', compact('cart_contents', 'modules')); } public function store(Request $request) { $this->validate($request, [ 'stock_id' => 'nullable|exists:stocks,id', 'warehouse_id' => 'nullable|exists:warehouses,id', 'type' => 'nullable|string|in:sale,purchase', 'id' => 'required|integer', 'name' => 'required|string', 'quantity' => 'required|numeric', 'price' => 'required|numeric', 'product_code' => 'nullable|string', 'product_unit_id' => 'nullable|integer', 'product_unit_name' => 'nullable|string', 'product_image' => 'nullable|string', 'sales_price' => 'nullable|numeric', 'whole_sale_price' => 'nullable|numeric', 'dealer_price' => 'nullable|numeric', 'expire_date' => 'nullable|date', 'product_type' => 'nullable|in:single,variant,combo', 'variant_name' => 'nullable|string', 'vat_percent' => 'nullable|numeric', ]); // Check for existing item in cart by type $existingCartItem = Cart::search( fn($item) => $item->id == $request->id && $item->options->type == $request->type && match ($request->type) { 'purchase' => $item->options->batch_no == $request->batch_no, 'sale' => $item->options->stock_id == $request->stock_id, default => false, } )->first(); if ($existingCartItem) { $newQty = $existingCartItem->qty + $request->quantity; Cart::update($existingCartItem->rowId, ['qty' => $newQty]); } else { // Add new item to cart $mainItemData = [ 'id' => $request->id, 'name' => $request->name, 'qty' => $request->quantity, 'price' => $request->price, 'options' => [ 'type' => $request->type, 'product_code' => $request->product_code, 'product_unit_id' => $request->product_unit_id, 'product_unit_name' => $request->product_unit_name, 'stock_id' => $request->stock_id, 'batch_no' => $request->batch_no, 'product_image' => $request->product_image, 'expire_date' => $request->expire_date, 'purchase_price' => $request->purchase_price, 'sales_price' => $request->sales_price, 'whole_sale_price' => $request->whole_sale_price, 'dealer_price' => $request->dealer_price, 'product_type' => $request->product_type, 'warehouse_id' => $request->warehouse_id, 'variant_name' => $request->variant_name, 'vat_percent' => $request->vat_percent, ] ]; Cart::add($mainItemData); } return response()->json([ 'success' => true, 'message' => 'Item added to cart successfully.' ]); } public function update(Request $request, $id) { $cart = Cart::get($id); if (!$cart) { return response()->json(['success' => false, 'message' => __('Item not found in cart')]); } $qty = $request->qty ?? $cart->qty; if ($qty < 0) { return response()->json(['success' => false, 'message' => __('Enter a valid quantity')]); } Cart::update($id, [ 'qty' => $qty, 'price' => $request->price ?? $cart->price, 'options' => [ 'type' => $cart->options->type, 'expire_date' => $request->expire_date ?? $cart->options->expire_date, 'stock_id' => $request->stock_id ?? $cart->options->stock_id, 'batch_no' => $request->batch_no ?? $cart->options->batch_no, 'product_code' => $cart->options->product_code, 'product_unit_id' => $cart->options->product_unit_id, 'product_unit_name' => $cart->options->product_unit_name, 'product_image' => $cart->options->product_image, 'sales_price' => $cart->options->sales_price, 'discount' => $request->discount ?? $cart->options->discount, 'whole_sale_price' => $cart->options->whole_sale_price, 'dealer_price' => $cart->options->dealer_price, 'purchase_price' => $cart->options->purchase_price, 'product_type' => $cart->options->product_type, 'warehouse_id' => $cart->options->warehouse_id, 'variant_name' => $cart->options->variant_name, 'vat_percent' => $cart->options->vat_percent, ] ]); return response()->json([ 'success' => true, 'message' => __('Cart updated successfully') ]); } public function destroy($id) { try { Cart::remove($id); return response()->json(['success' => true, 'message' => __('Item removed from cart')]); } catch (InvalidRowIDException $e) { return response()->json(['success' => false, 'message' => __('The cart does not contain this item')]); } } public function removeAllCart(Request $request) { $carts = Cart::content(); if ($carts->count() < 1) { return response()->json(['message' => __('Cart is empty. Add items first!')]); } Cart::destroy(); $response = [ 'success' => true, 'message' => __('All cart removed successfully!'), ]; return response()->json($response); } }