416 lines
13 KiB
PHP
416 lines
13 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Api\V2;
|
|
|
|
use App\Http\Resources\V2\ClassifiedProductDetailCollection;
|
|
use App\Http\Resources\V2\ClassifiedProductMiniCollection;
|
|
use Cache;
|
|
use App\Models\Shop;
|
|
use App\Models\Color;
|
|
use App\Models\Product;
|
|
use App\Models\FlashDeal;
|
|
use Illuminate\Http\Request;
|
|
use App\Utility\SearchUtility;
|
|
use App\Utility\CategoryUtility;
|
|
use App\Http\Resources\V2\ProductCollection;
|
|
use App\Http\Resources\V2\FlashDealCollection;
|
|
use App\Http\Resources\V2\ProductMiniCollection;
|
|
use App\Http\Resources\V2\ProductDetailCollection;
|
|
use App\Http\Resources\V2\DigitalProductDetailCollection;
|
|
use App\Models\CustomerProduct;
|
|
|
|
class ProductController extends Controller
|
|
{
|
|
public function index()
|
|
{
|
|
return new ProductMiniCollection(Product::latest()->paginate(10));
|
|
}
|
|
|
|
public function show($id)
|
|
{
|
|
return new ProductDetailCollection(Product::where('id', $id)->get());
|
|
// if (Product::findOrFail($id)->digital==0) {
|
|
// return new ProductDetailCollection(Product::where('id', $id)->get());
|
|
// }elseif (Product::findOrFail($id)->digital==1) {
|
|
// return new DigitalProductDetailCollection(Product::where('id', $id)->get());
|
|
// }
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// public function admin()
|
|
// {
|
|
// return new ProductCollection(Product::where('added_by', 'admin')->latest()->paginate(10));
|
|
// }
|
|
|
|
public function getPrice(Request $request)
|
|
{
|
|
$product = Product::findOrFail($request->id);
|
|
$str = '';
|
|
$tax = 0;
|
|
$quantity = 1;
|
|
|
|
|
|
|
|
if ($request->has('quantity') && $request->quantity != null) {
|
|
$quantity = $request->quantity;
|
|
}
|
|
|
|
if ($request->has('color') && $request->color != null) {
|
|
$str = Color::where('code', '#' . $request->color)->first()->name;
|
|
}
|
|
|
|
$var_str = str_replace(',', '-', $request->variants);
|
|
$var_str = str_replace(' ', '', $var_str);
|
|
|
|
if ($var_str != "") {
|
|
$temp_str = $str == "" ? $var_str : '-' . $var_str;
|
|
$str .= $temp_str;
|
|
}
|
|
|
|
$product_stock = $product->stocks->where('variant', $str)->first();
|
|
$price = $product_stock->price;
|
|
|
|
|
|
if ($product->wholesale_product) {
|
|
$wholesalePrice = $product_stock->wholesalePrices->where('min_qty', '<=', $quantity)->where('max_qty', '>=', $quantity)->first();
|
|
if ($wholesalePrice) {
|
|
$price = $wholesalePrice->price;
|
|
}
|
|
}
|
|
|
|
$stock_qty = $product_stock->qty;
|
|
$stock_txt = $product_stock->qty;
|
|
$max_limit = $product_stock->qty;
|
|
|
|
if ($stock_qty >= 1 && $product->min_qty <= $stock_qty) {
|
|
$in_stock = 1;
|
|
} else {
|
|
$in_stock = 0;
|
|
}
|
|
|
|
//Product Stock Visibility
|
|
if ($product->stock_visibility_state == 'text') {
|
|
if ($stock_qty >= 1 && $product->min_qty < $stock_qty) {
|
|
$stock_txt = translate('In Stock');
|
|
} else {
|
|
$stock_txt = translate('Out Of Stock');
|
|
}
|
|
}
|
|
|
|
//discount calculation
|
|
$discount_applicable = false;
|
|
|
|
if ($product->discount_start_date == null) {
|
|
$discount_applicable = true;
|
|
} elseif (
|
|
strtotime(date('d-m-Y H:i:s')) >= $product->discount_start_date &&
|
|
strtotime(date('d-m-Y H:i:s')) <= $product->discount_end_date
|
|
) {
|
|
$discount_applicable = true;
|
|
}
|
|
|
|
if ($discount_applicable) {
|
|
if ($product->discount_type == 'percent') {
|
|
$price -= ($price * $product->discount) / 100;
|
|
} elseif ($product->discount_type == 'amount') {
|
|
$price -= $product->discount;
|
|
}
|
|
}
|
|
|
|
// taxes
|
|
foreach ($product->taxes as $product_tax) {
|
|
if ($product_tax->tax_type == 'percent') {
|
|
$tax += ($price * $product_tax->tax) / 100;
|
|
} elseif ($product_tax->tax_type == 'amount') {
|
|
$tax += $product_tax->tax;
|
|
}
|
|
}
|
|
|
|
$price += $tax;
|
|
|
|
return response()->json(
|
|
|
|
[
|
|
'result' => true,
|
|
'data' => [
|
|
'price' => single_price($price * $quantity),
|
|
'stock' => $stock_qty,
|
|
'stock_txt' => $stock_txt,
|
|
'digital' => $product->digital,
|
|
'variant' => $str,
|
|
'variation' => $str,
|
|
'max_limit' => $max_limit,
|
|
'in_stock' => $in_stock,
|
|
'image' => $product_stock->image == null ? "" : uploaded_asset($product_stock->image)
|
|
]
|
|
|
|
]
|
|
);
|
|
}
|
|
|
|
public function seller($id, Request $request)
|
|
{
|
|
$shop = Shop::findOrFail($id);
|
|
$products = Product::where('added_by', 'seller')->where('user_id', $shop->user_id);
|
|
if ($request->name != "" || $request->name != null) {
|
|
$products = $products->where('name', 'like', '%' . $request->name . '%');
|
|
}
|
|
$products->where('published', 1);
|
|
return new ProductMiniCollection($products->latest()->paginate(10));
|
|
}
|
|
|
|
public function category($id, Request $request)
|
|
{
|
|
$category_ids = CategoryUtility::children_ids($id);
|
|
$category_ids[] = $id;
|
|
|
|
$products = Product::whereIn('category_id', $category_ids)->physical();
|
|
|
|
if ($request->name != "" || $request->name != null) {
|
|
$products = $products->where('name', 'like', '%' . $request->name . '%');
|
|
}
|
|
$products->where('published', 1);
|
|
return new ProductMiniCollection(filter_products($products)->latest()->paginate(10));
|
|
}
|
|
|
|
|
|
public function brand($id, Request $request)
|
|
{
|
|
$products = Product::where('brand_id', $id)->physical();
|
|
if ($request->name != "" || $request->name != null) {
|
|
$products = $products->where('name', 'like', '%' . $request->name . '%');
|
|
}
|
|
return new ProductMiniCollection(filter_products($products)->latest()->paginate(10));
|
|
}
|
|
|
|
public function todaysDeal()
|
|
{
|
|
// return Cache::remember('app.todays_deal', 86400, function () {
|
|
$products = Product::where('todays_deal', 1)->physical();
|
|
return new ProductMiniCollection(filter_products($products)->limit(20)->latest()->get());
|
|
// });
|
|
}
|
|
|
|
public function flashDeal()
|
|
{
|
|
return Cache::remember('app.flash_deals', 86400, function () {
|
|
$flash_deals = FlashDeal::where('status', 1)->where('featured', 1)->where('start_date', '<=', strtotime(date('d-m-Y')))->where('end_date', '>=', strtotime(date('d-m-Y')))->get();
|
|
return new FlashDealCollection($flash_deals);
|
|
});
|
|
}
|
|
|
|
public function featured()
|
|
{
|
|
|
|
|
|
$products = Product::where('featured', 1)->physical();
|
|
return new ProductMiniCollection(filter_products($products)->latest()->paginate(10));
|
|
}
|
|
|
|
public function digital()
|
|
{
|
|
$products = Product::digital();
|
|
return new ProductMiniCollection(filter_products($products)->latest()->paginate(10));
|
|
}
|
|
|
|
|
|
|
|
public function bestSeller()
|
|
{
|
|
// return Cache::remember('app.best_selling_products', 86400, function () {
|
|
$products = Product::orderBy('num_of_sale', 'desc')->physical();
|
|
return new ProductMiniCollection(filter_products($products)->limit(20)->get());
|
|
// });
|
|
}
|
|
|
|
public function related($id)
|
|
{
|
|
// return Cache::remember("app.related_products-$id", 86400, function () use ($id) {
|
|
$product = Product::find($id);
|
|
$products = Product::where('category_id', $product->category_id)->where('id', '!=', $id)->physical();
|
|
return new ProductMiniCollection(filter_products($products)->limit(10)->get());
|
|
|
|
// });
|
|
}
|
|
|
|
public function topFromSeller($id)
|
|
{
|
|
// return Cache::remember("app.top_from_this_seller_products-$id", 86400, function () use ($id) {
|
|
$product = Product::find($id);
|
|
$products = Product::where('user_id', $product->user_id)->orderBy('num_of_sale', 'desc')->physical();
|
|
return new ProductMiniCollection(filter_products($products)->limit(10)->get());
|
|
// });
|
|
}
|
|
|
|
|
|
public function search(Request $request)
|
|
{
|
|
$category_ids = [];
|
|
$brand_ids = [];
|
|
|
|
if ($request->categories != null && $request->categories != "") {
|
|
$category_ids = explode(',', $request->categories);
|
|
}
|
|
|
|
if ($request->brands != null && $request->brands != "") {
|
|
$brand_ids = explode(',', $request->brands);
|
|
}
|
|
|
|
$sort_by = $request->sort_key;
|
|
$name = $request->name;
|
|
$min = $request->min;
|
|
$max = $request->max;
|
|
|
|
|
|
$products = Product::query();
|
|
|
|
$products->where('published', 1)->physical();
|
|
|
|
if (!empty($brand_ids)) {
|
|
$products->whereIn('brand_id', $brand_ids);
|
|
}
|
|
|
|
if (!empty($category_ids)) {
|
|
$n_cid = [];
|
|
foreach ($category_ids as $cid) {
|
|
$n_cid = array_merge($n_cid, CategoryUtility::children_ids($cid));
|
|
}
|
|
|
|
if (!empty($n_cid)) {
|
|
$category_ids = array_merge($category_ids, $n_cid);
|
|
}
|
|
|
|
$products->whereIn('category_id', $category_ids);
|
|
}
|
|
|
|
if ($name != null && $name != "") {
|
|
$products->where(function ($query) use ($name) {
|
|
foreach (explode(' ', trim($name)) as $word) {
|
|
$query->where('name', 'like', '%' . $word . '%')->orWhere('tags', 'like', '%' . $word . '%')->orWhereHas('product_translations', function ($query) use ($word) {
|
|
$query->where('name', 'like', '%' . $word . '%');
|
|
});
|
|
}
|
|
});
|
|
SearchUtility::store($name);
|
|
$case1 = $name . '%';
|
|
$case2 = '%' . $name . '%';
|
|
|
|
$products->orderByRaw("CASE
|
|
WHEN name LIKE '$case1' THEN 1
|
|
WHEN name LIKE '$case2' THEN 2
|
|
ELSE 3
|
|
END");
|
|
}
|
|
|
|
if ($min != null && $min != "" && is_numeric($min)) {
|
|
$products->where('unit_price', '>=', $min);
|
|
}
|
|
|
|
if ($max != null && $max != "" && is_numeric($max)) {
|
|
$products->where('unit_price', '<=', $max);
|
|
}
|
|
|
|
|
|
|
|
switch ($sort_by) {
|
|
case 'price_low_to_high':
|
|
$products->orderBy('unit_price', 'asc');
|
|
break;
|
|
|
|
case 'price_high_to_low':
|
|
$products->orderBy('unit_price', 'desc');
|
|
break;
|
|
|
|
case 'new_arrival':
|
|
$products->orderBy('created_at', 'desc');
|
|
break;
|
|
|
|
case 'popularity':
|
|
$products->orderBy('num_of_sale', 'desc');
|
|
break;
|
|
|
|
case 'top_rated':
|
|
$products->orderBy('rating', 'desc');
|
|
break;
|
|
|
|
default:
|
|
$products->orderBy('created_at', 'desc');
|
|
break;
|
|
}
|
|
|
|
return new ProductMiniCollection(filter_products($products)->paginate(10));
|
|
}
|
|
|
|
public function variantPrice(Request $request)
|
|
{
|
|
$product = Product::findOrFail($request->id);
|
|
$str = '';
|
|
$tax = 0;
|
|
|
|
if ($request->has('color') && $request->color != "") {
|
|
$str = Color::where('code', '#' . $request->color)->first()->name;
|
|
}
|
|
|
|
$var_str = str_replace(',', '-', $request->variants);
|
|
$var_str = str_replace(' ', '', $var_str);
|
|
|
|
if ($var_str != "") {
|
|
$temp_str = $str == "" ? $var_str : '-' . $var_str;
|
|
$str .= $temp_str;
|
|
}
|
|
return $this->calc($product, $str, $request, $tax);
|
|
|
|
/*
|
|
$product_stock = $product->stocks->where('variant', $str)->first();
|
|
$price = $product_stock->price;
|
|
$stockQuantity = $product_stock->qty;
|
|
|
|
|
|
//discount calculation
|
|
$discount_applicable = false;
|
|
|
|
if ($product->discount_start_date == null) {
|
|
$discount_applicable = true;
|
|
} elseif (
|
|
strtotime(date('d-m-Y H:i:s')) >= $product->discount_start_date &&
|
|
strtotime(date('d-m-Y H:i:s')) <= $product->discount_end_date
|
|
) {
|
|
$discount_applicable = true;
|
|
}
|
|
|
|
if ($discount_applicable) {
|
|
if ($product->discount_type == 'percent') {
|
|
$price -= ($price * $product->discount) / 100;
|
|
} elseif ($product->discount_type == 'amount') {
|
|
$price -= $product->discount;
|
|
}
|
|
}
|
|
|
|
foreach ($product->taxes as $product_tax) {
|
|
if ($product_tax->tax_type == 'percent') {
|
|
$tax += ($price * $product_tax->tax) / 100;
|
|
} elseif ($product_tax->tax_type == 'amount') {
|
|
$tax += $product_tax->tax;
|
|
}
|
|
}
|
|
$price += $tax;
|
|
|
|
return response()->json([
|
|
'product_id' => $product->id,
|
|
'variant' => $str,
|
|
'price' => (float)convert_price($price),
|
|
'price_string' => format_price(convert_price($price)),
|
|
'stock' => intval($stockQuantity),
|
|
'image' => $product_stock->image == null ? "" : uploaded_asset($product_stock->image)
|
|
]);*/
|
|
}
|
|
|
|
// public function home()
|
|
// {
|
|
// return new ProductCollection(Product::inRandomOrder()->physical()->take(50)->get());
|
|
// }
|
|
}
|