Files
getgreen-backend/app/Helpers/Cart.php

260 lines
8.7 KiB
PHP
Executable File

<?php
namespace App\Helpers;
use App\Models\Cart as Model;
use App\Models\Product;
use Illuminate\Support\Facades\Cookie;
class Cart
{
/**
* @return array
*/
public function getProducts()
{
if (Cookie::has('cart_token')) {
$cart = Model::findByToken(Cookie::get('cart_token'))
->with('product:id,child_id', 'product.product:id,name,price,price_discount,poster_thumb,slug,leader_of_sales,currency,article_number,count,available')
->whereHas('product', function ($query) {
$query->whereHas('product', function ($query) {
return $query->isAvailable();
});
})
->get();
} else if (auth()->check()) {
$cart = Model::findByUser(auth()->user()->id)
->with('product:id,child_id', 'product.product:id,name,price,price_discount,poster_thumb,slug,leader_of_sales,currency,article_number,count,available')
->whereHas('product', function ($query) {
$query->whereHas('product', function ($query) {
return $query->isAvailable();
});
})
->get();
} else {
$cart = collect([]);
}
$cart->map(function ($cart) {
if (!empty($cart->product) && !empty($cart->product->product)) {
$cart->price = $cart->product->product->getPrice();
$cart->price_discount = $cart->product->product->price_discount == null ? null : $cart->product->product->getDiscountPrice();
} else {
$cart->price = 0;
$cart->price_discount = 0;
}
});
$prices = $cart->map(function ($cart) {
$price = 0;
$price_discount = 0;
$price_current = 0;
$price += $cart->price * $cart->count;
$price_discount += $cart->price_discount * $cart->count;
$price_current = $cart->price_discount ? $cart->price_discount * $cart->count : $cart->price * $cart->count;
return $price_current;
});
$prices = array_sum($prices->toArray());
return [$prices, $cart];
}
/**
* @param $request
* @return mixed
*/
public function store($request)
{
if (Cookie::has('cart_token')) {
$cart = Model::findByToken(Cookie::get('cart_token'))->where('product_id', $request->product_id)->where('size', $request->getSize())->first();
if (!empty($cart)) {
$cart->update([
'count' => $cart->count + $request->count
]);
} else {
Model::create([
'product_id' => $request->product_id,
'count' => $request->count,
'size' => $request->getSize(),
'token' => $request->cookie('cart_token')
]);
}
$count = Model::findByToken($request->cookie('cart_token'))->whereHas('product', function ($query) {
$query->whereHas('product');
})->count();
} elseif (auth()->check()) {
$cart = Model::findByUser(auth()->user()->id)->where('product_id', $request->product_id)->where('size', $request->getSize())->first();
if (!empty($cart)) {
$cart->update([
'count' => $cart->count + $request->count
]);
} else {
Model::create([
'product_id' => $request->product_id,
'count' => $request->count,
'size' => $request->getSize(),
'user_id' => auth()->user()->id
]);
}
$count = auth()->user()->cart()->whereHas('product', function ($query) {
$query->whereHas('product');
})->count();
}
return $count;
}
/**
* @param $product
* @return mixed
*/
public function delete($product)
{
if (Cookie::has('cart_token')) {
$cart = Model::findByToken(Cookie::get('cart_token'))->where('product_id', $product)->first();
if (!empty($cart))
$cart->delete();
$count = Model::findByToken(Cookie::get('cart_token'))->whereHas('product', function ($query) {
$query->whereHas('product');
})->count();
} else if (auth()->check()) {
$cart = Model::findByUser(auth()->user()->id)->where('product_id', $product)->first();
if (!empty($cart))
$cart->delete();
$count = auth()->user()->cart()->whereHas('product', function ($query) {
$query->whereHas('product');
})->count();
}
return $count;
}
/**
*
*/
public function removeAll()
{
if (Cookie::has('cart_token')) {
$cart = Model::findByToken(Cookie::get('cart_token'))->delete();
} elseif (auth()->check()) {
$cart = Model::findByUser(auth()->user()->id)->delete();
}
}
/**
* @param $request
* @return array
*/
public function update($request)
{
$product = Product::find($request->product_id);
$max_count = $product->product->count;
if (Cookie::has('cart_token')) {
$cart = Model::findByToken($request->cookie('cart_token'))->where('product_id', $request->product_id)->where('size', $request->getSize())->first();
if (!empty($cart)) {
$cart->update([
'count' => $request->count
]);
} else {
$cart = Model::create([
'product_id' => $request->product_id,
'count' => $request->count,
'size' => $request->getSize(),
'token' => $request->cookie('cart_token')
]);
}
$count = Model::findByToken($request->cookie('cart_token'))->whereHas('product', function ($query) {
$query->whereHas('product');
})->count();
} elseif (auth()->check()) {
$cart = Model::findByUser(auth()->user()->id)->where('product_id', $request->product_id)->where('size', $request->getSize())->first();
if (!empty($cart)) {
$cart->update([
'count' => $request->count
]);
} else {
$cart = Model::create([
'product_id' => $request->product_id,
'count' => $request->count,
'size' => $request->getSize(),
'user_id' => auth()->user()->id
]);
}
$count = auth()->user()->cart()->whereHas('product', function ($query) {
$query->whereHas('product');
})->count();
}
// $price = 0;
// $price_discount = 0;
// $price_current = 0;
//
// $price += $cart->product->product->getPrice();
// $price_discount += $cart->product->product->getDiscountPrice();
//
// $price_current = $cart->product->product->price_discount ? $price_discount : $price;
list($price) = $this->getProducts();
return [$price, $count, $max_count];
}
public function getBasketCount()
{
if (Cookie::has('cart_token')) {
$count = Model::findByToken(Cookie::get('cart_token'))->whereHas('product', function ($query) {
$query->whereHas('product', function ($query) {
return $query->isAvailable();
});
})->count();
} elseif (auth()->check()) {
$count = auth()->user()->cart()->whereHas('product', function ($query) {
$query->whereHas('product', function ($query) {
return $query->isAvailable();
});
})->count();
}
return $count;
}
/**
* @param $user_id
*/
public function AddToCartUpdate($user_id)
{
$token = Cookie::get('cart_token');
$carts = Model::findByToken($token)->get()->map(function ($cart) {
return $cart->product_id;
});
$cart_user = Model::findByUser($user_id)->get()->map(function ($cart) {
return $cart->product_id;
});
$product_id = array_diff($carts->toArray(), $cart_user->toArray());
Model::whereIn('product_id', $product_id)->findByToken($token)->update([
'token' => null,
'user_id' => $user_id
]);
Cookie::queue(Cookie::forget('cart_token'));
}
}