diff --git a/Modules/Linksehat/Http/Controllers/Api/LinkingController.php b/Modules/Linksehat/Http/Controllers/Api/LinkingController.php index cf3e1b7d..899dbfe2 100644 --- a/Modules/Linksehat/Http/Controllers/Api/LinkingController.php +++ b/Modules/Linksehat/Http/Controllers/Api/LinkingController.php @@ -5,7 +5,10 @@ namespace Modules\Linksehat\Http\Controllers\Api; use App\Helpers\Helper; use App\Http\Controllers\Controller; use App\Models\Person; +use App\Models\Corporate; +use App\Models\Member; use App\Models\OLDLMS\User; +use App\Models\OLDLMS\UserInsurance; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Hash; @@ -13,7 +16,10 @@ use Laravel\Socialite\Facades\Socialite; use Modules\Linksehat\Transformers\User\UserProfileResource; use Symfony\Component\HttpFoundation\Response; use Illuminate\Support\Facades\Http; -use Validator; +use Illuminate\Support\Facades\Validator; +use App\Http\Resources\OLDLMS\MemberResource; +use App\Rules\NikRule; + class LinkingController extends Controller { @@ -23,17 +29,110 @@ class LinkingController extends Controller $this->url = $_ENV['LMS_APP_URL']; } - public function manualLinking(Request $request){ - $request->validate([ + public function linkingValidate(Request $request) + { + $validator = Validator::make($request->all(), [ + 'corporate_id' => 'required', 'user_id' => 'required', - 'company_id' => 'required', ]); - $corporate = Corporate::find($request->company_id)->where('active', 1); - if (!$corporate){ - return response(['message' => 'Corporate Not Found or non active'], 403); + // $request->validate($validationRules); + if ($validator->fails()) { + return response()->json(['errors' => $validator->errors()], 422); } - + $corporate = Corporate::findOrFail($request->corporate_id); + // Make Validation from Linking Rules + $linkingRulesArr = $corporate->linking_rules->toArray(); + + $validationRules = []; + foreach ($linkingRulesArr as $field) { + $rules = ['required']; // Default is required if in the linking_rules + if ($field == 'email') { + $rules[] = 'email'; + } + + if ($field == 'nric') { + $rules[] = new NikRule; + } + + $validationRules[$field] = $rules; + } + + $validator = Validator::make($request->all(),$validationRules); + + // $request->validate($validationRules); + if ($validator->fails()) { + return Helper::responseJson(data: [], message: 'Member Tidak ditemukan', statusCode: 422, status: 'error'); + } + + $member = Member::query() + ->when(in_array('nric', $linkingRulesArr), function($q) use ($request) { + $q->where('nric', $request->nric); + }) + ->when(in_array('member_id', $linkingRulesArr), function($q) use ($request) { + $q->where('member_id', $request->member_id); + }) + ->when(in_array('name', $linkingRulesArr), function($q) use ($request) { + $q->where('name', $request->name); + }) + ->when(in_array('dob', $linkingRulesArr), function($q) use ($request) { + $q->where('birth_date', $request->dob); + }) + ->when(in_array('phone', $linkingRulesArr), function($q) use ($request) { + $q->whereHas('person', function ($person) use ($request) { + $person->where('phone', $request->phone); + }); + }) + ->when(in_array('email', $linkingRulesArr), function($q) use ($request) { + $q->where('email', $request->email); + }) + ->when(in_array('nik', $linkingRulesArr), function($q) use ($request) { + $q->whereHas('employeds', function ($employed) use ($request) { + $employed->where('corporate_id', $request->corporate_id) + ->where('nik', $request->nik); + }); + }) + + ->with([ + 'memberPlans' => function ($memberPlan) { + $memberPlan->latest(); + }, + + ]) + + ->first(); + + if ($member) { + // Insert into database linksehat + $insurance = UserInsurance::updateOrCreate( + [ + 'nIDUser' => $request->user_id, + ], + [ + 'nIDUser' => $request->user_id, + '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; + return Helper::responseJson(data: MemberResource::make($member), message: $message); + } + + return Helper::responseJson(data: [], message: 'Member Tidak ditemukan', statusCode: 404, status: 'error'); + } + + public function card($member_id){ + $member = Member::where('member_id', $member_id)->get()->first(); + $message = $member->currentPolicy->corporate->welcome_message; + return Helper::responseJson(data: MemberResource::make($member), message: $message); } } diff --git a/Modules/Linksehat/Routes/api.php b/Modules/Linksehat/Routes/api.php index 763ecab6..2ac3adfc 100644 --- a/Modules/Linksehat/Routes/api.php +++ b/Modules/Linksehat/Routes/api.php @@ -11,6 +11,7 @@ use Modules\Linksehat\Http\Controllers\Api\PersonController; 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; /* |-------------------------------------------------------------------------- @@ -75,5 +76,9 @@ Route::prefix('linksehat')->group(function () { Route::get('autocomplete/relationship', [AutocompleteController::class, 'relationship']); Route::get('autocomplete/corporate', [AutocompleteController::class, 'corporate']); + Route::post('manual-linking', [LinkingController::class, 'linkingValidate']); + + Route::get('card/{member_id}', [LinkingController::class, 'card']); + }); }); diff --git a/Modules/Linksehat/Transformers/User/ShowProfileResource.php b/Modules/Linksehat/Transformers/User/ShowProfileResource.php index 1d0b5433..a6d3e0f7 100644 --- a/Modules/Linksehat/Transformers/User/ShowProfileResource.php +++ b/Modules/Linksehat/Transformers/User/ShowProfileResource.php @@ -5,6 +5,7 @@ namespace Modules\Linksehat\Transformers\User; use Illuminate\Http\Resources\Json\JsonResource; use App\Models\OLDLMS\User; use App\Models\OLDLMS\UserDetail; +use App\Models\OLDLMS\UserInsurance; use DB; @@ -53,6 +54,11 @@ class ShowProfileResource extends JsonResource $relationship = DB::connection('oldlms')->table('tm_hubungan_keluarga')->where('nID', $this->nIDHubunganKeluarga)->first('sHubunganKeluarga'); // dd( $this->detail->nIDGolonganDarah); + $userInsurance = UserInsurance::where('nIDUser', $this->nID)->get()->first(); + $memberId = Null; + if($userInsurance){ + $memberId = $userInsurance->sNoPolis; + } return [ 'id' => $this->nID, 'first_name' => $this->sFirstName, @@ -67,6 +73,7 @@ class ShowProfileResource extends JsonResource 'relationship' => $relationship ? $relationship->sHubunganKeluarga : '-', 'weight' => $this->detail->sWeight, 'height' => $this->detail->sHeight, + 'member_id' => $memberId, ]; } } diff --git a/Modules/Linksehat/Transformers/User/UserProfileResource.php b/Modules/Linksehat/Transformers/User/UserProfileResource.php index 3bc07332..69ab8693 100644 --- a/Modules/Linksehat/Transformers/User/UserProfileResource.php +++ b/Modules/Linksehat/Transformers/User/UserProfileResource.php @@ -5,6 +5,11 @@ namespace Modules\Linksehat\Transformers\User; use Illuminate\Http\Resources\Json\JsonResource; use App\Models\OLDLMS\User; use App\Models\OLDLMS\UserDetail; +use App\Models\OLDLMS\UserInsurance; +use App\Models\Member; +use App\Models\Person; +use App\Models\CorporateEmployee; +use App\Models\Corporate; use Illuminate\Support\Facades\Auth; use DB; @@ -26,14 +31,60 @@ class UserProfileResource extends JsonResource $memberProfile = User::with('detail')->where('nIDUser', $this->nID)->get()->toArray(); $dataMemberProfile = []; + $userInsurance = UserInsurance::where('nIDUser', $this->nID)->get()->first(); + $memberId = null; + $linking = false; + 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/male-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' => 'Me', + 'relationship' => $relationship ? $relationship->sHubunganKeluarga : '-', 'avatar' => $avatarMember ]; @@ -56,21 +107,28 @@ class UserProfileResource extends JsonResource } else { - $nID = (Auth::user()->nID); + $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(); - - $urlAvatarDefault = $dataMember->detail->nIDJenisKelamin == 1 ? 'https://linksehat.dev/assets/img/users/male-avatar.png' : 'https://linksehat.dev/assets/img/users/male-avatar.png'; + + if ($this->detail){ + $urlAvatarDefault = $this->detail->nIDJenisKelamin == 1 ? 'https://linksehat.dev/assets/img/users/male-avatar.png' : 'https://linksehat.dev/assets/img/users/male-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', + 'relationship' => $relationship ? $relationship->sHubunganKeluarga : '-', 'avatar' => $avatarMember ]; - array_push($dataMemberProfile, $dataUser); if (count($memberProfile) > 0){ @@ -84,17 +142,22 @@ class UserProfileResource extends JsonResource 'name' => $m['full_name'], 'relationship' => $relationship->sHubunganKeluarga, 'avatar' => $avatarMember, - ]; array_push( $dataMemberProfile, $data); } } + } else { + } } // Principal - $urlAvatarDefault = $this->detail->nIDJenisKelamin == 1 ? 'https://linksehat.dev/assets/img/users/male-avatar.png' : 'https://linksehat.dev/assets/img/users/male-avatar.png'; + if ($this->detail){ + $urlAvatarDefault = $this->detail->nIDJenisKelamin == 1 ? 'https://linksehat.dev/assets/img/users/male-avatar.png' : 'https://linksehat.dev/assets/img/users/male-avatar.png'; + } else { + $urlAvatarDefault = 'https://linksehat.dev/assets/img/users/male-avatar.png'; + } $avatar = $this->detail->sImage ?? $urlAvatarDefault; @@ -103,8 +166,9 @@ class UserProfileResource extends JsonResource 'full_name' => $this->sFirstName . ' '. $this->sLastName, 'avatar' => $avatar, 'member_type' => $this->nIDUser ? 'Dependent' : 'Principal', - 'member_profile' => $dataMemberProfile, - + 'member_profile' => $dataMemberProfile, + 'member_id' => $memberId, + 'linking' => $linking, ]; } } diff --git a/app/Http/Resources/OLDLMS/MemberResource.php b/app/Http/Resources/OLDLMS/MemberResource.php index f5ba6cf7..610ce9cf 100644 --- a/app/Http/Resources/OLDLMS/MemberResource.php +++ b/app/Http/Resources/OLDLMS/MemberResource.php @@ -3,8 +3,10 @@ namespace App\Http\Resources\OLDLMS; use App\Services\ClaimService; +use App\Models\Corporate; use Illuminate\Http\Resources\Json\JsonResource; + class MemberResource extends JsonResource { /** @@ -21,28 +23,17 @@ class MemberResource extends JsonResource $limitTelecon = $this->totalUsage >= 6 ? null : $limitTelecon; $data = [ + 'id' => $this->id, + 'member_name' => $this->full_name, 'member_id' => $this->member_id, - 'birth_date' => $this->birth_date, - 'email' => $this->email, - 'phone' => $this->person->phone ?? null, - 'full_name' => $this->full_name, - 'nric' => $this->nric, - 'plan' => $currentMemberPlan ? [ - 'code' => $currentMemberPlan->plan->code ?? null, - 'start' => $currentMemberPlan->start, - 'end' => $currentMemberPlan->end, - 'limit' => $this->currentPlan->limit_rules, - 'limit_consultation' => 6 - ] : null, - 'policy_code' => $this->currentPolicy?->code ?? null, - 'corporate' => [ - 'code' => $this->currentPolicy?->corporate->code ?? null, - 'name' => $this->currentPolicy?->corporate->name, - 'welcome_message' => $this->currentPolicy?->corporate->welcome_message, - 'help_text' => $this->currentPolicy?->corporate?->help_text, - 'avatar_url' => $this->currentpolicy?->corporate?->avatar_url - ], - 'limit_usage' => $this->totalUsage ?? null + 'policy_holder' => $this->currentPolicy->corporate->name, + 'policy_number' => $this->currentPolicy->code ?? null, + 'date_of_birth' => $this->birth_date, + 'gender' => $this->gender, + 'start_date' => $this->members_effective_date, + 'corporate_logo' => $_ENV['LMS_APP_STORAGE'] . $this->corporateLogo, + 'valid_until' => $this->members_expire_date, + ]; return $data; } diff --git a/app/Models/Member.php b/app/Models/Member.php index 17e0a85e..6e8cba42 100644 --- a/app/Models/Member.php +++ b/app/Models/Member.php @@ -252,5 +252,20 @@ class Member extends Model get: fn () => $this->person->gender ?? null ); } + + protected function corporateLogo(): Attribute + { + $avatar = File::where(['type' => 'avatar', 'fileable_id' => $this->currentPolicy->corporate->id])->orderBy('id', 'desc')->get()->first(); + if ($avatar){ + $path = $_ENV['LMS_APP_STORAGE'] . $avatar->path ? $avatar->path :''; + return Attribute::make( + get: fn () => $avatar ? $path : null + ); + } else { + return Attribute::make( + get: fn () => null + ); + } + } /* -------------------------------------------------------------------------- */ } diff --git a/app/Models/OLDLMS/UserInsurance.php b/app/Models/OLDLMS/UserInsurance.php index c935f123..3b49d6fd 100644 --- a/app/Models/OLDLMS/UserInsurance.php +++ b/app/Models/OLDLMS/UserInsurance.php @@ -26,5 +26,7 @@ class UserInsurance extends Model 'dTanggalLahir', 'nNoKTP', 'sNoPolis', + 'nIDInsurance', + 'sLayanan', ]; }