requestFilters($products, $request); $this->sortQuery($products); $products = $products->paginate(10); /** @var array $printMultiProduct Array of id */ $printMultiProduct = session('printMultiProduct') ?? []; /** @var \Illuminate\Database\Eloquent\Builder $brands */ $brands = Brand::get(); /** @var \Illuminate\Database\Eloquent\Builder $keyword */ $keywords = Keyword::where('keyword_cat', 'LIKE', 'product_%')->get(); return view('pages.products.index', [ 'products' => $products, 'brands' => $brands, 'keywords' => $keywords, 'printMultiProduct' => $printMultiProduct, 'queryParameters' => $request->all(), ]); } /** * Show the form for creating a new resource. * * @param \Illuminate\Database\Eloquent\Builder $products * @param \Illuminate\Http\Request $request * @return \Illuminate\Contracts\View\View * @phpcs:disable Generic.Metrics.NestingLevel.TooHigh */ private function requestFilters(Builder $products, Request $request): \Illuminate\Database\Eloquent\Builder { //phpcs:enable foreach ($request->all() as $key => $queryParameter) { if (request()->sort_col === null && request()->sort_way === null && request()->rst === null) { $products->when( isset($queryParameter) && $queryParameter != 0, function ($q) use ($queryParameter, $key) { if ($key === "name") { $q->where($key, 'LIKE', '%' . $queryParameter . '%'); } elseif ($key === "claims" || $key === "origins") { foreach ($queryParameter as $item) { $q->where($key, 'LIKE', '%{"id":"' . $item['value'] . '"}%'); } } elseif ($key === "keywords") { foreach ($queryParameter as $keyword) { $q->whereHas('productKeywords', function ($q) use ($keyword, $key) { $q->where($key . '.id', intval($keyword['value'])); }); } } elseif ($key === "date_before" || $key === "date_after") { if ($key === "date_before") { $q->whereDate('created_at', '>=', $queryParameter); } else { $q->whereDate('created_at', '<=', $queryParameter); } } else { $q->where($key, $queryParameter); } //end if } ); } //end if } //end foreach return $products; } /** * Show the form for creating a new resource. * * @param App\Models\Product $productModel * @return \Illuminate\Contracts\View\View * phpcs:disable Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClass */ public function create(Product $productModel): \Illuminate\Contracts\View\View { //phpcs:enable $brands = Brand::get(); $productsFair = Product::pluck('fair'); $productsShop = Product::pluck('shop'); $productsCatalog = Product::pluck('catalogue'); $keywords = Keyword::where('keyword_cat', 'product_pleasure') ->orWhere('keyword_cat', 'product_shape') ->orWhere('keyword_cat', 'product_practicality') ->orWhere('keyword_cat', 'product_health') ->orWhere('keyword_cat', 'product_ethics') ->get(); return view('pages.products.create', compact( 'productModel', 'brands', 'productsFair', 'productsShop', 'productsCatalog', 'keywords' )); } /** * Store a newly created resource in storage. * * @param \App\Http\Requests\Products\StoreProductRequest $request * @return \Illuminate\Http\Response */ public function store(StoreProductRequest $request) { return DB::transaction(function () use ($request) { $product = new Product(); $product->fill($request->validated()); $this->storeDocuments($request, $product); if ($product->saveOrFail()) { $this->updateCommentsModel($request, $product); $product->productKeywords()->sync(collect($request->productKeywords)->pluck('id')); return redirect() ->route('products.edit', $product) ->with('success', trans( ':model a été créé', ['model' => Str::singular(trans('models.classes.products'))] )); } return redirect() ->back() ->with('error', trans( ':model n\'a pas été créé', ['model' => Str::singular(trans('models.classes.products'))] )); }); } /** * Show the form for editing the specified resource. * * @param \App\Models\Product $product * @return \Illuminate\Http\Response */ public function edit(Product $product) { $brands = Brand::get(); $productsFair = Product::pluck('fair'); $productsShop = Product::pluck('shop'); $productsCatalog = Product::pluck('catalogue'); $commentModel = $product->productComments; $keywords = Keyword::where('keyword_cat', 'product_pleasure') ->orWhere('keyword_cat', 'product_shape') ->orWhere('keyword_cat', 'product_practicality') ->orWhere('keyword_cat', 'product_health') ->orWhere('keyword_cat', 'product_ethics') ->get(); return view('pages.products.edit', [ 'productModel' => $product, 'brands' => $brands, 'productsFair' => $productsFair, 'productsShop' => $productsShop, 'productsCatalog' => $productsCatalog, 'commentModel' => $commentModel, 'keywords' => $keywords, ]); } /** * Update the specified resource in storage. * * @param \App\Http\Requests\Products\UpdateProductRequest $request * @param \App\Models\Product $product * @return \Illuminate\Http\Response */ public function update(UpdateProductRequest $request, Product $product) { return DB::transaction(function () use ($request, $product) { $product->fill($request->validated()); $this->storeDocuments($request, $product); $this->updateCommentsModel($request, $product); $product->productKeywords()->sync(collect($request->productKeywords)->pluck('id')); if ($product->saveOrFail()) { return redirect() ->route('products.edit', $product) ->with('success', trans( ':model a été mis à jour', ['model' => Str::singular(trans('models.classes.products'))] )); } return redirect() ->back() ->with('error', trans( ':model n\'a pas été mis à jour', ['model' => Str::singular(trans('models.classes.products'))] )); }); } /** * Remove the specified resource from storage. * * @param \App\Models\Product $product * @return \Illuminate\Http\Response */ public function destroy(Product $product) { $this->deleteCommentsModel($product); if ($product->deleteOrFail()) { return redirect() ->route('products.index') ->with('warning', trans( ':model a bien été supprimé', ['model' => Str::singular(trans('models.classes.products'))] )); } return redirect() ->back() ->with('error', trans( ':model n\'a pas été supprimé', ['model' => Str::singular(trans('models.classes.products'))] )); } /** * Update comments model. * * @param \Illuminate\Http\Request $request * @param \App\Models\Product $product * @return void */ public function updateCommentsModel(Request $request, Product $product) { $this->deleteCommentsModel($product); if ($request->evaluation) { foreach ($request->evaluation as $key => $value) { $product->productComments()->create([ 'evaluation' => $request->evaluation[$key], 'aspect' => $request->aspect[$key] ?? null, 'taste' => $request->taste[$key] ?? null, 'odor' => $request->odor[$key] ?? null, 'texture' => $request->texture[$key] ?? null, ]); } } } /** * Delete comments model. * * @param \App\Models\Product $product * @return \Illuminate\Http\Response */ public function deleteCommentsModel(Product $product) { foreach ($product->productComments as $comment) { if (!$comment->deleteOrFail()) { return redirect() ->back() ->with('error', trans( ':model n\'a pas été supprimé', ['model' => Str::singular(trans('models.classes.products'))] )); } } } /** * Show the form for editing the specified resource. * * @param \App\Models\Product $product * @return \Illuminate\Http\Response */ public function duplicate(Product $product) { return $this->create($product->replicate()); } /** * Return a boolean if the gencode is already used or not. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function checkGencode(Request $request) { if ( isset($request->GENCOD) && $request->GENCOD !== null && ctype_digit($request->GENCOD) && strlen($request->GENCOD) > 0 ) { if ( isset($request->ID) && $request->ID !== null && intval($request->GENCOD) === Product::where('id', $request->ID)->firstOrFail()->gencod ) { $result = null; } else { $result = in_array(intval($request->GENCOD), Product::pluck('gencod')->toArray()) ? Product::orderBy('created_at', 'desc')->where('gencod', intval($request->GENCOD))->first() : null; } } else { $result = null; } return response()->json($result); } /** * Print product commercial sheet. * * @param \Illuminate\Http\Request $request * @param integer $id * @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory */ public function printProductSheet(Request $request = null, int $id = null) { $productId = $id ?? intval($request->id); $product = Product::where('id', $productId)->firstOrFail(); $title = trans('Fiche produit : :name - :appname', [ 'name' => $product->name, 'appname' => \config('app.name', 'Startcoq') ]); $filename = trans('fiche-product-:slug-:date', [ 'slug' => Str::slug($product->name), 'date' => \now()->format('Y-m-d') ]); return Product::generateProductPdf($product, $title)->stream("{$filename}.pdf"); } /** * Print multi product commercial sheet * * @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory */ public function printMultiProductSheet() { /** @var array printMultiProduct */ $printMultiProduct = session('printMultiProduct') ?? []; asort($printMultiProduct); if (count($printMultiProduct)) { $title = trans('Fiches produits - :appname', [ 'appname' => \config('app.name', 'Startcoq') ]); Product::generateMultipleProductPdf($printMultiProduct, $title)->stream(); } else { return redirect() ->back() ->with('warning', trans('Veuillez sélectionner des produits')); } } /** * Print product commercial sheet * * @param \Illuminate\Http\Request $request * @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory */ public function printMultiProductUpdate(Request $request) { /** @var integer Id of the actual product */ $productId = intval($request->ID); /** @var array Array of id products */ $printMultiProduct = session('printMultiProduct') ?? []; if (in_array($productId, $printMultiProduct)) { array_splice($printMultiProduct, array_search($productId, $printMultiProduct), 1); $result = false; } else { $printMultiProduct[] = $productId; $result = true; } session(['printMultiProduct' => $printMultiProduct]); return $result; } /** * Remove the selection, * destroy the specified session. * * @return \Illuminate\Http\RedirectResponse */ public function printMultiProductDestroy() { session()->forget('printMultiProduct'); return redirect() ->back() ->with('success', trans('Sélection des :model supprimée', ['model' => trans('models.classes.products')])); } /** * Download a .zip file. * * @param \Illuminate\Http\Request $request * @return void */ public function download(Request $request) { \dispatch(new ExportProduct($request->id))->onConnection('database'); } }