add validasi import member ship
This commit is contained in:
@@ -247,4 +247,108 @@ class CorporateMemberController extends Controller
|
|||||||
$pdf = PDF::loadView('pdf.guaranted_leter', compact(['member', 'dateOfAdmission']));
|
$pdf = PDF::loadView('pdf.guaranted_leter', compact(['member', 'dateOfAdmission']));
|
||||||
return $pdf->download('Guaranted Letter - '.$member->full_name.'.pdf');
|
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')
|
||||||
|
]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -91,6 +91,7 @@ Route::prefix('internal')->group(function () {
|
|||||||
Route::put('corporates/{corporate_id}/divisions/{id}', [DivisionController::class, 'update']);
|
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', [CorporateMemberController::class, 'index']);
|
||||||
|
Route::get('corporates/{corporate_id}/members/list', [CorporateMemberController::class, 'generateMemberList']);
|
||||||
Route::post('corporates/{corporate_id}/members/import', [CorporateMemberController::class, 'import']);
|
Route::post('corporates/{corporate_id}/members/import', [CorporateMemberController::class, 'import']);
|
||||||
Route::put('members/{member_id}/activation', [CorporateMemberController::class, 'activation']);
|
Route::put('members/{member_id}/activation', [CorporateMemberController::class, 'activation']);
|
||||||
|
|
||||||
|
|||||||
@@ -174,6 +174,7 @@ class MemberEnrollmentService
|
|||||||
"ingestion_code" => "Ingestion Code",
|
"ingestion_code" => "Ingestion Code",
|
||||||
"ingestion_status" => "Ingestion Status",
|
"ingestion_status" => "Ingestion Status",
|
||||||
];
|
];
|
||||||
|
|
||||||
public $result_doc_headers = [
|
public $result_doc_headers = [
|
||||||
"Record Mode",
|
"Record Mode",
|
||||||
"Record Type",
|
"Record Type",
|
||||||
@@ -246,6 +247,78 @@ class MemberEnrollmentService
|
|||||||
"Ingestion Status",
|
"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)
|
public function __construct(Member $member)
|
||||||
{
|
{
|
||||||
$this->member = $member;
|
$this->member = $member;
|
||||||
@@ -462,9 +535,13 @@ class MemberEnrollmentService
|
|||||||
"members_expire_date" => $row['member_expiry_date'] ?? null,
|
"members_expire_date" => $row['member_expiry_date'] ?? null,
|
||||||
"activation_date" => $row['activation_date'] ?? null,
|
"activation_date" => $row['activation_date'] ?? null,
|
||||||
"terminated_date" => $row['date_terminated'] ?? 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']) {
|
if (!isset($corporate->currentPolicy) || $corporate->currentPolicy->code != $row['policy_number']) {
|
||||||
throw new ImportRowException(__('enrollment.POLICY_NUMBER_NOT_MATCH', [
|
throw new ImportRowException(__('enrollment.POLICY_NUMBER_NOT_MATCH', [
|
||||||
'policy_id' => $row['policy_number']
|
'policy_id' => $row['policy_number']
|
||||||
@@ -556,6 +633,7 @@ class MemberEnrollmentService
|
|||||||
|
|
||||||
switch ($row['record_mode']) {
|
switch ($row['record_mode']) {
|
||||||
case "1": // New Member
|
case "1": // New Member
|
||||||
|
$this->validateRow($row);
|
||||||
$member = Member::query()
|
$member = Member::query()
|
||||||
->where('member_id', $row['member_id'])
|
->where('member_id', $row['member_id'])
|
||||||
// ->whereHas('employeds', function ($query) use ($corporate) {
|
// ->whereHas('employeds', function ($query) use ($corporate) {
|
||||||
@@ -608,11 +686,6 @@ class MemberEnrollmentService
|
|||||||
if (!$plan) {
|
if (!$plan) {
|
||||||
throw new ImportRowException(__('enrollment.PLAN_NOT_FOUND'), 0, null, $row);
|
throw new ImportRowException(__('enrollment.PLAN_NOT_FOUND'), 0, null, $row);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
$this->validateRow($row);
|
|
||||||
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
DB::beginTransaction();
|
DB::beginTransaction();
|
||||||
@@ -675,6 +748,7 @@ class MemberEnrollmentService
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case "2": // Member Information Update (Without Replacement Card)
|
case "2": // Member Information Update (Without Replacement Card)
|
||||||
|
$this->validateRow($row);
|
||||||
$member = Member::query()
|
$member = Member::query()
|
||||||
->where('member_id', $row['member_id'])
|
->where('member_id', $row['member_id'])
|
||||||
->first();
|
->first();
|
||||||
@@ -686,9 +760,6 @@ class MemberEnrollmentService
|
|||||||
'policy_id' => $row['policy_number']
|
'policy_id' => $row['policy_number']
|
||||||
]), 0, null, $row);
|
]), 0, null, $row);
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->validateRow($row);
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$memberPolicy = MemberPolicy::query()
|
$memberPolicy = MemberPolicy::query()
|
||||||
->where('policy_id', $row['policy_number'])
|
->where('policy_id', $row['policy_number'])
|
||||||
|
|||||||
32
app/Http/Resources/MemberListResource.php
Normal file
32
app/Http/Resources/MemberListResource.php
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Resources;
|
||||||
|
|
||||||
|
use Illuminate\Http\Resources\Json\JsonResource;
|
||||||
|
|
||||||
|
class MemberListResource extends JsonResource
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Transform the resource into an array.
|
||||||
|
*
|
||||||
|
* @param \Illuminate\Http\Request $request
|
||||||
|
* @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
|
||||||
|
*/
|
||||||
|
public function toArray($request)
|
||||||
|
{
|
||||||
|
$data = parent::toArray($request);
|
||||||
|
$data['claim_grouped_by_status'] = $this->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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -147,6 +147,12 @@ class Member extends Model
|
|||||||
->latest(); // TODO Fix This
|
->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()
|
public function policies()
|
||||||
{
|
{
|
||||||
return $this->hasMany(MemberPolicy::class, 'member_id', 'member_id');
|
return $this->hasMany(MemberPolicy::class, 'member_id', 'member_id');
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
return new class extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
Schema::table('members', function (Blueprint $table) {
|
||||||
|
$table->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');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -79,7 +79,6 @@ export default function CorporatePlanList() {
|
|||||||
.catch((response) => {
|
.catch((response) => {
|
||||||
enqueueSnackbar('Failed getting data. ' + response.message, { variant: 'error' });
|
enqueueSnackbar('Failed getting data. ' + response.message, { variant: 'error' });
|
||||||
});
|
});
|
||||||
// console.log(response.data);
|
|
||||||
setDataTableLoading(false);
|
setDataTableLoading(false);
|
||||||
|
|
||||||
setDataTableData(response.data);
|
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 = () => {
|
const handleCancelImportButton = () => {
|
||||||
importPlan.current.value = '';
|
importPlan.current.value = '';
|
||||||
importPlan.current.dispatchEvent(new Event('change', { bubbles: true }));
|
importPlan.current.dispatchEvent(new Event('change', { bubbles: true }));
|
||||||
@@ -254,6 +266,7 @@ export default function CorporatePlanList() {
|
|||||||
>
|
>
|
||||||
Download Template
|
Download Template
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
|
<MenuItem onClick={handleMemberList}>Download Member</MenuItem>
|
||||||
</Menu>
|
</Menu>
|
||||||
</Stack>
|
</Stack>
|
||||||
)}
|
)}
|
||||||
|
|||||||
0
public/files/Corporate Membership Import List.xlsx
Executable file
0
public/files/Corporate Membership Import List.xlsx
Executable file
BIN
public/files/CorporateMembershipList.xlsx
Normal file
BIN
public/files/CorporateMembershipList.xlsx
Normal file
Binary file not shown.
Reference in New Issue
Block a user