Merge remote-tracking branch 'origin/staging'

This commit is contained in:
Linksehat Staging Server
2023-06-13 11:39:11 +07:00
1984 changed files with 7613 additions and 2056 deletions

0
Modules/Internal/Config/.gitkeep Normal file → Executable file
View File

0
Modules/Internal/Config/config.php Normal file → Executable file
View File

0
Modules/Internal/Console/.gitkeep Normal file → Executable file
View File

0
Modules/Internal/Database/Migrations/.gitkeep Normal file → Executable file
View File

0
Modules/Internal/Database/Seeders/.gitkeep Normal file → Executable file
View File

View File

0
Modules/Internal/Database/factories/.gitkeep Normal file → Executable file
View File

0
Modules/Internal/Emails/SendVerifyEmail.php Normal file → Executable file
View File

0
Modules/Internal/Entities/.gitkeep Normal file → Executable file
View File

0
Modules/Internal/Events/ForgetPassword.php Normal file → Executable file
View File

0
Modules/Internal/Http/Controllers/.gitkeep Normal file → Executable file
View File

View File

View File

@@ -0,0 +1,90 @@
<?php
namespace Modules\Internal\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Models\AuditTrail;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Modules\Internal\Transformers\AuditTrailResource;
class AuditTrailController extends Controller {
/**
* Display a listing of the resource.
* @return Renderable
*/
public function index(Request $request, $id)
{
$audittrails = AuditTrail::query()
->where('model', '=', $request->model)
->where('model_id', '=', $id)
// ->latest()
->paginate(1000);
return response()->json(Helper::paginateResources(AuditTrailResource::collection($audittrails)));
}
/**
* Show the form for creating a new resource.
* @return Renderable
*/
public function create()
{
return view('internal::create');
}
/**
* Store a newly created resource in storage.
* @param Request $request
* @return Renderable
*/
public function store(Request $request)
{
//
}
/**
* Show the specified resource.
* @param int $id
* @return Renderable
*/
public function show($id)
{
$appointments = Appointment::query()
->with('doctor.user', 'doctor.speciality', 'appointmentDetail', 'healthCare')
->where('nID', $id)
->first();
return response()->json(new AppointmentResource($appointments));
}
/**
* Show the form for editing the specified resource.
* @param int $id
* @return Renderable
*/
public function edit($id)
{
return view('internal::edit');
}
/**
* Update the specified resource in storage.
* @param Request $request
* @param int $id
* @return Renderable
*/
public function update(Request $request, $id)
{
//
}
/**
* Remove the specified resource from storage.
* @param int $id
* @return Renderable
*/
public function destroy($id)
{
//
}
}
?>

View File

View File

View File

162
Modules/Internal/Http/Controllers/Api/ClaimController.php Normal file → Executable file
View File

@@ -13,6 +13,8 @@ use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Modules\Internal\Transformers\ClaimShowResource;
use Box\Spout\Reader\Common\Creator\ReaderEntityFactory;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
use PDF;
class ClaimController extends Controller
@@ -177,6 +179,7 @@ class ClaimController extends Controller
$order = 1;
$data = [];
$claim->items()->forceDelete();
$totalClaim = 0;
foreach ($request->benefit_items as $benefitItem) {
$benefit = Benefit::find($benefitItem['id']);
if ($benefit) {
@@ -189,10 +192,16 @@ class ClaimController extends Controller
'nominal_dicover' => $benefitItem['biaya_disetujui'] ?? 0,
'nominal_total' => $benefitItem['biaya_disetujui'] ?? 0,
]);
$totalClaim += $benefitItem['biaya_disetujui'];
}
$order++;
}
// Update total
$claim->total_claim = $totalClaim;
$claim->save();
return Helper::responseJson([], message: "Item Claim berhasil di update");
}
@@ -285,4 +294,157 @@ class ClaimController extends Controller
return $view;
}
public function dataClaimReport(Request $request){
$file_name = 'Data Claim Report';
// Membuat penulis entitas Spout
$writer = WriterEntityFactory::createXLSXWriter();
// Membuka penulis untuk menulis ke file
$writer->openToFile(public_path('files/CorporatePlan&BenefitImportData.xlsx'));
// Sheet 1
$writer->getCurrentSheet()->setName('Worksheet');
$headers_map_to_table_fields = Claim::$listing_doc_headers;
$headerRow = WriterEntityFactory::createRowFromArray($headers_map_to_table_fields);
$writer->addRow($headerRow);
$claims = Claim::with([
'member',
'member.currentPolicy',
'member.currentPlan',
'member.currentCorporate',
'diagnoses' => function ($diagnosis) {
return $diagnosis->where('type', 'primary');
},
'diagnoses.icd',
'plan',
'benefit',
'claimRequest',
'claimRequest.service'
])
// ->latest()
->get()->toArray();
foreach ($claims as $index => $row){
$rowData = [
'', // Count of Usage
$row['code'], // Claim Number
'', // Insurar Code
$row['member']['current_policy']? $row['member']['current_policy']['code'] : '', // Policy no
$row['member']['current_corporate']? $row['member']['current_corporate']['name'] : '', // Corporate Name
$row['member']['current_plan']? $row['member']['current_plan']['code'] : '', // Plan Code
$row['member']['name'], // Member Name
$row['member']['record_type'], // Member Status
$row['member']['birth_date'], // Date of brith
$row['member']['member_id'], // Member Number
$row['member']['current_corporate']? $row['member']['current_corporate']['code'] : '', // Institution Code
'', // Invoice Line Number
$row['status'], // Claim Status
'', // Admission Date
'', // Discharge Date
'', // Date Of Service
'', // Place Of Service
'', // Los
'', // Provider code
'', // Treating Doctor Code
'', // Treating Doctor Name
'', // Doctor Title
$row['diagnoses']?$row['diagnoses'][0]['icd']['name']: '-', // Diagnosis
$row['plan']?$row['plan']['service_code']: '', // Service Code
$row['plan']?$row['plan']['type'] : '', // ServiceType
$row['claim_request'] ? $row['claim_request']['service']['description'] : '', // ServiceDescription
'', // UnitPrice
'', // Quantity
'', // Tarif
'', // Claimable amount
'', // Paid by customer
'', // HD Disc
'', // Doctor Notes
'', // ConsultationID Date
'', // Pharmacy Code
'', // Pharmacy Name
'', // Pharmacy Permit Number
'', // Pharmacy Address
'', // Pharmacy Phone number
'', // Delivery Address
'', // Claimable Status
$row['claim_request'] ? $row['claim_request']['service']['description'] : '', // ServiceDescription, // Benefit Code
];
$row = WriterEntityFactory::createRowFromArray($rowData);
$writer->addRow($row);
}
// $dataClaim = Claim::query
// $dataPlans = Claim::query()
// ->filter($request->all())
// ->where('corporate_id', $corporate_id)
// // ->whereHas('corporatePlan', function ($corporatePlan) use ($corporate_id) {
// // $corporatePlan->where('corporate_id', $corporate_id);
// // })
// // ->with('corporatePlan')
// ->orderBy('corporate_plan_id', 'asc')
// ->get()->toArray();
// foreach ($dataPlans as $index => $row){
// $rowData = [
// $row['service_code'], // Service
// $row['corporate_plan_id'], // Plan
// $row['code'], // Customer plans
// $row['type'], // Plan Type
// $row['start'], // Start Date of Plan
// $row['end'], // End Date of Plan
// $row['require_referral'], // Referral
// $row['referral_source'], // Referral Source
// $row['referral_duration'], // Referral Duration
// $row['family_plan'], // Family Plan
// $row['family_plan_share_rules'], // Family Sharing Overflow
// $row['limit_rules'], // Plan Limit
// $row['layer'], // Layer ID
// $row['layer_conditions'], // Layer Condition
// $row['budget_type'], // Budget Type
// $row['budget_code'], // Budget Code
// $row['budget_conditions'], // Budget Condition
// $row['surgery_limit'], // Surgery
// $row['non_surgery_limit'], // Non Surgery
// $row['max_claim_limit'], // Max/Claim
// $row['max_claim_count'], // Max Count of Claim
// $row['area_limit'], // Area
// $row['limit_shared_plans'], // Shared Plan
// $row['limit_shared_plan_type'], // Shared Plan Type
// $row['cashless_percentage'], // Cashless(%)
// $row['reimbursement_percentage'], // Reimbursement(%)
// $row['digital_percentage'], // Digital(%)
// $row['co_share_m_percentage'], // CoShareM(%)
// $row['co_share_s_percentage'], // CoShareS(%)
// $row['co_share_c_percentage'], // CoShareC(%)
// $row['cashless_deductible'], // Cashless Deductible
// $row['cashless_deductible'], // Reimbursement Deductible
// $row['digital_deductible'], // Digital Deductible
// $row['co_share_m_deductible'], // DeductibleM
// $row['co_share_s_deductible'], // DeductibleS
// $row['co_share_c_deductible'], // DeductibleC
// $row['co_share_deductible_condition'], // Co-share & Deductible Condition
// $row['msc'], // MSC
// $row['genders'], // Gender
// $row['min_age'], // Min Age
// $row['max_age'], // Max Age
// $row['rule_of_excess'], // Rule of Excess
// $row['max_excess_covered'], // Max Excess Covered
// $row['prorate_type'], // Prorate Type
// $row['prorate_lookup'], // Prorate Lookup
// $row['currency'], // Currency
// $row['max_surgery_reinstatement_days'], // Reinstatement days for Surgery NonSurgery
// $row['max_surgery_periode_days'], // Max Periode of Surgery Non Surgery
// ];
// $row = WriterEntityFactory::createRowFromArray($rowData);
// $writer->addRow($row);
// }
$writer->close();
return Helper::responseJson([
'file_name' => "Data Claim Report " . date('Y-m-d h:i:s'),
"file_url" => url('files/CorporatePlan&BenefitImportData.xlsx')
]);
}
}

