Files
elcaribe/desarrollo/app/Http/Controllers/Api/V2/ProductController.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());
// }
}