From 88ad1449218a95894e6d22bb4429be2cab47c627 Mon Sep 17 00:00:00 2001 From: pajri Date: Tue, 20 Dec 2022 17:48:28 +0700 Subject: [PATCH] table member dan table benefit --- .../Controllers/Api/BenefitController.php | 14 +- .../Api/CorporateBenefitController.php | 26 +- .../Api/CorporateMemberController.php | 19 + .../Http/Controllers/Api/PlanController.php | 40 +- Modules/Internal/Routes/api.php | 3 + .../Services/MemberEnrollmentService.php | 24 + app/Helpers/Helper.php | 15 + app/Models/CorporateBenefit.php | 36 +- app/Models/Member.php | 59 +- app/Models/Person.php | 23 + app/Models/Plan.php | 24 +- ...12_19_171824_add_active_to_plans_table.php | 2 +- ..._105712_add_person_id_to_members_table.php | 32 + ...0_151051_add_language_to_persons_table.php | 34 + .../src/pages/Corporates/Benefit/Form.tsx | 125 +++ .../src/pages/Corporates/Benefit/List.tsx | 879 +++++++++++++----- .../src/pages/Corporates/Member/List.tsx | 509 ++++++---- 17 files changed, 1365 insertions(+), 499 deletions(-) create mode 100644 database/migrations/2022_12_20_105712_add_person_id_to_members_table.php create mode 100644 database/migrations/2022_12_20_151051_add_language_to_persons_table.php create mode 100755 frontend/dashboard/src/pages/Corporates/Benefit/Form.tsx diff --git a/Modules/Internal/Http/Controllers/Api/BenefitController.php b/Modules/Internal/Http/Controllers/Api/BenefitController.php index 46204109..7428f909 100755 --- a/Modules/Internal/Http/Controllers/Api/BenefitController.php +++ b/Modules/Internal/Http/Controllers/Api/BenefitController.php @@ -20,12 +20,12 @@ class BenefitController extends Controller public function index(Request $request, $corporate_id) { $benefits = CorporateBenefit::query() - ->filter($request->all()) - ->where('corporate_id', $corporate_id) - ->with('benefit') - ->paginate() - ->appends($request->all()); - + ->filter($request->all()) + ->where('corporate_id', $corporate_id) + ->with('benefit', 'plan') + ->paginate() + ->appends($request->all()); + return $benefits; } @@ -133,7 +133,7 @@ class BenefitController extends Controller // } // } // } - + // break; //only read first sheet // } // $reader->close(); diff --git a/Modules/Internal/Http/Controllers/Api/CorporateBenefitController.php b/Modules/Internal/Http/Controllers/Api/CorporateBenefitController.php index b4d2f592..18598017 100755 --- a/Modules/Internal/Http/Controllers/Api/CorporateBenefitController.php +++ b/Modules/Internal/Http/Controllers/Api/CorporateBenefitController.php @@ -18,14 +18,30 @@ class CorporateBenefitController extends Controller public function index(Request $request, $corporate_id) { $benefits = CorporateBenefit::query() - ->filter($request->all()) - ->where('corporate_id', $corporate_id) - ->paginate(0) - ->appends($request->all()); - + ->filter($request->all()) + ->where('corporate_id', $corporate_id) + ->paginate(0) + ->appends($request->all()); return $benefits; } + public function activation(Request $request, $benefit_id) + { + $request->validate([ + 'active' => 'required' + ]); + // abort(404); + + $benefit = CorporateBenefit::findOrFail($benefit_id); + $benefit->active = $request->active == '1'; + + if ($benefit->save()) { + return response()->json([ + 'benefit' => $benefit, + 'message' => 'Status Updated Successfully' + ]); + } + } /** * Show the form for creating a new resource. * @return Renderable diff --git a/Modules/Internal/Http/Controllers/Api/CorporateMemberController.php b/Modules/Internal/Http/Controllers/Api/CorporateMemberController.php index d52f029e..501fdbda 100755 --- a/Modules/Internal/Http/Controllers/Api/CorporateMemberController.php +++ b/Modules/Internal/Http/Controllers/Api/CorporateMemberController.php @@ -51,6 +51,25 @@ class CorporateMemberController extends Controller return Helper::paginateResources(MemberDataTableResource::collection($members)); } + public function activation(Request $request, $member_id) + { + $request->validate([ + 'active' => 'required' + ]); + + // abort(404); + + $member = Member::findOrFail($member_id); + $member->active = $request->active == '1'; + + if ($member->save()) { + return response()->json([ + 'member' => $member, + 'message' => 'Status Updated Successfully' + ]); + } + } + /** * Show the form for creating a new resource. * @return Renderable diff --git a/Modules/Internal/Http/Controllers/Api/PlanController.php b/Modules/Internal/Http/Controllers/Api/PlanController.php index 4e667c45..c4d03b1a 100755 --- a/Modules/Internal/Http/Controllers/Api/PlanController.php +++ b/Modules/Internal/Http/Controllers/Api/PlanController.php @@ -28,16 +28,16 @@ class PlanController extends Controller public function index(Request $request, $corporate_id) { $plans = 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') - ->paginate() - ->appends($request->all()); - + ->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') + ->paginate() + ->appends($request->all()); + return $plans; } @@ -105,14 +105,14 @@ class PlanController extends Controller { $request->validate([ 'file' => 'required|file|mimes:xls,xlsx,csv,txt', - ]); - $file_name = now()->getPreciseTimestamp(3).'-'.$request->file('file')->getClientOriginalName(); + ]); + $file_name = now()->getPreciseTimestamp(3) . '-' . $request->file('file')->getClientOriginalName(); $file = $request->file('file')->storeAs('temp', $file_name); $corporate = Corporate::findOrFail($corporate_id); - + $import = $this->importService; - $import->read(Storage::path('temp/'.$file_name)); - $import->write(Storage::disk('public')->path('temp/result-'.$file_name), 'xsls'); + $import->read(Storage::path('temp/' . $file_name)); + $import->write(Storage::disk('public')->path('temp/result-' . $file_name), 'xsls'); $headers_map_to_table_fields = Plan::$doc_headers_to_field_map; @@ -142,7 +142,7 @@ class PlanController extends Controller // Create Directly try { $rowResponse = $this->corporateService->handlePlanRow($corporate, $plan_row); - + // Write Success Result to File array_push($plan_row, 'SUCCESS'); $import->addArrayToRow($plan_row); @@ -160,11 +160,11 @@ class PlanController extends Controller } } } - + break; //only read first sheet } $import->reader->close(); - Storage::delete('temp/'.$file_name); + Storage::delete('temp/' . $file_name); $import->writer->close(); // throw(404); @@ -173,8 +173,8 @@ class PlanController extends Controller 'total_failed_row' => count($failed_plan_data), 'failed_row' => $failed_plan_data, 'result_file' => [ - 'url' => Storage::disk('public')->url('temp/result-'.$file_name), - 'name' => 'result-'.$file_name, + 'url' => Storage::disk('public')->url('temp/result-' . $file_name), + 'name' => 'result-' . $file_name, ] ]; } diff --git a/Modules/Internal/Routes/api.php b/Modules/Internal/Routes/api.php index 741d4f5d..1dbf0dac 100755 --- a/Modules/Internal/Routes/api.php +++ b/Modules/Internal/Routes/api.php @@ -65,6 +65,7 @@ Route::prefix('internal')->group(function () { Route::post('corporates/{corporate_id}/corporate-benefits', [CorporateBenefitController::class, 'store']); Route::get('corporates/{corporate_id}/corporate-benefits/{id}/edit', [CorporateBenefitController::class, 'edit']); Route::put('corporates/{corporate_id}/corporate-benefits/{id}', [CorporateBenefitController::class, 'update']); + Route::put('benefits/{benefit_id}/activation', [CorporateBenefitController::class, 'activation']); Route::get('corporates/{corporate_id}/benefits', [BenefitController::class, 'index']); Route::post('corporates/{corporate_id}/benefits/import', [BenefitController::class, 'memberBenefitImport']); @@ -76,6 +77,8 @@ Route::prefix('internal')->group(function () { Route::get('corporates/{corporate_id}/members', [CorporateMemberController::class, 'index']); Route::post('corporates/{corporate_id}/members/import', [CorporateMemberController::class, 'import']); + Route::put('members/{member_id}/activation', [CorporateMemberController::class, 'activation']); + Route::get('corporates/{corporate_id}/diagnosis-exclusions', [DiagnosisExclusionController::class, 'index']); Route::post('corporates/{corporate_id}/diagnosis-exclusions/import', [DiagnosisExclusionController::class, 'import']); diff --git a/Modules/Internal/Services/MemberEnrollmentService.php b/Modules/Internal/Services/MemberEnrollmentService.php index 183a52f6..91a2c823 100755 --- a/Modules/Internal/Services/MemberEnrollmentService.php +++ b/Modules/Internal/Services/MemberEnrollmentService.php @@ -10,6 +10,7 @@ use App\Models\CorporateDivision; use App\Models\CorporatePlan; use App\Models\Member; use App\Models\MemberPolicy; +use App\Models\Person; use App\Models\Plan; use Box\Spout\Writer\Common\Creator\WriterEntityFactory; use Box\Spout\Common\Entity\Row; @@ -408,12 +409,35 @@ class MemberEnrollmentService // Validate If Exist Member if ($member) { + $person = Person::updateOrCreate( + [ + 'id' => $member->person_id + ], + [ + 'name' => $row['name'] ?? null, + 'birth_date' => Carbon::parse(strtotime($row['date_of_birth'])), + 'gender' => Helper::genderPerson($row['sex']), + 'language' => $row['language'] ?? null, + 'race' => $row['race'] ?? null, + ] + ); + $member->person_id = $person->id; + $member->save(); throw new ImportRowException(__('enrollment.MEMBER_UNIQUE', [ 'member_id' => $row['member_id'], 'policy_id' => $row['policy_number'] ]), 0, null, $row); } else { $member = new Member(); + $person = Person::create([ + 'name' => $row['name'], + 'birth_date' => Carbon::parse(strtotime($row['date_of_birth'])), + 'gender' => Helper::genderPerson($row['sex']), + 'language' => $row['language'] ?? null, + 'race' => $row['race'] ?? null, + ]); + $member->person_id = $person->id; + $member->save(); } $memberPolicy = $member->policies() diff --git a/app/Helpers/Helper.php b/app/Helpers/Helper.php index e61c7397..dec99616 100755 --- a/app/Helpers/Helper.php +++ b/app/Helpers/Helper.php @@ -24,6 +24,21 @@ class Helper } } + public static function genderPerson($anyGenderCode) + { + if ($anyGenderCode == 'M') { + return 'L'; + } else if ($anyGenderCode == 'F') { + return 'P'; + } else if ($anyGenderCode == 'O') { + return 'others'; + } else if ($anyGenderCode == 'U') { + return 'unknown'; + } else { + return null; + } + } + public static function paginateResources($resource) { return [ diff --git a/app/Models/CorporateBenefit.php b/app/Models/CorporateBenefit.php index e60940c7..c42f2986 100755 --- a/app/Models/CorporateBenefit.php +++ b/app/Models/CorporateBenefit.php @@ -146,7 +146,7 @@ class CorporateBenefit extends Model 'max_frequency' ]; - + public function setAreaLimitAttribute($value) { $this->attributes['area_limit'] = empty($value) ? null : $value; @@ -170,31 +170,31 @@ class CorporateBenefit extends Model public function getMaxFrequencyAttribute() { switch ($this->max_frequency_period) { - // case(0) : - // // TODO Fix This - // return null; - // break; - case(1) : + // case(0) : + // // TODO Fix This + // return null; + // break; + case (1): return empty($this->daily_frequency) ? 1 : $this->daily_frequency; break; - case(2) : + case (2): return empty($this->weekly_frequency) ? 1 : $this->weekly_frequency; break; - case(3) : + case (3): return empty($this->monthly_frequency) ? 1 : $this->monthly_frequency; break; - case(4) : + case (4): return empty($this->yearly_frequency) ? 1 : $this->yearly_frequency; break; - case(5) : + case (5): // TODO Fix This return empty($this->max_period_for_disability) ? 1 : $this->max_period_for_disability; break; - case(6) : + case (6): // TODO Fix This return 1; break; - default : + default: return null; break; } @@ -214,13 +214,19 @@ class CorporateBenefit extends Model { return $this->belongsTo(Plan::class); } - + public function scopeFilter($query, array $filters) { $query->when($filters['search'] ?? false, function ($query, $search) { return $query - ->where('code', 'like', "%" . $search . "%") - ->orWhere('name', 'like', "%" . $search . "%"); + ->whereHas('benefit', function ($query) use ($search) { + $query->where('code', 'like', "%" . $search . "%") + ->orWhere('service_code', 'like', "%" . $search . "%"); + })->orWhereHas('plan', function ($query) use ($search) { + $query->where('code', 'like', "%" . $search . "%"); + }); + // ->where('code', 'like', "%" . $search . "%") + // ->orWhere('name', 'like', "%" . $search . "%"); }); } } diff --git a/app/Models/Member.php b/app/Models/Member.php index d8496645..7fa7a662 100755 --- a/app/Models/Member.php +++ b/app/Models/Member.php @@ -14,6 +14,7 @@ class Member extends Model protected $fillable = [ "id", + "person_id", "member_id", "record_type", "payor_id", @@ -73,11 +74,18 @@ class Member extends Model 'deleted_by', ]; + + public function claims() { return $this->hasMany(Claim::class, 'member_id', 'id'); } + public function person() + { + return $this->belongsTo(Person::class, 'person_id', 'id'); + } + public function employeds() { return $this->hasMany(CorporateEmployee::class, 'member_id'); @@ -110,13 +118,13 @@ class Member extends Model // // ]) // ->where('start', '<', now()) // ->where('end', '>', now()); - - + + return $this->hasOneThrough(Corporate::class, CorporateEmployee::class, 'member_id', 'id', 'id', 'corporate_id'); - // ->where('corporate_policies.start', '<', now()) - // ->where('corporate_policies.end', '>', now()) - // ->where('member_policies.start', '<', now()) - // ->where('member_policies.end', '>', now()); + // ->where('corporate_policies.start', '<', now()) + // ->where('corporate_policies.end', '>', now()) + // ->where('member_policies.start', '<', now()) + // ->where('member_policies.end', '>', now()); } public function memberPlans() @@ -160,13 +168,16 @@ class Member extends Model public function getFullNameAttribute() { - $arr = []; - if (!empty($this->name_prefix)) { - $arr[] = $this->name_prefix; + if (!$this->person) { + return null; } - $arr[] = $this->name; - if (!empty($this->name_suffix)) { - $arr[] = $this->name_suffix; + $arr = []; + if (!empty($this->person->name_prefix)) { + $arr[] = $this->person->name_prefix; + } + $arr[] = $this->person->name; + if (!empty($this->person->name_suffix)) { + $arr[] = $this->person->name_suffix; } return implode(' ', $arr); @@ -177,13 +188,35 @@ class Member extends Model return $this->gender ? ($this->gender == 'female' ? 'F' : 'M') : $this->gender; } + public function getNameAttribute() + { + return $this->person->name ?? null; + } + + public function getBirthDateAttribute() + { + return Carbon::parse($this->person->birth_date ?? null)->format('Y-m-d') ?? null; + } + + public function getGenderAttribute() + { + return $this->person->gender ?? null; + } + public function scopeFilter($query, array $filters) { $query->when($filters['search'] ?? false, function ($query, $search) { return $query ->where('member_id', 'like', "%" . $search . "%") ->orWhere('payor_id', 'like', "%" . $search . "%") - ->orWhere('name', 'like', "%" . $search . "%"); + ->orWhere('email', 'like', "%" . $search . "%") + ->orWhereHas('person', function ($query) use ($search) { + $query->where('name', 'like', "%" . $search . "%"); + $query->orWhere('phone', 'like', "%" . $search . "%"); + }) + ->orWhereHas('currentPlan', function ($query) use ($search) { + $query->where('code', 'like', "%" . $search . "%"); + }); // ->orWhereHas('corporatePlan', function ($query) use ($search) { // $query->where('code', 'like', "%" . $search . "%"); // }); diff --git a/app/Models/Person.php b/app/Models/Person.php index d95d7cc2..969b52bb 100755 --- a/app/Models/Person.php +++ b/app/Models/Person.php @@ -107,4 +107,27 @@ class Person extends Model { return $this->morphMany(AppointmentParticipant::class, 'participantable'); } + + public function setGenderAttribute($value) + { + if ($value == "M" || $value == "L") { + return $this->attributes['gender'] = "male"; + } else if ($value == "F" || $value == "P") { + return $this->attributes['gender'] = "female"; + } else { + return $this->attributes['gender'] = $value; + } + } + + public function getGenderAttribute() + { + + if ($this->attributes['gender'] == "male" || $this->attributes['gender'] == "L") { + return "male"; + } else if ($this->attributes['gender'] == "female" || $this->attributes['gender'] == "P") { + return "female"; + } else { + return "other"; + } + } } diff --git a/app/Models/Plan.php b/app/Models/Plan.php index 974d49a9..dc66295b 100755 --- a/app/Models/Plan.php +++ b/app/Models/Plan.php @@ -11,6 +11,8 @@ class Plan extends Model { use HasFactory, SoftDeletes, Blameable; + protected $table = "plans"; + protected $fillable = [ "service_code", "corporate_id", @@ -138,7 +140,7 @@ class Plan extends Model { $this->attributes['max_surgery_reinstatement_days'] = empty($value) ? null : $value; } - + public function setMaxSurgeryPeriodeDaysAttribute($value) { $this->attributes['max_surgery_periode_days'] = empty($value) ? null : $value; @@ -148,11 +150,11 @@ class Plan extends Model { $query->when($filters['search'] ?? false, function ($query, $search) { return $query - ->where('service_code', 'like', "%" . $search . "%") - ->orWhere('code', 'like', "%" . $search . "%") - ->orWhereHas('corporatePlan', function ($query) use ($search) { - $query->where('code', 'like', "%" . $search . "%"); - }); + ->where('service_code', 'like', "%" . $search . "%") + ->orWhere('code', 'like', "%" . $search . "%") + ->orWhereHas('corporatePlan', function ($query) use ($search) { + $query->where('code', 'like', "%" . $search . "%"); + }); }); } @@ -169,12 +171,12 @@ class Plan extends Model public function benefits() { return $this->belongsToMany(Benefit::class, 'corporate_benefits', 'benefit_id', 'id') - ->withTimestamps() - ->withPivot([ - // TODO corporate_benefits pivot - ]); + ->withTimestamps() + ->withPivot([ + // TODO corporate_benefits pivot + ]); } - + public function corporateBeneftis() { return $this->hasMany(CorporateBenefit::class, 'benefit_id', 'id'); diff --git a/database/migrations/2022_12_19_171824_add_active_to_plans_table.php b/database/migrations/2022_12_19_171824_add_active_to_plans_table.php index c80f2d0c..29f7d6ba 100644 --- a/database/migrations/2022_12_19_171824_add_active_to_plans_table.php +++ b/database/migrations/2022_12_19_171824_add_active_to_plans_table.php @@ -14,7 +14,7 @@ return new class extends Migration public function up() { Schema::table('plans', function (Blueprint $table) { - $table->boolean('active')->after('max_surgery_periode_days'); + $table->boolean('active')->after('max_surgery_periode_days')->default(true); }); } diff --git a/database/migrations/2022_12_20_105712_add_person_id_to_members_table.php b/database/migrations/2022_12_20_105712_add_person_id_to_members_table.php new file mode 100644 index 00000000..653d121a --- /dev/null +++ b/database/migrations/2022_12_20_105712_add_person_id_to_members_table.php @@ -0,0 +1,32 @@ +unsignedBigInteger('person_id')->after('id')->nullable()->index(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('members', function (Blueprint $table) { + $table->dropColumn('person_id'); + }); + } +}; diff --git a/database/migrations/2022_12_20_151051_add_language_to_persons_table.php b/database/migrations/2022_12_20_151051_add_language_to_persons_table.php new file mode 100644 index 00000000..ecafe93e --- /dev/null +++ b/database/migrations/2022_12_20_151051_add_language_to_persons_table.php @@ -0,0 +1,34 @@ +string('language')->after('birth_place')->nullable(); + $table->string('race')->after('language')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('persons', function (Blueprint $table) { + $table->dropColumn('language'); + $table->dropColumn('race'); + }); + } +}; diff --git a/frontend/dashboard/src/pages/Corporates/Benefit/Form.tsx b/frontend/dashboard/src/pages/Corporates/Benefit/Form.tsx new file mode 100755 index 00000000..1556576f --- /dev/null +++ b/frontend/dashboard/src/pages/Corporates/Benefit/Form.tsx @@ -0,0 +1,125 @@ +import * as Yup from 'yup'; +import { LoadingButton } from '@mui/lab'; +import { Box, Card, Grid, Stack, Typography } from '@mui/material'; +import { CorporatePlan } from '../../../@types/corporates'; +import { FormProvider, RHFSwitch, RHFTextField } from '../../../components/hook-form'; +import { useEffect, useMemo } from 'react'; +import { useForm } from 'react-hook-form'; +import { yupResolver } from '@hookform/resolvers/yup'; +import { useSnackbar } from 'notistack'; +import { useNavigate, useParams } from 'react-router-dom'; +import axios from '../../../utils/axios'; + +type Props = { + isEdit: boolean; + currentCorporatePlan?: CorporatePlan; +}; + +export default function CorporatePlanForm({ isEdit, currentCorporatePlan }: Props) { + const { enqueueSnackbar } = useSnackbar(); + const navigate = useNavigate(); + const { corporate_id } = useParams(); + + const NewCorporatePlanSchema = Yup.object().shape({ + name: Yup.string().required('Name is required'), + code: Yup.string().required('Corporate Code is required'), + }); + + const defaultValues = useMemo( + () => ({ + name: currentCorporatePlan?.name || '', + code: currentCorporatePlan?.code || '', + active: currentCorporatePlan?.active === 1 ? true : false, + }), + [currentCorporatePlan] + ); + + useEffect(() => { + if (isEdit && currentCorporatePlan) { + reset(defaultValues); + } + if (!isEdit) { + reset(defaultValues); + } + }, [isEdit, currentCorporatePlan]); + + const methods = useForm({ + resolver: yupResolver(NewCorporatePlanSchema), + defaultValues, + }); + + const { + reset, + watch, + control, + setValue, + getValues, + setError, + handleSubmit, + formState: { isSubmitting }, + } = methods; + + const onSubmit = async (data: any) => { + if (!isEdit) { + await axios + .post('/corporates/' + corporate_id + '/divisions', data) + .then((res) => { + enqueueSnackbar('Division created successfully', { variant: 'success' }); + }) + .then((res) => { + navigate('/corporates/' + corporate_id + '/divisions', { replace: true }); + }) + .catch(({ response }) => { + if (response.status === 422) { + for (const [key, value] of Object.entries(response.data.errors)) { + setError(key, { message: value[0] }); + enqueueSnackbar(value[0] ?? 'Failed Processing Request', { variant: 'error' }); + } + } else { + enqueueSnackbar('Create Failed : ' + response.data.message, { variant: 'error' }); + } + }); + } else { + await axios + .put('/corporates/' + corporate_id + '/divisions/' + currentCorporatePlan?.id, data) + .then((res) => { + enqueueSnackbar('Division updated successfully', { variant: 'success' }); + }) + .then((res) => { + navigate('/corporates/' + corporate_id + '/divisions/', { replace: true }); + }) + .catch(({ response }) => { + enqueueSnackbar('Update Failed : ' + response.data.message, { variant: 'error' }); + }); + } + }; + + return ( + + + + + + + + ASO/Budget + + + + + + + + + + ASO/Budget + + + + + + + + + ); +} diff --git a/frontend/dashboard/src/pages/Corporates/Benefit/List.tsx b/frontend/dashboard/src/pages/Corporates/Benefit/List.tsx index 52fe8050..399a08f6 100755 --- a/frontend/dashboard/src/pages/Corporates/Benefit/List.tsx +++ b/frontend/dashboard/src/pages/Corporates/Benefit/List.tsx @@ -1,16 +1,62 @@ // @mui -import { Box, Button, Card, Collapse, IconButton, InputLabel, MenuItem, OutlinedInput, Paper, Select, SelectChangeEvent, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, TextField, Typography, Badge, Tab, Tabs, CardHeader, Stack, Menu, ButtonGroup } from '@mui/material'; +import { + Box, + Button, + Card, + Collapse, + IconButton, + InputLabel, + MenuItem, + OutlinedInput, + Paper, + Select, + SelectChangeEvent, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + TextField, + Typography, + Badge, + Tab, + Tabs, + CardHeader, + Stack, + Menu, + ButtonGroup, + Grid, +} from '@mui/material'; import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight'; import AddIcon from '@mui/icons-material/Add'; import UploadIcon from '@mui/icons-material/Upload'; import CancelIcon from '@mui/icons-material/Cancel'; + // hooks import React, { ChangeEvent, Component, useEffect, useRef, useState } from 'react'; import useSettings from '../../../hooks/useSettings'; import { useParams, useSearchParams } from 'react-router-dom'; // components + +import { + FormProvider, + RHFTextField, + RHFRadioGroup, + RHFUploadAvatar, + RHFSwitch, + RHFEditor, + RHFDatepicker, + RHFMultiCheckbox, + RHFCheckbox, + RHFCustomMultiCheckbox, + RHFSelect, +} from '../../../components/hook-form'; import axios from '../../../utils/axios'; +import { Benefit } from '../../../@types/corporates'; +import Form from './Form'; + import { LaravelPaginatedData } from '../../../@types/paginated-data'; import BasePagination from '../../../components/BasePagination'; import { enqueueSnackbar } from 'notistack'; @@ -20,30 +66,38 @@ export default function PlanList() { const { corporate_id } = useParams(); const [searchParams, setSearchParams] = useSearchParams(); const [importResult, setImportResult] = useState(null); - + function SearchInput(props: any) { - // SEARCH + // SEARCH const searchInput = useRef(null); - const [searchText, setSearchText] = useState(""); + const [searchText, setSearchText] = useState(''); const handleSearchChange = (event: any) => { - const newSearchText = event.target.value ?? '' + const newSearchText = event.target.value ?? ''; setSearchText(newSearchText); - } + }; const handleSubmit = (event: any) => { event.preventDefault(); props.onSearch(searchText); // Trigger to Parent - } + }; - useEffect(() => { + useEffect(() => { // console.log('Search Input: useEffect') setSearchText(searchParams.get('search') ?? ''); - }, [searchParams]) + }, [searchParams]); return (
- + ); } @@ -53,8 +107,8 @@ export default function PlanList() { // Create Button Menu const [anchorEl, setAnchorEl] = React.useState(null); const createMenu = Boolean(anchorEl); - const importPlan = useRef(null) - const [currentImportFileName, setCurrentImportFileName] = useState(null) + const importPlan = useRef(null); + const [currentImportFileName, setCurrentImportFileName] = useState(null); const handleClick = (event: React.MouseEvent) => { setAnchorEl(event.currentTarget); @@ -69,52 +123,66 @@ export default function PlanList() { handleClose(); importPlan.current ? importPlan.current.click() : console.log('No File selected'); } else { - alert('No file selected') + alert('No file selected'); } - } + }; const handleCancelImportButton = () => { - importPlan.current.value = ""; - importPlan.current.dispatchEvent(new Event("change", { bubbles: true })); - } + importPlan.current.value = ''; + importPlan.current.dispatchEvent(new Event('change', { bubbles: true })); + }; const handleImportChange = (event: any) => { if (event.target.files[0]) { - setCurrentImportFileName(event.target.files[0].name) + setCurrentImportFileName(event.target.files[0].name); } else { setCurrentImportFileName(null); } - } + }; const handleUpload = () => { if (importPlan.current?.files.length) { const formData = new FormData(); - formData.append("file", importPlan.current?.files[0]) - axios.post(`corporates/${corporate_id}/import-plan-benefit`, formData ) - .then(response => { + formData.append('file', importPlan.current?.files[0]); + axios + .post(`corporates/${corporate_id}/import-plan-benefit`, formData) + .then((response) => { handleCancelImportButton(); loadDataTableData(); - setImportResult(response.data) + setImportResult(response.data); // alert('Succesfully read '+ response.data.total_successed_row + ' with ' + response.data.total_failed_row + ' failed rows'); }) - .catch(response => { - enqueueSnackbar('Looks like something went wrong. Please check your data and try again. ' + response.message, { variant: 'error' }) - }) + .catch((response) => { + enqueueSnackbar( + 'Looks like something went wrong. Please check your data and try again. ' + + response.message, + { variant: 'error' } + ); + }); } else { - enqueueSnackbar('No File Selected', { variant: 'warning' }) + enqueueSnackbar('No File Selected', { variant: 'warning' }); } - } - + }; + return (
- - {( !currentImportFileName && - - {/*

kjasndkjandskjasndkjansdkjansd

*/} - - - + {currentImportFileName && ( + + + + + - - + +
)} - {( importResult && - - Last Import Result Report : {importResult.result_file?.name ?? "-"} - + {importResult && ( + + + Last Import Result Report :{' '} + + {importResult.result_file?.name ?? '-'} + + + )}
); } // Called on every row to map the data to the columns - function createData( benefit: Benefit ): Benefit { + function createData(benefit: Benefit): Benefit { return { ...benefit, - } + }; } // Generate the every row of the table function Row(props: { row: ReturnType }) { const { row } = props; const [open, setOpen] = React.useState(false); + const [openEdit, setOpenEdit] = React.useState(false); + + console.log('edit', openEdit); + console.log('open', open); + + const handleActivate = (model: any, status: string) => { + axios + .put(`/benefits/${row.id}/activation`, { + // service_code: service.service_code, + active: status == 'active', + }) + .then((res) => { + setDataTableData({ + ...dataTableData, + data: dataTableData.data.map((model) => { + let updatedModel = model; + if (row.id == model.id) { + updatedModel.active = res.data.benefit.active; + } + return updatedModel; + }), + }); + }) + .catch((error) => { + // console.log('asdasd', error.response.data.message) + enqueueSnackbar( + error.response.data.message ?? error.message ?? 'Failed Processing Request', + { variant: 'error' } + ); + }); + }; return ( *': { borderBottom: 'unset' } }}> - setOpen(!open)} - > + setOpen(!open)}> {open ? : } - {row.service_code} - {row.plan_code} - {row.benefit_code} - {row.code} - {row.description} - {row.budget} - {row.budget_conditions} - {row.budget_code} - {row.primary_benefit_code} - {row.benefit_mode} - {row.room_class_coverage} - {row.max_bed_coverage} - {row.tolerance_parameter} - {row.max_room_class} - {row.limit_amount} - {row.area_limit} - {row.shared_benefit} - {row.shared_benefit_type} - {row.msc} - {row.genders} - {row.min_age} - {row.max_age} - {row.max_frequency_period} - {row.daily_frequency} - {row.weekly_frequency} - {row.monthly_frequency} - {row.yearly_frequency} - {row.custom_frequency_days} - {row.custom_duration_value} - {row.allowed_transaction_types} - {row.high_plan_factor} - {row.pre_post_treatment} - {row.pre_treatment_days} - {row.post_treatment_days} - {row.layer_type_1} - {row.layer_value_1} - {row.layer_type_2} - {row.layer_value_2} - {row.cashless_percentage} - {row.reimbursement_percentage} - {row.digital_percentage} - {row.co_share_m_percentage} - {row.co_share_s_percentage} - {row.co_share_c_percentage} - {row.cashless_deductible} - {row.reimbursement_deductible} - {row.digital_deductible} - {row.co_share_m_deductible} - {row.co_share_s_deductible} - {row.co_share_c_deductible} - {row.prorate_type} - {row.prorate_lookup} - {row.max_days_for_disability} - {row.max_period_for_disability} - {row.currency} - {row.show_benefit_item} - {row.show_benefit_value} + {row.plan?.service_code} + {row.plan?.code} + {row.benefit?.code} + {row.corporate_benefit_code} + {row.benefit?.description} - - + + {row.active == 1 && ( + + )} + {row.active != 1 && ( + + )} + + + + {/* COLLAPSIBLE ROW */} - - - No Extra Data - - - {false && - - Rules - - - - - Date - Customer - Amount - Total price ($) - - - - {/* {row.history ? row.history.map((historyRow) => ( */} - - {row.start} - {row.end} - {row.start} - {row.start} - {row.start} - - {/* )) - : ( - - No Data - - ) - } */} - -
-
} + {open == true ? ( + openEdit == false ? ( + + + + + + ASO/Budget + + + : {row.budget ? row.budget : '-'} + + + Budget Condition + + + : {row.budget_conditions ? row.budget_conditions : '-'} + + + Budget Code + + + : {row.budget_code ? row.budget_code : '-'} + + + Primary benefit + + + : {row.primary_benefit_code ? row.primary_benefit_code : '-'} + + + Benefit Mode + + + : {row.benefit_mode ? row.benefit_mode : '-'} + + + Room Class + + + : {row.room_class_coverage ? row.room_class_coverage : '-'} + + + Max Bed + + + : {row.max_bed_coverage ? row.max_bed_coverage : '-'} + + + Tolerance Paramater + + + : {row.tolerance_parameter ? row.tolerance_parameter : '-'} + + + Max. Room Class + + + : {row.max_room_class ? row.max_room_class : '-'} + + + Limit Value + + + : {row.limit_amount ? row.limit_amount : '-'} + + + Area + + + : {row.area_limit ? row.area_limit : '-'} + + + Shared Benefit With + + + : {row.shared_benefit ? row.shared_benefit : '-'} + + + Shared Benefit Type + + + : {row.shared_benefit_type ? row.shared_benefit_type : '-'} + + + MSC + + + : {row.msc ? row.msc : '-'} + + + Gender + + + : {row.genders ? row.genders : '-'} + + + Min Age + + + : {row.min_age ? row.min_age : '-'} + + + Max Age + + + : {row.max_age ? row.max_age : '-'} + + + Freq. Period + + + : {row.max_frequency_period ? row.max_frequency_period : '-'} + + + Daily Frequency + + + : {row.daily_frequency ? row.daily_frequency : '-'} + + + Weekly Frequency + + + : {row.weekly_frequency ? row.weekly_frequency : '-'} + + + Monthly Frequency + + + : {row.monthly_frequency ? row.monthly_frequency : '-'} + + + Yearly Frequency + + + : {row.yearly_frequency ? row.yearly_frequency : '-'} + + + Custom Duration + + + : {row.custom_frequency_days ? row.custom_frequency_days : '-'} + + + Custom Duration Value + + + : {row.custom_duration_value ? row.custom_duration_value : '-'} + + + Cashless, Reimbursement + + + : {row.allowed_transaction_types ? row.allowed_transaction_types : '-'} + + + High Plan Factor + + + : {row.high_plan_factor ? row.high_plan_factor : '-'} + + + + + + + Pre Post Treatment + + + : {row.pre_post_treatment ? row.pre_post_treatment : '-'} + + + Pre Treatment + + + : {row.pre_treatment_days ? row.pre_treatment_days : '-'} + + + Post Treatment + + + : {row.post_treatment_days ? row.post_treatment_days : '-'} + + + Layer Type 1 + + + : {row.layer_type_1 ? row.layer_type_1 : '-'} + + + Layer Value 1 + + + : {row.layer_value_1 ? row.layer_value_1 : '-'} + + + Layer Type 2 + + + : {row.layer_type_2 ? row.layer_type_2 : '-'} + + + Layer Value 2 + + + : {row.layer_value_2 ? row.layer_value_2 : '-'} + + + Cashless (%) + + + : {row.cashless_percentage ? row.cashless_percentage : '-'} + + + Reimburse (%) + + + : {row.reimbursement_percentage ? row.reimbursement_percentage : '-'} + + + Digital (%) + + + : {row.digital_percentage ? row.digital_percentage : '-'} + + + CoShareM (%) + + + : {row.co_share_m_percentage ? row.co_share_m_percentage : '-'} + + + CoShareS (%) + + + : {row.co_share_s_percentage ? row.co_share_s_percentage : '-'} + + + CoShareC (%) + + + : {row.co_share_c_percentage ? row.co_share_c_percentage : '-'} + + + Cashless Deductible + + + : {row.cashless_deductible ? row.cashless_deductible : '-'} + + + Reimbursement Deductible + + + : {row.reimbursement_deductible ? row.reimbursement_deductible : '-'} + + + Digital Deductible + + + : {row.digital_deductible ? row.digital_deductible : '-'} + + + DeductibleM + + + : {row.co_share_m_deductible ? row.co_share_m_deductible : '-'} + + + DeductibleS + + + : {row.co_share_s_deductible ? row.co_share_s_deductible : '-'} + + + DeductibleC + + + : {row.co_share_c_deductible ? row.co_share_c_deductible : '-'} + + + Prorate Type + + + : {row.prorate_type ? row.prorate_type : '-'} + + + Prorate Lookup + + + : {row.prorate_lookup ? row.prorate_lookup : '-'} + + + Max Days for Disability + + + : {row.max_days_for_disability ? row.max_days_for_disability : '-'} + + + Max Periode of Disability + + + : {row.max_period_for_disability ? row.max_period_for_disability : '-'} + + + Currency + + + : {row.currency ? row.currency : '-'} + + + Show Benefit Item + + + : {row.show_benefit_item ? row.show_benefit_item : '-'} + + + Show Benefit Value + + + : {row.show_benefit_value ? row.show_benefit_value : '-'} + + + + + + ) : ( +
+ ) + ) : null} + + {/* + + + + */} @@ -299,147 +697,112 @@ export default function PlanList() { const [dataTableData, setDataTableData] = React.useState({ current_page: 1, data: [], - path: "", - first_page_url: "", + path: '', + first_page_url: '', last_page: 1, - last_page_url: "", - next_page_url: "", - prev_page_url: "", + last_page_url: '', + next_page_url: '', + prev_page_url: '', per_page: 10, from: 0, to: 0, - total: 0 + total: 0, }); const loadDataTableData = async (appliedFilter = null) => { setDataTableLoading(true); const filter = appliedFilter ? appliedFilter : Object.fromEntries([...searchParams.entries()]); - const response = await axios.get('/corporates/'+corporate_id+'/benefits', { params: filter }); + const response = await axios.get('/corporates/' + corporate_id + '/benefits', { + params: filter, + }); // console.log(response.data); setDataTableLoading(false); setDataTableData(response.data); - } + }; const headStyle = { fontWeight: 'bold', }; const applyFilter = async (searchFilter: string) => { - await loadDataTableData({ "search" : searchFilter }); - setSearchParams({ "search" : searchFilter }); - } + await loadDataTableData({ search: searchFilter }); + setSearchParams({ search: searchFilter }); + }; - const handlePageChange = (event : ChangeEvent, value: number) => { - const filter = Object.fromEntries([...searchParams.entries(), ["page", value]]); + const handlePageChange = (event: ChangeEvent, value: number) => { + const filter = Object.fromEntries([...searchParams.entries(), ['page', value]]); loadDataTableData(filter); setSearchParams(filter); - } + }; useEffect(() => { loadDataTableData(); - }, []) - + }, []); + return ( - + {/* The Main Table */} - Service - Plan - Benefit Code - Customer Benefit Code - Detail Benefit - ASO/Budget - Budget Condition - Budget Code - Primary benefit - Benefit Mode - Room Class - Max Bed - Tolerance Paramater - Max. Room Class - Limit Value - Area - Shared Benefit With - Shared Benefit Type - MSC - Gender - Min Age - Max Age - Freq. Period - Daily Frequency - Weekly Frequency - Monthly Frequency - Yearly Frequency - Custom Duration - Custom Duration Value - Cashless, Reimbursement - High Plan Factor - Pre Post Treatment - Pre Treatment - Post Treatment - Layer Type 1 - Layer Value 1 - Layer Type 2 - Layer Value 2 - Cashless (%) - Reimburse (%) - Digital (%) - CoShareM (%) - CoShareS (%) - CoShareC (%) - Cashless Deductible - Reimbursement Deductible - Digital Deductible - DeductibleM - DeductibleS - DeductibleC - Prorate Type - Prorate Lookup - Max Days for Disability - Max Periode of Disability - Currency - Show Benefit Item - Show Benefit Value - Status - Action + + Service + + + Plan + + + Benefit Code + + + Customer Benefit Code + + + Detail Benefit + + + + Status + + + Action + - {dataTableIsLoading ? - ( - - - Loading - - - ) : ( - dataTableData.data.length == 0 ? - ( - - - No Data - - - ) : ( - - {dataTableData.data.map(row => ( - - ))} - - ) + {dataTableIsLoading ? ( + + + + Loading + + + + ) : dataTableData.data.length == 0 ? ( + + + + No Data + + + + ) : ( + + {dataTableData.data.map((row) => ( + + ))} + )}
- - -
+ + +
); } diff --git a/frontend/dashboard/src/pages/Corporates/Member/List.tsx b/frontend/dashboard/src/pages/Corporates/Member/List.tsx index f8263419..3bab2c33 100755 --- a/frontend/dashboard/src/pages/Corporates/Member/List.tsx +++ b/frontend/dashboard/src/pages/Corporates/Member/List.tsx @@ -1,5 +1,33 @@ // @mui -import { Box, Button, Card, Collapse, IconButton, InputLabel, MenuItem, OutlinedInput, Paper, Select, SelectChangeEvent, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, TextField, Typography, Badge, Tab, Tabs, CardHeader, Stack, Menu, ButtonGroup, Grid } from '@mui/material'; +import { + Box, + Button, + Card, + Collapse, + IconButton, + InputLabel, + MenuItem, + OutlinedInput, + Paper, + Select, + SelectChangeEvent, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + TextField, + Typography, + Badge, + Tab, + Tabs, + CardHeader, + Stack, + Menu, + ButtonGroup, + Grid, +} from '@mui/material'; import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight'; import AddIcon from '@mui/icons-material/Add'; @@ -21,77 +49,85 @@ export default function CorporatePlanList() { const { themeStretch } = useSettings(); const { corporate_id } = useParams(); const [searchParams, setSearchParams] = useSearchParams(); - const [importResult, setImportResult] = useState(null) + const [importResult, setImportResult] = useState(null); // Dummy Default Data const [dataTableIsLoading, setDataTableLoading] = React.useState(true); const [dataTableData, setDataTableData] = React.useState({ current_page: 1, data: [], - path: "", - first_page_url: "", + path: '', + first_page_url: '', last_page: 1, - last_page_url: "", - next_page_url: "", - prev_page_url: "", + last_page_url: '', + next_page_url: '', + prev_page_url: '', per_page: 10, from: 0, to: 0, - total: 0 + total: 0, }); const loadDataTableData = async (appliedFilter = null) => { setDataTableLoading(true); const filter = appliedFilter ? appliedFilter : Object.fromEntries([...searchParams.entries()]); const response = await axios - .get('/corporates/'+corporate_id+'/members', { params: filter }) + .get('/corporates/' + corporate_id + '/members', { params: filter }) .catch((response) => { - enqueueSnackbar('Failed getting data. ' + response.message, { variant: 'error' }) + enqueueSnackbar('Failed getting data. ' + response.message, { variant: 'error' }); }); // console.log(response.data); setDataTableLoading(false); setDataTableData(response.data); - } + }; const applyFilter = async (searchFilter: string) => { - await loadDataTableData({ "search" : searchFilter }); - setSearchParams({ "search" : searchFilter }); - } + await loadDataTableData({ search: searchFilter }); + setSearchParams({ search: searchFilter }); + }; - const handlePageChange = (event : ChangeEvent, value: number) => { - const filter = Object.fromEntries([...searchParams.entries(), ["page", value]]); + const handlePageChange = (event: ChangeEvent, value: number) => { + const filter = Object.fromEntries([...searchParams.entries(), ['page', value]]); loadDataTableData(filter); setSearchParams(filter); - } + }; useEffect(() => { loadDataTableData(); - }, []) - + }, []); + function SearchInput(props: any) { - // SEARCH + // SEARCH const searchInput = useRef(null); - const [searchText, setSearchText] = useState(""); + const [searchText, setSearchText] = useState(''); const handleSearchChange = (event: any) => { - const newSearchText = event.target.value ?? '' + const newSearchText = event.target.value ?? ''; setSearchText(newSearchText); - } + }; const handleSubmit = (event: any) => { event.preventDefault(); props.onSearch(searchText); // Trigger to Parent - } + }; - useEffect(() => { + useEffect(() => { // console.log('Search Input: useEffect') setSearchText(searchParams.get('search') ?? ''); - }, [searchParams]) + }, [searchParams]); return ( - + ); } @@ -101,8 +137,8 @@ export default function CorporatePlanList() { // Create Button Menu const [anchorEl, setAnchorEl] = React.useState(null); const createMenu = Boolean(anchorEl); - const importPlan = useRef(null) - const [currentImportFileName, setCurrentImportFileName] = useState(null) + const importPlan = useRef(null); + const [currentImportFileName, setCurrentImportFileName] = useState(null); const handleClick = (event: React.MouseEvent) => { setAnchorEl(event.currentTarget); @@ -117,51 +153,65 @@ export default function CorporatePlanList() { handleClose(); importPlan.current ? importPlan.current.click() : console.log('No File selected'); } else { - alert('No file selected') + alert('No file selected'); } - } + }; const handleCancelImportButton = () => { - importPlan.current.value = ""; - importPlan.current.dispatchEvent(new Event("change", { bubbles: true })); - } + importPlan.current.value = ''; + importPlan.current.dispatchEvent(new Event('change', { bubbles: true })); + }; const handleImportChange = (event: any) => { if (event.target.files[0]) { - setCurrentImportFileName(event.target.files[0].name) + setCurrentImportFileName(event.target.files[0].name); } else { setCurrentImportFileName(null); } - } + }; const handleUpload = () => { if (importPlan.current?.files.length) { const formData = new FormData(); - formData.append("file", importPlan.current?.files[0]) - axios.post(`corporates/${corporate_id}/members/import`, formData ) - .then(response => { + formData.append('file', importPlan.current?.files[0]); + axios + .post(`corporates/${corporate_id}/members/import`, formData) + .then((response) => { handleCancelImportButton(); loadDataTableData(); - setImportResult(response.data) - }) - .catch(response => { - enqueueSnackbar('Looks like something went wrong. Please check your data and try again. ' + response.message, { variant: 'error' }) + setImportResult(response.data); }) + .catch((response) => { + enqueueSnackbar( + 'Looks like something went wrong. Please check your data and try again. ' + + response.message, + { variant: 'error' } + ); + }); } else { - enqueueSnackbar('No File Selected', { variant: 'warning' }) + enqueueSnackbar('No File Selected', { variant: 'warning' }); } - } - + }; + return (
- - {( !currentImportFileName && - - {/*

kjasndkjandskjasndkjansdkjansd

*/} - - - + {currentImportFileName && ( + + + + + - - + +
)} - {( importResult && - - Last Import Result : { importResult.total_success_row ?? 0 } Row Processed, { importResult.total_failed_row } Failed, Report : {importResult.result_file?.name ?? "-"} - + {importResult && ( + + + Last Import Result :{' '} + + {importResult.total_success_row ?? 0} + {' '} + Row Processed,{' '} + + {importResult.total_failed_row} + {' '} + Failed, Report :{' '} + + {importResult.result_file?.name ?? '-'} + + + )}
); } // Called on every row to map the data to the columns - function createData( member: Member ): Member { + function createData(member: Member): Member { return { ...member, - } + }; } const [columns, setColumns] = React.useState([ - { id: 'member_id', label: 'MemberID', minWidth: 100, align: "left" }, - { id: 'principal_id', label: 'Mapping ID', minWidth: 100, align: "left" }, - { id: 'nik', label: 'NIK', minWidth: 100, align: "left" }, - { id: 'current_policy.policy_number', label: 'Policy Number', minWidth: 100, align: "left" }, - { id: 'effective_date', label: 'Effective Date', minWidth: 100, align: "left" }, - { id: 'name', label: 'Name', minWidth: 100, align: "left" }, - { id: 'nric', label: 'NRIC', minWidth: 100, align: "left" }, - { id: 'email', label: 'E-mail', minWidth: 100, align: "left" }, - { id: 'plan_id', label: 'PlanID', minWidth: 100, align: "left" }, - { id: 'activation_date', label: 'Activation Date', minWidth: 100, align: "right" }, - { id: 'termination_date', label: 'Termination Date', minWidth: 100, align: 'right' }, + { id: 'member_id', label: 'MemberID', minWidth: 100, align: 'left' }, + // { id: 'principal_id', label: 'Mapping ID', minWidth: 100, align: 'left' }, + // { id: 'nik', label: 'NIK', minWidth: 100, align: 'left' }, + // { id: 'current_policy.policy_number', label: 'Policy Number', minWidth: 100, align: 'left' }, + { id: 'effective_date', label: 'Effective Date', minWidth: 100, align: 'left' }, + { id: 'name', label: 'Name', minWidth: 100, align: 'left' }, + // { id: 'nric', label: 'NRIC', minWidth: 100, align: 'left' }, + // { id: 'email', label: 'E-mail', minWidth: 100, align: 'left' }, + { id: 'plan_id', label: 'PlanID', minWidth: 100, align: 'left' }, + { id: 'activation_date', label: 'Activation Date', minWidth: 100, align: 'left' }, + { id: 'termination_date', label: 'Termination Date', minWidth: 100, align: 'left' }, ]); // Generate the every row of the table function Row(props: { row: ReturnType }) { const { row } = props; const [open, setOpen] = React.useState(false); - + const handleActivate = (model: any, status: string) => { + axios + .put(`/members/${row.id}/activation`, { + // service_code: service.service_code, + active: status == 'active', + }) + .then((res) => { + setDataTableData({ + ...dataTableData, + data: dataTableData.data.map((model) => { + let updatedModel = model; + if (row.id == model.id) { + updatedModel.active = res.data.member.active; + } + return updatedModel; + }), + }); + }) + .catch((error) => { + // console.log('asdasd', error.response.data.message) + enqueueSnackbar( + error.response.data.message ?? error.message ?? 'Failed Processing Request', + { variant: 'error' } + ); + }); + }; return ( *': { borderBottom: 'unset' } }}> - setOpen(!open)} - > + setOpen(!open)}> {open ? : } - {/* { columns.map((column, index) => - { row[column.id] ?? '-' } - ) } */} - {/* TODO FIX DISPLAY DATA FROM RELATION */} - {/* { id: 'member_id', label: 'MemberID', minWidth: 100, align: "left" }, - { id: 'principal_id', label: 'Mapping ID', minWidth: 100, align: "left" }, - { id: 'nik', label: 'NIK', minWidth: 100, align: "left" }, - { id: 'current_policy.policy_number', label: 'Policy Number', minWidth: 100, align: "left" }, - { id: 'effective_date', label: 'Effective Date', minWidth: 100, align: "left" }, - { id: 'name', label: 'Name', minWidth: 100, align: "left" }, - { id: 'nric', label: 'NRIC', minWidth: 100, align: "left" }, - { id: 'email', label: 'E-mail', minWidth: 100, align: "left" }, - { id: 'plan_id', label: 'PlanID', minWidth: 100, align: "left" }, - { id: 'termination_date', label: 'Termination Date', minWidth: 100, align: 'right' }, - { id: 'activation_date', label: 'Activation Date', minWidth: 100, align: "right" }, - */} {row.member_id} - {row.principal_id} - {row.employeds[0]?.nik} - {row.current_policy?.policy_id} {row.current_policy?.start} {row.name} - {row.nric} - {row.email} {row.current_plan?.code} {row.current_policy?.start} {row.current_policy?.end} - {( row.active ? () - : () - )} + + {row.active == 1 && ( + + )} + {row.active != 1 && ( + + )} + {/* */} {/* COLLAPSIBLE ROW */} - - + + - - Claim History - + + Detail + - Requested + Mapping ID - : {row.total_claims.requested} + : {row.principal_id ?? '-'} + + + Policy Number + + + : {row.current_policy?.code ?? '-'} + + + NRIC + + + : {row.nric ?? '-'} - - Pending + NIK - : {row.total_claims.received} + : {row.employeds[0]?.nik ?? '-'} + + + Email + + + : {row.email ?? '-'} + + + + + + + Birth Date + + + : {row.birth_date ?? '-'} + + + Gender + + + : {row.gender ?? '-'} + + + Martial Status + + + : {row.marital_status ?? '-'} + + + Language + + + : {row.language ?? '-'} + + + Race + + + : {row.race ?? '-'} + + + + + Claim History + + + + + Requested + + + : {row.total_claims?.requested} - - Approved + Pending - : {row.total_claims.approved} + : {row.total_claims?.received} - - Declined + Approved - : {row.total_claims.declined} - - - - Paid - - - : {row.total_claims.paid} + : {row.total_claims?.approved} + + Declined + + + : {row.total_claims?.declined} + + + + Paid + + + : {row.total_claims?.paid} + @@ -360,48 +525,54 @@ export default function CorporatePlanList() { - + {/* The Main Table */} - { columns.map((column, index) => ( - {column.label} - )) } - Status - Action + {columns.map((column, index) => ( + + {column.label} + + ))} + + Status + + + Action + - {dataTableIsLoading ? - ( - - - Loading - - - ) : ( - dataTableData.data.length == 0 ? - ( - - - No Data - - - ) : ( - - {dataTableData.data.map((row, index) => ( - - ))} - - ) + {dataTableIsLoading ? ( + + + + Loading + + + + ) : dataTableData.data.length == 0 ? ( + + + + No Data + + + + ) : ( + + {dataTableData.data.map((row, index) => ( + + ))} + )}
- - -
+ + +
); }