diff --git a/Modules/Internal/Http/Controllers/Api/CorporateMemberController.php b/Modules/Internal/Http/Controllers/Api/CorporateMemberController.php index 4f67e4ac..31ecf692 100755 --- a/Modules/Internal/Http/Controllers/Api/CorporateMemberController.php +++ b/Modules/Internal/Http/Controllers/Api/CorporateMemberController.php @@ -247,4 +247,108 @@ class CorporateMemberController extends Controller $pdf = PDF::loadView('pdf.guaranted_leter', compact(['member', 'dateOfAdmission'])); return $pdf->download('Guaranted Letter - '.$member->full_name.'.pdf'); } + + public function generateMemberList(Request $request, $corporate_id){ + // Mendapatkan data yang akan diekspor (misalnya, dari database) + $data = Member::with(['currentPlan', 'currentCorporate', 'division', 'employeds', 'currentPolicy']) + // ->filter($request->all()) + // ->where('corporate_id', $corporate_id) + ->whereHas('employeds', function ($employeds) use ($corporate_id) { + $employeds->where('corporate_id', $corporate_id); + })->get()->toArray(); + // Membuat penulis entitas Spout + $writer = WriterEntityFactory::createXLSXWriter(); + + // Membuka penulis untuk menulis ke file + $writer->openToFile(public_path('files/CorporateMembershipList.xlsx')); + // Menulis header kolom + $headers_map_to_table_fields = $this->memberEnrollmentService->listing_doc_headers; + $headerRow = WriterEntityFactory::createRowFromArray($headers_map_to_table_fields); + + $writer->addRow($headerRow); + // dd('test'); + // Menulis data + if (!empty($data)) { + foreach ($data as $item) { + $rowData = [ $item['record_type'], // Recode Type + $item['payor_id'], // Payor ID + $item['member_id'], // Member ID + $item['principal_id'], // Mapping ID + NULL, // Link Medis Member ID + $item['current_corporate']['code'] ?? null, // Corporate ID + $item['employeds'][0]['nik'] ?? null, // NIK + $item['division']['code'] ?? null, // Devision + $item['employeds'][0]['branch_code'] ?? null, // Branch Code + $item['bank_info'], // Bank Info + $item['language'], // Language + null, // Type of Work + $item['race'], // Race + $item['current_policy']['code'] ?? null, // Policy Number + $item['marital_status'], // Marital Status + $item['relation_with_principal'], // Relationship + str_replace('-', '',$item['members_effective_date']), // Member effective date + str_replace('-', '',$item['members_expire_date']), // Member expiry date + NULL, // Faskes FKTP (First Level Provider) or Individual preferred provider + NULL, // Faskes FKRTL (Next Level Provider) or Individual group preferred provider + $item['bpjs_class'], // The Right Classes Room of BPJS Participants + NULL, // Name of Faskes + NULL, // Rule BPJSK + NULL, // Internal Use + $item['full_name'], // Member Name + $item['address1'], // Address1 + $item['address2'], // Address2 + $item['address3'], // Address3 + $item['address4'], // Address4 + $item['city'], // City + NULL, // State + $item['postal_code'], // Post Code + NULL, // Telephone - Mobile + NULL, // Telephone - Res + NULL, // Telephone - Office + $item['nric'], // NRIC + $item['passport_no'], // Passport No + $item['passport_country'], // Passport Country + $item['email'], // Email + $item['identification_code'], // Identification Code + $item['birth_date'], // Date of Birth + $item['gender_code'], // Sex + NULL, // Internal Use + $item['current_plan']['code'], // Plan-ID + NULL, // Employment-Status + NULL, // Internal Use + NULL, // Internal Use + NULL,// Internal Use + str_replace('-', '',$item['terminated_date']), // Date Terminated + $item['pre_existing'], // Pre Existing + $item['bpjs_id'], // BPJS ID + $item['endorsement_date'], // Endorsement Date + $item['remarks'], // Remarks + NULL, // Internal Use + NULL,// Member Since + NULL,// Internal Use + $item['policy_in_force'], // Policy Inforce + NULL, // Member Suspended + str_replace('-', '',$item['activation_date']), // Activation Date + NULL, // Internal Use + $item['start_no_claim'], // StartNoClaim + $item['end_no_claim'], // EndNoClaim + NULL, // Option Mode + ]; + $row = WriterEntityFactory::createRowFromArray($rowData); + $writer->addRow($row); + } + } + + // Menutup penulis + $writer->close(); + // dd('test'); + // Mengembalikan response untuk mengunduh file + $filePath = public_path('files/CorporateMembershipList.xlsx'); + // dd($filePath); + // Mengembalikan response untuk mengunduh file + return Helper::responseJson([ + 'file_name' => "Corporate Plan & Benefit List " . date('Y-m-d h:i:s'), + "file_url" => url('files/CorporateMembershipList.xlsx') + ]); + } } diff --git a/Modules/Internal/Routes/api.php b/Modules/Internal/Routes/api.php index efbd0baf..a3eb8867 100755 --- a/Modules/Internal/Routes/api.php +++ b/Modules/Internal/Routes/api.php @@ -91,6 +91,7 @@ Route::prefix('internal')->group(function () { Route::put('corporates/{corporate_id}/divisions/{id}', [DivisionController::class, 'update']); Route::get('corporates/{corporate_id}/members', [CorporateMemberController::class, 'index']); + Route::get('corporates/{corporate_id}/members/list', [CorporateMemberController::class, 'generateMemberList']); Route::post('corporates/{corporate_id}/members/import', [CorporateMemberController::class, 'import']); Route::put('members/{member_id}/activation', [CorporateMemberController::class, 'activation']); diff --git a/Modules/Internal/Services/MemberEnrollmentService.php b/Modules/Internal/Services/MemberEnrollmentService.php index fe06e671..9c5205d0 100755 --- a/Modules/Internal/Services/MemberEnrollmentService.php +++ b/Modules/Internal/Services/MemberEnrollmentService.php @@ -174,6 +174,7 @@ class MemberEnrollmentService "ingestion_code" => "Ingestion Code", "ingestion_status" => "Ingestion Status", ]; + public $result_doc_headers = [ "Record Mode", "Record Type", @@ -246,6 +247,78 @@ class MemberEnrollmentService "Ingestion Status", ]; + public $listing_doc_headers = [ + // "Record Mode", + "Record Type", + "Payor ID", + "Member ID", + "Mapping ID", + "Link Medis Member ID", + "Corporate ID", + "NIK", + "Division", + "Branch Code", + "Bank Info", + "Language", + "Type of work", + "Race", + "Policy Number", + // "Policy No.", + "Marital Status", + "Relationship", + "Member's Effective Date", + "Member's Expiry Date", + "Faskes FKTP (First Level Provider) or Individual preferred provider", + "Faskes FKRTL (Next Level Provider) or Individual group preferred provider", + "The Right Classes Room of BPJS Participants", + "Name of Faskes", + "Rule BPJSK", + "Internal Use", + "Member Name", + "Address1", + // "Address 1", + "Address2", + "Address3", + "Address4", + "City", + "State", + "Post Code", + "Telephone - Mobile", + "Telephone - Res", + "Telephone - Office", + "NRIC", + "Passport No", + "Passport Country", + "Email", + "Identification Code", + "Date of Birth", + "Sex", + "Internal Use", + "Plan-ID", + "Employment-Status", + "Internal Use", + "Internal Use", + "Internal Use", + "Date Terminated", + "Pre Existing", + "BPJS ID", + "Endorsement Date", + "Remarks", + "Internal Use", + "Member Since", + "Internal Use", + "Policy Inforce", + "Member Suspended", + "Activation Date", + "Internal Use", + "StartNoClaim", + "EndNoClaim", + "Option Mode", + // "Renewal Activation Date", + // "Ingestion Code", + // "Ingestion Status", + ]; + public function __construct(Member $member) { $this->member = $member; @@ -462,9 +535,13 @@ class MemberEnrollmentService "members_expire_date" => $row['member_expiry_date'] ?? null, "activation_date" => $row['activation_date'] ?? null, "terminated_date" => $row['date_terminated'] ?? null, + + "telephone_mobile" => $row['telephone_mobile'] ?? null, + "telephone_res" => $row['telephone_res'] ?? null, + "telephone_office" => $row['telephone_office'] ?? null, ]; - $this->validateRow($row); + // $this->validateRow($row); if (!isset($corporate->currentPolicy) || $corporate->currentPolicy->code != $row['policy_number']) { throw new ImportRowException(__('enrollment.POLICY_NUMBER_NOT_MATCH', [ 'policy_id' => $row['policy_number'] @@ -556,6 +633,7 @@ class MemberEnrollmentService switch ($row['record_mode']) { case "1": // New Member + $this->validateRow($row); $member = Member::query() ->where('member_id', $row['member_id']) // ->whereHas('employeds', function ($query) use ($corporate) { @@ -608,11 +686,6 @@ class MemberEnrollmentService if (!$plan) { throw new ImportRowException(__('enrollment.PLAN_NOT_FOUND'), 0, null, $row); } - - - - $this->validateRow($row); - try { DB::beginTransaction(); @@ -675,6 +748,7 @@ class MemberEnrollmentService } break; case "2": // Member Information Update (Without Replacement Card) + $this->validateRow($row); $member = Member::query() ->where('member_id', $row['member_id']) ->first(); @@ -686,9 +760,6 @@ class MemberEnrollmentService 'policy_id' => $row['policy_number'] ]), 0, null, $row); } - - $this->validateRow($row); - try { $memberPolicy = MemberPolicy::query() ->where('policy_id', $row['policy_number']) diff --git a/app/Http/Resources/MemberListResource.php b/app/Http/Resources/MemberListResource.php new file mode 100644 index 00000000..3a0de911 --- /dev/null +++ b/app/Http/Resources/MemberListResource.php @@ -0,0 +1,32 @@ +claims->groupBy('status'); + $data['total_claims'] = [ + 'draft' => count($data['claim_grouped_by_status']['draft'] ?? []), + 'requested' => count($data['claim_grouped_by_status']['requested'] ?? []), + 'received' => count($data['claim_grouped_by_status']['received'] ?? []), + 'approved' => count($data['claim_grouped_by_status']['approved'] ?? []), + 'paid' => count($data['claim_grouped_by_status']['paid'] ?? []), + 'declined' => count($data['claim_grouped_by_status']['declined'] ?? []) + ]; + + // $data = ['fuck' => 'you']; + + return $data; + } +} diff --git a/app/Models/Member.php b/app/Models/Member.php index a9f8e824..a6884783 100755 --- a/app/Models/Member.php +++ b/app/Models/Member.php @@ -147,6 +147,12 @@ class Member extends Model ->latest(); // TODO Fix This } + public function currentEmployeds() + { + return $this->hasOneThrough(CorporateEmployee::class, Person::class, 'nik', 'id', 'id', 'nik') + ->latest(); // TODO Fix This + } + public function policies() { return $this->hasMany(MemberPolicy::class, 'member_id', 'member_id'); diff --git a/database/migrations/2023_05_17_090708_add_column_to_members_table.php b/database/migrations/2023_05_17_090708_add_column_to_members_table.php new file mode 100644 index 00000000..188f86ee --- /dev/null +++ b/database/migrations/2023_05_17_090708_add_column_to_members_table.php @@ -0,0 +1,36 @@ +string('telephone_mobile')->after('postal_code')->nullable(); + $table->string('telephone_res')->after('telephone_mobile')->nullable(); + $table->string('telephone_office')->after('telephone_res')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('members', function (Blueprint $table) { + $table->dropColumn('telephone_mobile'); + $table->dropColumn('telephone_res'); + $table->dropColumn('telephone_office'); + }); + } +}; diff --git a/frontend/dashboard/src/pages/Corporates/Member/List.tsx b/frontend/dashboard/src/pages/Corporates/Member/List.tsx index d0a695d8..38678411 100755 --- a/frontend/dashboard/src/pages/Corporates/Member/List.tsx +++ b/frontend/dashboard/src/pages/Corporates/Member/List.tsx @@ -79,7 +79,6 @@ export default function CorporatePlanList() { .catch((response) => { enqueueSnackbar('Failed getting data. ' + response.message, { variant: 'error' }); }); - // console.log(response.data); setDataTableLoading(false); setDataTableData(response.data); @@ -161,6 +160,19 @@ export default function CorporatePlanList() { } }; + const handleMemberList = async (appliedFilter = null) => { + axios.get('corporates/' + corporate_id + '/members/list').then((response) => { + console.log(response); + const link = document.createElement('a'); + console.log(response.data.data.file_name); + link.href = response.data.data.file_url; + link.setAttribute('download', response.data.data.file_name); + document.body.appendChild(link); + link.click(); + handleClose(); + }); + } + const handleCancelImportButton = () => { importPlan.current.value = ''; importPlan.current.dispatchEvent(new Event('change', { bubbles: true })); @@ -254,6 +266,7 @@ export default function CorporatePlanList() { > Download Template + Download Member )} diff --git a/public/files/Corporate Membership Import List.xlsx b/public/files/Corporate Membership Import List.xlsx new file mode 100755 index 00000000..e69de29b diff --git a/public/files/CorporateMembershipList.xlsx b/public/files/CorporateMembershipList.xlsx new file mode 100644 index 00000000..4400f4e4 Binary files /dev/null and b/public/files/CorporateMembershipList.xlsx differ