Edit File: HomeController.php
<?php namespace App\Http\Controllers\Api; use App\Http\Controllers\Controller; use App\Http\Requests\Api\Group\SelectRequest; use App\Http\Resources\AdsResource; use App\Http\Resources\CategoriesResource; use App\Http\Resources\CitiesResource; use App\Http\Resources\CityResource; use App\Http\Resources\FaqsResource; use App\Http\Resources\CommissionResource; use App\Http\Resources\CountriesResource; use App\Http\Resources\GroupResource; use App\Http\Resources\IntrosResource; use App\Http\Resources\OrdersResource; use App\Http\Resources\PaymentmethodResource; use App\Http\Resources\ProductResource; use App\Http\Resources\ProductsResource; use App\Http\Resources\StoresResource; use App\Http\Resources\GooglePlacesResource; use App\Models\Ads; use App\Models\Cartype; use App\Models\Category; use App\Models\City; use App\Models\Country; use App\Models\DelegateJoinrequest; use App\Models\Favourite; use App\Models\Qualification; use App\Models\Intro; use App\Models\Nationality; use App\Models\Paymentmethod; use App\Models\Product; use App\Models\ProductGroup; use App\Models\Region; use App\Models\Setting; use App\Models\Store; use App\Models\Subscription; use App\Models\User; use App\Services\OrderService; use App\Services\Store\HomeServices; use App\Traits\ApiTrait; use Auth; use Carbon\Carbon; use DateTime; use DB; use Illuminate\Http\Request; use Illuminate\Support\Facades\Http; use App\Models\Faq; class HomeController extends Controller { use ApiTrait; public function intro(Request $request) { $lang = $request->header('lang') ?? 'ar'; $data = []; //intros $intros = Intro::get(); $data['intros'] = IntrosResource::collection($intros); return $this->dataReturn($data); } public function policy(Request $request) { $lang = $request->header('lang') ?? 'ar'; $data = []; $name = 'policy_' . $lang; //intros $policy = Setting::where('key', $name)->first()->value; $data['policy'] = html_entity_decode(strip_tags($policy)); return $this->dataReturn($data); } public function terms(Request $request) { $lang = $request->header('lang') ?? 'ar'; $data = []; $name = 'terms_' . $lang; //intros $terms = Setting::where('key', $name)->first()->value; $data['terms'] = html_entity_decode(strip_tags($terms)); return $this->dataReturn($data); } public function about(Request $request) { $lang = $request->header('lang') ?? 'ar'; $data = []; $name = 'about_' . $lang; //intros $terms = Setting::where('key', $name)->first()->value; $data['about'] = html_entity_decode(strip_tags($terms)); return $this->dataReturn($data); } public function countries(Request $request) { $lang = $request->header('lang') ?? 'ar'; $data = []; //intros $countries = Country::get(); $data['countries'] = CountriesResource::collection($countries); return $this->dataReturn($data); } public function qualifications(Request $request) { $lang = $request->header('lang') ?? 'ar'; $data = []; //intros $countries = Qualification::get(); $data['qualifications'] = CitiesResource::collection($countries); return $this->dataReturn($data); } public function faqs(){ return $this->dataReturn(FaqsResource::collection(Faq::get())); } public function nationalities() { $nationalities = Nationality::all(); $data = CitiesResource::collection($nationalities); return $this->dataReturn($data); } public function cities(Request $request) { $lang = $request->header('lang') ?? 'ar'; $data = []; if (isset($request['region_id'])) { $cities = City::where('region_id', $request['region_id'])->get(); $data = CityResource::collection($cities); } elseif (isset($request['country_id'])) { $cities = DB::table('cities') ->join('regions', 'cities.region_id', '=', 'regions.id') ->join('countries', 'countries.id', '=', 'regions.country_id') ->where('countries.id', $request['country_id']) ->select('cities.*') ->distinct('cities.id') ->get(); $data = CityResource::collection($cities); } else { $cities = City::get(); $data = CitiesResource::collection($cities); } return $this->dataReturn($data); } public function categories() { $categories = Category::where(['status' => 'true'])->get(); $categoriesarr = CategoriesResource::collection($categories); return $this->dataReturn($categoriesarr); } public function subcategories(Request $request) { $categories = Category::where('status', 'true')->where('category_id' , $request['category_id'])->get(); $data['categories'] = CategoriesResource::collection($categories); return $this->dataReturn($data); } public function home(Request $request) { $data = []; $user = auth('api')->user(); if($user && $user->type == 'store') { $home = new HomeServices(); if ($plan = Subscription::where('user_id', $user->id)->where('unsupscribe' , '0')->where('end_at', '>', Carbon::now())->first()) { $data['isSubscribe'] = true ; }else{ $data['isSubscribe'] = false ; } $data['commission_used'] = $user->store->commission_used ; $data['statistics'] = $home->statistics($user); }elseif ($user && $request->type == 'delegate') { $home = new OrderService(); $orders = $home->delegateNearWaitingOrders(['request' => $request->all()]); $data['orders'] = OrdersResource::collection($orders); $data['pagination'] = $this->paginationModel($orders); }else{ //ads $adsarr = []; $ads = Ads::where('expiry_date', '>', date('y-m-d'))->get(); if (count($ads) > 0) { $adsarr = AdsResource::collection($ads); $data[] = [ 'ads' => $adsarr, 'size' => '100', 'type' => 'normal', 'category' => 'ads', 'rows' => 1, ]; } //categories $categoriesarr = []; $categories = Category::where('status', 'true')->where('category_id' , null)->get(); if (count($categories) > 0) { $categoriesarr = CategoriesResource::collection($categories); $data[] = [ 'categories' => $categoriesarr, 'size' => '100', 'type' => 'vertical', 'category' => 'categories', 'rows' => 2, ]; } } return $this->dataReturn($data); } public function nearstores(Request $request) { $lang = $request->header('lang') ?? 'ar'; $lat = doubleval($request['lat']) ?? doubleval(23.8859); $long = doubleval($request['long']) ?? doubleval(45.0792); $settings = Setting::all()->pluck('value', 'key'); $max_distance = (int) $settings['distance']; //get neareast special stores $order_by_key = 'distance'; $order_by_value = 'asc'; if($request['rate'] == 'high'){ $order_by_key = 'rate'; $order_by_value = 'desc'; }elseif($request['rate'] == 'low'){ $order_by_key = 'rate'; $order_by_value = 'asc'; } $category = Category::find($request['subcategory_id']); $stores = Store::select("stores.*" , DB::raw("6371 * acos(cos(radians(" . $lat . ")) * cos(radians(stores.lat)) * cos(radians(stores.long) - radians(" . $long . ")) + sin(radians(" . $lat . ")) * sin(radians(stores.lat))) AS distance")) // ->having("distance", '<', $max_distance) ->where('stores.has_contract', '=', 'true') ->where('stores.deleted_at', null) ->where(function ($query) use ($request , $category) { if ($request['search']) { $query->where('stores.name->ar', 'like', '%' . strtolower($request['search']) . '%'); $query->orWhere('stores.name->en', 'like', '%' . strtolower($request['search']) . '%'); } if($category){ $query->where('category' , $category->slug); } if($request['category']){ $query->where('category' , $request['category']); } }) ->leftJoin('users', function($join) { $join->on('stores.user_id', '=', 'users.id') ->where('users.approve', '=', 'accept'); }) ->orderBy($order_by_key, $order_by_value)->groupBy("stores.name") ->paginate($this->paginateNum()); $data['stores'] = StoresResource::collection($stores); $data['pagination'] = $this->paginationModel($stores); return $this->dataReturn($data); } public function offerStores(Request $request) { $datetime = new DateTime('now'); $today = $datetime->format('Y-m-d'); $groups = ProductGroup::where('from' , '<=' , $today) ->where('to' , '>' , $today) ->get(); $stores =Store::join('products' , 'products.store_id' , 'stores.id') ->join('product_groups' , function ($join) { $datetime = new DateTime('now'); $today = $datetime->format('Y-m-d'); $join->on('products.id', '=', 'product_groups.product_id') ->where('from' , '<=' , $today) ->where('to' , '>' , $today); })->where(function ($query) use ($request) { if ($request['search']) { $query->where('stores.name->ar', 'like', '%' . $request['search'] . '%') ->orwhere('stores.name->en', 'like', '%' . $request['search'] . '%'); } }) ->whereHas('user') ->select('stores.*') ->get(); $stores = $stores->filter(function ($store) { $cat = Category::where('slug',$store->category)->first(); if($cat && $cat->status == 'true'){ return true; } return false; }); $paginate = $this->paginateModel(collect($stores)); $data['stores'] = StoresResource::collection($paginate); $data['pagination'] = $this->paginationModel($paginate); return $this->dataReturn($data); } public function offerProducts(Request $request){ $datetime = new DateTime('now'); $today = $datetime->format('Y-m-d'); $products = Product::whereHas('groups' , function($q) use($today){ $q->where('from' , '<=' , $today) ->where('to' , '>' , $today); }) ->whereHas('store' , function ($q){ $q->whereHas('user'); }) ->where(function ($query) use ($request) { if ($request['search']) { $query->where('stores.name->ar', 'like', '%' . $request['search'] . '%') ->orwhere('stores.name->en', 'like', '%' . $request['search'] . '%'); } }) ->paginate($this->paginateNum()); $data['products'] = ProductsResource::collection($products); $data['pagination'] = $this->paginationModel($products); return $this->dataReturn($data); } public function singleStore(Request $request) { $lang = $request->header('lang') ?? 'ar'; $lat = doubleval($request['lat']) ?? doubleval(23.8859); $long = doubleval($request['long']) ?? doubleval(45.0792); $settings = Setting::all()->pluck('value', 'key'); $max_distance = (int) $settings['distance']; $store = Store::select("stores.*" , DB::raw("6371 * acos(cos(radians(" . $lat . ")) * cos(radians(stores.lat)) * cos(radians(stores.long) - radians(" . $long . ")) + sin(radians(" . $lat . ")) * sin(radians(stores.lat))) AS distance")) ->having("distance", '<', $max_distance) ->where("stores.id", $request['store_id']) ->first(); if (!$store) { $msg = trans('stores.not_available'); return $this->failMsg($msg); } $store->updateCacheWithProducts(); $data['store'] = $store->cachedMenusWithProducts(); return $this->dataReturn($data); } public function storeBranches(Request $request) { $store = Store::find($request['store_id']); if (!$store) { $msg = trans('stores.not_available'); return $this->failMsg($msg); } $limit = 15; $page = $request['page'] ?? 1; $offset = ($page - 1) * $limit; $lat = doubleval($request['lat']) ?? doubleval(23.8859); $long = doubleval($request['long']) ?? doubleval(45.0792); $settings = Setting::all()->pluck('value', 'key'); $max_distance = (int) $settings['distance']; $parent_id = ($store->store_id == null) ? $store->id : $store->store_id; //get neareast branches $branches = Store:: select("stores.*" , DB::raw("6371 * acos(cos(radians(" . $lat . ")) * cos(radians(stores.lat)) * cos(radians(stores.long) - radians(" . $long . ")) + sin(radians(" . $lat . ")) * sin(radians(stores.lat))) AS distance")) // ->having("distance", '<', $max_distance) ->where('store_id', '=', $parent_id) ->where('stores.has_contract', '=', 'true') ->where('id', '!=', $store->id) ->orwhere('id', '=', $parent_id) ->where('id', '!=', $store->id) ->whereHas('user') ->orderBy("distance", "asc") ->get(); $data['branches'] = StoresResource::collection($branches); return $this->dataReturn($data); } public function singleProduct(Request $request) { info($request['product_id']); $product = Product::find($request['product_id']); if (!$product) { $msg = trans('stores.product_not_available'); return $this->failMsg($msg); } $data['product'] = new ProductResource($product); return $this->dataReturn($data); } public function identicalValues($arrayA, $arrayB) { sort($arrayA); sort($arrayB); return $arrayA == $arrayB; } public function selectGroup(SelectRequest $request) { $product = Product::find($request['product_id']); if (!$product) { $msg = trans('stores.product_not_available'); return $this->failMsg($msg); } $groups = $product->groups()->where('status', 'posted')->where('properities', '!=', null)->get(); foreach ($groups as $group) { if ($this->identicalValues(json_decode($group->properities), json_decode($request['properities']))) { $data['group'] = new GroupResource($group); return $this->dataReturn($data); } } $msg = trans('stores.group_not_available'); return $this->failMsg($msg); } public function paymentMethods(Request $request) { $payment_methods = Paymentmethod::where('status', 'active')->get(); $data = []; $data['payment_methods'] = PaymentmethodResource::collection($payment_methods); return $this->dataReturn($data); } public function getStoreFinance() { $data_return = new HomeServices(); $ser = $data_return->get_finance(); $orders = $ser['orders']; $data['commissions'] = CommissionResource::collection($ser['commissions']); $data['orders'] = [ 'total_price' => $orders->sum('price'), 'app_percentage' => $ser['commissions']->sum('commissions'), 'needed' => $ser['commissions']->sum('commissions'), 'added_value' => $orders->sum('added_value'), ]; return $this->dataReturn($data); } public function get_favourites() { $user = auth('api')->user(); $fav = $user->products()->get(); $products = ProductsResource::collection($fav); return $this->dataReturn($products); } public function favourite(Request $request) { $user = auth('api')->user(); $favourite = Favourite::where('user_id', $user->id)->where('product_id', $request['product_id'])->first(); if ($favourite) { $favourite->delete(); $data['favorite'] = false; $msg = trans('user.unfav'); return $this->successReturn($msg, $data); } Favourite::create([ 'product_id' => $request['product_id'], 'user_id' => $user->id, ]); $msg = trans('user.fav'); $data['favorite'] = true; return $this->successReturn($msg, $data); } }
Back to File Manager