api doctor detail

This commit is contained in:
Muhammad Fajar
2022-10-27 14:37:12 +07:00
parent 0ece467d21
commit 2f84f43ae5
11 changed files with 245 additions and 106 deletions

View File

@@ -5,12 +5,13 @@ namespace Modules\Linksehat\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Models\Practitioner;
use App\Models\PractitionerRole;
use App\Models\PractitionerRoleAvailability;
use DB;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Modules\Linksehat\Transformers\DoctorResource;
use Modules\Linksehat\Transformers\PractitionerRoleToDoctorDetailResource;
use Modules\Linksehat\Transformers\Doctors\DoctorResourceDetail;
use Modules\Linksehat\Transformers\PractitionerRoleToDoctorResource;
class DoctorController extends Controller
@@ -92,27 +93,23 @@ class DoctorController extends Controller
*/
public function show(Request $request, $id)
{
$doctor = Practitioner::query()
$queryDoctor = PractitionerRole::query()
->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',
'practitioner',
'speciality',
'practices.prices'
])
->findOrFail($id);
// return $doctor;
$queryAvailables = PractitionerRoleAvailability::query()->with(['days' => function ($query) {
$query->select(['availability_id', 'day']);
}])->where('practitioner_role_id', $id)->get(['id', 'start_time']);
return response()->json(DoctorResource::make($doctor));
// return $queryDoctor;
$doctor = DoctorResourceDetail::make($queryDoctor);
$doctor['day_available'] = Helper::dailyAvailabilities($queryAvailables);
// return $doctor;
return response()->json(compact('doctor'));
}
/**

View File

@@ -17,7 +17,7 @@ class DoctorResource extends JsonResource
return [
'id' => $this->practitioner->person->id,
'name' => $this->practitioner->person->name,
'specialis' => $this->speciality->name,
'specialis' => "Spesialis " . $this->speciality->name,
'photos' => [
'title' => 'doctors-avatar-' . $this->id,
'url' => asset('images/default-doctor-avatar.png')

View File

@@ -15,10 +15,16 @@ class HospitalResource extends JsonResource
*/
public function toArray($request)
{
if (empty($this->distance)) {
$address = $this->currentAddress->text;
} else {
$address = $this->currentAddress;
}
return [
'id' => $this->id,
'name' => $this->name,
'address' => $this->currentAddress->text ?? null,
'address' => $address ?? null,
'distance' => $this->distance ? ($this->distance < 1 ? round($this->distance * 1000, 2) . " m" : round($this->distance, 2) . " km") : null,
'photos' => [
'title' => Str::slug($this->name),

View File

@@ -25,7 +25,7 @@ class DoctorResource extends JsonResource
// 'speciality' => SpecialityResource::make($practitionerRole->speciality),
// 'str' => '3121100888826697',
// 'sip' => '73/B.16/31.71.05.1003.01.015.S.2/4/-1.779.3/e/2020',
// 'is_chat_available' => $practitionerRole->is_chat_available,
// 'is_video_available' => $practitionerRole->is_video_available,
// 'is_walkin_available' => $practitionerRole->is_walkin_available,
@@ -52,7 +52,7 @@ class DoctorResource extends JsonResource
// 'hospital' => HospitalResource::make($practitionerRole->organization),
// 'str' => '3121100888826697',
// 'sip' => '73/B.16/31.71.05.1003.01.015.S.2/4/-1.779.3/e/2020',
// 'is_chat_available' => $practitionerRole->is_chat_available,
// 'is_video_available' => $practitionerRole->is_video_available,
// 'is_walkin_available' => $practitionerRole->is_walkin_available,
@@ -61,7 +61,7 @@ class DoctorResource extends JsonResource
$hospitals[$practitionerRole->organization_id]['id'] = $practitionerRole->hospital_id;
$hospitals[$practitionerRole->organization_id]['code'] = $practitionerRole->organization->code;
// $hospitals[$practitionerRole->organization_id]['code'] = $practitionerRole->organization->code;
$hospitals[$practitionerRole->organization_id]['name'] = $practitionerRole->organization->name;
$hospitals[$practitionerRole->organization_id]['description'] = $practitionerRole->organization->description;
$hospitals[$practitionerRole->organization_id]['address'] = $practitionerRole->organization->currentAddress->text;
@@ -81,7 +81,7 @@ class DoctorResource extends JsonResource
'speciality' => SpecialityResource::make($practitionerRole->speciality),
'str' => '3121100888826697',
'sip' => '73/B.16/31.71.05.1003.01.015.S.2/4/-1.779.3/e/2020',
'is_chat_available' => $practitionerRole->is_chat_available,
'is_video_available' => $practitionerRole->is_video_available,
'is_walkin_available' => $practitionerRole->is_walkin_available,
@@ -110,7 +110,7 @@ class DoctorResource extends JsonResource
'name_suffix' => $this->person->name_suffix ?? null,
'gender' => $this->person->gender ?? null,
'is_online' => false,
'is_insurance_covered' => rand(0,1) == 1,
'is_insurance_covered' => rand(0, 1) == 1,
'price_range' => 'Rp 100.000 - Rp 350.000',
'price_start' => '100000',
'price_end' => '350000',

View File

@@ -0,0 +1,66 @@
<?php
namespace Modules\Linksehat\Transformers\Doctors;
use App\Helpers\Helper;
use App\Models\Organization;
use Illuminate\Http\Resources\Json\JsonResource;
use Modules\Linksehat\Transformers\Dashboard\HospitalResource;
class DoctorResourceDetail extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request
* @return array
*/
public function toArray($request)
{
foreach ($this->practices as $practice) {
$prices[$practice->service_code] = Helper::currencyIdrFormat($practice->price);
}
$award[] = explode("\n", $this->practitioner->meta->award);
$education[] = explode("\n", $this->practitioner->meta->education);
$queryHospitals = Organization::query()
->without('meta')
->where('organizations.type', 'hospital')
->leftJoin('addresses', function ($q) {
$q->on('organizations.main_address_id', '=', 'addresses.id');
$q->where('addresses.addressable_type', '=', Organization::class);
});
if ($request->has('lat') && !empty($request->lat) && $request->has('lng') && !empty($request->lng)) {
$queryHospitals = $queryHospitals->selectRaw("organizations.*, addresses.text AS currentAddress, 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")->orderBy('distance', 'ASC');
}
$queryHospitals = $queryHospitals->orderBy('organizations.name', 'asc')->where('organizations.id', $this->organization_id)->get();
return [
'name' => $this->practitioner->person->full_name,
'length_of_work_year' => rand(1, 20),
'price' => $prices,
'rating' => rand(50, 100),
'photos' => [
'title' => 'doctor-avatar-' . $this->practitioner->person->id,
'url' => asset('images/default-doctor-avatar.png')
],
'spesialis' => [
[
'name' => 'Spesialis ' . $this->speciality->name,
'str' => random_int(1000000000000000, 5000000000000000)
],
],
'award' => $award,
'education' => $education,
'location_practect' => HospitalResource::collection($queryHospitals),
'available' => [
'is_chat_available' => $this->is_chat_available,
'is_video_available' => $this->is_video_available,
'is_walkin_available' => $this->is_walkin_available,
'is_instant_chat_available' => $this->is_instant_chat_available,
'day_available' => $this->day_available
]
];
}
}