diff --git a/Modules/Client/Http/Controllers/Api/ClaimRequestController.php b/Modules/Client/Http/Controllers/Api/ClaimRequestController.php index de3899d5..bd5bcc49 100644 --- a/Modules/Client/Http/Controllers/Api/ClaimRequestController.php +++ b/Modules/Client/Http/Controllers/Api/ClaimRequestController.php @@ -63,7 +63,7 @@ class ClaimRequestController extends Controller serviceCode: $request->service_code[$key], ); - ClaimRequested::dispatch($newClaimRequest); + // ClaimRequested::dispatch($newClaimRequest); // Log History $newClaimRequest->histories()->create([ diff --git a/Modules/Client/Http/Controllers/Api/CorporateMemberController.php b/Modules/Client/Http/Controllers/Api/CorporateMemberController.php index 5ea7b0e7..83fa13e3 100644 --- a/Modules/Client/Http/Controllers/Api/CorporateMemberController.php +++ b/Modules/Client/Http/Controllers/Api/CorporateMemberController.php @@ -21,10 +21,15 @@ use Modules\Client\Transformers\Dashboard\MemberEmployeeDataResources as Dashboa use Modules\Client\Transformers\DataMemberResource; use Illuminate\Support\Facades\DB; +use Box\Spout\Reader\Common\Creator\ReaderEntityFactory; +use Box\Spout\Writer\Common\Creator\WriterEntityFactory; +use Modules\Internal\Services\MemberEnrollmentService; + class CorporateMemberController extends Controller { - public function __construct(public CorporateMemberService $corporateMemberService) + public function __construct(public CorporateMemberService $corporateMemberService, MemberEnrollmentService $memberEnrollmentService) { + $this->memberEnrollmentService = $memberEnrollmentService; } /** @@ -106,6 +111,111 @@ class CorporateMemberController extends Controller } + public function generateMemberList($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_mode'], // Recode Mode + $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'] ?? null, // 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') + ]); + } + public function showPerMember($corporate_id, $member_id){ $data = ClaimRequest::where(['member_id' => $member_id]) ->whereNotNull('claim_id') diff --git a/Modules/Client/Routes/api.php b/Modules/Client/Routes/api.php index 43b08350..28b28bcf 100644 --- a/Modules/Client/Routes/api.php +++ b/Modules/Client/Routes/api.php @@ -48,6 +48,7 @@ Route::prefix('client')->group(function () { Route::get('division', [CorporateDivisionController::class, 'index']); Route::get('members', [CorporateMemberController::class, 'index']); Route::get('members/{id}', [CorporateMemberController::class, 'show']); + Route::get('export-members/list', [CorporateMemberController::class, 'generateMemberList']); Route::get('alarm-center-members/{id}', [CorporateMemberController::class, 'showPerMember']); Route::get('service-monitoring/{id}', [CorporateMemberController::class, 'serviceMonitoring']); Route::get('claims/status', [ClaimController::class, 'status']); diff --git a/Modules/HospitalPortal/Http/Controllers/Api/MemberController.php b/Modules/HospitalPortal/Http/Controllers/Api/MemberController.php index 4a69d876..52af40fb 100644 --- a/Modules/HospitalPortal/Http/Controllers/Api/MemberController.php +++ b/Modules/HospitalPortal/Http/Controllers/Api/MemberController.php @@ -96,6 +96,16 @@ class MemberController extends Controller $res_data['type'] = $request->type; + // Provider + $providers = DB::table('organizations') + ->select( + 'organizations.id', + 'organizations.name' + ) + ->get(); + + $res_data['providers'] = $providers; + return ApiResponse::apiResponse("Success", $res_data, trans('Message.success'), 200); } diff --git a/Modules/HospitalPortal/Http/Controllers/Api/RequestLogController.php b/Modules/HospitalPortal/Http/Controllers/Api/RequestLogController.php index db2cf4b9..a7f796ad 100644 --- a/Modules/HospitalPortal/Http/Controllers/Api/RequestLogController.php +++ b/Modules/HospitalPortal/Http/Controllers/Api/RequestLogController.php @@ -23,7 +23,10 @@ class RequestLogController extends Controller { $data = [ 'member_id' => $request->member_id, - 'service_code' => $request->service_code + 'service_code' => $request->service_code, + 'id_provider' => $request->id_provider, + 'name_provider' => $request->name_provider, + 'adress_provider' => $request->address_provider ]; $validator = Validator::make($request->all(), [ 'member_id' => 'required', @@ -32,6 +35,18 @@ class RequestLogController extends Controller 'member_id.required' => trans('Validation.required',['attribute' => 'Member ID']), 'service_code.required' => trans('Validation.required',['attribute' => 'Service Code']), ]); + if($request->id_provider) + { + $validator = Validator::make($request->all(), [ + 'id_provider' => 'required', + 'member_id' => 'required', + 'service_code' => 'required' + ], [ + 'id_provider.required' => trans('Validation.required',['attribute' => 'Provider ID']), + 'member_id.required' => trans('Validation.required',['attribute' => 'Member ID']), + 'service_code.required' => trans('Validation.required',['attribute' => 'Service Code']), + ]); + } if ($validator->fails()) { return ApiResponse::apiResponse('Bad Request', $data, $validator->errors(), 400); diff --git a/Modules/Internal/Http/Controllers/Api/CorporateController.php b/Modules/Internal/Http/Controllers/Api/CorporateController.php index a8fc5dbd..040b1d3f 100644 --- a/Modules/Internal/Http/Controllers/Api/CorporateController.php +++ b/Modules/Internal/Http/Controllers/Api/CorporateController.php @@ -79,7 +79,7 @@ class CorporateController extends Controller */ public function store(Request $request) { - + $request->validate([ 'code' => 'required|regex:/^[a-zA-Z0-9_]+$/', 'name' => 'required', @@ -468,9 +468,9 @@ class CorporateController extends Controller // $import->read($fileRead); // $import->write($fileWrite, 'xsls'); $result_headers = array_merge($row_data, ['Ingest Code' =>200, 'Ingest Note' => 'Success']); - + $import->addArrayToRow($result_headers, $sheet->getName()); - + } catch (ImportRowException $e) { // Write Data Validation Error to File // $import->read($fileRead); @@ -518,7 +518,7 @@ class CorporateController extends Controller } - public function importDocumentExample($document_type) + public function importDocumentExample($document_type) { switch ($document_type) { case 'plan-benefit': @@ -532,7 +532,7 @@ class CorporateController extends Controller 'file_name' => "Corporate Membership Import.xlsx", "file_url" => url('files/Corporate Membership Import.xlsx') ]); - break; + break; case 'diagnosis-exclusion': return Helper::responseJson([ 'file_name' => "Corporate Exclusion Import.xlsx", @@ -544,31 +544,31 @@ class CorporateController extends Controller 'file_name' => "Template - ICD.xlsx", "file_url" => url('files/Template - ICD.xlsx') ]); - break; + break; case 'master-formularium': return Helper::responseJson([ 'file_name' => "Template - Formularium.xlsx", "file_url" => url('files/Template - Formularium.xlsx') ]); - break; + break; case 'master-formularium-corporate': return Helper::responseJson([ 'file_name' => "Template - Formularium.xlsx", "file_url" => url('files/Template - Formularium - Corporate.xlsx') ]); - break; + break; case 'claim-request': return Helper::responseJson([ 'file_name' => "Template Format Claim.xlsx", "file_url" => url('files/Template Format Claim.xlsx') ]); - break; + break; case 'request-log': return Helper::responseJson([ 'file_name' => "Template Update Status Request LOG.xlsx", "file_url" => url('files/Template Update Status Request LOG.xlsx') ]); - break; + break; default: return Helper::responseJson([], 'error', 404); break; @@ -582,7 +582,7 @@ class CorporateController extends Controller $writer = WriterEntityFactory::createXLSXWriter(); // Membuka penulis untuk menulis ke file $writer->openToFile(public_path('files/CorporatePlan&BenefitImportData.xlsx')); - + // Sheet 1 $writer->getCurrentSheet()->setName('Plans'); $headers_map_to_table_fields = Plan::$listing_doc_headers; @@ -783,7 +783,7 @@ class CorporateController extends Controller { return Helper::responseJson(data: $request->toArray(), message: 'Tidak ada file yang ditambahkan'); } - + } public function getFilesDoc(Request $request) @@ -825,5 +825,5 @@ class CorporateController extends Controller return Helper::responseJson(data: $datas, message: 'Berhasil update status download menjadi '.($request->status_download == 0 ? 'Inactive' : 'Active')); } - + } diff --git a/Modules/Internal/Http/Controllers/Api/CorporateMemberController.php b/Modules/Internal/Http/Controllers/Api/CorporateMemberController.php index 4a0656a0..81d5f596 100644 --- a/Modules/Internal/Http/Controllers/Api/CorporateMemberController.php +++ b/Modules/Internal/Http/Controllers/Api/CorporateMemberController.php @@ -178,7 +178,7 @@ class CorporateMemberController extends Controller $result_headers = $this->memberEnrollmentService->result_doc_headers; $singleRow = WriterEntityFactory::createRow($this->memberEnrollmentService->makeResultRow($result_headers)); $writer->addRow($singleRow); - + $imported_member_data = 0; $failed_member_data = []; foreach ($reader->getSheetIterator() as $sheet) { @@ -202,7 +202,7 @@ class CorporateMemberController extends Controller $new_member_data[$headers_map_to_table_fields[$doc_headers_indexes[$header_index]]] = $cell->getValue(); } } - + try { $rowResponse = $this->memberEnrollmentService->handleImportRow($corporate, $new_member_data); // Write Success Result to File @@ -257,23 +257,23 @@ class CorporateMemberController extends Controller $corporate_id = CorporateEmployee::where('member_id', $member_id)->value('corporate_id'); // $member = Member::findOrFail($member_id) // ->load([ - // 'currentPlan', - // 'currentPolicy', + // 'currentPlan', + // 'currentPolicy', // 'currentPlan.corporateBenefits' => function ($benefit) use ($request) { // return $benefit->when($request->benefit_ids, function ($q, $ids) { - + // $q->whereIn('benefit_id', $ids) // ->where([ // 'corporate_benefits.active' => 1, // 'corporate_benefits.corporate_id' => $corporate_id, // ]); // }); - // }, + // }, // // 'currentPlan.corporateBenefits.benefit' // ]); $member = Member::with([ - 'currentPlan', - 'currentPolicy', + 'currentPlan', + 'currentPolicy', 'currentPlan.corporateBenefits' => function ($query) use ($request, $corporate_id) { $query->when($request->benefit_ids, function ($q, $ids) use ($corporate_id) { $q->whereIn('benefit_id', $ids) @@ -283,7 +283,7 @@ class CorporateMemberController extends Controller }, // 'currentPlan.corporateBenefits.benefit' ])->findOrFail($member_id); - + $dateOfAdmission = $request->date_of_admission ? Carbon::parse($request->date_of_admission) : now(); // return view('pdf.guaranted_leter', compact('member')); @@ -307,7 +307,7 @@ class CorporateMemberController extends Controller // 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 @@ -366,7 +366,7 @@ class CorporateMemberController extends Controller $item['pre_existing'], // Pre Existing $item['bpjs_id'], // BPJS ID $item['endorsement_date'], // Endorsement Date - $item['remarks'], // Remarks + $item['remarks'], // Remarks NULL, // Internal Use NULL,// Member Since NULL,// Internal Use @@ -398,8 +398,8 @@ class CorporateMemberController extends Controller public function sendAllECard(Request $request, $corporate_id){ $members = Member::with([ - 'currentPlan', - 'currentPolicy', + 'currentPlan', + 'currentPolicy', 'currentCorporate', // 'currentPlan.corporateBenefits.benefit' ])->whereHas('currentCorporate', function ($query) use ($corporate_id) { @@ -415,7 +415,7 @@ class CorporateMemberController extends Controller $pdf = PDF::loadView('pdf.ecard', compact('member'))->setPaper('A5', 'portrait'); $pdf->save($pdfPath); } - + $dataEmail = [ // 'email' => $member->email, 'email' => 'tbfajri', @@ -425,7 +425,7 @@ class CorporateMemberController extends Controller 'attach' => $pdfPath, ]; $sendEmail = Helper::sendEmailattachData($dataEmail); - + if ($sendEmail === true){ $countSuccesSend ++; @@ -445,7 +445,7 @@ class CorporateMemberController extends Controller 'data_succes_send' => $countSuccesSend, ]; - return response()->json($response); + return response()->json($response); } public function viewECard(Request $request, $member_id){ diff --git a/Modules/Internal/Services/CorporateService.php b/Modules/Internal/Services/CorporateService.php index 6d1d9ed3..497cbd15 100644 --- a/Modules/Internal/Services/CorporateService.php +++ b/Modules/Internal/Services/CorporateService.php @@ -29,10 +29,10 @@ class CorporateService MCU=Medical Check Up KB-VACC = Family Planning/Vaccination LAB = Test Diagnostic - PHAR = Pharmacy + PHAR = Pharmacy **/ protected $service_code = ['MEDIVAC', 'MSO', 'PAC', 'OPDE', 'IP', 'OP', 'MA', 'ANC', 'DE', 'GL', 'SP', 'PF', 'MCU', 'KB-VACC', 'LAB', 'PHAR']; - + protected function corporatePlansId($corporate_id){ $plans = Plan::where('corporate_id', $corporate_id)->get()->toArray(); $current_corporate_plans_id = []; @@ -80,8 +80,8 @@ class CorporateService throw new ImportRowException(__('plan.REQUIRED', [ 'attribute' => 'Customer Plan' ]), 0, null, $row); - } - + } + if (!in_array($row['type'], $plan_code)){ throw new ImportRowException(__('plan.NOT_MATCH', [ 'attribute' => 'Plan Type', @@ -105,13 +105,13 @@ class CorporateService // 'code' => $row['code'] // ]), 0, null, $row); // } - + if (!empty($row['family_plan']) && !in_array($row['family_plan'],$family_plan)) { throw new ImportRowException(__('plan.NOT_MATCH', [ 'attribute' => 'Family Plan', 'code' => $row['family_plan'] ]), 0, null, $row); - } + } if (!empty($row['prorate_type']) && !in_array($row['prorate_type'], $prorate_type)) { throw new ImportRowException(__('plan.NOT_MATCH', [ @@ -171,7 +171,7 @@ class CorporateService 'code' => $row['service_code'] ]), 0, null, $row); } - + if (empty($row['plan_code'])) { throw new ImportRowException(__('benefit.PLAN_CODE_REQUIRED'), 0, null, $row); } else if (!in_array($row['plan_code'], $current_corporate_plans)){ @@ -181,21 +181,21 @@ class CorporateService // ]), 0, null, $row); } - + if (empty($row['code'])) { throw new ImportRowException(__('plan.REQUIRED', [ 'attribute' => 'Benefit Code' ]), 0, null, $row); } - + if (empty($row['corporate_benefit_code'])) { throw new ImportRowException(__('Customer Benefit Code Required', [ 'attribute' => 'Customer Benefit Code' ]), 0, null, $row); } - + if (empty($row['description'])) { throw new ImportRowException(__('plan.REQUIRED', [ 'attribute' => 'Description' @@ -216,16 +216,16 @@ class CorporateService 'attribute' => 'Gender' ]), 0, null, $row); } - if (!empty($row['max_frequency_period']) && $row['max_frequency_period'] >= $max_frequence){ // jenis frequence + if (!empty($row['max_frequency_period']) && $row['max_frequency_period'] >= $max_frequence){ // jenis frequence throw new ImportRowException(__('plan.MAX_FREQUENCY'), 0, null, $row); } - - if (!empty($row['budget']) && !in_array($budget_aso)) { + + if (!empty($row['budget']) && !in_array($budget_aso)) { throw new ImportRowException(__('plan.MAX_FREQUENCY'), 0, null, $row); } - + // if (empty($row['limit_free_tc'])){ // throw new ImportRowException(__('plan.REQUIRED', [ diff --git a/app/Services/ClaimRequestService.php b/app/Services/ClaimRequestService.php index 71626fc4..c840e2da 100644 --- a/app/Services/ClaimRequestService.php +++ b/app/Services/ClaimRequestService.php @@ -20,7 +20,7 @@ use Str; class ClaimRequestService{ - public static function storeClaimRequest($row = null, $code, $member, $paymentType, $serviceCode, $requestLogID, $submissionDate = null, $status = 'requested', $organization_code = null) + public static function storeClaimRequest($row = null, $code, $member, $paymentType, $serviceCode, $requestLogID = null, $submissionDate = null, $status = 'requested', $organization_code = null) { // try { $organization = False; @@ -38,7 +38,7 @@ class ClaimRequestService{ $claimRequestData = [ 'code' => $code, - 'request_log_id' => $requestLogID, + 'request_log_id' => $requestLogID ?? 0, 'member_id' => $member->id, 'submission_date' => $submissionDate ?? now(), 'status' => $status, @@ -60,6 +60,8 @@ class ClaimRequestService{ // } } + + public static function storeClaimManagement($row, $member, $claim_request_id){ try { $organization = 0; @@ -100,7 +102,7 @@ class ClaimRequestService{ DB::commit(); return $claimManagement; - + } catch (\Exception $error) { DB::rollBack(); @@ -144,18 +146,18 @@ class ClaimRequestService{ $paymentType = $row['claim_type']; $status = $row['status']; $serviceCode = $row['coverage_type']; - + $newClaimRequest = $this->storeClaimRequest( row: $row, code: $code, - member: $member, - paymentType: $paymentType, - serviceCode: $serviceCode, - submissionDate: $submissionDate, - status: $status, + member: $member, + paymentType: $paymentType, + serviceCode: $serviceCode, + submissionDate: $submissionDate, + status: $status, organization_code: $organization_id ); - + $newlyCreatedID = $newClaimRequest->id; $newClaimManangement = $this->storeClaimManagement($row, $member, $newlyCreatedID); @@ -177,4 +179,4 @@ class ClaimRequestService{ } } -} \ No newline at end of file +} diff --git a/composer.json b/composer.json index a592e329..59cebfc4 100644 --- a/composer.json +++ b/composer.json @@ -19,6 +19,7 @@ "laravel/socialite": "^5.5", "laravel/tinker": "^2.7", "maatwebsite/excel": "^3.1", + "mikehaertl/phpwkhtmltopdf": "^2.5", "nwidart/laravel-modules": "^9.0", "phpmailer/phpmailer": "^6.9", "psr/simple-cache": "^1.0", diff --git a/frontend/client-portal/src/pages/Dashboard/Index.tsx b/frontend/client-portal/src/pages/Dashboard/Index.tsx index 355d4c97..ae7f9712 100644 --- a/frontend/client-portal/src/pages/Dashboard/Index.tsx +++ b/frontend/client-portal/src/pages/Dashboard/Index.tsx @@ -235,12 +235,12 @@ export default function Index() { label: 'Divisi', isSort: true, }, - { - id: 'limit', - align: 'center', - label: 'Limit', - isSort: false, - }, + // { + // id: 'limit', + // align: 'center', + // label: 'Limit', + // isSort: false, + // }, { id: 'status', align: 'center', @@ -292,18 +292,18 @@ export default function Index() { corporateMembers.data.data.map((obj: any) => { return { ...obj, - limit: ( - - - - {fSplit(obj.limit.current)} / {fSplit(obj.limit.total)} - - - ), + // limit: ( + // + // + // + // {fSplit(obj.limit.current)} / {fSplit(obj.limit.total)} + // + // + // ), status: obj.status === 1 ? (