public function get_providers() { $token = Input::get('token'); $owner_id = Input::get('id'); $latitude = Input::get('latitude'); $longitude = Input::get('longitude'); $type = Input::get('type'); $validator = Validator::make(array('token' => $token, 'owner_id' => $owner_id, 'latitude' => $latitude, 'longitude' => $longitude), array('token' => 'required', 'owner_id' => 'required|integer', 'latitude' => 'required', 'longitude' => 'required')); /* $var = Keywords::where('id', 2)->first(); */ if ($validator->fails()) { $error_messages = $validator->messages()->all(); $response_array = array('success' => false, 'error' => 'Invalid Input', 'error_code' => 401, 'error_messages' => $error_messages); $response_code = 200; } else { $is_admin = $this->isAdmin($token); if ($owner_data = $this->getOwnerData($owner_id, $token, $is_admin)) { // check for token validity if (is_token_active($owner_data->token_expiry) || $is_admin) { // Do necessary operations $is_multiple_service = Settings::where('key', 'allow_multiple_service')->first(); if ($is_multiple_service->value == 0) { $archk = is_array($type); Log::info('type = ' . print_r($archk, true)); if ($archk == 1) { $type = $type; Log::info('type = ' . print_r($type, true)); } else { $type = explode(',', $type); Log::info('type = ' . print_r($type, true)); } if (!$type) { // choose default type $provider_type = ProviderType::where('is_default', 1)->first(); if (!$provider_type) { $type = 1; } else { $type = $provider_type->id; } } foreach ($type as $key) { $typ[] = $key; } $ty = implode(",", $typ); $typequery = "SELECT distinct provider_id from walker_services where type IN({$ty})"; $typewalkers = DB::select(DB::raw($typequery)); Log::info('typewalkers = ' . print_r($typewalkers, true)); if ($typewalkers == NULL) { /* $driver = Keywords::where('id', 1)->first(); $response_array = array('success' => false, 'error' => 'No ' . $driver->keyword . ' found matching the service type.', 'error_code' => 405); */ $response_array = array('success' => false, 'error' => 'No ' . Config::get('app.generic_keywords.Provider') . ' found matching the service type.', 'error_code' => 405); $response_code = 200; return Response::json($response_array, $response_code); } foreach ($typewalkers as $key) { $types[] = $key->provider_id; } $typestring = implode(",", $types); Log::info('typestring = ' . print_r($typestring, true)); $settings = Settings::where('key', 'default_search_radius')->first(); $distance = $settings->value; $settings = Settings::where('key', 'default_distance_unit')->first(); $unit = $settings->value; if ($unit == 0) { $multiply = 1.609344; } elseif ($unit == 1) { $multiply = 1; } $query = "SELECT " . "walker.*, " . "ROUND(" . $multiply . " * 3956 * acos( cos( radians('{$latitude}') ) * " . "cos( radians(latitude) ) * " . "cos( radians(longitude) - radians('{$longitude}') ) + " . "sin( radians('{$latitude}') ) * " . "sin( radians(latitude) ) ) ,8) as distance " . "from walker " . "where is_available = 1 and " . "is_active = 1 and " . "is_approved = 1 and " . "ROUND((" . $multiply . " * 3956 * acos( cos( radians('{$latitude}') ) * " . "cos( radians(latitude) ) * " . "cos( radians(longitude) - radians('{$longitude}') ) + " . "sin( radians('{$latitude}') ) * " . "sin( radians(latitude) ) ) ) ,8) <= {$distance} and " . "walker.id IN({$typestring}) " . "order by distance " . "LIMIT 5"; $walkers = DB::select(DB::raw($query)); Log::info('walkers = ' . print_r($walkers, true)); if ($walkers != NULL) { $owner = Owner::find($owner_id); $owner->latitude = $latitude; $owner->longitude = $longitude; $owner->save(); $request = new Requests(); $request->owner_id = $owner_id; $request->request_start_time = date("Y-m-d H:i:s"); $request->save(); foreach ($type as $key) { $reqserv = new RequestServices(); $reqserv->request_id = $request->id; $reqserv->type = $key; $reqserv->save(); } $p = 0; foreach ($walkers as $prov) { $providers[$p]['id'] = $prov->id; $providers[$p]['first_name'] = $prov->first_name; $providers[$p]['last_name'] = $prov->last_name; $providers[$p]['picture'] = $prov->picture; $providers[$p]['phone'] = $prov->phone; $providers[$p]['latitude'] = $prov->latitude; $providers[$p]['longitude'] = $prov->longitude; $providers[$p]['rating'] = $prov->rate; $providers[$p]['car_model'] = $prov->car_model; $providers[$p]['car_number'] = $prov->car_number; $providers[$p]['bearing'] = $prov->bearing; $provserv = ProviderServices::where('provider_id', $prov->id)->get(); $types = ProviderType::where('id', '=', $prov->type)->first(); foreach ($provserv as $ps) { if ($ps->base_price != 0) { $providers[$p]['base_price'] = $ps->base_price; $providers[$p]['price_per_unit_time'] = $ps->price_per_unit_time; $providers[$p]['price_per_unit_distance'] = $ps->price_per_unit_distance; $providers[$p]['base_distance'] = $types->base_distance; } else { /* $settings = Settings::where('key', 'base_price')->first(); $base_price = $settings->value; */ $providers[$p]['base_price'] = $types->base_price; $providers[$p]['price_per_unit_time'] = $types->price_per_unit_time; $providers[$p]['price_per_unit_distance'] = $types->price_per_unit_distance; $providers[$p]['base_distance'] = $types->base_distance; } } /* $rat = WalkerReview::where('walker_id', $prov->id)->get(); $countRating = count($rat); */ /* if ($countRating > 0) { $sum = 0; $count = 0; foreach ($rat as $ratp) { $sum = $ratp->rating + $sum; $count = $count + 1; } $avgrat = $sum / $count; $providers[$p]['rating'] = $avgrat; } else { $providers[$p]['rating'] = 0; } */ $s = 0; $total_price = 0; foreach ($provserv as $ps) { foreach ($type as $tp) { $providers[$p]['type'] = $tp; if ($tp == $ps->type) { $total_price = $total_price + $ps->base_price; } } $s = $s + 1; } $providers[$p]['total_price'] = $total_price; $p = $p + 1; } Log::info('providers = ' . print_r($providers, true)); $response_array = array('success' => true, 'request_id' => $request->id, 'provider' => $providers); $response_code = 200; } } else { // Do necessary operations $archk = is_array($type); Log::info('type = ' . print_r($archk, true)); if ($archk == 1) { $type = (int) $type; Log::info('type = ' . print_r($type, true)); $count = 1; } else { $type1 = explode(',', $type); $type = array(); foreach ($type1 as $key) { $type[] = (int) $key; } Log::info('type = ' . print_r($type, true)); $count = count($type); } if (!$type) { // choose default type $provider_type = ProviderType::where('is_default', 1)->first(); if (!$provider_type) { $type = 1; } else { $type = $provider_type->id; } } $settings = Settings::where('key', 'default_search_radius')->first(); $distance = $settings->value; $settings = Settings::where('key', 'default_distance_unit')->first(); $unit = $settings->value; if ($unit == 0) { $multiply = 1.609344; } elseif ($unit == 1) { $multiply = 1; } $query = "SELECT " . "walker.id, " . "walker.first_name, " . "walker.last_name, " . "walker.picture, " . "walker.phone, " . "walker.latitude, " . "walker.longitude, " . "ROUND(" . $multiply . " * 3956 * acos( cos( radians('{$latitude}') ) * " . "cos( radians(latitude) ) * " . "cos( radians(longitude) - radians('{$longitude}') ) + " . "sin( radians('{$latitude}') ) * " . "sin( radians(latitude) ) ) ,8) as distance " . "from walker " . "where is_available = 1 and " . "is_active = 1 and " . "is_approved = 1 and " . "ROUND((" . $multiply . " * 3956 * acos( cos( radians('{$latitude}') ) * " . "cos( radians(latitude) ) * " . "cos( radians(longitude) - radians('{$longitude}') ) + " . "sin( radians('{$latitude}') ) * " . "sin( radians(latitude) ) ) ) ,8) <= {$distance} " . "order by distance " . "LIMIT 5"; $walker = DB::select(DB::raw($query)); $typewalker = array(); $typewalker1 = array(); foreach ($walker as $key) { $typewalker[] = $key->id; } $flag = 0; if ($typewalker) { $walkers = ProviderServices::whereIn('provider_id', $typewalker)->whereIn('type', $type)->groupBy('provider_id')->havingRaw('count(distinct type) = ' . $count)->get(); foreach ($walkers as $key) { $typewalker1[] = $key->provider_id; } if ($typewalker1) { $walkers = Walker::whereIn('id', $typewalker1)->get(); if ($walkers) { $flag = 1; } } } if ($flag == 1) { $c = 0; foreach ($walkers as $key) { $provider[$c]['id'] = $key->id; $provider[$c]['first_name'] = $key->first_name; $provider[$c]['last_name'] = $key->last_name; $provider[$c]['picture'] = $key->picture; $provider[$c]['phone'] = $key->phone; $provider[$c]['latitude'] = $key->latitude; $provider[$c]['longitude'] = $key->longitude; $provider[$c]['rating'] = $key->rate; $provider[$c]['car_model'] = $key->car_model; $provider[$c]['car_number'] = $key->car_number; $provider[$c]['bearing'] = $key->bearing; $provserv = ProviderServices::where('provider_id', $key->id)->get(); foreach ($provserv as $ps) { $provider[$c]['type'] = $ps->type; $provider[$c]['base_price'] = $ps->base_price; } /* $rat = WalkerReview::where('walker_id', $key->id)->get(); $countRating = count($rat); if ($countRating > 0) { $sum = 0; $count = 0; foreach ($rat as $ratp) { $sum = $ratp->rating + $sum; $count = $count + 1; } $avgrat = $sum / $count; $provider[$c]['rating'] = $avgrat; } else { $provider[$c]['rating'] = 0; } */ $s = 0; $total_price = 0; foreach ($provserv as $ps) { foreach ($type as $tp) { if ($tp == $ps->type) { $total_price = $total_price + $ps->base_price; } } $s = $s + 1; } $provider[$c]['total_price'] = $total_price; $c = $c + 1; } Log::info('provider = ' . print_r($provider, true)); $response_array = array('success' => true, 'provider' => $provider); $response_code = 200; } else { $response_array = array('success' => false, 'error' => 'No walker found'); $response_code = 200; } } } else { $response_array = array('success' => false, 'error' => 'Token Expired', 'error_code' => 405); $response_code = 200; } } else { if ($is_admin) { /* $response_array = array('success' => false, 'error' => '' . $var->keyword . ' ID not Found', 'error_code' => 410); */ $response_array = array('success' => false, 'error' => '' . Config::get('app.generic_keywords.User') . ' ID not Found', 'error_code' => 410); } else { $response_array = array('success' => false, 'error' => 'Not a valid token', 'error_code' => 406); } $response_code = 200; } } $response = Response::json($response_array, $response_code); return $response; }