Edit File: ProductService.php
<?php namespace App\Services\Store; use App\Models\Feature; use App\Models\Order; use App\Models\Product; use App\Models\ProductAdditive; use App\Models\ProductAdditiveCategory; use App\Models\Productfeature; use App\Models\Productfeatureproperity; use App\Models\ProductGroup; use App\Models\Properity; use App\Models\Store; use App\Models\StoreMenuCategory; use App\Models\User; use App\Traits\ApiTrait; use App\Traits\Uploadable; use Auth; use Session; use Carbon\Carbon; class ProductService { use Uploadable; use ApiTrait; //Additive public function getProducts(array $request) { $user = Auth::user(); $store = Store::where('user_id', $user->id) ->first(); $products = Product::where('store_id', $store->id) ->where(function ($query) use ($request) { if (isset($request['search'])) { if ($request['search']) { $query->where('name->ar', 'like', '%' . $request['search'] . '%') ->orwhere('name->en', 'like', '%' . $request['search'] . '%'); } } }) ->orderBy('created_at' , 'desc') ->paginate($this->paginateNum()); return $products; } public function get_single_product($id) { $product = Product::find($id); if(! $product) { $product['fail_msg'] = trans('stores_dashboard.product_not_found'); return $product; } return $product; } public function postProduct($request) { $user = Auth::user(); $store = $user->store; $product = Product::create($request->validated() + [ 'name' => [ 'ar' => $request['name_ar'], 'en' => $request['name_en'], ], 'desc' => [ 'ar' => $request['desc_ar'], 'en' => $request['desc_en'], ], 'store_id' => $store->id ]); ProductGroup::create($request->validated()+ ['product_id' => $product->id]); if (isset($request['addition'])) { foreach (json_decode($request['addition']) as $addition) { ProductAdditive::create([ 'product_id' => $product->id, 'product_additive_category_id' => $addition ]); } } return $product; } public function updateProducts($request) { info($request); $product = Product::find($request['product_id']); if($request['store_menu_category_id']) { $menu = StoreMenuCategory::find($request['store_menu_category_id']); if(! $menu) { $data['fail_msg'] = trans('stores_dashboard.not_found'); return $data; } } $product->update($request->validated() + [ 'name' => [ 'ar' => $request['name_ar'], 'en' => $request['name_en'], ], 'desc' => [ 'ar' => $request['desc_ar'], 'en' => $request['desc_en'], ], ]); if ($product->update()) { $group = $product->groups()->first(); $group->update($request->validated()); } if (isset($request['addition'])) { ProductAdditive::where('product_id' , $product->id)->delete(); foreach (json_decode($request['addition']) as $addition) { ProductAdditive::create([ 'product_id' => $product->id, 'product_additive_category_id' => $addition ]); } } $store = Store::find($product->store_id); $store->updateCacheWithProducts(); return $product->fresh(); } public function getFeatures() { $data['features'] = Feature::whereHas('properities')->get(); return $data; } public function getFeatureProperties($id) { $data = Properity::where('feature_id' , $id)->get(); return $data; } public function postProductFeatures(array $request) { $product = Product::find($request['product_id']); $feature = Feature::find($request['feature_id']); if (!$product || !$feature) { $msg = trans('stores_dashboard.feature'); $data['fail_msg'] = $msg; return $data; } $pr = Productfeature::where('feature_id', $request['feature_id'])->where('product_id', $request['product_id'])->first(); if ($pr) { $msg = trans('stores_dashboard.same_feature'); $data['fail_msg'] = $msg; return $data; } $pr = new Productfeature(); $pr->feature_id = $request['feature_id']; $pr->product_id = $request['product_id']; $pr->save(); $data['msg'] = trans('dashboard.created_successfully'); $data['pr'] = $pr; $data['feature'] = $feature; $store = Store::find($product->store_id); $store->updateCacheWithProducts(); return $data; } public function removeProductFeature(array $data) { $pr = Productfeature::where('product_id', $data['product_id'])->where('feature_id', $data['feature_id'])->first(); if (!$pr) { $msg = trans('stores_dashboard.feature_not_fount'); $data['fail_msg'] = $msg; return $data; } $id = $pr->id; $pr->delete(); $store = Store::find($pr->product->store_id); $store->updateCacheWithProducts(); // return $id; } public function postProductFeatureProperities(array $request) { $product = Product::find($request['product_id']); if (!$product) { $msg = 'wrong id.'; $data['fail_msg'] = $msg; return $data; } $new_feature_ids =[]; $old_product_feature_ids =[]; $old_product_features = $product->productfeatures; foreach ($old_product_features as $old) { array_push($old_product_feature_ids , $old->feature_id); } if ($request['productfeatures']) { foreach (json_decode($request['productfeatures']) as $featureProperty) { array_push($new_feature_ids , $featureProperty->feature_id); if($old_product_features) { if (in_array($featureProperty->feature_id, $old_product_feature_ids)) { $pr = Productfeature::where('feature_id', $featureProperty->feature_id)->where('product_id', $request['product_id'])->first(); }else { $pr = Productfeature::create([ 'feature_id' => $featureProperty->feature_id, 'product_id' => $request['product_id'] ]); } }else { $pr = Productfeature::create([ 'feature_id' => $featureProperty->feature_id, 'product_id' => $request['product_id'] ]); } if ($pr) { $pr->productfeatureproperities()->delete(); foreach ($featureProperty->properties as $p) { $properity = Properity::find($p->id); if ($p) { $pfr = Productfeatureproperity::create([ 'productfeature_id'=>$pr->id, 'properity_id' => $p->id, ]); } } $store = Store::find($pr->product->store_id); $store->updateCacheWithProducts(); } else { $msg = trans('stores_dashboard.add_feature_option'); $data['fail_msg'] = $msg; return $data; } } } else { $msg = trans('stores_dashboard.add_feature_option'); $data['fail_msg'] = $msg; return $data; } foreach ($old_product_features as $fe) { if(!in_array($fe->feature_id , $new_feature_ids)){ $fe->delete(); } } return $product->fresh(); } public function editProducts($id) { $user = Auth::user(); $store = Store::where('user_id', $user->id) ->first(); $data['product'] = Product::find($id); if (!$data['product']) { return redirect()->back()->with(['fail' => trans('stores_dashboard.product_not_found')]); } $data['group'] = $data['product']->groups()->first(); $data['features'] = Feature::get(); $data['menus'] = StoreMenuCategory::where('store_id', $store->id)->get(); return $data; } public function identicalValues($arrayA, $arrayB) { sort($arrayA); sort($arrayB); return $arrayA == $arrayB; } public function postGroups(array $request) { $product = Product::find($request['product_id']); if (!$product) { $msg = Session::has('lang') && Session::get('lang') == 'en' ? 'Opps! Looks like somrthing went wrong' : 'حدث خطأ ما'; $data['fail_msg'] = $msg; return $data; } // $groups = ProductGroup::where('product_id', $request['product_id'])->where('properities', '!=', null)->delete(); $groups = $product->groups()->where('properities','!=' , null)->delete(); foreach (json_decode($request['productfeatures_ids']) as $p) { $properities = json_encode($p->properties); // if ($groups) // { // foreach ($groups as $group) { // $group->delete(); // } // } // if ($this->identicalValues(json_decode($group->properities), json_decode($properities))) { // $group->update([ // 'properties' => $properities, // 'product_id' => $request['product_id'], // 'price' => $p->price ?? $group->price, // 'discount_price' => $request['discount_price'] ?? null, // 'from' => $request['from'] ?? null, // 'to' => $request['to'] ?? null, // 'in_stock_qty' => $request['in_stock_qty'] ?? $group->in_stock_qty, // ]); // } else { // $group = new ProductGroup(); // $group->properities = $properities; // $group->product_id = $request['product_id']; // $first_group = $product->groups()->first(); // $group->price = $p->price ?? $first_group->price; // if (isset($request['discount_price'])) { // $group->discount_price = $request['discount_price']; // } // if (isset($request['from'])) { // $group->from = $request['from']; // } // if (isset($request['to'])) { // $group->to = $request['to']; // } // $group->in_stock_qty = $p->qty ?? $first_group->in_stock_qty; // $group->save(); // // $group = ProductGroup::find($group->id); // $store = Store::find($product->store_id); // $store->updateCacheWithProducts(); // } // // } // } $group = new ProductGroup(); $group->properities = $properities; $group->product_id = $request['product_id']; $first_group = $product->groups()->first(); $group->price = $p->price ?? $first_group->price; if (isset($p->discount_price)) { $group->discount_price = $p->discount_price; } if (isset($p->from)) { $group->from = $p->from; } if (isset($p->to)) { $group->to = $p->to; } $group->in_stock_qty = $p->qty ?? $first_group->in_stock_qty; $group->save(); $group = ProductGroup::find($group->id); $store = Store::find($product->store_id); $store->updateCacheWithProducts(); } return $product->fresh(); } public function removeGroup($id) { $group = ProductGroup::find($id); if (!$group) { $msg = Session::has('lang') && Session::get('lang') == 'en' ? 'This group is mot available' : 'هذه المجموعة غير متاحة'; return $data['fail_msg'] = $msg; } $id = $group->id; $group->status = 'deleted'; $group->update(); $store = Store::find($group->product->store_id); $store->updateCacheWithProducts(); return $id; } public function getUpdateGroups($id) { $product = Product::find($id); $groups = ProductGroup::where('product_id', $id)->where('properities','!=' , null)->get(); return $groups; } public function updateGroups(array $request) { $group = ProductGroup::find($request['group_id']); if (!$group) { $msg = Session::has('lang') && Session::get('lang') == 'en' ? 'Opps! Looks like somrthing went wrong' : 'حدث خطأ ما'; return $data['fail_msg'] = $msg; } if ($request['price']) { $group->price = $request['price']; } if ($request['in_stock_qty']) { $group->in_stock_qty = $request['in_stock_qty']; } $group->update(); $group->refresh(); $store = Store::find($group->product->store_id); $store->updateCacheWithProducts(); return $group; } public function deleteProduct($id) { $product = Product::find($id); if (! $product){ return ['fail_msg' => trans('stores_dashboard.product_not_found')]; } if (Order::whereNotIn('status' , ['closed' , 'finished'])->whereHas('orderproducts' , function($q) use($product) { $q->where('product_id' , $product->id); })->exists()) { return ['fail_msg' => trans('stores_dashboard.product_have_orders')]; } $product->delete(); $msg = trans('auth.deleted_success'); return $msg; } }
Back to File Manager