From a9f29cd19dd9461a40f4f223df8885bf9f5b9258 Mon Sep 17 00:00:00 2001 From: R Date: Sat, 17 Sep 2022 00:51:02 +0700 Subject: [PATCH] Add API --- .../Controllers/Api/ArticleController.php | 79 ++++++++++ .../Http/Controllers/Api/AuthController.php | 50 +++++-- .../Http/Controllers/Api/DoctorController.php | 102 +++++++++++++ .../Controllers/Api/HospitalController.php | 96 ++++++++++++ Modules/Linksehat/Routes/api.php | 13 ++ .../Linksehat/Transformers/DoctorResource.php | 19 +++ .../Transformers/HospitalResource.php | 37 +++++ ...PractitionerRoleToDoctorDetailResource.php | 40 +++++ .../PractitionerRoleToDoctorResource.php | 33 ++++ app/Models/Address.php | 24 +++ app/Models/Meta.php | 22 +++ app/Models/Organization.php | 40 +++++ app/Models/Person.php | 49 ++++++ app/Models/Practitioner.php | 39 +++++ app/Models/PractitionerRole.php | 41 +++++ ...8_09_095513_create_organizations_table.php | 2 + ...22_09_14_095154_create_addresses_table.php | 9 ++ .../2022_09_16_045129_create_metas_table.php | 41 +++++ ...9_16_082408_create_practitioners_table.php | 37 +++++ ...2022_09_16_082630_create_persons_table.php | 47 ++++++ ...084111_create_practitioner_roles_table.php | 44 ++++++ database/seeders/OrganizationSeeder.php | 65 ++++++++ database/seeders/PractitionerSeeder.php | 141 ++++++++++++++++++ .../components/hook-form/RHFAutocomplete.tsx | 41 +++++ .../dashboard/src/pages/Corporates/Form.tsx | 21 +++ public/images/default-doctor-avatar.png | Bin 0 -> 103695 bytes public/images/default-hospital-image.png | Bin 0 -> 1415982 bytes ...splash_ZCztndOWdjs (2).png:Zone.Identifier | 3 + 28 files changed, 1122 insertions(+), 13 deletions(-) create mode 100644 Modules/Linksehat/Http/Controllers/Api/ArticleController.php create mode 100644 Modules/Linksehat/Http/Controllers/Api/DoctorController.php create mode 100644 Modules/Linksehat/Http/Controllers/Api/HospitalController.php create mode 100644 Modules/Linksehat/Transformers/DoctorResource.php create mode 100644 Modules/Linksehat/Transformers/HospitalResource.php create mode 100644 Modules/Linksehat/Transformers/PractitionerRoleToDoctorDetailResource.php create mode 100644 Modules/Linksehat/Transformers/PractitionerRoleToDoctorResource.php create mode 100644 app/Models/Meta.php create mode 100644 app/Models/Person.php create mode 100644 app/Models/Practitioner.php create mode 100644 app/Models/PractitionerRole.php create mode 100644 database/migrations/2022_09_16_045129_create_metas_table.php create mode 100644 database/migrations/2022_09_16_082408_create_practitioners_table.php create mode 100644 database/migrations/2022_09_16_082630_create_persons_table.php create mode 100644 database/migrations/2022_09_16_084111_create_practitioner_roles_table.php create mode 100644 database/seeders/OrganizationSeeder.php create mode 100644 database/seeders/PractitionerSeeder.php create mode 100644 frontend/dashboard/src/components/hook-form/RHFAutocomplete.tsx create mode 100644 public/images/default-doctor-avatar.png create mode 100644 public/images/default-hospital-image.png create mode 100644 public/images/unsplash_ZCztndOWdjs (2).png:Zone.Identifier diff --git a/Modules/Linksehat/Http/Controllers/Api/ArticleController.php b/Modules/Linksehat/Http/Controllers/Api/ArticleController.php new file mode 100644 index 00000000..caf9936e --- /dev/null +++ b/Modules/Linksehat/Http/Controllers/Api/ArticleController.php @@ -0,0 +1,79 @@ +validate([ - 'phone' => 'required' + // 'phone' => 'required' + 'phone_or_email' => 'required' ]); + + if(filter_var($request->phone_or_email, FILTER_VALIDATE_EMAIL)) { + $user = User::updateOrCreate([ + 'email' => $request->phone_or_email + ], [ + 'email' => $request->phone_or_email, + 'otp' => rand(1000, 9999), + 'otp_created_at' => now() + ]); + } + else { + $user = User::updateOrCreate([ + 'phone' => $request->phone + ], [ + 'phone' => $request->phone, + 'otp' => rand(1000, 9999), + 'otp_created_at' => now() + ]); + } - $user = User::updateOrCreate([ - 'phone' => $request->phone - ], [ - 'phone' => $request->phone, - 'otp' => rand(1000, 9999), - 'otp_created_at' => now() - ]); if (!$user) { return response()->json([ - 'message' => "User dengan nomor telepon ".$request->phone." tidak ditemukan" + 'message' => filter_var($request->phone_or_email, FILTER_VALIDATE_EMAIL) ? + "User dengan alamat email ".$request->phone_or_email." tidak ditemukan" : + "User dengan nomor telepon ".$request->phone_or_email." tidak ditemukan" ], 404); } + // TODO Send the OTP + if (filter_var($request->phone_or_email, FILTER_VALIDATE_EMAIL)) { + // Send Email + } else { + // Send Whatsapp + } + return response()->json([ 'message' => 'OTP Terkirim', 'data' => [ @@ -41,10 +63,12 @@ class AuthController extends Controller public function login(Request $request) { $request->validate([ - 'email' => 'email', - 'password' => 'required_with:email', - 'phone' => '', - 'otp' => 'required_with:phone', + // 'email' => 'email', + // 'password' => 'required_with:email', + // 'phone' => '', + // 'otp' => 'required_with:phone', + 'phone_or_email' => 'required', + 'otp' => 'required' ]); $loginType = null; diff --git a/Modules/Linksehat/Http/Controllers/Api/DoctorController.php b/Modules/Linksehat/Http/Controllers/Api/DoctorController.php new file mode 100644 index 00000000..83b2ba7c --- /dev/null +++ b/Modules/Linksehat/Http/Controllers/Api/DoctorController.php @@ -0,0 +1,102 @@ +with(['practitioner.person', 'speciality', 'practitioner.metas', 'metas', 'organization']) + ->when($request->search ?? null, function($query, $search) { + $query->whereHas('practitioner.person', function($person) use ($search) { + $person->where('name', 'LIKE', '%'.$search.'%'); + }); + }) + ->paginate(6); + + + return response()->json([ + 'message' => 'Sukses mengambil data Dokter', + 'doctors' => Helper::paginateResources(PractitionerRoleToDoctorResource::collection($hospitals)) + ]); + } + + /** + * Show the form for creating a new resource. + * @return Renderable + */ + public function create() + { + return view('linksehat::create'); + } + + /** + * Store a newly created resource in storage. + * @param Request $request + * @return Renderable + */ + public function store(Request $request) + { + // + } + + /** + * Show the specified resource. + * @param int $id + * @return Renderable + */ + public function show($id) + { + $doctor = PractitionerRole::query() + ->with(['practitioner', 'practitioner.person', 'speciality', 'practitioner.metas', 'metas', 'organization']) + ->where('id', $id) + ->firstOrFail(); + + return response()->json(PractitionerRoleToDoctorDetailResource::make($doctor)); + } + + /** + * Show the form for editing the specified resource. + * @param int $id + * @return Renderable + */ + public function edit($id) + { + return view('linksehat::edit'); + } + + /** + * Update the specified resource in storage. + * @param Request $request + * @param int $id + * @return Renderable + */ + public function update(Request $request, $id) + { + // + } + + /** + * Remove the specified resource from storage. + * @param int $id + * @return Renderable + */ + public function destroy($id) + { + // + } +} diff --git a/Modules/Linksehat/Http/Controllers/Api/HospitalController.php b/Modules/Linksehat/Http/Controllers/Api/HospitalController.php new file mode 100644 index 00000000..a9f1c31b --- /dev/null +++ b/Modules/Linksehat/Http/Controllers/Api/HospitalController.php @@ -0,0 +1,96 @@ +with(['currentAddress']) + ->where('type', 'hospital') + ->when($request->search ?? null, function($query, $search) { + $query->where('name', 'LIKE', '%'.$search.'%'); + }) + ->paginate(6); + + + return response()->json([ + 'message' => 'Sukses mengambil data Rumah Sakit', + 'hospitals' => Helper::paginateResources(HospitalResource::collection($hospitals)) + ]); + } + + /** + * Show the form for creating a new resource. + * @return Renderable + */ + public function create() + { + return view('linksehat::create'); + } + + /** + * Store a newly created resource in storage. + * @param Request $request + * @return Renderable + */ + public function store(Request $request) + { + // + } + + /** + * Show the specified resource. + * @param int $id + * @return Renderable + */ + public function show($id) + { + $hospital = Organization::query()->findOrFail($id); + + return response()->json(HospitalResource::make($hospital)); + } + + /** + * Show the form for editing the specified resource. + * @param int $id + * @return Renderable + */ + public function edit($id) + { + return view('linksehat::edit'); + } + + /** + * Update the specified resource in storage. + * @param Request $request + * @param int $id + * @return Renderable + */ + public function update(Request $request, $id) + { + // + } + + /** + * Remove the specified resource from storage. + * @param int $id + * @return Renderable + */ + public function destroy($id) + { + // + } +} diff --git a/Modules/Linksehat/Routes/api.php b/Modules/Linksehat/Routes/api.php index 10107af7..80dda47f 100644 --- a/Modules/Linksehat/Routes/api.php +++ b/Modules/Linksehat/Routes/api.php @@ -2,6 +2,8 @@ use Illuminate\Http\Request; use Modules\Linksehat\Http\Controllers\Api\AuthController; +use Modules\Linksehat\Http\Controllers\Api\DoctorController; +use Modules\Linksehat\Http\Controllers\Api\HospitalController; /* |-------------------------------------------------------------------------- @@ -18,6 +20,17 @@ Route::post('otp-request', [AuthController::class, 'otpRequest']); Route::post('login', [AuthController::class, 'login']); Route::post('register', [AuthController::class, 'register']); +Route::get('articles', [ArticleController::class, 'index']); +Route::get('articles/id', [ArticleController::class, 'show']); + +Route::get('hospitals', [HospitalController::class, 'index']); +Route::get('hospitals/{id}', [HospitalController::class, 'show']); + +Route::get('doctors/online', [DoctorController::class, 'index']); +Route::get('doctors', [DoctorController::class, 'index']); +Route::get('doctors/{id}', [DoctorController::class, 'show']); +Route::get('doctors/{id}/schedule', [DoctorController::class, 'schedule']); + Route::middleware('auth:api')->get('/linksehat', function (Request $request) { return $request->user(); }); \ No newline at end of file diff --git a/Modules/Linksehat/Transformers/DoctorResource.php b/Modules/Linksehat/Transformers/DoctorResource.php new file mode 100644 index 00000000..c2c449a4 --- /dev/null +++ b/Modules/Linksehat/Transformers/DoctorResource.php @@ -0,0 +1,19 @@ + $this->id, + 'name' => $this->name, + 'code' => $this->code, + 'description' => $this->description, + 'address' => $this->currentAddress->text ?? null, + 'lat' => $this->currentAddress->lat ?? null, + 'lng' => $this->currentAddress->lng ?? null, + 'distance' => '200 m', + 'city_name' => 'Kota Tangerang', + 'phone' => $this->meta->phone, + 'photo_url' => asset('images/default-hospital-image.png'), + 'photos' => [ + [ + 'title' => $this->name, + 'photo_url' => asset('images/default-hospital-image.png'), + ] + ] + ]; + } +} diff --git a/Modules/Linksehat/Transformers/PractitionerRoleToDoctorDetailResource.php b/Modules/Linksehat/Transformers/PractitionerRoleToDoctorDetailResource.php new file mode 100644 index 00000000..f34512bf --- /dev/null +++ b/Modules/Linksehat/Transformers/PractitionerRoleToDoctorDetailResource.php @@ -0,0 +1,40 @@ + $this->id, + 'full_name' => $this->practitioner->person->full_name ?? null, + 'name_prefix' => $this->practitioner->person->name_prefix ?? null, + 'name' => $this->practitioner->person->name ?? null, + 'name_suffix' => $this->practitioner->person->name_suffix ?? null, + 'gender' => $this->practitioner->person->gender ?? null, + 'speciality_name' => !empty($this->speciality->name ?? null) ? 'Spesialis '. $this->speciality->name : 'Spesialis Empty', + 'is_online' => false, + 'price_range' => 'Rp 100.000 - Rp 350.000', + 'price_start' => '100000', + 'price_end' => '350000', + 'avatar_url' => asset('images/default-doctor-avatar.png'), + 'education' => $this->meta->education ?? '', + 'medical_treatment' => $this->meta->medical_treatment ?? '', + 'award' => $this->meta->award ?? '', + 'work_experience' => $this->meta->work_experience ?? '', + 'keilmuan' => $this->meta->keilmuan ?? '', + 'description' => $this->meta->description ?? '' + ]; + + return parent::toArray($request); + } +} diff --git a/Modules/Linksehat/Transformers/PractitionerRoleToDoctorResource.php b/Modules/Linksehat/Transformers/PractitionerRoleToDoctorResource.php new file mode 100644 index 00000000..52b72669 --- /dev/null +++ b/Modules/Linksehat/Transformers/PractitionerRoleToDoctorResource.php @@ -0,0 +1,33 @@ + $this->id, + 'full_name' => $this->practitioner->person->full_name, + 'name_prefix' => $this->practitioner->person->name_prefix, + 'name' => $this->practitioner->person->name, + 'name_suffix' => $this->practitioner->person->name_suffix, + 'gender' => $this->practitioner->person->gender, + 'speciality_name' => !empty($this->speciality->name ?? null) ? 'Spesialis '. $this->speciality->name : 'Spesialis Empty', + 'is_online' => false, + 'price_range' => 'Rp 100.000 - Rp 350.000', + 'price_start' => '100000', + 'price_end' => '350000', + 'avatar_url' => asset('images/default-doctor-avatar.png'), + ]; + return parent::toArray($request); + } +} diff --git a/app/Models/Address.php b/app/Models/Address.php index 14f53910..3c867fb5 100644 --- a/app/Models/Address.php +++ b/app/Models/Address.php @@ -8,4 +8,28 @@ use Illuminate\Database\Eloquent\Model; class Address extends Model { use HasFactory; + + protected $fillable = [ + 'addressable_type', + 'addressable_id', + 'use', + 'type', + 'text', + 'line', + 'province_id', + 'city_id', + 'district_id', + 'village_id', + 'postal_code', + 'country', + 'lat', + 'lng', + 'period_start', + 'period_end', + ]; + + public function addressable() + { + return $this->morphTo(); + } } diff --git a/app/Models/Meta.php b/app/Models/Meta.php new file mode 100644 index 00000000..6e16dfff --- /dev/null +++ b/app/Models/Meta.php @@ -0,0 +1,22 @@ +morphTo(); + } +} diff --git a/app/Models/Organization.php b/app/Models/Organization.php index c75065af..496c02cf 100644 --- a/app/Models/Organization.php +++ b/app/Models/Organization.php @@ -10,15 +10,55 @@ class Organization extends Model use HasFactory; protected $fillable = [ + 'code', 'name', 'type', 'status', 'description', 'part_of', + 'main_address_id', ]; + public $with = [ + 'metas' + ]; + + public $appends = [ + 'meta' + ]; + + public function getMetaAttribute() + { + $orgMeta = []; + foreach ($this->metas as $meta) { + $orgMeta[$meta->type] = $meta->value; + } + + return (object) $orgMeta; + } + + public function addresses() + { + return $this->morphMany(Address::class, 'addressable'); + } + + public function currentAddress() + { + return $this->belongsTo(Address::class, 'main_address_id'); + } + public function parent() { return $this->belongsTo(Organization::class, 'part_of', 'id'); } + + public function metas() + { + return $this->morphMany(Meta::class, 'metaable'); + } + + public function practitionerRoles() + { + return $this->hasMany(PractitionerRole::class, 'organization_id'); + } } diff --git a/app/Models/Person.php b/app/Models/Person.php new file mode 100644 index 00000000..410ccdc3 --- /dev/null +++ b/app/Models/Person.php @@ -0,0 +1,49 @@ +name_prefix)) { + $arr[] = $this->name_prefix; + } + $arr[] = $this->name; + if (!empty($this->name_suffix)) { + $arr[] = $this->name_suffix; + } + + return implode(' ', $arr); + } + + public function addresses() + { + return $this->morphMany(Address::class, 'addressable'); + } + + public function metas() + { + return $this->morphMany(Meta::class, 'metaable'); + } +} diff --git a/app/Models/Practitioner.php b/app/Models/Practitioner.php new file mode 100644 index 00000000..a3c569a2 --- /dev/null +++ b/app/Models/Practitioner.php @@ -0,0 +1,39 @@ +metas as $meta) { + $orgMeta[$meta->type] = $meta->value; + } + + return (object) $orgMeta; + } + + public function person() + { + return $this->belongsTo(Person::class, 'person_id'); + } + + public function metas() + { + return $this->morphMany(Meta::class, 'metaable'); + } +} diff --git a/app/Models/PractitionerRole.php b/app/Models/PractitionerRole.php new file mode 100644 index 00000000..8c102554 --- /dev/null +++ b/app/Models/PractitionerRole.php @@ -0,0 +1,41 @@ +morphMany(Meta::class, 'metaable'); + } + + public function organization() + { + return $this->belongsTo(Organization::class, 'organization_id'); + } + + public function practitioner() + { + return $this->belongsTo(Practitioner::class, 'practitioner_id'); + } + + public function speciality() + { + return $this->belongsTo(Speciality::class, 'speciality_id'); + } +} diff --git a/database/migrations/2022_08_09_095513_create_organizations_table.php b/database/migrations/2022_08_09_095513_create_organizations_table.php index 3c57d9be..b400795f 100644 --- a/database/migrations/2022_08_09_095513_create_organizations_table.php +++ b/database/migrations/2022_08_09_095513_create_organizations_table.php @@ -15,11 +15,13 @@ return new class extends Migration { Schema::create('organizations', function (Blueprint $table) { $table->id(); + $table->string('code')->unique(); $table->string('name'); $table->string('type')->nullable(); $table->string('status')->nullable()->default('active'); $table->text('description')->nullable(); $table->foreignId('part_of')->nullable(); + $table->foreignId('main_address_id')->nullable(); $table->timestamps(); $table->softDeletes(); diff --git a/database/migrations/2022_09_14_095154_create_addresses_table.php b/database/migrations/2022_09_14_095154_create_addresses_table.php index 7d258d15..6fce3e0e 100644 --- a/database/migrations/2022_09_14_095154_create_addresses_table.php +++ b/database/migrations/2022_09_14_095154_create_addresses_table.php @@ -27,7 +27,16 @@ return new class extends Migration $table->string('postal_code')->nullable(); $table->string('rt')->nullable(); $table->string('rw')->nullable(); + $table->string('lat')->nullable(); + $table->string('lng')->nullable(); + $table->dateTime('period_start')->nullable(); + $table->dateTime('period_end')->nullable(); $table->timestamps(); + $table->softDeletes(); + + $table->foreignId('created_by')->nullable(); + $table->foreignId('updated_by')->nullable(); + $table->foreignId('deleted_by')->nullable(); }); } diff --git a/database/migrations/2022_09_16_045129_create_metas_table.php b/database/migrations/2022_09_16_045129_create_metas_table.php new file mode 100644 index 00000000..7ebbbd87 --- /dev/null +++ b/database/migrations/2022_09_16_045129_create_metas_table.php @@ -0,0 +1,41 @@ +id(); + $table->morphs('metaable'); + $table->string('system')->nullable()->index(); + $table->string('type')->index(); + $table->text('value')->nullable(); + + $table->timestamps(); + $table->softDeletes(); + + $table->foreignId('created_by')->nullable(); + $table->foreignId('updated_by')->nullable(); + $table->foreignId('deleted_by')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('metas'); + } +}; diff --git a/database/migrations/2022_09_16_082408_create_practitioners_table.php b/database/migrations/2022_09_16_082408_create_practitioners_table.php new file mode 100644 index 00000000..be61fbcf --- /dev/null +++ b/database/migrations/2022_09_16_082408_create_practitioners_table.php @@ -0,0 +1,37 @@ +id(); + $table->foreignId('person_id'); + $table->timestamps(); + $table->softDeletes(); + + $table->foreignId('created_by')->nullable(); + $table->foreignId('updated_by')->nullable(); + $table->foreignId('deleted_by')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('practitioners'); + } +}; diff --git a/database/migrations/2022_09_16_082630_create_persons_table.php b/database/migrations/2022_09_16_082630_create_persons_table.php new file mode 100644 index 00000000..65855362 --- /dev/null +++ b/database/migrations/2022_09_16_082630_create_persons_table.php @@ -0,0 +1,47 @@ +id(); + $table->string('nik')->nullable(); + $table->string('name_prefix')->nullable(); + $table->string('name')->nullable(); + $table->string('name_suffix')->nullable(); + $table->string('gender')->nullable(); + $table->dateTime('birth_date')->nullable(); + $table->boolean('is_deceased')->default(0); + $table->dateTime('deceased_at')->nullable(); + $table->string('marital_status')->nullable(); + $table->foreignId('main_address_id')->nullable(); + + $table->timestamps(); + $table->softDeletes(); + + $table->foreignId('created_by')->nullable(); + $table->foreignId('updated_by')->nullable(); + $table->foreignId('deleted_by')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('persons'); + } +}; diff --git a/database/migrations/2022_09_16_084111_create_practitioner_roles_table.php b/database/migrations/2022_09_16_084111_create_practitioner_roles_table.php new file mode 100644 index 00000000..147efdbd --- /dev/null +++ b/database/migrations/2022_09_16_084111_create_practitioner_roles_table.php @@ -0,0 +1,44 @@ +id(); + $table->foreignId('practitioner_id')->index(); + $table->foreignId('organization_id')->index(); + $table->foreignId('speciality_id')->nullable()->index(); + $table->foreignId('identifier_id')->nullable()->index(); + $table->dateTime('period_start')->nullable(); + $table->dateTime('period_end')->nullable(); + $table->boolean('active')->default(true); + + $table->timestamps(); + $table->softDeletes(); + + $table->foreignId('created_by')->nullable()->index(); + $table->foreignId('updated_by')->nullable()->index(); + $table->foreignId('deleted_by')->nullable()->index(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('practitioner_roles'); + } +}; diff --git a/database/seeders/OrganizationSeeder.php b/database/seeders/OrganizationSeeder.php new file mode 100644 index 00000000..1dcaff49 --- /dev/null +++ b/database/seeders/OrganizationSeeder.php @@ -0,0 +1,65 @@ +json()['organizations'] as $organization) { + $newOrganization = Organization::updateOrCreate([ + 'code' => 'ORG000'.$organization['code'], + ],[ + 'code' => 'ORG000'.$organization['code'], + 'name' => $organization['name'], + 'type' => 'hospital', + ]); + + $newAddress = $newOrganization->addresses()->updateOrCreate([ + 'id' => $newOrganization->main_address_id + ],[ + 'use' => 'both', + 'type' => 'physical', + 'text' => $organization['address'], + 'lat' => $organization['lat'], + 'lng' => $organization['lng'], + ]); + + $newOrganization->main_address_id = $newAddress->id; + $newOrganization->save(); + + $newOrganization->metas()->updateOrCreate([ + 'type' => 'KodeRS', + ], [ + 'system' => 'primaya-his', + 'type' => 'KodeRS', + 'value' => $organization['code'] + ]); + $newOrganization->metas()->updateOrCreate([ + 'type' => 'phone', + ],[ + 'system' => 'default', + 'type' => 'phone', + 'value' => $organization['phone'] + ]); + $newOrganization->metas()->updateOrCreate([ + 'type' => 'timezone', + ],['system' => 'default', + 'type' => 'timezone', + 'value' => $organization['timezone'] + ]); + } + } +} diff --git a/database/seeders/PractitionerSeeder.php b/database/seeders/PractitionerSeeder.php new file mode 100644 index 00000000..00552894 --- /dev/null +++ b/database/seeders/PractitionerSeeder.php @@ -0,0 +1,141 @@ +get(); + $specialities = Speciality::pluck('id', 'name')->toArray(); + + foreach ($organizations as $organization) { + $response = Http::get('http://localhost:8001/temp/practitioners?code='.$organization->meta->KodeRS); + + foreach ($response->json()['practitioners'] as $practitioner) { + $practitioner = json_decode(json_encode($practitioner)); + if (!empty($practitioner->meta->NIK)) { + $newPerson = Person::updateOrCreate([ + 'nik' => $practitioner->meta->NIK + ], [ + 'nik' => $practitioner->meta->NIK, + 'name' => $practitioner->doctor->name, + 'gender' => $practitioner->doctor->gender, + 'birth_date' => !empty($practitioner->meta->TanggalLahir) && $practitioner->meta->TanggalLahir != '0000-00-00' ? $practitioner->meta->TanggalLahir : null, + ]); + } else { + $newPerson = Person::create([ + 'name' => $practitioner->doctor->name, + 'gender' => $practitioner->doctor->gender, + 'birth_date' => !empty($practitioner->meta->TanggalLahir) && $practitioner->meta->TanggalLahir != '0000-00-00' ? $practitioner->meta->TanggalLahir : null, + ]); + } + $newPerson->addresses()->create([ + 'use' => 'both', + 'type' => 'physical', + 'text' => $practitioner->doctor->address, + ]); + + $newPractitioner = Practitioner::updateOrCreate([ + 'person_id' => $newPerson->id + ],[ + 'person_id' => $newPerson->id + ]); + $newPractitioner->metas()->create([ + 'system' => 'default', + 'type' => 'medical_treatment', + 'value' => $practitioner->doctor->meta->MedicalTreatment ?? null, + ]); + $newPractitioner->metas()->create([ + 'system' => 'default', + 'type' => 'education', + 'value' => $practitioner->doctor->meta->Education ?? null, + ]); + $newPractitioner->metas()->create([ + 'system' => 'default', + 'type' => 'award', + 'value' => $practitioner->doctor->meta->Award ?? null, + ]); + $newPractitioner->metas()->create([ + 'system' => 'default', + 'type' => 'work_experience', + 'value' => $practitioner->doctor->meta->WorkExperience ?? null, + ]); + $newPractitioner->metas()->create([ + 'system' => 'primaya-his', + 'type' => 'alias', + 'value' => $practitioner->meta->Sapaan ?? null, + ]); + $newPractitioner->metas()->create([ + 'system' => 'primaya-his', + 'type' => 'Keilmuan', + 'value' => $practitioner->meta->Keilmuan ?? null, + ]); + $newPractitioner->metas()->create([ + 'system' => 'primaya-his', + 'type' => 'description', + 'value' => $practitioner->doctor->description ?? null, + ]); + + + + + $newPractitionerRole = PractitionerRole::create([ + 'practitioner_id' => $newPractitioner->id, + 'organization_id' => $organization->id, + 'speciality_id' => $practitioner->speciality ? ($specialities[$practitioner->speciality->name] ?? null) : null, + 'active' => 1, + ]); + + if (empty($newPractitionerRole->speciality_id)) { + $newPractitionerRole->metas()->updateOrCreate([ + 'type' => 'speciality_code', + ],[ + 'system' => 'default', + 'type' => 'speciality_code', + 'value' => $practitioner->speciality->code ?? null, + ]); + + $newPractitionerRole->metas()->updateOrCreate([ + 'type' => 'speciality', + ],[ + 'system' => 'default', + 'type' => 'speciality', + 'value' => $practitioner->speciality->name ?? null, + ]); + + $newPractitionerRole->metas()->updateOrCreate([ + 'type' => 'speciality_image', + ],[ + 'system' => 'default', + 'type' => 'speciality_image', + 'value' => $practitioner->speciality->name ?? null, + ]); + } + + $newPractitionerRole->metas()->updateOrCreate([ + 'type' => 'primaya-his', + 'type' => 'DokterID', + ],[ + 'system' => 'primaya-his', + 'type' => 'DokterID', + 'value' => $practitioner->meta->DokterID ?? null, + ]); + } + } + } +} diff --git a/frontend/dashboard/src/components/hook-form/RHFAutocomplete.tsx b/frontend/dashboard/src/components/hook-form/RHFAutocomplete.tsx new file mode 100644 index 00000000..3872aec5 --- /dev/null +++ b/frontend/dashboard/src/components/hook-form/RHFAutocomplete.tsx @@ -0,0 +1,41 @@ +import { Autocomplete, TextField, TextFieldProps } from '@mui/material'; +import { useState } from 'react'; +import { Controller, useFormContext } from 'react-hook-form'; + +interface IProps { + options: any[]; + name: string; + label?: string; +} + +export default function RHFAutocomplete({ name, options, label, ...other }: IProps & TextFieldProps) { + const { control } = useFormContext(); + console.log(control) + + const [value, setValue] = useState(options[0]); + const [inputValue, setInputValue] = useState(''); + + return ( + ( + { + // console.log('fuck', newValue) + setValue(newValue.id); + }} + inputValue={inputValue} + onInputChange={(event, newInputValue) => { + setInputValue(newInputValue); + }} + renderInput={(params) => } + {...other} + /> + )} + /> + ); +} \ No newline at end of file diff --git a/frontend/dashboard/src/pages/Corporates/Form.tsx b/frontend/dashboard/src/pages/Corporates/Form.tsx index fb275df6..f1dc06d9 100644 --- a/frontend/dashboard/src/pages/Corporates/Form.tsx +++ b/frontend/dashboard/src/pages/Corporates/Form.tsx @@ -41,6 +41,7 @@ import { import { Corporate } from '../../@types/corporates'; import axios from '../../utils/axios'; import { fCurrency } from '../../utils/formatNumber'; +import RHFAutocomplete from '../../components/hook-form/RHFAutocomplete'; const LabelStyle = styled(Typography)(({ theme }) => ({ ...theme.typography.subtitle2, @@ -256,6 +257,22 @@ export default function CorporateForm({ isEdit, currentCorporate }: Props) { "label" : "Sub Corporate" }, ] + + const options = [ + { + "label" : "Something", + "id" : "Something" + }, + { + "label" : "Syalalalal", + "id" : "Syalalalal" + }, + { + "label" : "Lilili", + "id" : "Lilili" + }, + ] + const handleTypeChange = (event: SelectChangeEvent) => { setValue('type', event.target.value) } @@ -269,6 +286,10 @@ export default function CorporateForm({ isEdit, currentCorporate }: Props) { Corporate Profile + + {values.name} + +