Edit File: ProviderService.php
<?php namespace App\Services\Provider; use App\Enums\ProductDeliveryTypesEnum; use App\Models\Category; use App\Models\Provider; use App\Services\BaseService; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Http; class ProviderService extends BaseService { public function __construct() { $this->model = Provider::class; parent::__construct(Provider::class); } public function all($paginateNum = 10) { return $this->model::search(request()->searchArray)->where('is_approved', true)->paginate($paginateNum); } public function joiningRequests($paginateNum = 10) { return $this->model::search(request()->searchArray)->where('is_approved', false)->paginate($paginateNum); } public function getFilteredProviders($request, $paginateNum = 10): array { $providers = $this->model::has('products')->has('providerWorkTimes') ->when($request->best_rated, function ($q) { $q->orderBy('avg_rate', 'DESC'); }) ->search($request->only(['neighborhood_id', 'category_id', 'store_name'])) ->when($request->search, function ($q) use ($request) { $q->when($request->search_for == 'store', function ($q) use ($request) { $q->where('store_name', 'like', '%' . $request->search . '%'); })->when($request->search_for == 'product', function ($q) use ($request) { $q->whereRelation('products', 'name', 'like', '%' . $request->search . '%'); }); }) ->when(in_array($request->delivery_type, array_column(ProductDeliveryTypesEnum::cases(), 'value')), function ($q) use ($request) { $q->whereIn('delivery_method', [$request->delivery_type, ProductDeliveryTypesEnum::Both->value]); }) ->paginate($paginateNum); // create search history for user if request has store_name and search_for if (auth()->check() && ($request->has('store_name') || ($request->has('search_for') && $request->has('search')))) { $keyword = $request->input('store_name') ?? $request->input('search'); $this->createSearchHistory($keyword); } return ['rows' => $providers, 'msg' => __('apis.success'), 'key' => 'success']; } public function getBestClosestProviders($request): array { $lat = auth()->user()?->lat ?? $request->lat ?? 31.0409; $lng = auth()->user()?->lng ?? $request->lng ?? 31.3786; $providers = Provider::has('products')->has('providerWorkTimes') ->select( '*', DB::raw("6371 * acos(cos(radians(" . ($lat) . ")) * cos(radians(lat)) * cos(radians(lng) - radians(" . ($lng) . ")) + sin(radians(" . ($lat) . ")) * sin(radians(lat))) AS distance") ) ->orderByRaw("distance ASC") ->orderByRaw("avg_rate DESC") ->take(5) ->get(); // $providers = $providers->map(function ($provider) use ($lat, $lng) { // $distanceData = $this->calculateDistance($lat, $lng, $provider->lat, $provider->lng); // // // Add distance and duration as custom attributes // $provider->distance = $distanceData['value']; // $provider->duration = $distanceData['duration']; // // return $provider; // }); return ['keys' => 'success', 'rows' => $providers, 'msg' => __('apis.success')]; } protected function createSearchHistory($keyword): void { if (isset($keyword)) { auth()->user()->searchHistory()->updateOrCreate(['keyword' => $keyword], ['keyword' => $keyword]); } } public function providerClassificationsAccordingToCategory($category_id, $provider_id): array { try { $provider = $this->find($provider_id); $subCategory = $provider ? $provider?->subCategories() ->where('category_id', $category_id) ->first() : null; if (!$subCategory) { return ['key' => 'fail', 'rows' => [], 'msg' => __('apis.no_classifications_inside_this_category')]; } $classifications = $subCategory->childes() ->whereRelation('products', 'provider_id', $provider_id) ->get(); return ['key' => 'success', 'rows' => $classifications, 'msg' => __('apis.success')]; } catch (\Exception $exception) { return ['key' => 'fail', 'rows' => [], 'msg' => __('apis.not_found')]; } } public function getProviderProducts($provider_id, $request, $paginateNum = 10, $classification_id = null, $sub_category_id = null): array { $provider = $this->find($provider_id); $products = $provider->products()->orderBy('created_at','desc')->withCount('productClassifications') ->when($request->classification_id, function ($q) use ($request) { $q->whereRelation('category', 'id', $request->classification_id); })->when($request->input('search'), function ($q) use ($request) { $q->where('name', 'like', '%' . $request->input('search') . '%'); })->when($request->category_id && !$request->classification_id, function ($q) use ($request) { $classifications = Category::find($request->category_id)->childes()->pluck('id')->toArray(); $q->whereIn('category_id',$classifications); })->when($sub_category_id, function ($q) use ($sub_category_id) { $q->whereRelation('category.parent', 'id', $sub_category_id); }) ->paginate($paginateNum); return ['key' => 'success', 'rows' => $products, 'msg' => __('apis.success')]; } public function findProviderProduct($provider_id, $product_id): array { $provider = $this->find($provider_id); $product = $provider->products()->with('productClassifications.productAddons')->find($product_id); return ['key' => 'success', 'row' => $product, 'msg' => __('apis.success')]; } public function isApprovedToggle($id) { $user = $this->find($id); $user->update(['is_approved' => !$user->is_approved]); return $user->refresh(); } public function details($user) { if (request()->type == 'main_data') { $html = view('admin.providers.parts.main_data', ['row' => $user])->render(); } if (request()->type == 'complaints') { $complaints = $user->complaints()->paginate(10); $html = view('admin.providers.parts.complaints', compact('complaints'))->render(); } if (request()->type == 'orders') { $orders = $user->orders()->orderBy('created_at','desc')->get() ?? collect([]); $html = view('admin.providers.parts.orders', compact('orders'))->render(); } return ['html' => $html]; } }
Back to File Manager