codigo actual del servidor, con avances de joan
This commit is contained in:
415
app/Http/Controllers/Api/V2/ProductController.php
Normal file
415
app/Http/Controllers/Api/V2/ProductController.php
Normal file
@@ -0,0 +1,415 @@
|
||||
<?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());
|
||||
// }
|
||||
}
|
||||
Reference in New Issue
Block a user