diff --git a/Modules/Internal/Transformers/DoctorResource.php b/Modules/Internal/Transformers/DoctorResource.php index 5889b3a5..b49477d1 100644 --- a/Modules/Internal/Transformers/DoctorResource.php +++ b/Modules/Internal/Transformers/DoctorResource.php @@ -61,6 +61,8 @@ class DoctorResource extends JsonResource 'speciality_id' => $item->speciality->id, ]; }), + 'period_start' => $items->pluck('period_start')->first(), + 'period_end' => $items->pluck('period_end')->first(), ]; }); diff --git a/Modules/Linksehat/Http/Controllers/Api/HomeController.php b/Modules/Linksehat/Http/Controllers/Api/HomeController.php new file mode 100644 index 00000000..a405e697 --- /dev/null +++ b/Modules/Linksehat/Http/Controllers/Api/HomeController.php @@ -0,0 +1,75 @@ +where('nId', $request->id) + ->first(); + return Helper::responseJson([ + 'home' => HomeResource::make($user, $request), + ]); + } + + public function listHospital(Request $request){ + // Hospital List + $hospitalList = []; + $hospitals = Organization::where([ + 'type' => 'hospital', + 'status' => 'active', + ]) + ->with('currentAddress') + ->get()->toArray(); + foreach($hospitals as $hospital){ + $lat = 0; + $lang = 0; + if ($hospital['current_address']['lat']){ + $lat = $hospital['current_address']['lat']; + } + if ($hospital['current_address']['lng']){ + $lang = $hospital['current_address']['lng']; + } + + $address = ''; + if ($hospital['current_address']['text']){ + $address = $hospital['current_address']['text']; + } + + $radius = 0; + if ($lat && $lang && $request->longitude && $request->latitude){ + $radius = round(Helper::calculateDistance($lat, $lang, $request->latitude, $request->longitude), 2); + } + + $data = [ + 'name' => $hospital['name'], + 'radius' => $radius, + 'image' => '', + 'address' => $address + ]; + + array_push($hospitalList, $data); + } + usort($hospitalList, function($a, $b) { + return $a['radius'] <=> $b['radius']; + }); + return Helper::responseJson([ + 'hospital' => $hospitalList + ]); + } +} diff --git a/Modules/Linksehat/Http/Controllers/Api/LinkingController.php b/Modules/Linksehat/Http/Controllers/Api/LinkingController.php index 899dbfe2..331eeb68 100644 --- a/Modules/Linksehat/Http/Controllers/Api/LinkingController.php +++ b/Modules/Linksehat/Http/Controllers/Api/LinkingController.php @@ -5,6 +5,8 @@ namespace Modules\Linksehat\Http\Controllers\Api; use App\Helpers\Helper; use App\Http\Controllers\Controller; use App\Models\Person; +use App\Models\RequestLogBenefit; +use App\Models\RequestLog; use App\Models\Corporate; use App\Models\Member; use App\Models\OLDLMS\User; @@ -135,4 +137,39 @@ class LinkingController extends Controller $message = $member->currentPolicy->corporate->welcome_message; return Helper::responseJson(data: MemberResource::make($member), message: $message); } + + public function card_detail($member_id, $id){ + $member = Member::where('member_id', $member_id)->get()->toArray(); + $requestLogBenefits = RequestLogBenefit::where('request_log_id', $id)->with('benefit')->get()->toArray(); + $requestLog = RequestLog::find($id)->first(); + $benefitItem = []; + $dataRequestLog = [ + 'code' => $requestLog['code'], + 'diagnosis' => Helper::diagnosisName($requestLog['diagnosis']), + 'service_type' => Helper::serviceName($requestLog['service_code']), + + ]; + foreach($requestLogBenefits as $requestLogBenefit) { + $data = [ + 'benefit_item' => $requestLogBenefit['benefit']['description'], + 'amount_incurred' => $requestLogBenefit['amount_incurred'], + 'amount_approved' => $requestLogBenefit['amount_approved'], + 'amount_not_approved' => $requestLogBenefit['amount_not_approved'], + 'excess_paid' => $requestLogBenefit['excess_paid'], + ]; + + $benefitItem[] = $data; + }; + $dataRequestLog['benefit_item'] = $benefitItem; + + // dd($dataRequestLog); + // $data = [ + // 'id' => $requestLog['id'], + // 'code' => $requestLog['code'], + // 'submission_date' => Carbon::parse($requestLog['submission_date'])->format('d M Y H:i:s'), + // 'provider_name' => $requestLog['organization']['name'], + // 'service' => Helper::serviceName($requestLog['service_code']) + // ]; + return Helper::responseJson(data:$dataRequestLog); + } } diff --git a/Modules/Linksehat/Routes/api.php b/Modules/Linksehat/Routes/api.php index 07fe7532..8dfff2f5 100644 --- a/Modules/Linksehat/Routes/api.php +++ b/Modules/Linksehat/Routes/api.php @@ -12,6 +12,7 @@ use Modules\Linksehat\Http\Controllers\Api\ProfileController; use Modules\Linksehat\Http\Controllers\Api\SearchController; use Modules\Linksehat\Http\Controllers\Api\SpecialityController; use Modules\Linksehat\Http\Controllers\Api\LinkingController; +use Modules\Linksehat\Http\Controllers\Api\HomeController; /* |-------------------------------------------------------------------------- @@ -63,6 +64,11 @@ Route::prefix('linksehat')->group(function () { Route::get('doctors/{id}', 'show')->name('doctors.show'); }); + Route::controller(HomeController::class)->group(function () { + Route::get('home', 'index')->name('homes.index'); + Route::get('home/hospital', 'listHospital')->name('homes.listHospital'); + }); + Route::middleware('auth:sanctum')->group(function () { Route::get('profile/{id}', [ProfileController::class, 'index'])->name('profile'); @@ -81,6 +87,7 @@ Route::prefix('linksehat')->group(function () { Route::post('manual-linking', [LinkingController::class, 'linkingValidate']); Route::get('card/{member_id}', [LinkingController::class, 'card']); + Route::get('card/{member_id}/{log_id}', [LinkingController::class, 'card_detail']); }); }); diff --git a/Modules/Linksehat/Transformers/Home/HomeResource.php b/Modules/Linksehat/Transformers/Home/HomeResource.php new file mode 100644 index 00000000..834a7fe9 --- /dev/null +++ b/Modules/Linksehat/Transformers/Home/HomeResource.php @@ -0,0 +1,297 @@ +request = $request; + parent::__construct($resource); + } + + public function toArray($request) + { + $memberProfile = User::with('detail')->where('nIDUser', $this->nID)->get()->toArray(); + $dataMemberProfile = []; + + $userInsurance = UserInsurance::where('nIDUser', $this->nID)->get()->first(); + $memberId = null; + $linking = false; + + $jam = date('G'); // Ambil jam dalam format 24 jam + + if ($jam < 12) { + $wellcome = "Good Morning!"; + } elseif ($jam < 18) { + $wellcome = "Good Afternoon!"; + } else { + $wellcome = "Good Evening!"; + } + + if($userInsurance){ + $memberId = $userInsurance->sNoPolis; + $linking = true; + } else { + $member = Member::where('email', $this->sEmail)->get()->first(); + $person = Person::where('phone', $this->sPhone)->get()->first(); + if ($member || $person){ // Autolinking + $corporateEmployee = CorporateEmployee::where('member_id', $member->id)->get()->first(); // cek corporate id empolyee/member + if ($corporateEmployee){ + $corporate = Corporate::findOrFail($corporateEmployee->corporate_id)->automatic_linking; // cek autocomplete + if ($corporate){ + if($member) { + // Insert into database linksehat + $insurance = UserInsurance::updateOrCreate( + [ + 'nIDUser' => $this->nID, + ], + [ + 'nIDUser' => $this->nID, + 'nIDInsurance' => $_ENV['LINKSEHAT_ASO_INSURANCE_ID'], + 'sNoPolis' => $member->member_id, + 'sNamaPeserta' => $member->fullName, + 'sKartuPeserta' => '', + 'sLayanan' => 'RJ,TC', + 'dStartDate' => $member->members_effective_date, + 'dExpireDate' => $member->members_expire_date, + 'dTanggalLahir' => $member->birth_date, + 'nNoKTP' => $member->nric != '' ? $member->nric : 0 , + 'sIsConfrimed' => 1, + 'sStatus' => 1, + ]); + $message = $member->currentPolicy->corporate->welcome_message; + $linking = true; + + $memberId = $member->member_id; + } + } + } + } + }; + + if (count($memberProfile) > 0){ + + $urlAvatarDefault = $this->detail->nIDJenisKelamin == 1 ? 'https://linksehat.dev/assets/img/users/male-avatar.png' : 'https://linksehat.dev/assets/img/users/female-avatar.png'; + $avatarMember = $this->detail->sImage ?? $urlAvatarDefault; + $relationship = DB::connection('oldlms')->table('tm_hubungan_keluarga')->where('nID', $this->nIDHubunganKeluarga)->first('sHubunganKeluarga'); + + $dataUser = [ + 'id' => $this->nID, + 'name' => $this->sFirstName . ' ' . $this->sLastName, + 'relationship' => $relationship ? $relationship->sHubunganKeluarga : '-', + 'avatar' => $avatarMember + ]; + + array_push($dataMemberProfile, $dataUser); + + foreach($memberProfile as $m){ + $urlAvatarDefault = $m['detail']['nIDJenisKelamin'] == 1 ? 'https://linksehat.dev/assets/img/users/male-avatar.png' : 'https://linksehat.dev/assets/img/users/female-avatar.png'; + $avatarMember = $m['detail']['sImage'] ?? $urlAvatarDefault; + $relationship = DB::connection('oldlms')->table('tm_hubungan_keluarga')->where('nID', $m['nIDHubunganKeluarga'])->first('sHubunganKeluarga'); + + $data = [ + 'id' => $m['nID'], + 'name' => $m['full_name'], + 'relationship' => $relationship ? $relationship->sHubunganKeluarga : '-', + 'avatar' => $avatarMember, + ]; + + array_push( $dataMemberProfile, $data); + } + + + } else { + $nID = $this->nIDUser ? $this->nIDUser : $this->nID; + if ($nID){ + $memberProfile = User::with('detail')->where('nIDUser', $nID)->get()->toArray(); + + $dataMember = User::with('detail')->where('nID', $nID)->get()->first(); + + if ($this->detail){ + $urlAvatarDefault = $this->detail->nIDJenisKelamin == 1 ? 'https://linksehat.dev/assets/img/users/male-avatar.png' : 'https://linksehat.dev/assets/img/users/female-avatar.png'; + } else { + $urlAvatarDefault = 'https://linksehat.dev/assets/img/users/male-avatar.png'; + } + $avatar = $this->detail->sImage ?? $urlAvatarDefault; + + $avatarMember = $dataMember->detail->sImage ?? $urlAvatarDefault; + $relationship = DB::connection('oldlms')->table('tm_hubungan_keluarga')->where('nID', $this->nIDHubunganKeluarga)->first('sHubunganKeluarga'); + + $dataUser = [ + 'id' => $dataMember->nID, + 'name' => $dataMember->sFirstName . ' ' . $dataMember->sLastName, + 'relationship' => 'Me', + 'avatar' => $avatarMember + ]; + array_push($dataMemberProfile, $dataUser); + + if (count($memberProfile) > 0){ + foreach($memberProfile as $m){ + $urlAvatarDefault = $m['detail']['nIDJenisKelamin'] == 1 ? 'https://linksehat.dev/assets/img/users/male-avatar.png' : 'https://linksehat.dev/assets/img/users/female-avatar.png'; + $avatarMember = $m['detail']['sImage'] ?? $urlAvatarDefault; + $relationship = DB::connection('oldlms')->table('tm_hubungan_keluarga')->where('nID', $m['nIDHubunganKeluarga'])->first('sHubunganKeluarga'); + + $data = [ + 'id' => $m['nID'], + 'name' => $m['full_name'], + 'relationship' => $relationship->sHubunganKeluarga, + 'avatar' => $avatarMember, + ]; + + array_push( $dataMemberProfile, $data); + } + } + } else { + + } + } + + // Principal + if ($this->detail){ + $urlAvatarDefault = $this->detail->nIDJenisKelamin == 1 ? 'https://linksehat.dev/assets/img/users/male-avatar.png' : 'https://linksehat.dev/assets/img/users/female-avatar.png'; + } else { + $urlAvatarDefault = 'https://linksehat.dev/assets/img/users/male-avatar.png'; + } + $avatar = $this->detail->sImage ?? $urlAvatarDefault; + + // Doctor livechat + $doctors = Practitioner::with('person', 'practitionerRoles.organization', 'practitionerRoles.speciality') + ->whereHas('person', function ($query) { + $query->where('isOnline', 1); // hanya online + }) + ->get() + ->toArray(); + $doctorsLivechat = []; + foreach($doctors as $doctor){ + $specialist = 'Umum'; + $year = 0; + $price = 0; + if (!empty($doctor['person']['start_date_work'])) { + $starExperience = Carbon::parse($doctor['person']['start_date_work'])->format('Y-m-d'); + $experience = Carbon::createFromFormat('Y-m-d', $starExperience); + $year = $experience->diffInYears(Carbon::now()); + } + if ($doctor['practitioner_roles']) { + if ($doctor['practitioner_roles'][0]['speciality']){ + $specialist = $doctor['practitioner_roles'][0]['speciality']['name']; + } + if ($doctor['practitioner_roles'][0]['price']){ + $price = $doctor['practitioner_roles'][0]['price']; + } + } + $data = [ + 'full_name' => $doctor['person']['name'], + 'specialist' => $specialist, + 'experience' => $year, + 'review' => $doctor['person']['review'], + 'price' => $price, + 'price_real' => $price + ]; + array_push($doctorsLivechat, $data); + } + + // Hospital List + $hospitalList = []; + + $hospitals = Organization::where([ + 'type' => 'hospital', + 'status' => 'active', + ]) + ->with('currentAddress') + ->get()->toArray(); + foreach($hospitals as $hospital){ + $lat = 0; + $lang = 0; + if ($hospital['current_address']['lat']){ + $lat = $hospital['current_address']['lat']; + } + if ($hospital['current_address']['lng']){ + $lang = $hospital['current_address']['lng']; + } + + $address = ''; + if ($hospital['current_address']['text']){ + $address = $hospital['current_address']['text']; + } + + $radius = 0; + if ($lat && $lang && $request->longitude && $request->latitude){ + $radius = round(Helper::calculateDistance($lat, $lang, $request->latitude, $request->longitude), 2); + } + + $data = [ + 'name' => $hospital['name'], + 'radius' => $radius, + 'image' => '', + 'address' => $address + ]; + + array_push($hospitalList, $data); + } + + + usort($hospitalList, function($a, $b) { + return $a['radius'] <=> $b['radius']; + }); + + $hospitalList = array_slice($hospitalList, 0, 5); + + return [ + 'id' => $this->nID, + 'message' => $wellcome, + 'full_name' => $this->sFirstName . ' '. $this->sLastName, + 'avatar' => $avatar, + // 'member_type' => $this->nIDUser ? 'Dependent' : 'Principal', + // 'member_profile' => $dataMemberProfile, + 'member_id' => $memberId, + 'linking' => $linking, + 'doctors_livechat' => [ + $doctorsLivechat + ], + 'hospital' => $hospitalList + + + // [ + // [ + // 'name' => 'PRIMAYA HOSPITAL NORTH BEKASI', + // 'image' => '', + // 'range' => 6 + // ], + // [ + // 'name' => 'PRIMAYA HOSPITAL TANGERANG', + // 'image' => '', + // 'range' => 10 + // ], + // ] + ]; + } +} diff --git a/app/Helpers/Helper.php b/app/Helpers/Helper.php index 19088571..12892c3d 100644 --- a/app/Helpers/Helper.php +++ b/app/Helpers/Helper.php @@ -11,6 +11,7 @@ use Illuminate\Support\Facades\DB; use App\Models\Member; use App\Models\User; use App\Models\Service; +use App\Models\Icd; use DateTime; class Helper @@ -117,6 +118,16 @@ class Helper } } + public static function diagnosisName($code) + { + $icd = Icd::where('code', $code)->get()->first(); + if ($icd){ + return $icd->name; + } else { + return '-'; + } + } + public static function paginateResources($resource) { return [ @@ -443,4 +454,23 @@ class Helper } } + public static function calculateDistance($latitudeFrom, $longitudeFrom, $latitudeTo, $longitudeTo, $earthRadius = 6371) { + // Convert degrees to radians + $latFrom = deg2rad($latitudeFrom); + $lonFrom = deg2rad($longitudeFrom); + $latTo = deg2rad($latitudeTo); + $lonTo = deg2rad($longitudeTo); + + // Calculate the change in coordinates + $deltaLat = $latTo - $latFrom; + $deltaLon = $lonTo - $lonFrom; + + // Apply Haversine formula + $a = sin($deltaLat / 2) * sin($deltaLat / 2) + cos($latFrom) * cos($latTo) * sin($deltaLon / 2) * sin($deltaLon / 2); + $c = 2 * atan2(sqrt($a), sqrt(1 - $a)); + $distance = $earthRadius * $c; + + return $distance; + } + } diff --git a/app/Http/Resources/OLDLMS/MemberResource.php b/app/Http/Resources/OLDLMS/MemberResource.php index 610ce9cf..14d5f04d 100644 --- a/app/Http/Resources/OLDLMS/MemberResource.php +++ b/app/Http/Resources/OLDLMS/MemberResource.php @@ -4,6 +4,12 @@ namespace App\Http\Resources\OLDLMS; use App\Services\ClaimService; use App\Models\Corporate; +use App\Models\CorporateBenefit; +use App\Models\RequestLog; +use App\Models\RequestLogBenefit; +use App\Models\MemberPlan; +use App\Helpers\Helper; +use Carbon\Carbon; use Illuminate\Http\Resources\Json\JsonResource; @@ -21,7 +27,46 @@ class MemberResource extends JsonResource $currentMemberPlan = $this->memberPlans?->first(); $limitTelecon = $currentMemberPlan->plan->limit_telecon ?? null; $limitTelecon = $this->totalUsage >= 6 ? null : $limitTelecon; + $services = MemberPlan::where('member_id', $this->id)->with('plan')->get()->toArray(); + $dataServices = []; + if ($services) { + foreach($services as $service) { + $serviceName = Helper::serviceName($service['plan']['service_code']); + $benefits = CorporateBenefit::where('plan_id', $service['plan_id'])->with('benefit')->get()->toArray(); + $dataBenefit = []; + foreach($benefits as $benefit){ + $dataBenefitItem = $benefit['benefit']['description']; + array_push($dataBenefit, $dataBenefitItem); + } + $data = [ + 'name' => $serviceName, + 'benefit' => $dataBenefit + ]; + + array_push($dataServices, $data); + } + } + // LOG + $dataLog = []; + $requestLogs = RequestLog::where('member_id', $this->id)->with('organization')->get()->toArray(); + $totalBenefit = 0; + if ($requestLogs) { + foreach($requestLogs as $requestLog) { + $requestLogBenefit = RequestLogBenefit::where('request_log_id', $requestLog['id'])->sum('amount_approved'); + $totalBenefit += $requestLogBenefit; + $data = [ + 'id' => $requestLog['id'], + 'code' => $requestLog['code'], + 'submission_date' => Carbon::parse($requestLog['submission_date'])->format('d M Y H:i:s'), + 'provider_name' => $requestLog['organization']['name'], + 'service' => Helper::serviceName($requestLog['service_code']) + ]; + + array_push($dataLog, $data); + } + } + $data = [ 'id' => $this->id, 'member_name' => $this->full_name, @@ -33,6 +78,9 @@ class MemberResource extends JsonResource 'start_date' => $this->members_effective_date, 'corporate_logo' => $_ENV['LMS_APP_STORAGE'] . $this->corporateLogo, 'valid_until' => $this->members_expire_date, + 'total_benefit_usage' => $totalBenefit, + 'service' => $dataServices, + 'histor_log' => $dataLog ]; return $data; diff --git a/app/Models/Person.php b/app/Models/Person.php index 4c61f862..e647f2cd 100644 --- a/app/Models/Person.php +++ b/app/Models/Person.php @@ -23,6 +23,8 @@ class Person extends Model 'birth_date', 'birth_place', 'language', + 'isOnline', + 'review', 'race', 'citizenship', 'current_employment', diff --git a/database/migrations/2024_02_12_133447_add_coloumn_to_benefits_table.php b/database/migrations/2024_02_12_133447_add_coloumn_to_benefits_table.php new file mode 100644 index 00000000..7a031803 --- /dev/null +++ b/database/migrations/2024_02_12_133447_add_coloumn_to_benefits_table.php @@ -0,0 +1,32 @@ +integer('type')->nullable()->default(1)->comment('1=Non COB, 2=Cob'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('benefits', function (Blueprint $table) { + $table->dropColumn('type'); + }); + } +}; diff --git a/database/migrations/2024_04_16_134401_add_column_to_persons_table.php b/database/migrations/2024_04_16_134401_add_column_to_persons_table.php new file mode 100644 index 00000000..06adb0d3 --- /dev/null +++ b/database/migrations/2024_04_16_134401_add_column_to_persons_table.php @@ -0,0 +1,39 @@ +dateTime('start_date_work')->nullable()->after('birth_place'); + $table->integer('isOnline') + ->default(0) + ->comment('0=offline, 1=online') + ->after('start_date_work'); + $table->double('review')->after('isOnline'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('persons', function (Blueprint $table) { + $table->dropColumn('start_date_work'); + $table->dropColumn('isOnline'); + $table->dropColumn('review'); + }); + } +}; diff --git a/database/migrations/2024_04_16_170457_add_column_to_practitioner_roles_table.php b/database/migrations/2024_04_16_170457_add_column_to_practitioner_roles_table.php new file mode 100644 index 00000000..46ce4053 --- /dev/null +++ b/database/migrations/2024_04_16_170457_add_column_to_practitioner_roles_table.php @@ -0,0 +1,32 @@ +integer('price')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('practitioner_roles', function (Blueprint $table) { + $table->dropColumn('price'); + }); + } +};