![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/mcoil.corals.io/app/Http/Controllers/Admin/Products/ |
<?php namespace App\Http\Controllers\Admin\Products; use App\Shop\Attributes\Repositories\AttributeRepositoryInterface; use App\Shop\AttributeValues\Repositories\AttributeValueRepositoryInterface; use App\Shop\Brands\Repositories\BrandRepositoryInterface; use App\Shop\Categories\Repositories\Interfaces\CategoryRepositoryInterface; use App\Shop\ProductAttributes\ProductAttribute; use App\Shop\Products\Exceptions\ProductInvalidArgumentException; use App\Shop\Products\Exceptions\ProductNotFoundException; use App\Shop\Products\Product; use App\Shop\Products\Repositories\Interfaces\ProductRepositoryInterface; use App\Shop\Products\Repositories\ProductRepository; use App\Shop\Products\Requests\CreateProductRequest; use App\Shop\Products\Requests\UpdateProductRequest; use App\Http\Controllers\Controller; use App\Shop\Products\Transformations\ProductTransformable; use App\Shop\Tools\UploadableTrait; use App\Shop\VatDisplaySettings\VatDisplaySetting; use Illuminate\Http\Request; use Illuminate\Http\UploadedFile; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Validator; use Illuminate\Support\Str; class ProductController extends Controller { use ProductTransformable, UploadableTrait; /** * @var ProductRepositoryInterface */ private $productRepo; /** * @var CategoryRepositoryInterface */ private $categoryRepo; /** * @var AttributeRepositoryInterface */ private $attributeRepo; /** * @var AttributeValueRepositoryInterface */ private $attributeValueRepository; /** * @var ProductAttribute */ private $productAttribute; /** * @var BrandRepositoryInterface */ private $brandRepo; /** * ProductController constructor. * * @param ProductRepositoryInterface $productRepository * @param CategoryRepositoryInterface $categoryRepository * @param AttributeRepositoryInterface $attributeRepository * @param AttributeValueRepositoryInterface $attributeValueRepository * @param ProductAttribute $productAttribute * @param BrandRepositoryInterface $brandRepository */ public function __construct( ProductRepositoryInterface $productRepository, CategoryRepositoryInterface $categoryRepository, AttributeRepositoryInterface $attributeRepository, AttributeValueRepositoryInterface $attributeValueRepository, ProductAttribute $productAttribute, BrandRepositoryInterface $brandRepository ) { $this->productRepo = $productRepository; $this->categoryRepo = $categoryRepository; $this->attributeRepo = $attributeRepository; $this->attributeValueRepository = $attributeValueRepository; $this->productAttribute = $productAttribute; $this->brandRepo = $brandRepository; $this->middleware(['permission:create-product, guard:employee'], ['only' => ['create', 'store']]); $this->middleware(['permission:update-product, guard:employee'], ['only' => ['edit', 'update']]); $this->middleware(['permission:delete-product, guard:employee'], ['only' => ['destroy']]); $this->middleware(['permission:view-product, guard:employee'], ['only' => ['index', 'show']]); } /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { $list = $this->productRepo->listProducts('id'); if (request()->has('q') && request()->input('q') != '') { $list = $this->productRepo->searchProduct(request()->input('q')); } $products = $list->map(function (Product $item) { return $this->transformProduct($item); })->all(); return view('admin.products.list', [ 'products' => $products ]); } /** * Show the form for creating a new resource. * * @return \Illuminate\Http\Response */ public function create() { $categories = $this->categoryRepo->listCategories('name', 'asc'); return view('admin.products.create', [ 'categories' => $categories, 'brands' => $this->brandRepo->listBrands(['*'], 'name', 'asc'), 'default_weight' => env('SHOP_WEIGHT'), 'weight_units' => Product::MASS_UNIT, 'product' => new Product ]); } /** * Store a newly created resource in storage. * * @param CreateProductRequest $request * * @return \Illuminate\Http\Response */ public function store(CreateProductRequest $request) { $data = $request->except('_token', '_method'); $data['slug'] = Str::slug($request->input('name')); if ($request->hasFile('cover') && $request->file('cover') instanceof UploadedFile) { $data['cover'] = $this->productRepo->saveCoverImage($request->file('cover')); } $product = $this->productRepo->createProduct($data); $productRepo = new ProductRepository($product); if ($request->hasFile('image')) { $productRepo->saveProductImages(collect($request->file('image'))); } if ($request->has('categories')) { $productRepo->syncCategories($request->input('categories')); } else { $productRepo->detachCategories(); } return redirect()->route('admin.products.index', $product->id)->with('message', 'Product created successfully.'); } /** * Display the specified resource. * * @param int $id * * @return \Illuminate\Http\Response */ public function show(int $id) { $product = $this->productRepo->findProductById($id); return view('admin.products.show', compact('product')); } /** * Show the form for editing the specified resource. * * @param int $id * * @return \Illuminate\Http\Response */ public function edit(int $id) { $product = $this->productRepo->findProductById($id); $productAttributes = $product->attributes()->get(); $qty = $productAttributes->map(function ($item) { return $item->quantity; })->sum(); if (request()->has('delete') && request()->has('pa')) { $pa = $productAttributes->where('id', request()->input('pa'))->first(); $pa->attributesValues()->detach(); $pa->delete(); request()->session()->flash('message', 'Delete successful'); return redirect()->route('admin.products.edit', [$product->id, 'combination' => 1]); } $categories = $this->categoryRepo->listCategories('name', 'asc')->toTree(); return view('admin.products.edit', [ 'product' => $product, 'images' => $product->images()->get(['src','id']), 'categories' => $categories, 'selectedIds' => $product->categories()->pluck('category_id')->all(), 'attributes' => $this->attributeRepo->listAttributes(), 'productAttributes' => $productAttributes, 'qty' => $qty, 'brands' => $this->brandRepo->listBrands(['*'], 'name', 'asc'), 'weight' => $product->weight, 'default_weight' => $product->mass_unit, 'weight_units' => Product::MASS_UNIT ]); } /** * Update the specified resource in storage. * * @param UpdateProductRequest $request * @param int $id * * @return \Illuminate\Http\Response * @throws \App\Shop\Products\Exceptions\ProductUpdateErrorException */ public function update(UpdateProductRequest $request, int $id) { $product = $this->productRepo->findProductById($id); $productRepo = new ProductRepository($product); if ($request->has('attributeValue')) { $request->validate([ //'name'=>'required|regex:/^[A-Za-z0-9-]+$/|unique:cases' 'productAttributeQuantity'=>['required'] ]); $this->saveProductCombinations($request, $product); return redirect()->route('admin.products.edit', [$id, 'combination' => 1])->with('message', 'Attribute combination created successfully.'); } $data = $request->except( 'categories', '_token', '_method', 'default', 'image', 'productAttributeQuantity', 'productAttributePrice', 'attributeValue', 'combination' ); $data['slug'] = Str::slug($request->input('name')); if ($request->hasFile('cover')) { $data['cover'] = $productRepo->saveCoverImage($request->file('cover')); } if ($request->hasFile('image')) { $productRepo->saveProductImages(collect($request->file('image'))); } if ($request->has('categories')) { $productRepo->syncCategories($request->input('categories')); $data['oil_type_status'] = 1; } else { $productRepo->detachCategories(); $data['oil_type_status'] = 0; } $productRepo->updateProduct($data); return redirect()->route('admin.products.edit', $id)->with('message', 'Product update successfully.'); } /** * Remove the specified resource from storage. * * @param int $id * * @return \Illuminate\Http\Response * @throws \Exception */ public function destroy(Request $request) { $id = $request->id; $product = $this->productRepo->findProductById($id); $product->categories()->sync([]); $productAttr = $product->attributes(); $productAttr->each(function ($pa) { DB::table('attribute_value_product_attribute')->where('product_attribute_id', $pa->id)->delete(); }); $productAttr->where('product_id', $product->id)->delete(); $productRepo = new ProductRepository($product); $productRepo->removeProduct(); return redirect()->route('admin.products.index')->with('message', 'Product deleted successfully.'); } /** * @param Request $request * * @return \Illuminate\Http\RedirectResponse */ public function removeImage(Request $request) { $product = Product::where('id',$request->input('id'))->first(); if($product){ \Storage::disk('public')->delete($product->cover); Product::where('id',$request->input('id'))->update(['cover'=>'']); return 1; }else{ return 0; } //$this->productRepo->deleteFile($request->only('product', 'image'), 'uploads'); //return redirect()->back()->with('message', 'Image deleted successfully.'); } /** * @param Request $request * * @return \Illuminate\Http\RedirectResponse */ public function removeThumbnail(Request $request) { // $this->productRepo->deleteThumb($request->input('src')); // return redirect()->back()->with('message', 'Image deleted successfully.'); $product_image = \DB::table('product_images')->where('id',$request->input('id'))->first(); //$product = Product::where('id',$request->input('id'))->first(); if($product_image){ \Storage::disk('public')->delete($product_image->src); \DB::table('product_images')->where('id',$request->input('id'))->delete(); return 1; }else{ return 0; } } /** * @param Request $request * @param Product $product * @return boolean */ private function saveProductCombinations(Request $request, Product $product): bool { $fields = $request->only( 'productAttributeQuantity', 'productAttributePrice', 'sale_price', 'default' ); if ($errors = $this->validateFields($fields)) { return redirect()->route('admin.products.edit', [$product->id, 'combination' => 1]) ->withErrors($errors); } $quantity = $fields['productAttributeQuantity']; $price = $fields['productAttributePrice']; $sale_price = null; if (isset($fields['sale_price'])) { $sale_price = $fields['sale_price']; } $attributeValues = $request->input('attributeValue'); $productRepo = new ProductRepository($product); $hasDefault = $productRepo->listProductAttributes()->where('default', 1)->count(); $default = 0; if ($request->has('default')) { $default = $fields['default']; } if ($default == 1 && $hasDefault > 0) { $default = 0; } $productAttribute = $productRepo->saveProductAttributes( new ProductAttribute(compact('quantity', 'price', 'sale_price', 'default')) ); // save the combinations return collect($attributeValues)->each(function ($attributeValueId) use ($productRepo, $productAttribute) { $attribute = $this->attributeValueRepository->find($attributeValueId); return $productRepo->saveCombination($productAttribute, $attribute); })->count(); } /** * @param array $data * * @return */ private function validateFields(array $data) { $validator = Validator::make($data, [ 'productAttributeQuantity' => 'required' ]); if ($validator->fails()) { return $validator; } } /** * Display the no of product count which is to be shown on front-end product listing page. * * @return \Illuminate\Http\Response */ public function displayCount() { // Fetch the display count $displayCount = DB::table('product_display_counts')->first(); return view('admin.products.display-count', ['displayCount' => $displayCount]); } /** * To update no of product count which is to be shown on front-end product listing page * @param Request $request * * @return \Illuminate\Http\RedirectResponse */ public function updateDisplayCount(Request $request) { $displayCount = $request->get('display_count'); $displayId = $request->get('display_id'); if ( DB::table('product_display_counts')->where(['id' => $displayId])->update(['display_count' => $displayCount]) ) { return redirect()->back()->with('message', 'Display count updated successfully'); } else { return redirect()->back()->with('error', 'Some issue in display count update'); } } /** * To manage front-end product price inclusive / exclusive of vat from admin * * @return \Illuminate\Http\Response */ public function vatDisplay() { $vatDisplaySetting = VatDisplaySetting::first(); return view('admin.products.vat-display', ['vatDisplaySetting' => $vatDisplaySetting]); } /** * To update vat display setting * @param Request $request * * @return \Illuminate\Http\RedirectResponse */ public function updateVatDisplay(Request $request) { $vatId = $request->get('vat_id'); $vatSetting = $request->get('vat_setting'); if( VatDisplaySetting::where(['id' => $vatId])->update(['vat_setting' => $vatSetting]) ) { return redirect()->back()->with('message', 'Vat display setting updated successfully'); } else { return redirect()->back()->with('error', 'Some issue in vat display setting update'); } } /** * // To update product default attribute * * @return array */ public function updateDefaultAttribute(Request $request) { $productId = $request->get('productId'); $attributeId= $request->get('attributeId'); $response = array(); DB::beginTransaction(); // Update existing default to '0' if( ProductAttribute::where(['product_id' => $productId])->update(['default' => 0]) ) { if( ProductAttribute::where(['id' => $attributeId])->update(['default' => 1]) ) { DB::commit(); $response = array( 'status' => 1, 'msg' => 'Default updated successfully' ); } else { DB::rollBack(); $response = array( 'status' => 2, 'msg' => 'Some error in default update' ); } } return response()->json($response); } public function editAttribute(Request $request,$id){ $prod_attr = ProductAttribute::where(['id' => $id])->first(); $product = $this->productRepo->findProductById($prod_attr->product_id); $productAttributes = $product->attributes()->get(); $attributes = $this->attributeRepo->listAttributes(); $selectedAttr = $prod_attr->attributesValues->pluck('id')->toArray(); //dd($prod_attr->attributesValues->pluck('id')->toArray()); return view('admin.products.edit-attributes', ['prod_attr' => $prod_attr, 'attributes' => $attributes, 'productAttributes' => $productAttributes, 'selectedAttr' => $selectedAttr]); } public function updateAttribute(Request $request,$id){ $product_details= ProductAttribute::where(['id' => $id])->first(); ProductAttribute::where(['id' => $id])->update(['price'=>$request->input('productAttributePrice'),'quantity'=>$request->input('productAttributeQuantity'),'sale_price'=>$request->input('salePrice')]); DB::table('attribute_value_product_attribute')->where('product_attribute_id', $id)->delete(); $attributeValues = $request->input('attributeValue'); foreach ($attributeValues as $value) { DB::table('attribute_value_product_attribute')->insert(['product_attribute_id' => $id, "attribute_value_id" => $value]); } return redirect()->route('admin.products.edit', [$product_details->product_id, 'combination' => 1]); } }