<?php
namespace App\Http\Controllers\Api\V2\Seller;
use App\Http\Requests\ProductRequest;
use App\Http\Resources\V2\Attributes\AttributeValuesResource;
use App\Http\Resources\V2\Seller\AttributeCollection;
use App\Http\Resources\V2\Seller\BrandCollection;
use App\Http\Resources\V2\Seller\CategoriesCollection;
use App\Http\Resources\V2\Seller\ColorCollection;
use App\Http\Resources\V2\Seller\ProductCollection;
use App\Http\Resources\V2\Seller\ProductDetailsCollection;
use App\Http\Resources\V2\Seller\ProductReviewCollection;
use App\Http\Resources\V2\Seller\TaxCollection;
use App\Models\Attribute;
use App\Models\AttributeValue;
use App\Models\Brand;
use App\Models\Cart;
use App\Models\Category;
use App\Models\Color;
use App\Models\Product;
use App\Models\ProductTax;
use App\Models\ProductTranslation;
use App\Models\Review;
use App\Models\Tax;
use App\Services\ProductFlashDealService;
use App\Services\ProductService;
use App\Services\ProductStockService;
use App\Services\ProductTaxService;
use Artisan;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
class ProductController extends Controller
{
protected $productService;
protected $productTaxService;
protected $productFlashDealService;
protected $productStockService;
public function __construct(
ProductService $productService,
ProductTaxService $productTaxService,
ProductFlashDealService $productFlashDealService,
ProductStockService $productStockService
)
{
$this->productService = $productService;
$this->productTaxService = $productTaxService;
$this->productFlashDealService = $productFlashDealService;
$this->productStockService = $productStockService;
}
public function index()
{
$products = Product::where('user_id', auth()->user()->id)->where('digital', 0)->where('auction_product', 0)->where('wholesale_product', 0)->orderBy('created_at', 'desc');
$products = $products->paginate(10);
dd($products);
return new ProductCollection($products);
}
public function getCategory()
{
$categories = Category::where('parent_id', 0)
->where('digital', 0)
->with('childrenCategories')
->get();
return CategoriesCollection::collection($categories);
}
public function getBrands()
{
$brands = Brand::all();
return BrandCollection::collection($brands);
}
public function getTaxes(Request $request)
{
if ($request->has('whitoutITBIS') && $request->whitoutITBIS) {
$taxes = Tax::where('tax_status', 1)->whereNot('name', 'I.T.B.I.S.')->get();
} else {
$taxes = Tax::where('tax_status', 1)->get();
}
return TaxCollection::collection($taxes);
}
public function getAttributes()
{
$attributes = Attribute::with('attribute_values')->get();
return AttributeCollection::collection($attributes);
}
public function getAttributesFromId(int|string $attribute_id)
{
$attributes = AttributeValue::where('attribute_id', $attribute_id)->get()->load('attribute');
return AttributeValuesResource::collection($attributes);
}
public function getColors()
{
$colors = Color::orderBy('name', 'asc')->get();
return ColorCollection::collection($colors);
}
public function edit(Request $request, $id)
{
if (auth()->user()->user_type != 'seller') {
return $this->failed(translate('Unauthenticated User.'));
}
$product = Product::where('id', $id)->with('stocks')->first();
if (auth()->user()->id != $product->user_id) {
return $this->failed(translate('This product is not yours.'));
}
$product->lang = $request->lang == null ? env("DEFAULT_LANGUAGE") : $request->lang;
return new ProductDetailsCollection($product);
/* $data = response()->json([
'lang' => $lang,
'product' => $product,
'product_name' => $product->getTranslation('name',$lang),
'product_unit' => $product->getTranslation('unit',$lang),
'description' => $product->getTranslation('description',$lang),
]);
return $data;*/
}
public function change_status(Request $request)
{
if (addon_is_activated('seller_subscription')) {
if (!seller_package_validity_check()) {
return $this->failed(translate('Please upgrade your package'));
}
}
$product = Product::where('user_id', auth()->user()->id)
->where('id', $request->id)
->update([
'published' => $request->status
]);
if ($product == 0) {
return $this->failed(translate('This product is not yours'));
}
return ($request->status == 1) ?
$this->success(translate('Product has been published successfully')) :
$this->success(translate('Product has been unpublished successfully'));
}
public function update(ProductRequest $request, Product $product)
{
//Product
$product = $this->productService->update($request->except([
'_token', 'sku', 'choice', 'tax_id', 'tax', 'tax_type', 'flash_deal_id', 'flash_discount', 'flash_discount_type'
]), $product);
//Product Stock
foreach ($product->stocks as $key => $stock) {
$stock->delete();
}
$request->merge(['product_id' => $product->id]);
$this->productStockService->store($request->only([
'colors_active', 'colors', 'choice_no', 'unit_price', 'sku', 'current_stock', 'product_id'
]), $product);
//VAT & Tax
if ($request->tax_id) {
ProductTax::where('product_id', $product->id)->update([
'tax' => $request->tax[0],
]);
}
// Product Translations
ProductTranslation::updateOrCreate(
$request->only([
'lang', 'product_id'
]),
$request->only([
'name', 'unit', 'description'
])
);
return $this->success(translate('Product has been updated successfully'));
}
public function store(ProductRequest $request)
{
if (addon_is_activated('seller_subscription')) {
if (!seller_package_validity_check(auth()->user()->id)) {
return $this->failed(translate('Please upgrade your package.'));
}
}
$request->merge(['added_by' => 'seller']);
$product = $this->productService->store($request->except([
'_token', 'sku', 'choice', 'tax_id', 'tax', 'tax_type', 'flash_deal_id', 'flash_discount', 'flash_discount_type'
]));
$request->merge(['product_id' => $product->id]);
//VAT & Tax
ProductTax::create([
'product_id' => $product->id
]);
ProductTax::create([
'product_id' => $product->id,
'tax_id' => 4,
'tax' => $request->tax[0],
]);
//Product Stock
$this->productStockService->store($request->only([
'colors_active', 'colors', 'choice_no', 'unit_price', 'sku', 'current_stock', 'product_id'
]), $product);
// Product Translations
$request->merge(['lang' => env('DEFAULT_LANGUAGE')]);
ProductTranslation::create($request->only([
'lang', 'name', 'unit', 'description', 'product_id'
]));
return $this->success(translate('Producto Creado Exitosamente'));
}
public function change_featured_status(Request $request)
{
$product = Product::where('user_id', auth()->user()->id)
->where('id', $request->id)
->update([
'seller_featured' => $request->featured_status
]);
if ($product == 0) {
return $this->failed(translate('This product is not yours'));
}
return ($request->featured_status == 1) ?
$this->success(translate('Product has been featured successfully')) :
$this->success(translate('Product has been unfeatured successfully'));
}
public function duplicate($id)
{
$product = Product::findOrFail($id);
if (auth()->user()->id != $product->user_id) {
return $this->failed(translate('This product is not yours'));
}
if (addon_is_activated('seller_subscription')) {
if (!seller_package_validity_check(auth()->user()->id)) {
return $this->failed(translate('Please upgrade your package'));
}
}
//Product
$product_new = (new ProductService)->product_duplicate_store($product);
//Store in Product Stock Table
(new ProductStockService)->product_duplicate_store($product->stocks, $product_new);
//Store in Product Tax Table
(new ProductTaxService)->product_duplicate_store($product->taxes, $product_new);
return $this->success(translate('Product has been duplicated successfully'));
}
public function destroy($id)
{
$product = Product::findOrFail($id);
if (auth()->user()->id != $product->user_id) {
return $this->failed(translate('This product is not yours'));
}
$product->product_translations()->delete();
$product->stocks()->delete();
$product->taxes()->delete();
if (Product::destroy($id)) {
Cart::where('product_id', $id)->delete();
return $this->success(translate('Product has been deleted successfully'));
Artisan::call('view:clear');
Artisan::call('cache:clear');
}
}
public function product_reviews()
{
$reviews = Review::orderBy('id', 'desc')
->join('products', 'reviews.product_id', '=', 'products.id')
->join('users', 'reviews.user_id', '=', 'users.id')
->where('products.user_id', auth()->user()->id)
->select('reviews.id', 'reviews.rating', 'reviews.comment', 'reviews.status', 'reviews.updated_at', 'products.name as product_name', 'users.id as user_id', 'users.name', 'users.avatar')
->distinct()
->paginate(1);
return new ProductReviewCollection($reviews);
}
public function remainingUploads()
{
$remaining_uploads = (max(0, auth()->user()->shop->seller_package->product_upload_limit - auth()->user()->products()->count()));
return response()->json([
'ramaining_product' => $remaining_uploads,
]);
}
}
|