diff --git a/Modules/Internal/Http/Controllers/Api/DiagnosisExclusionController.php b/Modules/Internal/Http/Controllers/Api/DiagnosisExclusionController.php index 51cbaec1..9fca0540 100644 --- a/Modules/Internal/Http/Controllers/Api/DiagnosisExclusionController.php +++ b/Modules/Internal/Http/Controllers/Api/DiagnosisExclusionController.php @@ -277,6 +277,7 @@ class DiagnosisExclusionController extends Controller $gender = implode(",", $gender); $gender = trim($gender, ","); + $exclusion->rules()->corporate_id = $corporate_id; $exclusion->rules()->updateOrCreate([ 'exclusion_id' => $exclusion->id, @@ -302,7 +303,6 @@ class DiagnosisExclusionController extends Controller 'values' => $data['min_age'] ?? '', ]); - $exclusion->rules()->updateOrCreate([ 'exclusion_id' => $exclusion->id, 'name' => 'max_age', @@ -330,6 +330,59 @@ class DiagnosisExclusionController extends Controller return Helper::paginateResources(DiagnosisExclusionResource::collection($exclusions)); } + /** + * Bagaskoro BSD 20-10-2023 + * + * Fungsi untuk get detil exclusion + */ + public function detilExclusion(Request $request, $corporate_id, $id_exclusion) + { + $corporate = Corporate::query() + ->with(['currentPolicy', 'plans']) + ->withCount('corporatePlans') + ->withCount('employees') + ->findOrFail($corporate_id); + + $plans = $corporate['plans']->map(function ($plan) { + return $plan['code']; + }); + + $exclusions = Exclusion::query() + ->where('id', $id_exclusion) + ->where('type', 'diagnosis') + ->where('deleted_at', null) + ->with(['rules']) + ->get(); + + $exclusion = DiagnosisExclusionResource::collection($exclusions); + + return response()->json([ + 'error' => false, + 'messages' => "success", + 'data' => [ + 'exclusion' => empty($exclusion) ? [] : $exclusion[0], + 'plans' => $plans, + ] + ],200); + } + + /** + * Bagaskoro BSD 19-10-2023 + * + * Fungsi untuk update status active + */ + protected function messages() + { + return [ + 'required' => ':attribute harus diisi', + 'integer' => ':attribute harus angka', + 'unique' => ':attribute (:input) sudah ada', + 'max' => ':attribute maximal :max karakter', + 'exists' => ':attribute (:input) tidak ditemukan', + 'digits_between'=> ':attribute maximal :max digit minimal :min digit' + ]; + } + public function updateActivation(Request $request) { // validation rule @@ -340,8 +393,20 @@ class DiagnosisExclusionController extends Controller // validation error if ($validator->fails()) { - return response()->json($validator->getMessageBag(),400); + return response()->json([ + 'error' => true, + 'messages' => $validator->getMessageBag() + ],400); } + Exclusion::where('id', $request->id)->update([ + 'active' => $request->active + ]); + + return response()->json([ + 'error' => false, + 'messages' => "status berhasil diupdate", + 'data' => [] + ],200); } } diff --git a/Modules/Internal/Routes/api.php b/Modules/Internal/Routes/api.php index 59a0bf04..ec4e1a19 100644 --- a/Modules/Internal/Routes/api.php +++ b/Modules/Internal/Routes/api.php @@ -113,8 +113,9 @@ Route::prefix('internal')->group(function () { Route::get('corporates/{corporate_id}/diagnosis-exclusions', [DiagnosisExclusionController::class, 'index']); + Route::get('corporates/{corporate_id}/diagnosis-exclusions/{id_exclusion}', [DiagnosisExclusionController::class, 'detilExclusion']); // By Bagaskoro, get detil exclusion Route::post('corporates/{corporate_id}/diagnosis-exclusions/store', [DiagnosisExclusionController::class, 'storeExclusion']); - Route::put('corporates/diagnosis-exclusions/update_activation', [DiagnosisExclusionController::class, 'updateActivation']); + Route::put('corporates/diagnosis-exclusions/update_activation', [DiagnosisExclusionController::class, 'updateActivation']); // By Bagaskoro, edit status aktif Route::delete('diagnosis-exclusions/{id}', [DiagnosisExclusionController::class, 'destroy']); Route::post('corporates/{corporate_id}/diagnosis-exclusions/import', [DiagnosisExclusionController::class, 'import']); diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 34361820..0a910438 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -12,6 +12,7 @@ use App\Models\CorporateService; use App\Models\CorporatePlan; use App\Models\CorporateBenefit; use App\Models\Member; +use App\Models\CorporateHospital; use App\Models\ExclusionRules; use App\Models\ExclusionImport; use App\Models\Icd; @@ -41,7 +42,7 @@ class AppServiceProvider extends ServiceProvider public function boot() { Schema::defaultStringLength(191); - + Str::macro('initials', fn($value, $sep = ' ', $glue = '') => trim(collect(explode($sep, $value))->map(function ($segment) { return $segment[0] ?? ''; })->join($glue))); @@ -52,7 +53,7 @@ class AppServiceProvider extends ServiceProvider // }); Corporate::updated(function ($model) { - + $this->logAuditTrail($model, 'updated'); }); @@ -61,7 +62,7 @@ class AppServiceProvider extends ServiceProvider }); Member::updated(function ($model) { - + $this->logAuditTrail($model, 'updated'); }); @@ -69,10 +70,20 @@ class AppServiceProvider extends ServiceProvider $this->logAuditTrail($model, 'deleted'); }); + //Hospital + CorporateHospital::updated(function ($model) { + + $this->logAuditTrail($model, 'updated'); + }); + + CorporateHospital::deleted(function ($model) { + $this->logAuditTrail($model, 'deleted'); + }); + // Corporate Service CorporateService::updated(function ($model) { - + $this->logAuditTrail($model, 'updated'); }); @@ -82,7 +93,7 @@ class AppServiceProvider extends ServiceProvider // Corporate Plans CorporatePlan::updated(function ($model) { - + $this->logAuditTrail($model, 'updated'); }); @@ -92,7 +103,7 @@ class AppServiceProvider extends ServiceProvider // Corporate Benefits CorporateBenefit::updated(function ($model) { - + $this->logAuditTrail($model, 'updated'); }); @@ -103,21 +114,20 @@ class AppServiceProvider extends ServiceProvider // Corporate Exclusion ExclusionRules::updated(function ($model) { - - $this->logAuditTrailExclusion($model, 'updated'); + $this->logAuditTrail($model, 'updated'); }); ExclusionRules::deleted(function ($model) { - $this->logAuditTrailExclusion($model, 'deleted'); + $this->logAuditTrail($model, 'deleted'); }); ExclusionImport::updated(function ($model) { - - $this->logAuditTrailExclusion($model, 'updated'); + + $this->logAuditTrail($model, 'updated'); }); ExclusionImport::deleted(function ($model) { - $this->logAuditTrailExclusion($model, 'deleted'); + $this->logAuditTrail($model, 'deleted'); }); // ICD or exlusion diff --git a/database/migrations/2023_10_19_132434_create_corporate_hospitals.php b/database/migrations/2023_10_19_132434_create_corporate_hospitals.php index 5b1bb211..ae434a69 100644 --- a/database/migrations/2023_10_19_132434_create_corporate_hospitals.php +++ b/database/migrations/2023_10_19_132434_create_corporate_hospitals.php @@ -21,7 +21,7 @@ return new class extends Migration $table->string('name', 255); $table->text('description')->nullable(); $table->tinyInteger('active')->default(1); - $table->text('reason'); + $table->text('reason')->nullable(); $table->timestamps(); $table->softDeletes(); $table->bigInteger('created_by')->nullable(); diff --git a/frontend/dashboard/.env.development b/frontend/dashboard/.env.development index fc501ce1..943542d0 100644 --- a/frontend/dashboard/.env.development +++ b/frontend/dashboard/.env.development @@ -1,6 +1,6 @@ GENERATE_SOURCEMAP=false -PORT=8083 +PORT=8000 REACT_APP_HOST_API_URL="http://lms.test" diff --git a/frontend/dashboard/src/components/hook-form/RHFCheckbox.tsx b/frontend/dashboard/src/components/hook-form/RHFCheckbox.tsx index cac7f8bb..5aceb667 100644 --- a/frontend/dashboard/src/components/hook-form/RHFCheckbox.tsx +++ b/frontend/dashboard/src/components/hook-form/RHFCheckbox.tsx @@ -1,7 +1,8 @@ // form import { useFormContext, Controller } from 'react-hook-form'; // @mui -import { Checkbox, FormControlLabel, FormGroup, FormControlLabelProps } from '@mui/material'; +import { Checkbox, FormControlLabel, FormGroup, FormControlLabelProps, SxProps } from '@mui/material'; +import { Theme } from '@mui/system'; // ---------------------------------------------------------------------- @@ -77,9 +78,10 @@ interface optionsCustomInterface { interface RHFCustomMultiCheckboxProps { name: string; options: optionsCustomInterface[]; + sx?: SxProps } -export function RHFCustomMultiCheckbox({ name, options, ...other }: RHFCustomMultiCheckboxProps) { +export function RHFCustomMultiCheckbox({ name, options, sx, ...other }: RHFCustomMultiCheckboxProps) { const { control } = useFormContext(); return ( @@ -93,7 +95,7 @@ export function RHFCustomMultiCheckbox({ name, options, ...other }: RHFCustomMul : [...field.value, option.value]; return ( - + {options.map((option, index) => ( ([]); // option untuk field plans + + // checkbox option + // ==================================== + const msc_checkbox_option = [ + { + value: 'm', + label: 'Member', + }, + { + value: 's', + label: 'Spouse', + }, + { + value: 'c', + label: 'Child', + }, + ] + + const gender_checkbox_option = [ + { + value: 'male', + label: 'Male', + }, + { + value: 'female', + label: 'Female', + }, + ] + + // setup form + // ==================================== + const defaultValues: any = { + msc: [], + gender: [], + min_age: '', + max_age: '', + plans: [], + }; + + const methods = useForm({ + defaultValues + }); + + const { setValue, handleSubmit, reset, watch, formState: { isDirty, isSubmitting } } = methods; + const formValues = watch(); + + // set form value + // ===================================== + useEffect(() => { + axios.get(`corporates/${corporate_id}/diagnosis-exclusions/${exclusion_id}`) + .then((res) => { + // plan option + setPlans(res.data.data.plans); + + // set value + let res_plan = res.data.data.exclusion.rules.plan; + + if (res_plan.length == 1 && res_plan[0] == '') { + res_plan = []; + } + + reset({ + msc : res.data.data.exclusion.rules.msc[0].split(','), + gender : res.data.data.exclusion.rules.gender[0].split(','), + min_age : res.data.data.exclusion.value_rules.min_age, + max_age : res.data.data.exclusion.value_rules.max_age, + plans : res_plan, + }) + }) + }, [exclusion_id]); + + // Submit Form + // ===================================== + const submitHandler = async (data: any) => { + let one_row = { + msc: { + m: data.msc.includes('m'), + s: data.msc.includes('s'), + c: data.msc.includes('c'), + }, + gender : { + male : data.gender.includes('male') == true ? 1 : 0, + female: data.gender.includes('female') == true ? 1 : 0, + }, + min_age: data.min_age, + max_age: data.max_age, + plan : data.plans.join(','), + icd_id : exclusion_id, + } + + return axios + .post(`/corporates/${corporate_id}/diagnosis-exclusions/store`, { + type: 'one_row', + icd_id: exclusion_id, + one_row + }) + .then((res) => { + enqueueSnackbar('Exclusion Updated', { + variant: 'success', + }); + + reset({ + msc : data.msc, + gender : data.gender, + min_age : data.min_age, + max_age : data.max_age, + plans : data.plans, + }) + + return true; + }) + .catch((res) => { + enqueueSnackbar('Terjadi kesalahan pada server', { + variant: 'error', + }); + + return true; + }) + } + + return ( + + + navigate(`/corporates/${corporate_id}/diagnosis-exclusions`)} > + + + + + {pageTitle} + + + + + + + + {/* MSC row */} + + + + + MSC* : + + + + + + + + + {/* Gender row */} + + + + + Gender* : + + + + + + + + + {/* Age row */} + + + + + Age* : + + + + + + + + + + + + + + + + {/* Plan Section */} + + + + + Plan* : + + + + { + return option ?? false + }} + value={formValues.plans} + isOptionEqualToValue={(option, value) =>{ + return option === value + }} + renderInput={(params) => ( + + )} + onChange={(event,value) => { + setValue('plans', value, {shouldDirty: true}); + }} + /> + + + + + {/* Button Cancle & Save */} + + + + + + Save Changes + + + + + + + + + + ); +} diff --git a/frontend/dashboard/src/pages/Corporates/DiagnosisExclusion/List.tsx b/frontend/dashboard/src/pages/Corporates/DiagnosisExclusion/List.tsx index 431f855f..99332313 100644 --- a/frontend/dashboard/src/pages/Corporates/DiagnosisExclusion/List.tsx +++ b/frontend/dashboard/src/pages/Corporates/DiagnosisExclusion/List.tsx @@ -476,22 +476,36 @@ export default function List(props: any) { active: row.active == 1 ? 0 : 1, }) .then((res) => { - // setDataTableData({ - // ...dataTableData, - // data: dataTableData.data.map((model) => { - // let updatedModel = model; - // if (row.id == model.id) { - // updatedModel.active = res.data.corporate.active; - // } - // return updatedModel; - // }), - // }); + setDataTableData({ + ...dataTableData, + data: dataTableData.data.map((model) => { + let updatedModel = model; + + if (model.id == row.id) { + updatedModel.active = row.active == 1 ? 0 : 1; + } + + return updatedModel; + }), + }); }) .catch((error) => { - enqueueSnackbar( - error.response.data.message ?? error.message ?? 'Failed Processing Request', - { variant: 'error' } - ); + if (error.response.status == 400) { + let data = error.response.data.messages; + + for (const key in data) { + enqueueSnackbar( + data[key][0], + { variant: 'error' } + ); + } + } + else { + enqueueSnackbar( + error.response.data.message ?? error.message ?? 'Failed Processing Request', + { variant: 'error' } + ); + } }); }; @@ -539,7 +553,7 @@ export default function List(props: any) { Detail - navigate(`/corporates/${corporate_id}/diagnosis-exclusions/history`)} > + navigate(`/corporates/${corporate_id}/diagnosis-exclusions/${row.id}/edit`)} > Edit @@ -630,222 +644,6 @@ export default function List(props: any) { ) : null } - {/* {open == true ? ( - openEdit == false ? ( - -
- - Excluded Only for : - - - {row.rules.msc && ( - - MSC : {row.rules.msc.join(', ') ?? '-'} - - )} - {row.rules.gender && ( - - Gender : {row.rules.gender.join(', ') ?? '-'} - - )} - {(row.rules.min_age || row.rules.max_age) && ( - - Age : {row.rules.min_age ?? '-'} - {row.rules.max_age ?? '-'} - - )} - {row.rules.plan && ( - - Plan : {row.rules.plan.join(', ') ?? '-'} - - )} -
-
- ) : ( - // - - - Edit Exclusion : - - - - - - - MSC - - - - - - { - // handleConfigExclusion(event, row, 'm', 'msc'); - handleChange(index, event, 'msc', row.id, 'm'); - }} - /> - } - label="Member" - /> - - - { - // handleConfigExclusion(event, row, 's', 'msc'); - handleChange(index, event, 'msc', row.id, 's'); - }} - /> - } - label="Spouse" - /> - - - { - // handleConfigExclusion(event, row, 'c', 'msc'); - handleChange(index, event, 'msc', row.id, 'c'); - }} - /> - } - label="Child" - /> - - - - - - - - - - Gender - - - - - { - // handleConfigExclusion(event, row, 'male', 'gender'); - handleChange(index, event, 'gender', row.id, 'male'); - }} - /> - } - label="Male" - /> - - - { - // handleConfigExclusion(event, row, 'female', 'gender'); - handleChange(index, event, 'gender', row.id, 'female'); - }} - /> - } - label="Female" - /> - - - - - - - - - Age - - - - - { - handleMinAge(event); - handleChange(index, event, 'min_age', row.id); - }} - onKeyDown={(event) => { - if (event.key === 'Enter') { - handleConfigExclusion(event, row, minAge, 'min_age'); - } - }} - /> - - - { - handleMaxAge(event); - handleChange(index, event, 'max_age', row.id); - }} - onKeyDown={(event) => { - if (event.key === 'Enter') { - handleConfigExclusion(event, row, maxAge, 'max_age'); - } - }} - /> - - - - - - - - - Plan - - - - - option.label} - defaultValue={converToArray(row.value_rules.plan) || []} - isOptionEqualToValue={(option, value) => - option.value === value.value - } - onChange={(event, value) => { - handlePlanChange(event, value); - handleChange(index, event, 'plan', row.id, value); - }} - onKeyDown={(event) => { - if (event.key === 'Enter') { - handleConfigExclusion(event, row, valuePlan, 'plan'); - } - }} - renderInput={(params) => ( - - )} - /> - - - - - - - - ) - ) : null} */} diff --git a/frontend/dashboard/src/pages/Corporates/Hospital/Form.tsx b/frontend/dashboard/src/pages/Corporates/Hospital/Form.tsx index f31ac177..b0d708bf 100644 --- a/frontend/dashboard/src/pages/Corporates/Hospital/Form.tsx +++ b/frontend/dashboard/src/pages/Corporates/Hospital/Form.tsx @@ -14,19 +14,28 @@ export default function CorporateHospitalForm({ isEdit }: Props) { const navigate = useNavigate(); const { corporate_id, id, organization_id } = useParams(); const [dataHospital, setDataHospital] = useState(null); - const [addData, setAddData] = useState(null); let idHospital = organization_id && isEdit ? organization_id : 0; const [indexData, setIndexData] = useState(idHospital); const [updateData, setUpdateData] = useState(null); + const [dataDefault, setDataDefault] = useState(null); useEffect(() => { axios.get('/corporates/' + corporate_id + '/hospitals/data') .then((res) => { setDataHospital(res.data); + const data = { + corporate_id : corporate_id ? corporate_id : null, + organization_id : res.data[0] ? res.data[0].id : null, + code : res.data[0] ? res.data[0].code : null, + name : res.data[0] ? res.data[0].name : null, + } + setDataDefault(data); }) }, [isEdit]); - + + const [addData, setAddData] = useState(dataDefault); + const handlePageChange = (index:any) => { setIndexData(index); const data = { @@ -36,11 +45,12 @@ export default function CorporateHospitalForm({ isEdit }: Props) { name : dataHospital ? dataHospital[index].name : null, } setAddData(data); + } const handleSaveData = () => { //Save data axios - .post('/corporates/'+corporate_id+'/hospitals/save', addData) + .post('/corporates/'+corporate_id+'/hospitals/save', (addData ? addData : dataDefault)) .then((response) => { if(response.data) { diff --git a/frontend/dashboard/src/pages/Corporates/Hospital/History.tsx b/frontend/dashboard/src/pages/Corporates/Hospital/History.tsx new file mode 100644 index 00000000..457a21c3 --- /dev/null +++ b/frontend/dashboard/src/pages/Corporates/Hospital/History.tsx @@ -0,0 +1,158 @@ +import { useNavigate, useParams } from "react-router-dom"; +import HeaderBreadcrumbs from "../../../components/HeaderBreadcrumbs"; +import Page from "../../../components/Page"; +import { useContext, useEffect, useState } from 'react'; +import { Hospital } from '../../../@types/corporates'; +import { Corporate } from "@/@types/corporates"; +import { ConfiguredCorporateContext } from "@/contexts/ConfiguredCorporateContext"; +import { + Stack, + Typography, + Card, + Paper, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + Collapse, + Box, + Tab, +} from '@mui/material'; +import axios from '@/utils/axios'; +import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; +import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight'; +import { fDate, fDateTime } from '@/utils/formatTime'; + + + +export default function HospitalHistory() { + const { corporate_id, id } = useParams(); + const navigate = useNavigate(); + + const [corporate, setCorporate] = useState(); + + const [ currentHospital, setCurrentHospital ] = useState(); + + const configuredCorporateContext = useContext(ConfiguredCorporateContext); + + useEffect(() => { + setCorporate(configuredCorporateContext.currentCorporate); + const model = 'App\\Models\\CorporateHospital'; + const url = `/audittrail/${id}?model=${model}`; + axios.get(url) + .then((res) => { + setCurrentHospital(res.data); + }) + .catch((error) => { + console.error('Terjadi kesalahan:', error); + }); + }, [corporate_id, id, configuredCorporateContext]); + + const [openRows, setOpenRows] = useState({}); + + const handleRowToggle = (index) => { + setOpenRows((prevOpenRows) => ({ + ...prevOpenRows, + [index]: !prevOpenRows[index], + })); + }; + + return ( + + + + + + {/* Condition Table Body */} + {currentHospital?.data.map((item, index) => ( + + + Data has {item.action} by {item.user_id} on {fDateTime(item.updated_at)} + + {openRows[index] ? ( + handleRowToggle(index)} /> + ) : ( + handleRowToggle(index)} /> + )} + + + + + {/* COLLAPSIBLE ROW */} + + +
+ + + + Field + + + Old Value + + + New Value + + + + + {Object.entries(item.old_values).map(([key, value]) => { + let renderedValue; + if (key === 'code' || key === 'name') { + renderedValue = item.new_values[key]; + const field = key.charAt(0).toUpperCase() + key.slice(1); + return ( + + + {field ? field : '-'} + + + {value ? value : '-'} + + + {renderedValue ? renderedValue : ''} + + + ); + } + else + { + return null; + } + })} + +
+
+ + + + + ))} + + +
+
+ ); +} diff --git a/frontend/dashboard/src/pages/Corporates/Hospital/List.tsx b/frontend/dashboard/src/pages/Corporates/Hospital/List.tsx index c7f34fb0..74f4bc94 100644 --- a/frontend/dashboard/src/pages/Corporates/Hospital/List.tsx +++ b/frontend/dashboard/src/pages/Corporates/Hospital/List.tsx @@ -96,10 +96,10 @@ export default function PlanList() { return ( - - {row.code ? row.code : '-'} + *': open ? {borderBottom: 'unset'} : {}, cursor: open ? 'pointer' : '' }} onClick={() => {if(open==true) setOpen(!open)}}> + {row.code ? row.code : '-'} {row.name ? row.name : '-'} - + {row.active === 1 ? ( )} - + setOpen(!open)}> @@ -125,7 +125,7 @@ export default function PlanList() { Update Status - navigate ('')}> + navigate ('/corporates/'+corporate_id+'/hospitals/'+row.id+'/history')}> History @@ -135,8 +135,8 @@ export default function PlanList() { {/* COLLAPSIBLE ROW */} - - + {if(open==true) setOpen(!open)}}> + @@ -290,16 +290,16 @@ export default function PlanList() { {/* Table Head */} - + Code Hospital - + Status - + diff --git a/frontend/dashboard/src/pages/Corporates/Member/History.tsx b/frontend/dashboard/src/pages/Corporates/Member/History.tsx new file mode 100644 index 00000000..d9c33aed --- /dev/null +++ b/frontend/dashboard/src/pages/Corporates/Member/History.tsx @@ -0,0 +1,166 @@ +import { useNavigate, useParams } from "react-router-dom"; +import HeaderBreadcrumbs from "../../../components/HeaderBreadcrumbs"; +import Page from "../../../components/Page"; +import { useContext, useEffect, useState } from 'react'; +import { Member } from '../../../@types/corporates'; +import { Corporate } from "@/@types/corporates"; +import { ConfiguredCorporateContext } from "@/contexts/ConfiguredCorporateContext"; +import { + Stack, + Typography, + Card, + Paper, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + Collapse, + Box, + Tab, +} from '@mui/material'; +import axios from '@/utils/axios'; +import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; +import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight'; +import { fDate, fDateTime } from '@/utils/formatTime'; + + + +export default function MemberHistory() { + const { corporate_id, member_id } = useParams(); + const navigate = useNavigate(); + + const [corporate, setCorporate] = useState(); + + const [ currentMember, setCurrentMember ] = useState(); + + const configuredCorporateContext = useContext(ConfiguredCorporateContext); + + useEffect(() => { + setCorporate(configuredCorporateContext.currentCorporate); + const model = 'App\\Models\\Member'; + const url = `/audittrail/${member_id}?model=${model}`; + axios.get(url) + .then((res) => { + setCurrentMember(res.data); + }) + .catch((error) => { + console.error('Terjadi kesalahan:', error); + }); + }, [corporate_id, member_id, configuredCorporateContext]); + + const [openRows, setOpenRows] = useState({}); + + const handleRowToggle = (index) => { + setOpenRows((prevOpenRows) => ({ + ...prevOpenRows, + [index]: !prevOpenRows[index], + })); + }; + + return ( + + + + + + {/* Condition Table Body */} + {currentMember?.data.map((item, index) => ( + + + Data has {item.action} by {item.user_id} on {fDateTime(item.updated_at)} + + {openRows[index] ? ( + handleRowToggle(index)} /> + ) : ( + handleRowToggle(index)} /> + )} + + + + + {/* COLLAPSIBLE ROW */} + + +
+ + + + Field + + + Old Value + + + New Value + + + + + {Object.entries(item.old_values).map(([key, value]) => { + let renderedValue; + if (key === 'reason' || key === 'updated_at') { + switch (key) { + case 'updated_at': + renderedValue = fDateTime(item.new_values[key]); + value = fDateTime(value); + break; + default: + renderedValue = item.new_values[key]; + break; + } + const field = key.charAt(0).toUpperCase() + key.slice(1); + + return ( + + + {field ? field : '-'} + + + {value ? value : '-'} + + + {renderedValue ? renderedValue : ''} + + + ); + } + else{ + return null; + } + })} + +
+
+
+
+
+ + ))} + + + + + ); +} diff --git a/frontend/dashboard/src/pages/Corporates/Member/List.tsx b/frontend/dashboard/src/pages/Corporates/Member/List.tsx index dc92063c..35e208ca 100644 --- a/frontend/dashboard/src/pages/Corporates/Member/List.tsx +++ b/frontend/dashboard/src/pages/Corporates/Member/List.tsx @@ -424,7 +424,7 @@ export default function CorporatePlanList({handleSubmitSuccess}) { } const [columns, setColumns] = React.useState([ - { id: 'member_id', label: 'Member ID', minWidth: 100, align: 'center', width: '10%' }, + { id: 'member_id', label: 'Member ID', minWidth: 100, align: 'left', width: '10%' }, { id: 'effective_date', label: 'Effective Date', minWidth: 100, align: 'left', width: '20%' }, { id: 'name', label: 'Name', minWidth: 100, align: 'left', width: '20%' }, { id: 'plan_id', label: 'Plan ID', minWidth: 100, align: 'left', width: '10%' }, @@ -470,8 +470,8 @@ export default function CorporatePlanList({handleSubmitSuccess}) { return ( - - + *': open ? {borderBottom: 'unset'} : {}, cursor: open ? 'pointer' : '' }} onClick={() => {if(open==true) setOpen(!open)}}> + {row.member_id ? row.member_id : '-'} @@ -489,7 +489,7 @@ export default function CorporatePlanList({handleSubmitSuccess}) { {row.terminated_date ? row.terminated_date : '-'} - + setOpen(!open)}> @@ -500,7 +500,7 @@ export default function CorporatePlanList({handleSubmitSuccess}) { Update Status - navigate ('')}> + navigate ('/corporates/'+corporate_id+'/members/'+row.id+'/history')}> History @@ -510,7 +510,7 @@ export default function CorporatePlanList({handleSubmitSuccess}) { {/* COLLAPSIBLE ROW */} - + {if(open==true) setOpen(!open)}}> diff --git a/frontend/dashboard/src/routes/index.tsx b/frontend/dashboard/src/routes/index.tsx index 7afc6fd6..76ec6275 100644 --- a/frontend/dashboard/src/routes/index.tsx +++ b/frontend/dashboard/src/routes/index.tsx @@ -169,6 +169,10 @@ export default function Router() { path: ':corporate_id/diagnosis-exclusions', element: , }, + { + path: ':corporate_id/diagnosis-exclusions/:exclusion_id/edit', + element: , + }, { path: ':corporate_id/diagnosis-exclusions/history', element: , @@ -186,6 +190,10 @@ export default function Router() { path: ':corporate_id/hospitals/edit/:id/:organization_id', element: , }, + { + path: ':corporate_id/hospitals/:id/history', + element: , + }, { path: ':corporate_id/claim-history', element: , @@ -437,7 +445,7 @@ const CorporateDivisionsCreate = Loadable( ); const CorporateMembers = Loadable(lazy(() => import('../pages/Corporates/Member/Index'))); -const CorporateHistoryMembers = Loadable(lazy(() => import('../pages/Corporates/Member/sections/History'))); +const CorporateHistoryMembers = Loadable(lazy(() => import('../pages/Corporates/Member/History'))); const BenefitCreate = Loadable(lazy(() => import('../pages/Corporates/Benefit/Create'))); const Benefits = Loadable(lazy(() => import('../pages/Corporates/Benefit/Index'))); @@ -467,6 +475,9 @@ const CorporatePlansHistory = Loadable(lazy(() => import('../pages/Corporates/Pl const DiagnosisExclusions = Loadable( lazy(() => import('../pages/Corporates/DiagnosisExclusion/Index')) ); +const EditDiagnosisExclusions = Loadable( + lazy(() => import('../pages/Corporates/DiagnosisExclusion/Edit')) +); const DiagnosisExclusionsHistory = Loadable( lazy(() => import('../pages/Corporates/DiagnosisExclusion/History')) ); @@ -516,6 +527,7 @@ const HospitalCreateUpdate = Loadable(lazy(() => import('../pages/Corporates/Hos const CorporateClaimHistories = Loadable( lazy(() => import('../pages/Corporates/ClaimHistory/Index')) ); +const HospitalHistory = Loadable(lazy(() => import('../pages/Corporates/Hospital/History'))); const CorporateHistories = Loadable( lazy(() => import('../pages/Corporates/History'))