cart_instance = $cartInstance; if ($data) { $this->data = $data; $this->global_discount = $data->discount_percentage; //$this->global_tax = $data->tax_percentage; $this->shipping = $data->shipping_amount; //$this->updatedGlobalTax(); $this->updatedGlobalDiscount(); $cart_items = Cart::instance($this->cart_instance)->content(); foreach ($cart_items as $cart_item) { $this->check_quantity[$cart_item->id] = [$cart_item->options->stock]; $this->quantity[$cart_item->id] = $cart_item->qty; $this->unit_price[$cart_item->id] = $cart_item->price; $this->discount_type[$cart_item->id] = $cart_item->options->product_discount_type; if ($cart_item->options->product_discount_type == 'fixed') { $this->item_discount[$cart_item->id] = $cart_item->options->product_discount; } elseif ($cart_item->options->product_discount_type == 'percentage') { $this->item_discount[$cart_item->id] = round(100 * ($cart_item->options->product_discount / $cart_item->price)); } } } else { $this->global_discount = 0; //$this->global_tax = 0; $this->shipping = 0.00; $this->check_quantity = []; $this->quantity = []; $this->unit_price = []; $this->discount_type = []; $this->item_discount = []; } } public function render() { $cart_items = Cart::instance($this->cart_instance)->content(); return view('livewire.product-cart', [ 'cart_items' => $cart_items ]); } public function productSelected($product) { $cart = Cart::instance($this->cart_instance); $exists = $cart->search(function ($cartItem, $rowId) use ($product) { return $cartItem->id == $product['id']; }); if ($exists->isNotEmpty()) { session()->flash('message', 'Product exists in the cart!'); return; } $this->product = $product; $cart->add([ 'id' => $product['id'], 'name' => $product['product_name'], 'qty' => 1, 'price' => $this->calculate($product)['price'], 'weight' => 1, 'options' => [ 'product_discount' => 0.00, 'product_discount_type' => 'fixed', 'sub_total' => $this->calculate($product)['sub_total'], 'code' => $product['product_code'], 'stock' => $product['product_quantity'], 'unit' => $product['product_unit'], //'product_tax' => $this->calculate($product)['product_tax'], 'unit_price' => $this->calculate($product)['unit_price'] ] ]); $this->check_quantity[$product['id']] = $product['product_quantity']; $this->quantity[$product['id']] = 1; $this->discount_type[$product['id']] = 'fixed'; $this->item_discount[$product['id']] = 0; } public function removeItem($row_id) { Cart::instance($this->cart_instance)->remove($row_id); } // public function updatedGlobalTax() { // Cart::instance($this->cart_instance)->setGlobalTax((integer)$this->global_tax); // } public function updatedGlobalDiscount() { Cart::instance($this->cart_instance)->setGlobalDiscount((integer)$this->global_discount); } public function updateQuantity($row_id, $product_id) { if ($this->cart_instance == 'sale' || $this->cart_instance == 'purchase_return') { if ($this->check_quantity[$product_id] < $this->quantity[$product_id]) { session()->flash('message', 'The requested quantity is not available in stock.'); return; } } Cart::instance($this->cart_instance)->update($row_id, $this->quantity[$product_id]); $cart_item = Cart::instance($this->cart_instance)->get($row_id); Cart::instance($this->cart_instance)->update($row_id, [ 'options' => [ 'sub_total' => $cart_item->price * $cart_item->qty, 'code' => $cart_item->options->code, 'stock' => $cart_item->options->stock, 'unit' => $cart_item->options->unit, //'product_tax' => $cart_item->options->product_tax, 'unit_price' => $cart_item->options->unit_price, 'product_discount' => $cart_item->options->product_discount, 'product_discount_type' => $cart_item->options->product_discount_type, ] ]); } public function updatedDiscountType($value, $name) { $this->item_discount[$name] = 0; } public function discountModalRefresh($product_id, $row_id) { $this->updateQuantity($row_id, $product_id); } public function setProductDiscount($row_id, $product_id) { $cart_item = Cart::instance($this->cart_instance)->get($row_id); if ($this->discount_type[$product_id] == 'fixed') { Cart::instance($this->cart_instance) ->update($row_id, [ 'price' => ($cart_item->price + $cart_item->options->product_discount) - $this->item_discount[$product_id] ]); $discount_amount = $this->item_discount[$product_id]; $this->updateCartOptions($row_id, $product_id, $cart_item, $discount_amount); } elseif ($this->discount_type[$product_id] == 'percentage') { $discount_amount = ($cart_item->price + $cart_item->options->product_discount) * ($this->item_discount[$product_id] / 100); Cart::instance($this->cart_instance) ->update($row_id, [ 'price' => ($cart_item->price + $cart_item->options->product_discount) - $discount_amount ]); $this->updateCartOptions($row_id, $product_id, $cart_item, $discount_amount); } session()->flash('discount_message' . $product_id, 'Discount added to the product!'); } public function updatePrice($row_id, $product_id) { $product = Product::findOrFail($product_id); $cart_item = Cart::instance($this->cart_instance)->get($row_id); Cart::instance($this->cart_instance)->update($row_id, ['price' => $this->unit_price[$product['id']]]); Cart::instance($this->cart_instance)->update($row_id, [ 'options' => [ 'sub_total' => $this->calculate($product, $this->unit_price[$product['id']])['sub_total'], 'code' => $cart_item->options->code, 'stock' => $cart_item->options->stock, 'unit' => $cart_item->options->unit, //'product_tax' => $this->calculate($product, $this->unit_price[$product['id']])['product_tax'], 'unit_price' => $this->calculate($product, $this->unit_price[$product['id']])['unit_price'], 'product_discount' => $cart_item->options->product_discount, 'product_discount_type' => $cart_item->options->product_discount_type, ] ]); } public function calculate($product, $new_price = null) { if ($new_price) { $product_price = $new_price; } else { $this->unit_price[$product['id']] = $product['product_price']; if ($this->cart_instance == 'purchase' || $this->cart_instance == 'purchase_return') { $this->unit_price[$product['id']] = $product['product_cost']; } $product_price = $this->unit_price[$product['id']]; } // Check if wholesale price should be applied if (isset($product['min_quantity_for_wholesale']) && isset($product['wholesale_discount_percentage']) && isset($this->quantity[$product['id']]) && $this->quantity[$product['id']] >= $product['min_quantity_for_wholesale']) { $discount = $product['wholesale_discount_percentage'] / 100; $product_price = $product_price * (1 - $discount); } $price = $product_price; $unit_price = $product_price; $sub_total = $product_price; return ['price' => $price, 'unit_price' => $unit_price, 'sub_total' => $sub_total]; } public function updateCartOptions($row_id, $product_id, $cart_item, $discount_amount) { Cart::instance($this->cart_instance)->update($row_id, ['options' => [ 'sub_total' => $cart_item->price * $cart_item->qty, 'code' => $cart_item->options->code, 'stock' => $cart_item->options->stock, 'unit' => $cart_item->options->unit, //'product_tax' => $cart_item->options->product_tax, 'unit_price' => $cart_item->options->unit_price, 'product_discount' => $discount_amount, 'product_discount_type' => $this->discount_type[$product_id], ]]); } }