View File

View File

@@ -34,6 +34,7 @@ class CorporateBenefitController extends Controller
$benefit = CorporateBenefit::findOrFail($benefit_id);
$benefit->active = $request->active == '1';
$benefit->reason = $request->reason;
if ($benefit->save()) {
return response()->json([

View File

@@ -19,6 +19,7 @@ use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Maatwebsite\Excel\Facades\Excel;
use Box\Spout\Reader\Common\Creator\ReaderEntityFactory;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
use App\Models\File;
use Illuminate\Support\Facades\File as FacadesFile;
use Illuminate\Support\Facades\Response;
@@ -81,6 +82,7 @@ class CorporateController extends Controller
$request->validate([
'code' => 'required|regex:/^[a-zA-Z0-9]+$/',
'name' => 'required',
'payor_id' => 'required',
// 'logo' => 'required',
'policy_code' => 'required_with:policy_id',
'policy_total_premi' => 'required_with:policy_code',
@@ -100,6 +102,7 @@ class CorporateController extends Controller
if ($request->has('policy_code') && !empty($request->policy_code)) {
$newCorporate->policies()->create([
'code' => $request->policy_code ?? NULL,
'payor_id' => $request->payor_id ?? NULL,
'total_premi' => $request->policy_total_premi ?? NULL,
'minimal_deposit_percentage' => $request->policy_minimal_deposit_percentage ?? NULL,
'minimal_deposit_net' => $request->policy_minimal_deposit_net ?? NULL,
@@ -301,6 +304,7 @@ class CorporateController extends Controller
{
$request->validate([
'code' => 'required|regex:/^[a-zA-Z0-9]+$/',
'payor_id' => 'required',
'name' => 'required',
'policy_code' => 'required_with:policy_id',
'policy_total_premi' => 'required_with:policy_code',
@@ -327,6 +331,7 @@ class CorporateController extends Controller
['id' => $request->policy_id],
[
'code' => $request->policy_code ?? NULL,
'payor_id' => $request->payor_id ?? NULL,
'total_premi' => $request->policy_total_premi ?? NULL,
'minimal_deposit_percentage' => $request->policy_minimal_deposit_percentage ?? NULL,
'minimal_deposit_net' => $request->policy_minimal_deposit_net ?? NULL,
@@ -455,7 +460,6 @@ class CorporateController extends Controller
} else if ($sheet->getName() == 'Benefit') {
$corporateService->handleBenefitRow($corporate, $row_data);
}
// Write Success Result to File
$import->addArrayToRow(array_merge($row_data, [
'Ingest Code' => 200,
@@ -519,5 +523,191 @@ class CorporateController extends Controller
break;
}
}
public function dataPlanBenefit(Request $request, $corporate_id){
$file_name = 'Corporate Plan and Benefit';
// Membuat penulis entitas Spout
$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;
$headerRow = WriterEntityFactory::createRowFromArray($headers_map_to_table_fields);
$writer->addRow($headerRow);
$dataPlans = Plan::query()
->filter($request->all())
->where('corporate_id', $corporate_id)
// ->whereHas('corporatePlan', function ($corporatePlan) use ($corporate_id) {
// $corporatePlan->where('corporate_id', $corporate_id);
// })
// ->with('corporatePlan')
->orderBy('corporate_plan_id', 'asc')
->get()->toArray();
foreach ($dataPlans as $index => $row){
$rowData = [
$row['service_code'], // Service
$row['corporate_plan_id'], // Plan
$row['code'], // Customer plans
$row['type'], // Plan Type
$row['start'], // Start Date of Plan
$row['end'], // End Date of Plan
$row['require_referral'], // Referral
$row['referral_source'], // Referral Source
$row['referral_duration'], // Referral Duration
$row['family_plan'], // Family Plan
$row['family_plan_share_rules'], // Family Sharing Overflow
$row['limit_rules'], // Plan Limit
$row['layer'], // Layer ID
$row['layer_conditions'], // Layer Condition
$row['budget_type'], // Budget Type
$row['budget_code'], // Budget Code
$row['budget_conditions'], // Budget Condition
$row['surgery_limit'], // Surgery
$row['non_surgery_limit'], // Non Surgery
$row['max_claim_limit'], // Max/Claim
$row['max_claim_count'], // Max Count of Claim
$row['area_limit'], // Area
$row['limit_shared_plans'], // Shared Plan
$row['limit_shared_plan_type'], // Shared Plan Type
$row['cashless_percentage'], // Cashless(%)
$row['reimbursement_percentage'], // Reimbursement(%)
$row['digital_percentage'], // Digital(%)
$row['co_share_m_percentage'], // CoShareM(%)
$row['co_share_s_percentage'], // CoShareS(%)
$row['co_share_c_percentage'], // CoShareC(%)
$row['cashless_deductible'], // Cashless Deductible
$row['cashless_deductible'], // Reimbursement Deductible
$row['digital_deductible'], // Digital Deductible
$row['co_share_m_deductible'], // DeductibleM
$row['co_share_s_deductible'], // DeductibleS
$row['co_share_c_deductible'], // DeductibleC
$row['co_share_deductible_condition'], // Co-share & Deductible Condition
$row['msc'], // MSC
$row['genders'], // Gender
$row['min_age'], // Min Age
$row['max_age'], // Max Age
$row['rule_of_excess'], // Rule of Excess
$row['max_excess_covered'], // Max Excess Covered
$row['prorate_type'], // Prorate Type
$row['prorate_lookup'], // Prorate Lookup
$row['currency'], // Currency
$row['max_surgery_reinstatement_days'], // Reinstatement days for Surgery NonSurgery
$row['max_surgery_periode_days'], // Max Periode of Surgery Non Surgery
];
$row = WriterEntityFactory::createRowFromArray($rowData);
$writer->addRow($row);
}
// Menutup penulis
// Sheet 2
$writer->addNewSheetAndMakeItCurrent();
$writer->getCurrentSheet()->setName('Benefit');
$headers_map_to_table_fields = CorporateBenefit::$listing_doc_headers;
$headerRow = WriterEntityFactory::createRowFromArray($headers_map_to_table_fields);
$writer->addRow($headerRow);
$dataBenfit = CorporateBenefit::query()
->where('corporate_id', $corporate_id)
->with('benefit', 'plan')
->orderBy('plan_id', 'asc')
->get()->toArray();
// dd($dataBenfit);
foreach($dataBenfit as $index => $row){
$rowData = [
$row['benefit']['service_code'] ?? NULL, // "Service",
$row['plan']['type'] ?? NULL, // "Plan",
$row['benefit']['code'] ?? NULL, // "Benefit Code",
$row['benefit']['code'] ?? NULL, // "Customer Benefit Code",
$row['benefit']['description'] ?? NULL, // "Detail Benefit",
$row['budget'], // "ASO/Budget",
$row['budget_conditions'], // "Budget Condition",
$row['budget_code'], // "Budget Code",
$row['primary_benefit_code'], // "Primary benefit",
$row['benefit_mode'], // "Benefit Mode",
$row['room_class_coverage'], // "Room Class",
$row['max_bed_coverage'], // "Max Bed",
$row['tolerance_parameter'], // "Tolerance Paramater",
$row['max_room_class'], // "Max. Room Class",
$row['limit_amount'], // "Limit Value",
$row['area_limit'], // "Area",
$row['shared_benefit'], // "Shared Benefit With",
$row['shared_benefit_type'], // "Shared Benefit Type",
$row['msc'], // "MSC",
$row['genders'], // "Gender",
$row['min_age'], // "Min Age",
$row['max_age'], // "Max Age",
$row['max_frequency_period'], // "Freq. Period",
$row['daily_frequency'], // "Daily Frequency",
$row['weekly_frequency'], // "Weekly Frequency",
$row['monthly_frequency'], // "Monthly Frequency",
$row['yearly_frequency'], // "Yearly Frequency",
$row['custom_frequency_days'], // "Custom Duration",
$row['custom_duration_value'], // "Custom Duration Value",
NULL, // "Cashless, Reimbursement",
$row['high_plan_factor'], // "High Plan Factor",
$row['pre_post_treatment'], // "Pre Post Treatment",
$row['pre_treatment_days'], // "Pre Treatment",
$row['post_treatment_days'], // "Post Treatment",
$row['layer_type_1'], // "Layer Type 1",
$row['layer_value_1'], // "Layer Value 1",
$row['layer_type_2'], // "Layer Type 2",
$row['layer_value_2'], // "Layer Value 2",
$row['cashless_percentage'], // "Cashless (%)",
$row['reimbursement_percentage'], // "Reimburse (%)",
$row['digital_percentage'], // "Digital (%)",
$row['co_share_m_percentage'], // "CoShareM (%)",
$row['co_share_s_percentage'], // "CoShareS (%)",
$row['co_share_c_deductible'], // "CoShareC (%)",
$row['cashless_deductible'], // "Cashless Deductible",
$row['reimbursement_deductible'], // "Reimbursement Deductible",
$row['digital_deductible'], // "Digital Deductible",
$row['co_share_m_deductible'], // "DeductibleM",
$row['co_share_s_deductible'], // "DeductibleS",
$row['co_share_c_deductible'], // "DeductibleC",
$row['prorate_type'], // "Prorate Type",
$row['prorate_lookup'], // "Prorate Lookup",
$row['max_days_for_disability'], // "Max Days for Disability",
$row['max_period_for_disability'], // "Max Periode of Disability",
$row['currency'], // "Currency",
$row['show_benefit_item'], // "Show Benefit Item",
$row['show_benefit_value'], // "Show Benefit Value",
];
$row = WriterEntityFactory::createRowFromArray($rowData);
$writer->addRow($row);
}
$writer->close();
return Helper::responseJson([
'file_name' => "Data Corporate Plan & Benefit List " . date('Y-m-d h:i:s'),
"file_url" => url('files/CorporatePlan&BenefitImportData.xlsx')
]);
}
public function corporateCode(Request $request){
$corporates = Corporate::query()
->when($request->search, function ($query, $search) {
return $query->where('name', 'LIKE', '%' . $search . '%')
->orWhere('code', 'LIKE', '%' . $search . '%');
})
->with('currentPolicy', 'subCorporates')
->withCount([
'employees',
'corporateBenefits',
'corporatePlans',
// 'claims'
])
->where('active', 1)
->get()
->pluck('code');
return $corporates;
}
}

View File

@@ -6,6 +6,7 @@ use App\Exceptions\ImportRowException;
use App\Helpers\Helper;
use App\Http\Resources\MemberDataTableResource;
use App\Models\Corporate;
use App\Models\CorporateEmployee;
use App\Models\Member;
use Box\Spout\Reader\Common\Creator\ReaderEntityFactory;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
@@ -45,11 +46,16 @@ class CorporateMemberController extends Controller
// return $claim->used(now()->startOfYear(), now()->endOfYear());
},
'currentPlan',
'currentPlan.benefits'
'currentPlan.benefits' => function ($benefit) use ($corporate_id){
return $benefit->where([
'corporate_benefits.active' => 1,
'corporate_benefits.corporate_id' => $corporate_id,
// 'corporate_benefits.plan_id' => $corporate_id,
]);
}
])
->paginate()
->appends($request->all());
return Helper::paginateResources(MemberDataTableResource::collection($members));
}
@@ -63,6 +69,7 @@ class CorporateMemberController extends Controller
$member = Member::findOrFail($member_id);
$member->active = $request->active == '1';
$member->reason = $request->reason;
if ($member->save()) {
return response()->json([
@@ -179,11 +186,9 @@ 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
$singleRow = WriterEntityFactory::createRow($this->memberEnrollmentService->makeResultRowWithResultFormat($rowResponse));
$writer->addRow($singleRow);
@@ -219,7 +224,6 @@ class CorporateMemberController extends Controller
$writer->close();
Storage::delete('temp/' . $file_name);
// throw(404);
return [
'total_success_row' => $imported_member_data,
'total_failed_row' => count($failed_member_data),
@@ -234,21 +238,145 @@ class CorporateMemberController extends Controller
public function generateLog(Request $request, $member_id)
{
$member = Member::findOrFail($member_id)
->load([
'currentPlan',
'currentPolicy',
'currentPlan.corporateBenefits' => function ($benefit) use ($request) {
return $benefit->when($request->benefit_ids, function ($q, $ids) {
return $q->whereIn('benefit_id', $ids);
});
},
'currentPlan.corporateBenefits.benefit']);
$corporate_id = CorporateEmployee::where('member_id', $member_id)->value('corporate_id');
// $member = Member::findOrFail($member_id)
// ->load([
// '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.corporateBenefits' => function ($query) use ($request, $corporate_id) {
$query->when($request->benefit_ids, function ($q, $ids) use ($corporate_id) {
$q->whereIn('benefit_id', $ids)
->where('active', 1)
->where('corporate_id', $corporate_id);
});
},
// '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'));
$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_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')
]);
}
}

View File

@@ -35,6 +35,7 @@ class CorporatePlanController extends Controller
$plan = CorporatePlan::findOrFail($plan_id);
$plan->active = $request->active == '1';
$plan->reason = $request->reason;
if ($plan->save()) {
return response()->json([

View File

@@ -136,6 +136,7 @@ class CorporateServiceController extends Controller
public function corporateServiceUpdate(Request $request, $corporate_id, $service_code)
{
// dd($request->all);
// $corporate = Corporate::findOrFail($corporate_id);
$corporateService = CorporateService::query()
->where('corporate_id', $corporate_id)
@@ -143,7 +144,8 @@ class CorporateServiceController extends Controller
// ->with('configs', 'service')
->first();
$corporateService->fill([
'status' => $request->status == 'active' ? 'active' : 'inactive'
'status' => $request->status == 'active' ? 'active' : 'inactive',
'reason' => $request->reason
]);
$corporateService->save();

View File

View File

View File

View File

View File

View File

View File

View File

View File

View File

@@ -13,10 +13,14 @@ class MemberController extends Controller
* Display a listing of the resource.
* @return Renderable
*/
public function index()
public function index(Request $request)
{
return Member::query()
->with('currentPlan')
->when($request->search, function ($query, $search) {
return $query->where('name', 'LIKE', '%' . $search . '%')
->orWhere('member_id', 'LIKE', '%' . $search . '%');
})
->with('currentPlan', 'currentCorporate')
->paginate();
}

View File

View File

View File

View File

View File

View File

View File

@@ -12,6 +12,7 @@ use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\DB;
use Modules\Internal\Transformers\EncounterResource;
class ClaimEncounterController extends Controller
{
/**
@@ -31,6 +32,13 @@ class ClaimEncounterController extends Controller
{
return view('internal::create');
}
public function getAllData()
{
$encounters = Encounter::with('claim.member')->get();
return Helper::responseJson(data: EncounterResource::collection($encounters), message: 'Data berhasil diambil');
}
/**
* Store a newly created resource in storage.
@@ -255,6 +263,22 @@ class ClaimEncounterController extends Controller
}
}
public function x`counters($claim_id)
{
$claim = Claim::findOrFail($claim_id);
$encounters = $claim->encounters()->get();
return response()->json($encounters);
}
public function getEncounterData($encounter_id)
{
$encounter = Encounter::with('claim.member')->findOrFail($encounter_id);
return Helper::responseJson(data: EncounterResource::make($encounter), message: 'Data berhasil diambil');
}
/**
* Remove the specified resource from storage.
* @param int $id

View File

0
Modules/Internal/Http/Middleware/.gitkeep Normal file → Executable file
View File

0
Modules/Internal/Http/Requests/.gitkeep Normal file → Executable file
View File

0
Modules/Internal/Listeners/SendVerifyEmail.php Normal file → Executable file
View File

0
Modules/Internal/Notifications/NotifyVerifyEmail.php Normal file → Executable file
View File

0
Modules/Internal/Providers/.gitkeep Normal file → Executable file
View File

0
Modules/Internal/Providers/EventServiceProvider.php Normal file → Executable file
View File

0
Modules/Internal/Providers/InternalServiceProvider.php Normal file → Executable file
View File

0
Modules/Internal/Providers/RouteServiceProvider.php Normal file → Executable file
View File

0
Modules/Internal/Resources/assets/.gitkeep Normal file → Executable file
View File

0
Modules/Internal/Resources/assets/js/app.js Normal file → Executable file
View File

0
Modules/Internal/Resources/assets/sass/app.scss Normal file → Executable file
View File

0
Modules/Internal/Resources/lang/.gitkeep Normal file → Executable file
View File

0
Modules/Internal/Resources/views/.gitkeep Normal file → Executable file
View File

0
Modules/Internal/Resources/views/index.blade.php Normal file → Executable file
View File

View File

0
Modules/Internal/Routes/.gitkeep Normal file → Executable file
View File

9
Modules/Internal/Routes/api.php Normal file → Executable file
View File

@@ -30,6 +30,7 @@ use Modules\Internal\Http\Controllers\Api\PlanController;
use Modules\Internal\Http\Controllers\Api\ProvinceController;
use Modules\Internal\Http\Controllers\Api\SpecialityController;
use Modules\Internal\Http\Controllers\Api\VillageController;
use Modules\Internal\Http\Controllers\Api\AuditTrailController;
use Modules\Internal\Http\Controllers\ClaimEncounterController;
/*
@@ -66,6 +67,9 @@ Route::prefix('internal')->group(function () {
Route::get('corporates/import-document-example/{document_type}', [CorporateController::class, 'importDocumentExample']);
Route::put('corporates/{corporate_id}/activation', [CorporateController::class, 'activation']);
Route::post('corporates/{corporate_id}/import-plan-benefit', [CorporateController::class, 'importPlanBenefit']);
Route::get('corporates/{corporate_id}/data-plan-benefit', [CorporateController::class, 'dataPlanBenefit']);
Route::get('corporates/{corporate_id}/code', [CorporateController::class, 'corporateCode']);
Route::get('corporates/{corporate_id}/payor_id', [CorporateController::class, 'corporatePayorId']);
Route::get('corporates/{corporate_id}/corporate-plans', [CorporatePlanController::class, 'index']);
Route::post('corporates/{corporate_id}/corporate-plans', [CorporatePlanController::class, 'store']);
@@ -91,6 +95,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']);
@@ -113,6 +118,9 @@ Route::prefix('internal')->group(function () {
// Route::get('corporates/{corporate_id}/diagnosis-exclusions', [DiagnosisExclusionController::class, 'index']);
// Route::get('corporates/{corporate_id}/diagnosis-exclusions/import', [DiagnosisExclusionController::class, 'import']);
// Audittrail
Route::get('audittrail/{corporate_id}', [AuditTrailController::class, 'index']);
Route::get('master/diagnosis', [DiagnosisController::class, 'index']);
Route::get('master/diagnosis/search', [DiagnosisController::class, 'search']);
Route::get('master/drugs', [DrugController::class, 'index']);
@@ -136,6 +144,7 @@ Route::prefix('internal')->group(function () {
Route::post('claims', [ClaimController::class, 'store']);
Route::get('claims/{id}', [ClaimController::class, 'show']);
Route::post('check-limit', [ClaimController::class, 'checkLimit']);
Route::get('claims/1/data-claim', [ClaimController::class, 'dataClaimReport']);
Route::get('search-organizations', [OrganizationController::class, 'searchOrganization']);
Route::get('search-specialities', [SpecialityController::class, 'searchSpeciality']);

0
Modules/Internal/Routes/web.php Normal file → Executable file
View File

176
Modules/Internal/Services/CorporateService.php Normal file → Executable file
View File

@@ -6,27 +6,131 @@ use App\Exceptions\ImportRowException;
use App\Models\Benefit;
use App\Models\Corporate;
use App\Models\CorporateBenefit;
use App\Models\CorporatePolicy;
use App\Models\Plan;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
class CorporateService
{
protected function validatePlanRow($row)
/*
Refer to Coverage code :
MEDIVAC = Medical evacuation
MSO = Medical second opinion
PAC = Personal Assistant Concierge
OPDE = Outpatient Dental
IP=Inpatient
OP=Outpatient
MA=Maternity
ANC = Ante/Post Natal Care
DE=Dental
GL=Glasses
SP=Special Treatment
PF=Pooled Fund
MCU=Medical Check Up
KB-VACC = Family Planning/Vaccination
LAB = Test Diagnostic
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 = [];
if($plans){
foreach($plans as $plan){
array_push($current_corporate_plans_id,$plan['corporate_plan_id']);
}
}
return $current_corporate_plans_id;
}
protected function validatePlanRow($row, $corporate_id)
{
// $corporate_policy = CorporatePolicy::where('corporate_id', $corporateId)->get();
$plans = Plan::where('corporate_id', $corporate_id)->get()->toArray();
$current_corporate_plans = $this->corporatePlansId($corporate_id);
$plan_code = [1, 2, 3, 4];
$prorate_type = [0, 1, 2];
$family_plan = ['F', 'S', 'N'];
if (empty($row['service_code'])) {
throw new ImportRowException(__('plan.RECORD_TYPE_REQUIRED'), 0, null, $row);
throw new ImportRowException(__('plan.REQUIRED', [
'attribute' => 'Service Code'
] ), 0, null, $row);
} else if (!in_array($row['service_code'], $this->service_code)){
throw new ImportRowException(__('plan.NOT_MATCH', [
'attribute' => 'Service Code',
'code' => $row['service_code']
]), 0, null, $row);
}
if (empty($row['corporate_plan_id'])) {
throw new ImportRowException(__('plan.REQUIRED', [
'attribute' => 'Plan'
]), 0, null, $row);
} else if(!in_array($row['corporate_plan_id'], $current_corporate_plans)){
// throw new ImportRowException(__('plan.NOT_MATCH', [
// 'attribute' => 'Plans',
// 'code' => $row['corporate_plan_id']
// ]), 0, null, $row);
}
if (empty($row['code'])) {
throw new ImportRowException(__('plan.CODE_REQUIRED'), 0, null, $row);
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',
'code' => $row['type']
]), 0, null, $row);
} else if ($row['type'] == 2 && $row['limit_rules'] != 999999999){
throw new ImportRowException(__('plan.LIMIT_PLAN'), 0, null, $row);
}
if (empty($row['type'])) {
throw new ImportRowException(__('plan.TYPE_REQUIRED'), 0, null, $row);
// if (!empty($row['start'])) {
// throw new ImportRowException(__('plan.REQUIRED', [
// 'attribute' => 'Start Date of Plan'
// ]), 0, null, $row);
// }
// if (empty($row['type'])) {
// throw new ImportRowException(__('plan.TYPE_REQUIRED'), 0, null, $row);
// } else if (!in_array($row['type'],$plan_code)){
// throw new ImportRowException(__('plan.NOT_MATCH', [
// 'attribute' => 'Plan Type',
// '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', [
'attribute' => 'Prorate Type',
'code' => $row['prorate_type']
]), 0, null, $row);
}
if (!empty($row['prorate_lookup']) && !in_array($row['prorate_lookup'], $prorate_type)) {
throw new ImportRowException(__('plan.NOT_MATCH', [
'attribute' => 'Prorate Lookup',
'code' => $row['prorate_lookup']
]), 0, null, $row);
}
if (empty($row['limit_rules'])) {
throw new ImportRowException(__('plan.PLAN_LIMIT_REQUIRED'), 0, null, $row);
} else {
}
if (empty($row['msc'])) {
@@ -34,12 +138,13 @@ class CorporateService
}
}
public function handlePlanRow(Corporate $corporate, $row)
{
try {
$plan_data = $row;
$this->validatePlanRow($plan_data, $corporate->id);
$plan_data["corporate_id"] = $corporate->id;
$this->validatePlanRow($plan_data);
$plan = $corporate->plans()->updateOrCreate([
'corporate_plan_id' => $plan_data['corporate_plan_id'],
// 'active' => 0,
@@ -51,43 +156,76 @@ class CorporateService
}
}
protected function validateBenefitRow($row)
protected function validateBenefitRow($row, $corporate_id)
{
$max_frequence = 7;
$budget_aso = [1,2];
$current_corporate_plans = $this->corporatePlansId($corporate_id);
if (empty($row['service_code'])) {
throw new ImportRowException(__('benefit.SERVICE_CODE_REQUIRED'), 0, null, $row);
throw new ImportRowException(__('plan.REQUIRED', [
'attribute' => 'Service Code'
]), 0, null, $row);
} else if (!in_array($row['service_code'], $this->service_code)){
throw new ImportRowException(__('plan.NOT_MATCH', [
'attribute' => 'Service Code',
'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)){
// throw new ImportRowException(__('plan.NOT_MATCH', [
// 'attribute' => 'Plan',
// 'code' => $row['plan_code']
// ]), 0, null, $row);
}
if (empty($row['code'])) {
throw new ImportRowException(__('benefit.BENEFIT_CODE_REQUIRED'), 0, null, $row);
throw new ImportRowException(__('plan.REQUIRED', [
'attribute' => 'Benefit Code'
]), 0, null, $row);
}
if (empty($row['corporate_benefit_code'])) {
throw new ImportRowException(__('benefit.CUSTOMER_BENEFIT_CODE_REQUIRED'), 0, null, $row);
throw new ImportRowException(__('plan.REQUIRED', [
'attribute' => 'Customer Benefit Code'
]), 0, null, $row);
}
if (empty($row['description'])) {
throw new ImportRowException(__('benefit.DESCRIPTION_REQUIRED'), 0, null, $row);
throw new ImportRowException(__('plan.REQUIRED', [
'attribute' => 'Description'
]), 0, null, $row);
}
if (empty($row['limit_amount'])) {
throw new ImportRowException(__('benefit.LIMIT_AMOUNT_REQUIRED'), 0, null, $row);
throw new ImportRowException(__('plan.REQUIRED', [
'attribute' => 'Limit Amount'
]), 0, null, $row);
}
if (empty($row['msc'])) {
throw new ImportRowException(__('benefit.MSC_REQUIRED'), 0, null, $row);
throw new ImportRowException(__('plan.REQUIRED', [
'attribute' => 'MSC'
]), 0, null, $row);
}
if (empty($row['genders'])) {
throw new ImportRowException(__('benefit.GENDER_REQUIRED'), 0, null, $row);
throw new ImportRowException(__('plan.REQUIRED', [
'attribute' => 'Gender'
]), 0, null, $row);
}
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)) {
throw new ImportRowException(__('plan.MAX_FREQUENCY'), 0, null, $row);
}
}
public function handleBenefitRow(Corporate $corporate, $row)
{
try {
$benefit_data = $row;
$this->validateBenefitRow($benefit_data, $corporate->id);
$benefit_data["corporate_id"] = $corporate->id;
$this->validateBenefitRow($benefit_data);
$plan = $corporate->plans()
->where('corporate_plan_id', $benefit_data['plan_code'])
->first();
@@ -101,7 +239,6 @@ class CorporateService
], [
'code' => $benefit_data['code'],
'service_code' => $plan->service_code,
'active' => 1,
'description' => $benefit_data['description'],
]);
@@ -112,7 +249,6 @@ class CorporateService
return $corporateBenefit;
} catch (\Exception $e) {
// dd($e->getMessage());
throw $e;
}
}

6
Modules/Internal/Services/ExclusionService.php Normal file → Executable file
View File

@@ -13,9 +13,9 @@ class ExclusionService
{
protected function validateDiagnosisExclusionRow($row)
{
// if (empty($row['service_code'])) {
// throw new ImportRowException(__('plan.RECORD_TYPE_REQUIRED'), 0, null, $row);
// }
if (empty($row['service_code'])) {
throw new ImportRowException(__('plan.REQUIRED'), 0, null, $row);
}
}
public function handleDiagnosisExclusionRow(Corporate $corporate, $row)

0
Modules/Internal/Services/FormulariumService.php Normal file → Executable file
View File

338
Modules/Internal/Services/MemberEnrollmentService.php Normal file → Executable file
View File

@@ -7,6 +7,7 @@ use App\Helpers\Helper;
use App\Models\Corporate;
use App\Models\CorporateEmployee;
use App\Models\CorporateDivision;
use App\Models\CorporatePolicy;
use App\Models\CorporatePlan;
use App\Models\Member;
use App\Models\MemberPolicy;
@@ -26,7 +27,7 @@ class MemberEnrollmentService
"Payor ID" => "payor_id",
"Member ID" => "member_id",
"Mapping ID" => "principal_id",
"Halodoc Member ID" => "halodoc_member_id",
"LinkSehat Member ID" => "halodoc_member_id",
"Corporate ID" => "corporate_id",
"NIK" => "nik",
"Division" => "division_name",
@@ -50,7 +51,7 @@ class MemberEnrollmentService
"Agent Code / intermediary code" => "agent_code",
"Member Name" => "name",
"Address1" => "address1",
"Address 1" => "address1",
// "Address 1" => "address1",
"Address2" => "address2",
"Address3" => "address3",
"Address4" => "address4",
@@ -90,12 +91,13 @@ class MemberEnrollmentService
"Member Suspended" => "member_suspended",
"Activation Date" => "activation_date",
"Internal Use" => "internal_use_6",
"Date Terminated" => "date_terminated",
"StartNoClaim" => "start_no_claim",
"EndNoClaim" => "end_no_claim",
"Option Mode" => "option_mode",
"Policy Inforce" => "policy_in_force",
"Renewal activation date" => "renewal_activation_date",
"Renewal Activation Date" => "renewal_activation_date",
// "Renewal Activation Date" => "renewal_activation_date",
"Ingestion Code" => "ingestion_code", // TODO I think this should not be here because if user uploading result then ingestion code and status will be filled
"Ingestion Status" => "ingestion_status",
];
@@ -106,7 +108,7 @@ class MemberEnrollmentService
"payor_id" => "Payor ID",
"member_id" => "Member ID",
"principal_id" => "Mapping ID",
"halodoc_member_id" => "Halodoc Member ID",
"halodoc_member_id" => "LinkSehat Member ID",
"corporate_id" => "Corporate ID",
"nik" => "NIK",
"division_name" => "Division",
@@ -129,7 +131,7 @@ class MemberEnrollmentService
"agent_code" => "Agent Code / intermediary code",
"name" => "Member Name",
"address1" => "Address1",
"address1" => "Address 1",
// "address1" => "Address 1",
"address2" => "Address2",
"address3" => "Address3",
"address4" => "Address4",
@@ -168,17 +170,18 @@ class MemberEnrollmentService
"start_no_claim" => "StartNoClaim",
"end_no_claim" => "EndNoClaim",
"option_mode" => "Option Mode",
"renewal_activation_date" => "Renewal Activation Date",
// "renewal_activation_date" => "Renewal Activation Date",
"ingestion_code" => "Ingestion Code",
"ingestion_status" => "Ingestion Status",
];
public $result_doc_headers = [
"Record Mode",
"Record Type",
"Payor ID",
"Member ID",
"Mapping ID",
"Halodoc Member ID",
"LinkSehat Member ID",
"Corporate ID",
"NIK",
"Division",
@@ -201,7 +204,7 @@ class MemberEnrollmentService
"Internal Use",
"Member Name",
"Address1",
"Address 1",
// "Address 1",
"Address2",
"Address3",
"Address4",
@@ -239,11 +242,83 @@ class MemberEnrollmentService
"StartNoClaim",
"EndNoClaim",
"Option Mode",
"Renewal Activation Date",
// "Renewal Activation Date",
"Ingestion Code",
"Ingestion Status",
];
public $listing_doc_headers = [
"Record Mode",
"Record Type",
"Payor ID",
"Member ID",
"Mapping ID",
"LinkSehat 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;
@@ -253,8 +328,26 @@ class MemberEnrollmentService
return is_string($date_from_row) ? Carbon::parse(strtotime($date_from_row)) : Carbon::parse($date_from_row);
}
public function validateDate($dateString, $dateFormat = 'Ymd'){
$date = DateTime::createFromFormat($dateFormat, $dateString);
if ($date && $date->format($dateFormat) == $dateString) {
return true;
} else {
return false;
}
}
protected function validateRow($row)
{
$title =[
'member_effective_date' => 'Member Effective Date',
'member_expiry_date' => 'Member Expired Date',
'activation_date' => 'Activation Date',
'date_of_birth' => 'Date of Birth',
'date_terminated' => 'Date Terminated',
];
if (empty($row['record_type'])) {
throw new ImportRowException(__('enrollment.RECORD_TYPE_REQUIRED'), 0, null, $row);
}
@@ -278,9 +371,31 @@ class MemberEnrollmentService
}
if ($row['record_type'] == 'D') {
$member = Member::query()
->where('member_id', $row['principal_id'])
// ->whereHas('employeds', function ($query) use ($corporate) {
// $query->where('corporate_id', $corporate->id);
// })
->first();
if(empty($member)){
throw new ImportRowException(__('enrollment.PRINCIPAL_NOT_IN_MEMBER_ID'), 0, null, $row);
} else {
if ($member['record_type'] != 'P'){
throw new ImportRowException(__('enrollment.PRINCIPAL_ID_NOT_SAME_MEMBER_ID'), 0, null, $row);
}
}
if (empty($row['principal_id'])) {
throw new ImportRowException(__('enrollment.PRINCIPAL_ID_REQUIRED'), 0, null, $row);
}
if (empty($row['relationship_with_principal'])){
throw new ImportRowException(__('enrollment.RELATIONSHIP_WITH_PRICIPAL_REQUIRED'), 0, null, $row);
}
if (!empty($row['relationship_with_principal']) && !in_array($row['relationship_with_principal'], ['H', 'W', 'D', 'S'])){
throw new ImportRowException(__('enrollment.RELATIONSHIP_WITH_PRICIPAL_NOT_VALID'), 0, null, $row);
}
}
// TODO RECORD BCA ONLY
@@ -312,17 +427,37 @@ class MemberEnrollmentService
if (!empty($row['marital_status']) && !in_array($row['marital_status'], ['S', 'M', 'D'])) {
throw new ImportRowException(__('enrollment.INVALID_MARITAL_STATUS'), 0, null, $row);
}
// TODO EFFECTIVE DATE VALIDATION
if (empty($row['member_effective_date'])) {
throw new ImportRowException(__('enrollment.MEMBER_EFFECTIVE_REQUIRED'), 0, null, $row);
}
// TODO EFFECTIVE DATE VALIDATION
if(!$this->validateDate($row['member_effective_date'])){
throw new ImportRowException(__('enrollment.INVALID_DATE', [
'title' => $title['member_effective_date']
]), 0, null, $row);
}
if (empty($row['member_expiry_date'])) {
throw new ImportRowException(__('enrollment.MEMBER_EXPIRY_REQUIRED'), 0, null, $row);
}
if(!$this->validateDate($row['member_expiry_date'])){
throw new ImportRowException(__('enrollment.INVALID_DATE', [
'title' => $title['member_expiry_date']
]), 0, null, $row);
}
// TODO EFFECTIVE DATE VALIDATION
// if (empty($row['activation_date'])) {
// throw new ImportRowException(__('enrollment.ACTIVATION_DATE_REQUIRED'), 0, null, $row);
// }
if(!empty($row['activation_date'])){
if(!$this->validateDate($row['activation_date'])){
throw new ImportRowException(__('enrollment.INVALID_DATE', [
'title' => $title['activation_date']
]), 0, null, $row);
}
}
// TODO FKTP VALIDATION
// TODO FKRTL VALIDATION
@@ -334,6 +469,10 @@ class MemberEnrollmentService
throw new ImportRowException(__('enrollment.NAME_REQUIRED'), 0, null, $row);
}
if (!Helper::validatePhoneNumber($row['telephone_mobile'])){
throw new ImportRowException(__('enrollment.PHONE_INVALID'), 0, null, $row);
}
if (
!empty($row['telephone_mobile'])
&& !(substr($row['telephone_mobile'], 0, 4) == '+628' || substr($row['telephone_mobile'], 0, 3) == '628')
@@ -351,27 +490,57 @@ class MemberEnrollmentService
if (empty($row['date_of_birth'])) {
throw new ImportRowException(__('enrollment.DATE_OF_BIRTH_REQUIRED'), 0, null, $row);
}
if(!$this->validateDate($row['date_of_birth'])){
throw new ImportRowException(__('enrollment.INVALID_DATE', [
'title' => $title['date_of_birth']
]), 0, null, $row);
}
// if (empty($row['date_terminated'])) {
// throw new ImportRowException(__('enrollment.DATE_OF_TERMINATED'), 0, null, $row);
// }
if (!empty($row['date_terminated'])) {
if(!$this->validateDate($row['date_terminated'])){
throw new ImportRowException(__('enrollment.INVALID_DATE', [
'title' => $title['date_terminated']
]), 0, null, $row);
}
}
// TODO DOB FORMAT VALIDATION
if (empty($row['sex'])) {
throw new ImportRowException(__('enrollment.SEX_REQUIRED'), 0, null, $row);
}
if (!in_array($row['sex'], ['F', 'M'])){
throw new ImportRowException(__('enrollment.SEX_CODE_NOT_VALID'), 0, null, $row);
}
}
public function handleImportRow(Corporate $corporate, $row)
{
try {
$activation_date = NULL;
if (!empty($row['activation_date'])){
$activation_date = $row['activation_date'];
}
$date_terminated = NULL;
if(!empty($row['date_terminated'])){
$date_terminated = $row['date_terminated'];
}
$member_data = [
"name" => $row['name'] ?? null,
"member_id" => $row['member_id'] ?? null,
"payor_id" => $row['payor_id'] ?? null,
"nik" => $row['nik'] ?? null,
"birth_date" => $this->dateParser($row['date_of_birth']),
"birth_date" => $row['date_of_birth'],
"gender" => Helper::genderNormalization($row['sex']),
// "language" => $row['language'] ?? null,
// "race" => $row['race'] ?? null,
"language" => $row['language'] ?? null,
"race" => $row['race'] ?? null,
"marital_status" => $row['marital_status'] ?? null,
"record_type" => $row['record_type'] ?? null,
"record_mode" => $row['record_mode'] ?? null,
"principal_id" => $row['principal_id'] ?? null,
"relation_with_principal" => $row['relationship_with_principal'] ?? null,
"bpjs_class" => $row['bpjs_class'] ?? null,
@@ -396,16 +565,117 @@ class MemberEnrollmentService
"policy_in_force" => $row['policy_in_force'] ?? null,
"start_no_claim" => $row['start_no_claim'] ?? null,
"end_no_claim" => $row['end_no_claim'] ?? null,
"members_effective_date" => $row['member_effective_date'] ?? null,
"members_expire_date" => $row['member_expiry_date'] ?? null,
"activation_date" => $activation_date,
"terminated_date" => $date_terminated,
"telephone_mobile" => $row['telephone_mobile'] ?? null,
"telephone_res" => $row['telephone_res'] ?? null,
"telephone_office" => $row['telephone_office'] ?? null,
];
// $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']
]), 0, null, $row);
}
// validasi member efektif date range date in periode date coroporate
$member_effective_date = date("Y-m-d", strtotime($row['member_effective_date']));
$date_terminated = date("Y-m-d", strtotime($row['date_terminated']));
if(!empty($row['activation_date'])){
$activation_date = date("Y-m-d", strtotime($row['activation_date']));
if (($activation_date == $date_terminated) && ($activation_date == $member_effective_date)) {
throw new ImportRowException(__('enrollment.MORE_THAN', [
'date_param' => 'Activation Date',
'date' => $activation_date,
'date_param2' => 'Member Effective Date',
'start' => $activation_date
]), 0, null, $row);
}
}
if (!empty($row['date_terminated'])){
$date_terminated = date("Y-m-d", strtotime($row['date_terminated']));
if($date_terminated){
if ($date_terminated <= $member_effective_date && ($date_terminated != $member_effective_date)) {
throw new ImportRowException(__('enrollment.MORE_THAN', [
'date_param' => 'Date Terminated Date',
'date' => $date_terminated,
'date_param2' => 'Member Effective Date',
'start' => $member_effective_date
]), 0, null, $row);
}
}
}
// validasi member expried date range date in periode date coroporate
$members_expire_date = date("Y-m-d", strtotime($row['member_expiry_date']));
// validasi member expried date must less date member effective
$members_expire_date = date("Y-m-d", strtotime($row['member_expiry_date']));
$members_expire_date = date("Y-m-d", strtotime($row['member_expiry_date']));
if ($member_effective_date <= $corporate->currentPolicy->start && ($member_effective_date != $corporate->currentPolicy->start)) {
throw new ImportRowException(__('enrollment.MORE_THAN', [
'date_param' => 'Member Effective Date',
'date' => $member_effective_date,
'date_param2' => 'Start Period Date',
'start' => $corporate->currentPolicy->start
]), 0, null, $row);
}
if ($member_effective_date >= $corporate->currentPolicy->end && ($member_effective_date != $corporate->currentPolicy->end)) {
throw new ImportRowException(__('enrollment.LESS_THAN', [
'date_param' => 'Member Effective Date',
'date' => $member_effective_date,
'date_param2' => 'End Period Date',
'end' => $corporate->currentPolicy->end
]), 0, null, $row);
}
if ($member_effective_date >= $corporate->currentPolicy->end && ($member_effective_date != $corporate->currentPolicy->end)) {
throw new ImportRowException(__('enrollment.LESS_THAN', [
'date_param' => 'Member Effective Date',
'date' => $member_effective_date,
'date_param2' => 'End Period Date',
'end' => $corporate->currentPolicy->end
]), 0, null, $row);
}
if ($members_expire_date <= $corporate->currentPolicy->start && ($members_expire_date != $corporate->currentPolicy->start) ) {
throw new ImportRowException(__('enrollment.MORE_THAN', [
'date_param' => 'Member Expired Date',
'date' => $members_expire_date,
'date_param2' => 'Start Period Date',
'start' => $corporate->currentPolicy->start
]), 0, null, $row);
}
if ($members_expire_date >= $corporate->currentPolicy->end && ($members_expire_date != $corporate->currentPolicy->end)) {
throw new ImportRowException(__('enrollment.LESS_THAN', [
'date_param' => 'Member Expired Date',
'date' => $members_expire_date,
'date_param2' => 'END Period Date',
'end' => $corporate->currentPolicy->end
]), 0, null, $row);
}
if ($members_expire_date <= $member_effective_date && ($members_expire_date != $member_effective_date)) {
throw new ImportRowException(__('enrollment.MORE_THAN', [
'date_param' => 'Member Expired Date',
'date' => $members_expire_date,
'date_param2' => 'Member Effective Date',
'start' => $member_effective_date
]), 0, null, $row);
}
if($corporate->code != $row['corporate_id']){
throw new ImportRowException(__('enrollment.CORPORATE_CODE_NOT_MATCH', [
'corporate_id' => $row['corporate_id']
]), 0, null, $row);
}
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) {
@@ -421,7 +691,8 @@ class MemberEnrollmentService
],
[
'name' => $row['name'] ?? null,
'birth_date' => $this->dateParser($row['date_of_birth']),
// 'birth_date' => $this->dateParser($row['date_of_birth']),
'birth_date' => $row['date_of_birth'],
'gender' => Helper::genderPerson($row['sex']),
'language' => $row['language'] ?? null,
'race' => $row['race'] ?? null,
@@ -457,10 +728,7 @@ class MemberEnrollmentService
if (!$plan) {
throw new ImportRowException(__('enrollment.PLAN_NOT_FOUND'), 0, null, $row);
}
$this->validateRow($row);
try {
DB::beginTransaction();
$member->fill($member_data);
@@ -468,7 +736,7 @@ class MemberEnrollmentService
$person = Person::create([
'name' => $row['name'],
'birth_date' => $this->dateParser($row['date_of_birth']),
'birth_date' => $row['date_of_birth'],
'gender' => Helper::genderPerson($row['sex']),
'language' => $row['language'] ?? null,
'race' => $row['race'] ?? null,
@@ -499,7 +767,7 @@ class MemberEnrollmentService
$division_id = $division->id;
}
}
// Bisa disini penyebab data dobel
$member->employeds()->create([
'corporate_id' => $corporate->id,
'branch_code' => $row['branch_code'],
@@ -507,7 +775,7 @@ class MemberEnrollmentService
'nik' => $row['nik'],
'status' => $row['employment_status']
]);
// Bisa disini penyebab data dobel
$member->memberPlans()->create([
'plan_id' => $plan->id,
'status' => 'active',
@@ -522,6 +790,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();
@@ -533,7 +802,6 @@ class MemberEnrollmentService
'policy_id' => $row['policy_number']
]), 0, null, $row);
}
try {
$memberPolicy = MemberPolicy::query()
->where('policy_id', $row['policy_number'])
@@ -559,8 +827,16 @@ class MemberEnrollmentService
if (!$memberPolicy->member->isDirty()) {
throw new ImportRowException(__('enrollment.MEMBER_NO_CHANGE'), 0, null, $row);
}
$memberPolicy->member->save();
// update informasi person
$person = Person::query()
->where('id', $member->person_id)
->first();
$person->fill($member_data);
$person->save();
DB::commit();
} catch (\Exception $e) {
DB::rollback();
@@ -580,6 +856,7 @@ class MemberEnrollmentService
'policy_id' => $row['policy_number']
]), 0, null, $row);
}
$this->validateRow($row);
$memberPolicy = MemberPolicy::query()
->where('policy_id', $row['policy_number'])
@@ -1036,6 +1313,17 @@ class MemberEnrollmentService
return $cells;
}
// This validation for range date in period corporate // validasi untuk range tanggal dalam period corporate yang ditentukan
public function validateRangePeriode($dates){
$date = date("Y-m-d", strtotime($dates));
if (!isset($corporate->currentPolicy) || $corporate->currentPolicy->start <= $date) {
}
if (!isset($corporate->currentPolicy) || $corporate->currentPolicy->end >= $date) {
dd($corporate->currentPolicy->end, $dates);
}
}
// This returning row with format or order as it is
public function makeResultRow($row_data)
{

0
Modules/Internal/Tests/Feature/.gitkeep Normal file → Executable file
View File

0
Modules/Internal/Tests/Unit/.gitkeep Normal file → Executable file
View File

0
Modules/Internal/Transformers/AppointmentResource.php Normal file → Executable file
View File

View File

@@ -0,0 +1,30 @@
<?php
namespace Modules\Internal\Transformers;
use Carbon\Carbon;
use Illuminate\Http\Resources\Json\JsonResource;
class AuditTrailResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request
* @return array
*/
public function toArray($request)
{
$audit_trail = [
'id' => $this->id,
'old_values' => json_decode($this->old_values),
'new_values' => json_decode($this->new_values),
'action' => $this->action,
'user_id' => $this->user->email,
'created_at' => $this->created_at,
'updated_at' => $this->updated_at,
];
return $audit_trail;
}
}

2
Modules/Internal/Transformers/ClaimRequestResource.php Normal file → Executable file
View File

@@ -24,7 +24,7 @@ class ClaimRequestResource extends JsonResource
'submission_date' => $this->submission_date,
'member' => $this->member,
'status' => $this->status ?? 'unknown',
'service_name' => $this->service->name,
'service_name' => $this->service ? $this->service->name : '',
'payment_type' => $this->payment_type,
'payment_type_name' => $this->payment_type_name,
'files_by_type' => $filesGroupByType

View File

0
Modules/Internal/Transformers/ClaimResource.php Normal file → Executable file
View File

0
Modules/Internal/Transformers/ClaimShowResource.php Normal file → Executable file
View File

View File

View File

View File

0
Modules/Internal/Transformers/DoctorResource.php Normal file → Executable file
View File

0
Modules/Internal/Transformers/EncounterResource.php Normal file → Executable file
View File

View File

0
Modules/Internal/Transformers/LivechatResource.php Normal file → Executable file
View File

0
Modules/Internal/Transformers/OrganizationResource.php Normal file → Executable file
View File

0
Modules/Internal/composer.json Normal file → Executable file
View File

0
Modules/Internal/module.json Normal file → Executable file
View File

0
Modules/Internal/package.json Normal file → Executable file
View File

0
Modules/Internal/webpack.mix.js Normal file → Executable file
View File