Spamworldpro Mini Shell
Spamworldpro


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/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/corals/mcoil.corals.io/app/Http/Controllers/Admin/Products/ProductController.php
<?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]);
    }
}

Spamworldpro Mini