From b0d74c222e09cb9b2b96f48e628acde6681fec1b Mon Sep 17 00:00:00 2001 From: Muhammad Fajar Date: Tue, 25 Oct 2022 18:12:27 +0700 Subject: [PATCH] add api linksehat/dashboard --- .../Http/Controllers/Api/DoctorController.php | 140 +++++++++--------- 1 file changed, 66 insertions(+), 74 deletions(-) diff --git a/Modules/Linksehat/Http/Controllers/Api/DoctorController.php b/Modules/Linksehat/Http/Controllers/Api/DoctorController.php index bf7ec224..70971780 100644 --- a/Modules/Linksehat/Http/Controllers/Api/DoctorController.php +++ b/Modules/Linksehat/Http/Controllers/Api/DoctorController.php @@ -22,36 +22,37 @@ class DoctorController extends Controller public function index(Request $request) { $doctors = PractitionerRole::query() - ->with(['practitioner.person', 'speciality', 'practitioner.metas', 'metas', - 'organization' => function ($query) use ($request) { - if ($request->has('lat') && !empty($request->lat) && $request->has('lng') && !empty($request->lng)) { - return $query->leftJoin('addresses', function($q) { - $q->on('organizations.main_address_id', '=', 'addresses.id'); - $q->where('addresses.addressable_type', '=', Organization::class); - }) - ->select([ - "organizations.*", - "addresses.lat", - "addresses.lng", - // DB::raw("ST_Distance_Sphere(point(addresses.lng,addresses.lat), point(".$request->lng.",".$request->lat.")) /1000 as distance_km"), - DB::raw("6371 * acos (cos ( radians($request->lat) ) * cos( radians( addresses.lat ) ) * cos( radians( addresses.lng ) - radians($request->lng) ) + sin ( radians($request->lat) ) * sin( radians( addresses.lat ) )) as distance_km") - ]); - } - }, - ]) - ->when($request->search ?? null, function($query, $search) { - $query->whereHas('practitioner.person', function($person) use ($search) { - $person->where('name', 'LIKE', '%'.$search.'%'); - }); - }) - ->whereHas('speciality'); + ->with([ + 'practitioner.person', 'speciality', 'practitioner.metas', 'metas', + 'organization' => function ($query) use ($request) { + if ($request->has('lat') && !empty($request->lat) && $request->has('lng') && !empty($request->lng)) { + return $query->leftJoin('addresses', function ($q) { + $q->on('organizations.main_address_id', '=', 'addresses.id'); + $q->where('addresses.addressable_type', '=', Organization::class); + }) + ->select([ + "organizations.*", + "addresses.lat", + "addresses.lng", + // DB::raw("ST_Distance_Sphere(point(addresses.lng,addresses.lat), point(".$request->lng.",".$request->lat.")) /1000 as distance_km"), + DB::raw("6371 * acos (cos ( radians($request->lat) ) * cos( radians( addresses.lat ) ) * cos( radians( addresses.lng ) - radians($request->lng) ) + sin ( radians($request->lat) ) * sin( radians( addresses.lat ) )) as distance_km") + ]); + } + }, + ]) + ->when($request->search ?? null, function ($query, $search) { + $query->whereHas('practitioner.person', function ($person) use ($search) { + $person->where('name', 'LIKE', '%' . $search . '%'); + }); + }) + ->whereHas('speciality'); if ($request->has('hospital_id_in')) { $hospital_ids = explode(',', $request->hospital_id_in); $doctors->whereIn('organization_id', $hospital_ids); } else if ($request->has('hospital_id')) { $doctors->where('organization_id', $request->hospital_id); } - + $limit = $request->limit ?? 6; if ($limit > 20) { $limit = 20; @@ -92,30 +93,25 @@ class DoctorController extends Controller public function show(Request $request, $id) { $doctor = Practitioner::query() - ->with([ - 'practitionerRoles', - 'practitionerRoles.metas', - 'practitionerRoles.speciality', - 'practitionerRoles.organization' => function ($query) use ($request) { - if ($request->has('lat') && !empty($request->lat) && $request->has('lng') && !empty($request->lng)) { - $query->leftJoin('addresses', function($q) { - $q->on('organizations.main_address_id', '=', 'addresses.id'); - $q->where('addresses.addressable_type', '=', Organization::class); - }); - $query->select([ - "organizations.*", - // DB::raw("ST_Distance_Sphere(point(addresses.lng,addresses.lat), point(".$request->lng.",".$request->lat.")) /1000 as distance_km"), - DB::raw("6371 * acos (cos ( radians($request->lat) ) * cos( radians( addresses.lat ) ) * cos( radians( addresses.lng ) - radians($request->lng) ) + sin ( radians($request->lat) ) * sin( radians( addresses.lat ) )) as distance_km") - ]); - } - }, - 'practitionerRoles.practices', - 'practitionerRoles.availabilities', - 'person', - 'metas', - ]) - ->findOrFail($id); - + ->with([ + 'practitionerRoles', + 'practitionerRoles.metas', + 'practitionerRoles.speciality', + 'practitionerRoles.organization' => function ($query) { + $query->leftJoin('addresses', function ($q) { + $q->on('organizations.main_address_id', '=', 'addresses.id'); + $q->where('addresses.addressable_type', '=', Organization::class); + }); + }, + 'practitionerRoles.practices', + 'practitionerRoles.availabilities', + 'person', + 'metas', + ]) + ->findOrFail($id); + + // return $doctor; + return response()->json(DoctorResource::make($doctor)); } @@ -162,12 +158,12 @@ class DoctorController extends Controller if ($request->type == 'walkin') { $practitionerRole = PractitionerRole::query() - ->where('practitioner_id', $id) - ->where('organization_id', $request->hospital_id) - ->where('speciality_id', $request->speciality_id) - ->with(['availabilities', 'availabilities.days']) - ->first(); - + ->where('practitioner_id', $id) + ->where('organization_id', $request->hospital_id) + ->where('speciality_id', $request->speciality_id) + ->with(['availabilities', 'availabilities.days']) + ->first(); + if ($practitionerRole) { $schedules = [ @@ -181,25 +177,23 @@ class DoctorController extends Controller ]; foreach ($practitionerRole->daily_availabilities as $day => $times) { - $schedules[$day] = array_unique( array_merge($schedules[$day], $times) ); + $schedules[$day] = array_unique(array_merge($schedules[$day], $times)); } - } - } else if ($request->type == 'teleconsultation') { $practitioner = Practitioner::query() - ->with([ - 'practitionerRoles' => function($practitionerRole) use ($request) { - if (!empty($request->hospital_id)) { - $practitionerRole->where('organization_id', $request->hospital_id); - } - }, - 'practitionerRoles.availabilities', - 'practitionerRoles.availabilities.days' - ]) - ->where('id', $id) - ->first(); + ->with([ + 'practitionerRoles' => function ($practitionerRole) use ($request) { + if (!empty($request->hospital_id)) { + $practitionerRole->where('organization_id', $request->hospital_id); + } + }, + 'practitionerRoles.availabilities', + 'practitionerRoles.availabilities.days' + ]) + ->where('id', $id) + ->first(); $schedules = [ 'Senin' => [], @@ -212,24 +206,22 @@ class DoctorController extends Controller ]; foreach ($practitioner->practitionerRoles as $role) { - + foreach ($role->daily_availabilities as $day => $times) { // Merge All Role Availabilities - $schedules[$day] = array_unique( array_merge($schedules[$day], $times) ); + $schedules[$day] = array_unique(array_merge($schedules[$day], $times)); // $schedules[] = [ // 'day' => $day, // 'times' => array_unique( array_merge($schedules[$day], $times) ) // ]; } - } - } - - $datesAvailabilities = Helper::dailyAvailabilitiesToDate( $schedules, $request->start_date, $request->end_date ?? null); + + $datesAvailabilities = Helper::dailyAvailabilitiesToDate($schedules, $request->start_date, $request->end_date ?? null); return response()->json($datesAvailabilities);