Merge branch 'staging' of https://dev.sismedika.online/febio/aso into staging

This commit is contained in:
2024-01-03 17:06:15 +07:00
15 changed files with 346 additions and 100 deletions

View File

@@ -63,7 +63,7 @@ class ClaimRequestController extends Controller
serviceCode: $request->service_code[$key], serviceCode: $request->service_code[$key],
); );
ClaimRequested::dispatch($newClaimRequest); // ClaimRequested::dispatch($newClaimRequest);
// Log History // Log History
$newClaimRequest->histories()->create([ $newClaimRequest->histories()->create([

View File

@@ -21,10 +21,15 @@ use Modules\Client\Transformers\Dashboard\MemberEmployeeDataResources as Dashboa
use Modules\Client\Transformers\DataMemberResource; use Modules\Client\Transformers\DataMemberResource;
use Illuminate\Support\Facades\DB; 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 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){ public function showPerMember($corporate_id, $member_id){
$data = ClaimRequest::where(['member_id' => $member_id]) $data = ClaimRequest::where(['member_id' => $member_id])
->whereNotNull('claim_id') ->whereNotNull('claim_id')

View File

@@ -48,6 +48,7 @@ Route::prefix('client')->group(function () {
Route::get('division', [CorporateDivisionController::class, 'index']); Route::get('division', [CorporateDivisionController::class, 'index']);
Route::get('members', [CorporateMemberController::class, 'index']); Route::get('members', [CorporateMemberController::class, 'index']);
Route::get('members/{id}', [CorporateMemberController::class, 'show']); 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('alarm-center-members/{id}', [CorporateMemberController::class, 'showPerMember']);
Route::get('service-monitoring/{id}', [CorporateMemberController::class, 'serviceMonitoring']); Route::get('service-monitoring/{id}', [CorporateMemberController::class, 'serviceMonitoring']);
Route::get('claims/status', [ClaimController::class, 'status']); Route::get('claims/status', [ClaimController::class, 'status']);

View File

@@ -96,6 +96,16 @@ class MemberController extends Controller
$res_data['type'] = $request->type; $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); return ApiResponse::apiResponse("Success", $res_data, trans('Message.success'), 200);
} }

View File

@@ -23,7 +23,10 @@ class RequestLogController extends Controller
{ {
$data = [ $data = [
'member_id' => $request->member_id, '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(), [ $validator = Validator::make($request->all(), [
'member_id' => 'required', 'member_id' => 'required',
@@ -32,6 +35,18 @@ class RequestLogController extends Controller
'member_id.required' => trans('Validation.required',['attribute' => 'Member ID']), 'member_id.required' => trans('Validation.required',['attribute' => 'Member ID']),
'service_code.required' => trans('Validation.required',['attribute' => 'Service Code']), '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()) if ($validator->fails())
{ {
return ApiResponse::apiResponse('Bad Request', $data, $validator->errors(), 400); return ApiResponse::apiResponse('Bad Request', $data, $validator->errors(), 400);

View File

@@ -79,7 +79,7 @@ class CorporateController extends Controller
*/ */
public function store(Request $request) public function store(Request $request)
{ {
$request->validate([ $request->validate([
'code' => 'required|regex:/^[a-zA-Z0-9_]+$/', 'code' => 'required|regex:/^[a-zA-Z0-9_]+$/',
'name' => 'required', 'name' => 'required',
@@ -468,9 +468,9 @@ class CorporateController extends Controller
// $import->read($fileRead); // $import->read($fileRead);
// $import->write($fileWrite, 'xsls'); // $import->write($fileWrite, 'xsls');
$result_headers = array_merge($row_data, ['Ingest Code' =>200, 'Ingest Note' => 'Success']); $result_headers = array_merge($row_data, ['Ingest Code' =>200, 'Ingest Note' => 'Success']);
$import->addArrayToRow($result_headers, $sheet->getName()); $import->addArrayToRow($result_headers, $sheet->getName());
} catch (ImportRowException $e) { } catch (ImportRowException $e) {
// Write Data Validation Error to File // Write Data Validation Error to File
// $import->read($fileRead); // $import->read($fileRead);
@@ -518,7 +518,7 @@ class CorporateController extends Controller
} }
public function importDocumentExample($document_type) public function importDocumentExample($document_type)
{ {
switch ($document_type) { switch ($document_type) {
case 'plan-benefit': case 'plan-benefit':
@@ -532,7 +532,7 @@ class CorporateController extends Controller
'file_name' => "Corporate Membership Import.xlsx", 'file_name' => "Corporate Membership Import.xlsx",
"file_url" => url('files/Corporate Membership Import.xlsx') "file_url" => url('files/Corporate Membership Import.xlsx')
]); ]);
break; break;
case 'diagnosis-exclusion': case 'diagnosis-exclusion':
return Helper::responseJson([ return Helper::responseJson([
'file_name' => "Corporate Exclusion Import.xlsx", 'file_name' => "Corporate Exclusion Import.xlsx",
@@ -544,31 +544,31 @@ class CorporateController extends Controller
'file_name' => "Template - ICD.xlsx", 'file_name' => "Template - ICD.xlsx",
"file_url" => url('files/Template - ICD.xlsx') "file_url" => url('files/Template - ICD.xlsx')
]); ]);
break; break;
case 'master-formularium': case 'master-formularium':
return Helper::responseJson([ return Helper::responseJson([
'file_name' => "Template - Formularium.xlsx", 'file_name' => "Template - Formularium.xlsx",
"file_url" => url('files/Template - Formularium.xlsx') "file_url" => url('files/Template - Formularium.xlsx')
]); ]);
break; break;
case 'master-formularium-corporate': case 'master-formularium-corporate':
return Helper::responseJson([ return Helper::responseJson([
'file_name' => "Template - Formularium.xlsx", 'file_name' => "Template - Formularium.xlsx",
"file_url" => url('files/Template - Formularium - Corporate.xlsx') "file_url" => url('files/Template - Formularium - Corporate.xlsx')
]); ]);
break; break;
case 'claim-request': case 'claim-request':
return Helper::responseJson([ return Helper::responseJson([
'file_name' => "Template Format Claim.xlsx", 'file_name' => "Template Format Claim.xlsx",
"file_url" => url('files/Template Format Claim.xlsx') "file_url" => url('files/Template Format Claim.xlsx')
]); ]);
break; break;
case 'request-log': case 'request-log':
return Helper::responseJson([ return Helper::responseJson([
'file_name' => "Template Update Status Request LOG.xlsx", 'file_name' => "Template Update Status Request LOG.xlsx",
"file_url" => url('files/Template Update Status Request LOG.xlsx') "file_url" => url('files/Template Update Status Request LOG.xlsx')
]); ]);
break; break;
default: default:
return Helper::responseJson([], 'error', 404); return Helper::responseJson([], 'error', 404);
break; break;
@@ -582,7 +582,7 @@ class CorporateController extends Controller
$writer = WriterEntityFactory::createXLSXWriter(); $writer = WriterEntityFactory::createXLSXWriter();
// Membuka penulis untuk menulis ke file // Membuka penulis untuk menulis ke file
$writer->openToFile(public_path('files/CorporatePlan&BenefitImportData.xlsx')); $writer->openToFile(public_path('files/CorporatePlan&BenefitImportData.xlsx'));
// Sheet 1 // Sheet 1
$writer->getCurrentSheet()->setName('Plans'); $writer->getCurrentSheet()->setName('Plans');
$headers_map_to_table_fields = Plan::$listing_doc_headers; $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'); return Helper::responseJson(data: $request->toArray(), message: 'Tidak ada file yang ditambahkan');
} }
} }
public function getFilesDoc(Request $request) 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')); return Helper::responseJson(data: $datas, message: 'Berhasil update status download menjadi '.($request->status_download == 0 ? 'Inactive' : 'Active'));
} }
} }

View File

@@ -178,7 +178,7 @@ class CorporateMemberController extends Controller
$result_headers = $this->memberEnrollmentService->result_doc_headers; $result_headers = $this->memberEnrollmentService->result_doc_headers;
$singleRow = WriterEntityFactory::createRow($this->memberEnrollmentService->makeResultRow($result_headers)); $singleRow = WriterEntityFactory::createRow($this->memberEnrollmentService->makeResultRow($result_headers));
$writer->addRow($singleRow); $writer->addRow($singleRow);
$imported_member_data = 0; $imported_member_data = 0;
$failed_member_data = []; $failed_member_data = [];
foreach ($reader->getSheetIterator() as $sheet) { 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(); $new_member_data[$headers_map_to_table_fields[$doc_headers_indexes[$header_index]]] = $cell->getValue();
} }
} }
try { try {
$rowResponse = $this->memberEnrollmentService->handleImportRow($corporate, $new_member_data); $rowResponse = $this->memberEnrollmentService->handleImportRow($corporate, $new_member_data);
// Write Success Result to File // Write Success Result to File
@@ -257,23 +257,23 @@ class CorporateMemberController extends Controller
$corporate_id = CorporateEmployee::where('member_id', $member_id)->value('corporate_id'); $corporate_id = CorporateEmployee::where('member_id', $member_id)->value('corporate_id');
// $member = Member::findOrFail($member_id) // $member = Member::findOrFail($member_id)
// ->load([ // ->load([
// 'currentPlan', // 'currentPlan',
// 'currentPolicy', // 'currentPolicy',
// 'currentPlan.corporateBenefits' => function ($benefit) use ($request) { // 'currentPlan.corporateBenefits' => function ($benefit) use ($request) {
// return $benefit->when($request->benefit_ids, function ($q, $ids) { // return $benefit->when($request->benefit_ids, function ($q, $ids) {
// $q->whereIn('benefit_id', $ids) // $q->whereIn('benefit_id', $ids)
// ->where([ // ->where([
// 'corporate_benefits.active' => 1, // 'corporate_benefits.active' => 1,
// 'corporate_benefits.corporate_id' => $corporate_id, // 'corporate_benefits.corporate_id' => $corporate_id,
// ]); // ]);
// }); // });
// }, // },
// // 'currentPlan.corporateBenefits.benefit' // // 'currentPlan.corporateBenefits.benefit'
// ]); // ]);
$member = Member::with([ $member = Member::with([
'currentPlan', 'currentPlan',
'currentPolicy', 'currentPolicy',
'currentPlan.corporateBenefits' => function ($query) use ($request, $corporate_id) { 'currentPlan.corporateBenefits' => function ($query) use ($request, $corporate_id) {
$query->when($request->benefit_ids, function ($q, $ids) use ($corporate_id) { $query->when($request->benefit_ids, function ($q, $ids) use ($corporate_id) {
$q->whereIn('benefit_id', $ids) $q->whereIn('benefit_id', $ids)
@@ -283,7 +283,7 @@ class CorporateMemberController extends Controller
}, },
// 'currentPlan.corporateBenefits.benefit' // 'currentPlan.corporateBenefits.benefit'
])->findOrFail($member_id); ])->findOrFail($member_id);
$dateOfAdmission = $request->date_of_admission ? Carbon::parse($request->date_of_admission) : now(); $dateOfAdmission = $request->date_of_admission ? Carbon::parse($request->date_of_admission) : now();
// return view('pdf.guaranted_leter', compact('member')); // return view('pdf.guaranted_leter', compact('member'));
@@ -307,7 +307,7 @@ class CorporateMemberController extends Controller
// Menulis header kolom // Menulis header kolom
$headers_map_to_table_fields = $this->memberEnrollmentService->listing_doc_headers; $headers_map_to_table_fields = $this->memberEnrollmentService->listing_doc_headers;
$headerRow = WriterEntityFactory::createRowFromArray($headers_map_to_table_fields); $headerRow = WriterEntityFactory::createRowFromArray($headers_map_to_table_fields);
$writer->addRow($headerRow); $writer->addRow($headerRow);
// dd('test'); // dd('test');
// Menulis data // Menulis data
@@ -366,7 +366,7 @@ class CorporateMemberController extends Controller
$item['pre_existing'], // Pre Existing $item['pre_existing'], // Pre Existing
$item['bpjs_id'], // BPJS ID $item['bpjs_id'], // BPJS ID
$item['endorsement_date'], // Endorsement Date $item['endorsement_date'], // Endorsement Date
$item['remarks'], // Remarks $item['remarks'], // Remarks
NULL, // Internal Use NULL, // Internal Use
NULL,// Member Since NULL,// Member Since
NULL,// Internal Use NULL,// Internal Use
@@ -398,8 +398,8 @@ class CorporateMemberController extends Controller
public function sendAllECard(Request $request, $corporate_id){ public function sendAllECard(Request $request, $corporate_id){
$members = Member::with([ $members = Member::with([
'currentPlan', 'currentPlan',
'currentPolicy', 'currentPolicy',
'currentCorporate', 'currentCorporate',
// 'currentPlan.corporateBenefits.benefit' // 'currentPlan.corporateBenefits.benefit'
])->whereHas('currentCorporate', function ($query) use ($corporate_id) { ])->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 = PDF::loadView('pdf.ecard', compact('member'))->setPaper('A5', 'portrait');
$pdf->save($pdfPath); $pdf->save($pdfPath);
} }
$dataEmail = [ $dataEmail = [
// 'email' => $member->email, // 'email' => $member->email,
'email' => 'tbfajri', 'email' => 'tbfajri',
@@ -425,7 +425,7 @@ class CorporateMemberController extends Controller
'attach' => $pdfPath, 'attach' => $pdfPath,
]; ];
$sendEmail = Helper::sendEmailattachData($dataEmail); $sendEmail = Helper::sendEmailattachData($dataEmail);
if ($sendEmail === true){ if ($sendEmail === true){
$countSuccesSend ++; $countSuccesSend ++;
@@ -445,7 +445,7 @@ class CorporateMemberController extends Controller
'data_succes_send' => $countSuccesSend, 'data_succes_send' => $countSuccesSend,
]; ];
return response()->json($response); return response()->json($response);
} }
public function viewECard(Request $request, $member_id){ public function viewECard(Request $request, $member_id){

View File

@@ -29,10 +29,10 @@ class CorporateService
MCU=Medical Check Up MCU=Medical Check Up
KB-VACC = Family Planning/Vaccination KB-VACC = Family Planning/Vaccination
LAB = Test Diagnostic 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 $service_code = ['MEDIVAC', 'MSO', 'PAC', 'OPDE', 'IP', 'OP', 'MA', 'ANC', 'DE', 'GL', 'SP', 'PF', 'MCU', 'KB-VACC', 'LAB', 'PHAR'];
protected function corporatePlansId($corporate_id){ protected function corporatePlansId($corporate_id){
$plans = Plan::where('corporate_id', $corporate_id)->get()->toArray(); $plans = Plan::where('corporate_id', $corporate_id)->get()->toArray();
$current_corporate_plans_id = []; $current_corporate_plans_id = [];
@@ -80,8 +80,8 @@ class CorporateService
throw new ImportRowException(__('plan.REQUIRED', [ throw new ImportRowException(__('plan.REQUIRED', [
'attribute' => 'Customer Plan' 'attribute' => 'Customer Plan'
]), 0, null, $row); ]), 0, null, $row);
} }
if (!in_array($row['type'], $plan_code)){ if (!in_array($row['type'], $plan_code)){
throw new ImportRowException(__('plan.NOT_MATCH', [ throw new ImportRowException(__('plan.NOT_MATCH', [
'attribute' => 'Plan Type', 'attribute' => 'Plan Type',
@@ -105,13 +105,13 @@ class CorporateService
// 'code' => $row['code'] // 'code' => $row['code']
// ]), 0, null, $row); // ]), 0, null, $row);
// } // }
if (!empty($row['family_plan']) && !in_array($row['family_plan'],$family_plan)) { if (!empty($row['family_plan']) && !in_array($row['family_plan'],$family_plan)) {
throw new ImportRowException(__('plan.NOT_MATCH', [ throw new ImportRowException(__('plan.NOT_MATCH', [
'attribute' => 'Family Plan', 'attribute' => 'Family Plan',
'code' => $row['family_plan'] 'code' => $row['family_plan']
]), 0, null, $row); ]), 0, null, $row);
} }
if (!empty($row['prorate_type']) && !in_array($row['prorate_type'], $prorate_type)) { if (!empty($row['prorate_type']) && !in_array($row['prorate_type'], $prorate_type)) {
throw new ImportRowException(__('plan.NOT_MATCH', [ throw new ImportRowException(__('plan.NOT_MATCH', [
@@ -171,7 +171,7 @@ class CorporateService
'code' => $row['service_code'] 'code' => $row['service_code']
]), 0, null, $row); ]), 0, null, $row);
} }
if (empty($row['plan_code'])) { if (empty($row['plan_code'])) {
throw new ImportRowException(__('benefit.PLAN_CODE_REQUIRED'), 0, null, $row); throw new ImportRowException(__('benefit.PLAN_CODE_REQUIRED'), 0, null, $row);
} else if (!in_array($row['plan_code'], $current_corporate_plans)){ } else if (!in_array($row['plan_code'], $current_corporate_plans)){
@@ -181,21 +181,21 @@ class CorporateService
// ]), 0, null, $row); // ]), 0, null, $row);
} }
if (empty($row['code'])) { if (empty($row['code'])) {
throw new ImportRowException(__('plan.REQUIRED', [ throw new ImportRowException(__('plan.REQUIRED', [
'attribute' => 'Benefit Code' 'attribute' => 'Benefit Code'
]), 0, null, $row); ]), 0, null, $row);
} }
if (empty($row['corporate_benefit_code'])) { if (empty($row['corporate_benefit_code'])) {
throw new ImportRowException(__('Customer Benefit Code Required', [ throw new ImportRowException(__('Customer Benefit Code Required', [
'attribute' => 'Customer Benefit Code' 'attribute' => 'Customer Benefit Code'
]), 0, null, $row); ]), 0, null, $row);
} }
if (empty($row['description'])) { if (empty($row['description'])) {
throw new ImportRowException(__('plan.REQUIRED', [ throw new ImportRowException(__('plan.REQUIRED', [
'attribute' => 'Description' 'attribute' => 'Description'
@@ -216,16 +216,16 @@ class CorporateService
'attribute' => 'Gender' 'attribute' => 'Gender'
]), 0, null, $row); ]), 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); 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); throw new ImportRowException(__('plan.MAX_FREQUENCY'), 0, null, $row);
} }
// if (empty($row['limit_free_tc'])){ // if (empty($row['limit_free_tc'])){
// throw new ImportRowException(__('plan.REQUIRED', [ // throw new ImportRowException(__('plan.REQUIRED', [

View File

@@ -20,7 +20,7 @@ use Str;
class ClaimRequestService{ 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 { // try {
$organization = False; $organization = False;
@@ -38,7 +38,7 @@ class ClaimRequestService{
$claimRequestData = [ $claimRequestData = [
'code' => $code, 'code' => $code,
'request_log_id' => $requestLogID, 'request_log_id' => $requestLogID ?? 0,
'member_id' => $member->id, 'member_id' => $member->id,
'submission_date' => $submissionDate ?? now(), 'submission_date' => $submissionDate ?? now(),
'status' => $status, 'status' => $status,
@@ -60,6 +60,8 @@ class ClaimRequestService{
// } // }
} }
public static function storeClaimManagement($row, $member, $claim_request_id){ public static function storeClaimManagement($row, $member, $claim_request_id){
try { try {
$organization = 0; $organization = 0;
@@ -100,7 +102,7 @@ class ClaimRequestService{
DB::commit(); DB::commit();
return $claimManagement; return $claimManagement;
} catch (\Exception $error) { } catch (\Exception $error) {
DB::rollBack(); DB::rollBack();
@@ -144,18 +146,18 @@ class ClaimRequestService{
$paymentType = $row['claim_type']; $paymentType = $row['claim_type'];
$status = $row['status']; $status = $row['status'];
$serviceCode = $row['coverage_type']; $serviceCode = $row['coverage_type'];
$newClaimRequest = $this->storeClaimRequest( $newClaimRequest = $this->storeClaimRequest(
row: $row, row: $row,
code: $code, code: $code,
member: $member, member: $member,
paymentType: $paymentType, paymentType: $paymentType,
serviceCode: $serviceCode, serviceCode: $serviceCode,
submissionDate: $submissionDate, submissionDate: $submissionDate,
status: $status, status: $status,
organization_code: $organization_id organization_code: $organization_id
); );
$newlyCreatedID = $newClaimRequest->id; $newlyCreatedID = $newClaimRequest->id;
$newClaimManangement = $this->storeClaimManagement($row, $member, $newlyCreatedID); $newClaimManangement = $this->storeClaimManagement($row, $member, $newlyCreatedID);
@@ -177,4 +179,4 @@ class ClaimRequestService{
} }
} }
} }

View File

@@ -19,6 +19,7 @@
"laravel/socialite": "^5.5", "laravel/socialite": "^5.5",
"laravel/tinker": "^2.7", "laravel/tinker": "^2.7",
"maatwebsite/excel": "^3.1", "maatwebsite/excel": "^3.1",
"mikehaertl/phpwkhtmltopdf": "^2.5",
"nwidart/laravel-modules": "^9.0", "nwidart/laravel-modules": "^9.0",
"phpmailer/phpmailer": "^6.9", "phpmailer/phpmailer": "^6.9",
"psr/simple-cache": "^1.0", "psr/simple-cache": "^1.0",

View File

@@ -235,12 +235,12 @@ export default function Index() {
label: 'Divisi', label: 'Divisi',
isSort: true, isSort: true,
}, },
{ // {
id: 'limit', // id: 'limit',
align: 'center', // align: 'center',
label: 'Limit', // label: 'Limit',
isSort: false, // isSort: false,
}, // },
{ {
id: 'status', id: 'status',
align: 'center', align: 'center',
@@ -292,18 +292,18 @@ export default function Index() {
corporateMembers.data.data.map((obj: any) => { corporateMembers.data.data.map((obj: any) => {
return { return {
...obj, ...obj,
limit: ( // limit: (
<Stack> // <Stack>
<BorderLinearProgress // <BorderLinearProgress
variant="determinate" // variant="determinate"
value={obj.limit.percentage} // value={obj.limit.percentage}
sx={{ mb: 1 }} // sx={{ mb: 1 }}
/> // />
<Typography sx={{ typography: 'caption', color: '#637381' }}> // <Typography sx={{ typography: 'caption', color: '#637381' }}>
{fSplit(obj.limit.current)} / {fSplit(obj.limit.total)} // {fSplit(obj.limit.current)} / {fSplit(obj.limit.total)}
</Typography> // </Typography>
</Stack> // </Stack>
), // ),
status: status:
obj.status === 1 ? ( obj.status === 1 ? (
<Button <Button
@@ -369,12 +369,12 @@ export default function Index() {
</Stack> </Stack>
<Grid container spacing={2}> <Grid container spacing={2}>
<Grid item xs={12} lg={6} md={12}> {/* <Grid item xs={12} lg={6} md={12}>
<CardNotification data={itemList} /> <CardNotification data={itemList} />
</Grid> </Grid>
<Grid item xs={12} lg={6} md={12}> <Grid item xs={12} lg={6} md={12}>
<CardPolicy data={policyData} /> <CardPolicy data={policyData} />
</Grid> </Grid> */}
<Grid item xs={12} lg={12} md={12}> <Grid item xs={12} lg={12} md={12}>
<Table <Table
headCells={headCells} headCells={headCells}

View File

@@ -40,6 +40,7 @@ import TableMoreMenu from '../../components/table/TableMoreMenu';
import EditOutlinedIcon from '@mui/icons-material/EditOutlined'; import EditOutlinedIcon from '@mui/icons-material/EditOutlined';
import VisibilityOutlinedIcon from '@mui/icons-material/VisibilityOutlined'; import VisibilityOutlinedIcon from '@mui/icons-material/VisibilityOutlined';
import Label from '../../components/Label'; import Label from '../../components/Label';
import { enqueueSnackbar } from 'notistack';
/* ---------------------------------- types --------------------------------- */ /* ---------------------------------- types --------------------------------- */
@@ -229,10 +230,32 @@ export default function List() {
}; };
const searchs = { const searchs = {
useSearchs: true,
searchText: searchText, searchText: searchText,
setSearchText: setSearchText, setSearchText: setSearchText,
handleSearchSubmit: handleSearchSubmit, handleSearchSubmit: handleSearchSubmit,
}; };
const [startDateValue, setStartDateValue] = useState('');
const [endDateValue, setEndDateValue] = useState('');
const [statusValue, setStatusValue] = useState('all');
const handleExportReport = async (appliedFilter = null) => {
axios.get(corporateValue + '/export-members/list').then((response) => {
const link = document.createElement('a');
link.href = response.data.data.file_url;
link.setAttribute('download', response.data.data.file_name);
document.body.appendChild(link);
link.click();
// handleClose();
});
}
const exportReport = {
useExport: true,
startDate: startDateValue,
endDate: endDateValue,
status: statusValue,
handleExportReport: handleExportReport
}
/* -------------------------------- headCell -------------------------------- */ /* -------------------------------- headCell -------------------------------- */
const headCells: HeadCell<never>[] = [ const headCells: HeadCell<never>[] = [
@@ -375,6 +398,7 @@ export default function List() {
params={params} params={params}
searchs={searchs} searchs={searchs}
// filters={filters} // filters={filters}
exportReport={exportReport}
/> />
</Stack> </Stack>
); );

View File

@@ -34,5 +34,9 @@
"txtSupportingResultDocument" : "Supporting Result Document", "txtSupportingResultDocument" : "Supporting Result Document",
"txtAddResult" : "Add Result", "txtAddResult" : "Add Result",
"txtServiceType" : "Service Type", "txtServiceType" : "Service Type",
"txtAdditionalDocuments" : "Additional Documents" "txtAdditionalDocuments" : "Additional Documents",
"txtAddNew" : "Add New",
"txtAddress" : "Address",
"txtProvider": "Provider",
"txtAlertProvider" : "Please enter provider"
} }

View File

@@ -34,5 +34,9 @@
"txtSupportingResultDocument" : "Dokumen Hasil Pendukung", "txtSupportingResultDocument" : "Dokumen Hasil Pendukung",
"txtAddResult" : "Tambah Hasil", "txtAddResult" : "Tambah Hasil",
"txtServiceType" : "Tipe Layanan", "txtServiceType" : "Tipe Layanan",
"txtAdditionalDocuments" : "Dokumen Tambahan" "txtAdditionalDocuments" : "Dokumen Tambahan",
"txtAddNew" : "Tambah Baru",
"txtAddress" : "Alamat",
"txtProvider": "Penyedia",
"txtAlertProvider" : "Mohon masukan provider"
} }

View File

@@ -16,10 +16,14 @@ import { useRef, useState, useContext } from 'react';
import { makeFormData } from '@/utils/jsonToFormData'; import { makeFormData } from '@/utils/jsonToFormData';
import { format } from 'date-fns'; import { format } from 'date-fns';
import { LanguageContext } from '@/contexts/LanguageContext'; import { LanguageContext } from '@/contexts/LanguageContext';
import Autocomplete from '@mui/material/Autocomplete';
import TextField from '@mui/material/TextField';
import Button from '@mui/material/Button';
interface MemberType { interface MemberType {
members: any; members: any;
services: any; services: any;
providers:any;
} }
interface FormRequestClaimProps { interface FormRequestClaimProps {
member: MemberType; member: MemberType;
@@ -28,9 +32,15 @@ interface FormRequestClaimProps {
export default function FormRequestClaim({ member, handleSubmitSuccess }: FormRequestClaimProps) { export default function FormRequestClaim({ member, handleSubmitSuccess }: FormRequestClaimProps) {
const { localeData }: any = useContext(LanguageContext); const { localeData }: any = useContext(LanguageContext);
const [serviceCode, setServiceCode] = useState<string>(''); const [serviceCode, setServiceCode] = useState<string>('');
const [idProvider, setIdProvider] = useState<number>(0);
const [submitLoading, setSubmitLoading] = useState<boolean>(false); const [submitLoading, setSubmitLoading] = useState<boolean>(false);
function submitRequest() { function submitRequest() {
if(!idProvider&& (name == '' || alamat == ''))
{
enqueueSnackbar(localeData.txtAlertProvider, { variant: 'warning' });
return false;
}
if(serviceCode == '') if(serviceCode == '')
{ {
enqueueSnackbar(localeData.txtDialogMember4, { variant: 'warning' }); enqueueSnackbar(localeData.txtDialogMember4, { variant: 'warning' });
@@ -39,7 +49,10 @@ export default function FormRequestClaim({ member, handleSubmitSuccess }: FormRe
setSubmitLoading(true); setSubmitLoading(true);
const formData = { const formData = {
member_id: member.members.id, member_id: member.members.id,
service_code: serviceCode service_code: serviceCode,
id_provider: idProvider,
name_provider : name,
address_provider: alamat
}; };
axios axios
.post('/request-log', formData) .post('/request-log', formData)
@@ -64,8 +77,26 @@ export default function FormRequestClaim({ member, handleSubmitSuccess }: FormRe
name: string; name: string;
} }
interface Providers {
id: number;
name: string;
}
const [showAddNewForm, setShowAddNewForm] = useState(false);
const [name, setName] = useState('');
const [alamat, setAlamat] = useState('');
const handleAddNewData = () => {
// Logika untuk menambahkan data baru ke database
// Pastikan untuk menyesuaikan logika ini sesuai dengan kebutuhan aplikasi Anda
console.log('Adding new data:', { name, alamat });
// Setelah menambahkan data baru, Anda mungkin ingin melakukan sesuatu seperti menutup formulir tambahan atau melakukan pengaturan lainnya
setShowAddNewForm(false);
};
return ( return (
<Stack direction="column" spacing={4}> <Stack direction="column" spacing={2}>
<Stack direction="row" justifyContent={'end'} sx={{ marginBottom: 2 }} spacing={2}> <Stack direction="row" justifyContent={'end'} sx={{ marginBottom: 2 }} spacing={2}>
<Typography variant='body2' sx={{color: '#757575'}}> <Typography variant='body2' sx={{color: '#757575'}}>
{localeData.txtDialogMember5} {localeData.txtDialogMember5}
@@ -74,27 +105,71 @@ export default function FormRequestClaim({ member, handleSubmitSuccess }: FormRe
</Stack> </Stack>
<Stack direction="row" spacing={2}> <Stack direction="row" spacing={2}>
<Stack spacing={2} sx={{width:'100%'}}> <Stack spacing={2} sx={{ width: '100%' }}>
<Typography variant='subtitle1'>{localeData.txtDialogMember1}*</Typography> <Typography variant='subtitle1'>{localeData.txtProvider} *</Typography>
<FormControl> <Autocomplete
<InputLabel htmlFor="service_type"> id="provider"
{localeData.txtDialogMember1} options={[{ name: localeData.txtAddNew, id: 0 }, ...member?.providers || []]}
</InputLabel> getOptionLabel={(option: Providers) => option.name || ''}
<Select value={member?.providers.find((item: Providers) => item.id === idProvider) || null}
id="service_type" onChange={(event: React.ChangeEvent<{}>, newValue: Providers | null) => {
value={serviceCode} if (newValue?.id === 0) {
// Pengguna memilih opsi "Tambahkan Data Baru"
setIdProvider(0); // Reset nilai
setShowAddNewForm(true); // Menampilkan formulir tambahan
} else {
// Pengguna memilih opsi dari hasil pencarian
setIdProvider(newValue?.id || 0);
setShowAddNewForm(false); // Menyembunyikan formulir tambahan
}
}}
renderInput={(params) => (
<TextField
{...params}
label={localeData.txtProvider}
fullWidth fullWidth
label={localeData.txtDialogMember1} />
onChange={(e) => { )}
setServiceCode(e.target.value); />
}} {showAddNewForm && (
> <Stack direction="column" spacing={1} padding={1}>
{member && member?.services?.map((item: MemberService, index:number) => ( <Typography variant='body2'>{localeData.txtAddNew} *</Typography>
<MenuItem key={index} value={item.service_code}>{item.name}</MenuItem> <TextField
))} label={localeData.txtName}
</Select> fullWidth
onChange={(e) => setName(e.target.value)}
/>
<TextField
label={localeData.txtAddress}
fullWidth
onChange={(e) => setAlamat(e.target.value)}
/>
</Stack>
)}
<FormHelperText style={{ color: 'red' }}></FormHelperText>
</Stack>
</Stack>
<Stack direction="row" spacing={2}>
<Stack spacing={2} sx={{ width: '100%' }}>
<Typography variant='subtitle1'>{localeData.txtDialogMember1} *</Typography>
<Autocomplete
id="service_type"
options={member?.services || []}
getOptionLabel={(option: MemberService) => option.name || ''}
value={member?.services.find((item: MemberService) => item.service_code === serviceCode) || null}
onChange={(event: React.ChangeEvent<{}>, newValue: MemberService | null) => {
setServiceCode(newValue?.service_code || '');
}}
renderInput={(params) => (
<TextField
{...params}
label={localeData.txtDialogMember1}
fullWidth
/>
)}
/>
<FormHelperText style={{ color: 'red' }}></FormHelperText> <FormHelperText style={{ color: 'red' }}></FormHelperText>
</FormControl>
</Stack> </Stack>
</Stack> </Stack>