MIF_E31222707/app/Http/Livewire/ProductCart.php

177 lines
6.6 KiB
PHP

<?php
namespace App\Http\Livewire;
use Gloudemans\Shoppingcart\Facades\Cart;
use Illuminate\Support\Facades\Request;
use Livewire\Component;
class ProductCart extends Component
{
public $listeners = ['productSelected'];
public $cart_instance;
public $global_discount;
public $global_tax;
public $shipping;
public $quantity;
public $check_quantity;
public $discount_type;
public $item_discount;
public $sale;
public function mount($cartInstance, $sale = null) {
$this->cart_instance = $cartInstance;
if ($sale) {
$this->sale = $sale;
$this->global_discount = $sale->discount_percentage;
$this->global_tax = $sale->tax_percentage;
$this->shipping = $sale->shipping_amount;
$this->updatedGlobalTax();
$this->updatedGlobalDiscount();
$sale_details = $this->sale->saleDetails;
foreach ($sale_details as $sale_detail) {
$this->check_quantity[$sale_detail->product_id] = [$sale_detail->product->product_quantity];
$this->quantity[$sale_detail->product_id] = $sale_detail->quantity;
$this->discount_type[$sale_detail->product_id] = 'fixed';
$this->item_discount[$sale_detail->product_id] = $sale_detail->product_discount_amount;
}
} else {
$this->global_discount = 0;
$this->global_tax = 0;
$this->shipping = 0.00;
$this->check_quantity = [];
$this->quantity = [];
$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;
}
$cart->add([
'id' => $product['id'],
'name' => $product['product_name'],
'qty' => 1,
'price' => $this->calculate($product)['price'],
'weight' => 1,
'options' => [
'product_discount' => 0.00,
'sub_total' => $this->calculate($product)['sub_total'],
'code' => $product['product_code'],
'stock' => $product['product_quantity'],
'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->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,
'product_tax' => $cart_item->options->product_tax,
'unit_price' => $cart_item->options->unit_price,
'product_discount' => $cart_item->options->product_discount,
]
]);
}
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]]);
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,
'product_tax' => $cart_item->options->product_tax,
'unit_price' => $cart_item->options->unit_price,
'product_discount' => $this->item_discount[$product_id],
]]);
}
}
public function calculate($product) {
$price = 0;
$unit_price = 0;
$product_tax = 0;
$sub_total = 0;
if ($product['product_tax_type'] == 1) {
$price = $product['product_price'] + ($product['product_price'] * ($product['product_order_tax'] / 100));
$unit_price = $product['product_price'];
$product_tax = $product['product_price'] * ($product['product_order_tax'] / 100);
$sub_total = $product['product_price'] + ($product['product_price'] * ($product['product_order_tax'] / 100));
}
elseif ($product['product_tax_type'] == 2) {
$price = $product['product_price'];
$unit_price = $product['product_price'] - ($product['product_price'] * ($product['product_order_tax'] / 100));
$product_tax = $product['product_price'] * ($product['product_order_tax'] / 100);
$sub_total = $product['product_price'];
}
else {
$price = $product['product_price'];
$unit_price = $product['product_price'];
$product_tax = 0.00;
$sub_total = $product['product_price'];
}
return ['price' => $price, 'unit_price' => $unit_price, 'product_tax' => $product_tax, 'sub_total' => $sub_total];
}
}