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 994c3066..ea14475f 100644 --- a/Modules/Internal/Routes/api.php +++ b/Modules/Internal/Routes/api.php @@ -105,8 +105,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 7a637a80..7c4d06a0 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -40,7 +40,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))); @@ -51,7 +51,7 @@ class AppServiceProvider extends ServiceProvider // }); Corporate::updated(function ($model) { - + $this->logAuditTrail($model, 'updated'); }); @@ -60,7 +60,7 @@ class AppServiceProvider extends ServiceProvider }); Member::updated(function ($model) { - + $this->logAuditTrail($model, 'updated'); }); @@ -71,7 +71,7 @@ class AppServiceProvider extends ServiceProvider // Corporate Service CorporateService::updated(function ($model) { - + $this->logAuditTrail($model, 'updated'); }); @@ -81,7 +81,7 @@ class AppServiceProvider extends ServiceProvider // Corporate Plans CorporatePlan::updated(function ($model) { - + $this->logAuditTrail($model, 'updated'); }); @@ -91,7 +91,7 @@ class AppServiceProvider extends ServiceProvider // Corporate Benefits CorporateBenefit::updated(function ($model) { - + $this->logAuditTrail($model, 'updated'); }); @@ -102,21 +102,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/frontend/dashboard/.env.development b/frontend/dashboard/.env.development index e9e17c4c..95652e0f 100644 --- a/frontend/dashboard/.env.development +++ b/frontend/dashboard/.env.development @@ -1,7 +1,7 @@ GENERATE_SOURCEMAP=false -PORT=8083 +PORT=8000 -REACT_APP_HOST_API_URL="https://aso-api.linksehat.dev/api/internal" +REACT_APP_HOST_API_URL="http://127.0.0.1:8000/api/internal" -VITE_API_URL="https://aso-api.linksehat.dev/api/internal" +VITE_API_URL="http://127.0.0.1:8000/api/internal" diff --git a/frontend/dashboard/src/components/ThemeColorPresets.tsx b/frontend/dashboard/src/components/ThemeColorPresets.tsx index 03d43c43..56c57c2d 100644 --- a/frontend/dashboard/src/components/ThemeColorPresets.tsx +++ b/frontend/dashboard/src/components/ThemeColorPresets.tsx @@ -21,7 +21,7 @@ export default function ThemeColorPresets({ children }: Props) { ...defaultTheme, palette: { ...defaultTheme.palette, - primary: setColor, + // primary: setColor, }, customShadows: { ...defaultTheme.customShadows, 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 9d09e4b1..2bd5c202 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/routes/index.tsx b/frontend/dashboard/src/routes/index.tsx index fb15ab6c..5b5a3e6e 100644 --- a/frontend/dashboard/src/routes/index.tsx +++ b/frontend/dashboard/src/routes/index.tsx @@ -165,6 +165,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: , @@ -453,6 +457,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')) ); diff --git a/frontend/dashboard/src/theme/palette.ts b/frontend/dashboard/src/theme/palette.ts index 6dc9fde3..38249bc1 100644 --- a/frontend/dashboard/src/theme/palette.ts +++ b/frontend/dashboard/src/theme/palette.ts @@ -62,11 +62,11 @@ declare module '@mui/material' { // SETUP COLORS const PRIMARY = { - lighter: '#19BBBB', // #19BBBB - light: '#5BE584', - main: '#00AB55', - dark: '#007B55', - darker: '#005249', + lighter: '#D0FBEC', + light: '#70EAD5', + main: '#19BBBB', + dark: '#0C7186', + darker: '#043C59', }; const SECONDARY = { lighter: '#D6E4FF',