diff --git a/Modules/Internal/Http/Controllers/Api/CorporateBenefitController.php b/Modules/Internal/Http/Controllers/Api/CorporateBenefitController.php index f4362852..229c03d2 100644 --- a/Modules/Internal/Http/Controllers/Api/CorporateBenefitController.php +++ b/Modules/Internal/Http/Controllers/Api/CorporateBenefitController.php @@ -20,10 +20,12 @@ class CorporateBenefitController extends Controller $benefits = CorporateBenefit::query() ->filter($request->all()) ->where('corporate_id', $corporate_id) - ->paginate(0) + ->with('benefit', 'plan') + ->paginate(10) ->appends($request->all()); return $benefits; } + public function activation(Request $request, $benefit_id) { $request->validate([ @@ -31,9 +33,8 @@ class CorporateBenefitController extends Controller ]); // abort(404); - - $benefit = CorporateBenefit::findOrFail($benefit_id); - $benefit->active = $request->active == '1'; + $benefit = CorporateBenefit::find($benefit_id); + $benefit->active = $request->active == 1 ? 0 : 1; $benefit->reason = $request->reason; if ($benefit->save()) { diff --git a/Modules/Internal/Http/Controllers/Api/CorporateFormulariumController.php b/Modules/Internal/Http/Controllers/Api/CorporateFormulariumController.php index 1d5f26a4..1056978b 100644 --- a/Modules/Internal/Http/Controllers/Api/CorporateFormulariumController.php +++ b/Modules/Internal/Http/Controllers/Api/CorporateFormulariumController.php @@ -6,6 +6,7 @@ use App\Exceptions\ImportRowException; use App\Helpers\Helper; use App\Models\CorporateFormularium; use App\Models\Formularium; +use App\Models\FormulariumTemplate; use App\Services\ImportService; use Illuminate\Contracts\Support\Renderable; use Illuminate\Http\Request; @@ -52,9 +53,16 @@ class CorporateFormulariumController extends Controller * Show the form for creating a new resource. * @return Renderable */ - public function create() + public function create(Request $request, $corporate_id) { - return view('internal::create'); + $data = CorporateFormularium::where('corporate_id', $corporate_id)->pluck('formularium_template_id')->toArray(); // agar tidak dobel + $formularium_template = FormulariumTemplate::whereNotIn('id', $data)->get(); + $respone = [ + "status" => 200, + "message" => 'data berhasil diambil', + "data" => $formularium_template + ]; + return $respone; } /** @@ -62,9 +70,36 @@ class CorporateFormulariumController extends Controller * @param Request $request * @return Renderable */ - public function store(Request $request) + public function store(Request $request, $corporate_id) { - // + $request->validate([ + 'id' => 'required' + ]); + + $checkFormularium = FormulariumTemplate::find($request->id); + if (!$checkFormularium){ + $respone = [ + "status" => 404, + "message" => "data master formularium tidak ditemukan", + "data" => [] + ]; + return $respone; + } + $newCorporateFormularium = CorporateFormularium::create([ + 'corporate_id' => $corporate_id, + 'formularium_template_id' => $request->id, + 'active' => 1 + ]); + + if ($newCorporateFormularium){ + $respone = [ + "status" => 200, + "message" => "data berhasil disimpan" + ]; + return $respone; + } + + return $newCorporatePlan; } /** @@ -72,9 +107,15 @@ class CorporateFormulariumController extends Controller * @param int $id * @return Renderable */ - public function show($id) + public function show(Request $request, $corporate_id, $id) { - return view('internal::show'); + $data = Formularium::where('formularium_template_id', $id)->get(); + $respone = [ + "status" => 200, + "message" => 'data berhasil diambil', + "data" => $data + ]; + return $respone; } /** @@ -82,9 +123,16 @@ class CorporateFormulariumController extends Controller * @param int $id * @return Renderable */ - public function edit($id) + public function edit(Request $request, $corporate_id) { - return view('internal::edit'); + $data = CorporateFormularium::where('corporate_id', $corporate_id)->pluck('formularium_template_id')->toArray(); // agar tidak dobel + $formularium_template = FormulariumTemplate::whereNotIn('id', $data)->get(); + $respone = [ + "status" => 200, + "message" => 'data berhasil diambil', + "data" => $formularium_template + ]; + return $respone; } /** @@ -139,6 +187,22 @@ class CorporateFormulariumController extends Controller } } + public function active(Request $request, $corporate_id, $id) + { + $corporateFormularium = CorporateFormularium::find($id); + $corporateFormularium->fill([ + 'active' => $request->active, + ])->save(); + + $respone = [ + "status" => 200, + "message" => 'data berhasil diedit', + "data" => $corporateFormularium + ]; + + return $respone; + } + public function import(Request $request, $id) { $request->validate([ diff --git a/Modules/Internal/Http/Controllers/Api/CorporateMemberController.php b/Modules/Internal/Http/Controllers/Api/CorporateMemberController.php index df5368ed..25f1a833 100644 --- a/Modules/Internal/Http/Controllers/Api/CorporateMemberController.php +++ b/Modules/Internal/Http/Controllers/Api/CorporateMemberController.php @@ -69,13 +69,14 @@ class CorporateMemberController extends Controller public function activation(Request $request, $member_id) { $request->validate([ - 'active' => 'required' + 'active' => 'required', + 'reason' => 'required', ]); // abort(404); $member = Member::findOrFail($member_id); - $member->active = $request->active == '1'; + $member->active = $request->active; $member->reason = $request->reason; if ($member->save()) { diff --git a/Modules/Internal/Http/Controllers/Api/CorporatePlanController.php b/Modules/Internal/Http/Controllers/Api/CorporatePlanController.php index a71309a1..9c79a62a 100644 --- a/Modules/Internal/Http/Controllers/Api/CorporatePlanController.php +++ b/Modules/Internal/Http/Controllers/Api/CorporatePlanController.php @@ -25,6 +25,31 @@ class CorporatePlanController extends Controller return $benefits; } + public function filter(Request $request, $corporate_id){ + + $benefits = CorporatePlan::query() + ->filter($request->all()) + ->where('corporate_id', $corporate_id); + // ->where('type', $request->type) + // ->where('code', $request->code); + + if ($request->has('service_code') && is_array($request->service_code) && count($request->service_code) > 0) { + $benefits->whereIn('service_code', $request->service_code); + } + if ($request->has('type') && is_array($request->type) && count($request->type) > 0) { + $benefits->whereIn('type', $request->type); + } + if ($request->has('code') && is_array($request->code) && count($request->code) > 0) { + $benefits->whereIn('code', $request->code); + } + + + $benefits = $benefits->paginate(0)->appends($request->all()); + + return $benefits; + + } + public function activation(Request $request, $plan_id) { $request->validate([ diff --git a/Modules/Internal/Http/Controllers/Api/DiagnosisExclusionController.php b/Modules/Internal/Http/Controllers/Api/DiagnosisExclusionController.php index 51cbaec1..db11aab5 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,21 @@ 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 == 1 ? 0 : 1, + 'reason' => $request->reason + ]); + + return response()->json([ + 'error' => false, + 'messages' => "status berhasil diupdate", + 'data' => [] + ],200); } } diff --git a/Modules/Internal/Http/Controllers/Api/HospitalController.php b/Modules/Internal/Http/Controllers/Api/HospitalController.php new file mode 100644 index 00000000..63a716f7 --- /dev/null +++ b/Modules/Internal/Http/Controllers/Api/HospitalController.php @@ -0,0 +1,153 @@ +filter($request->all()) + ->where('corporate_id', $corporate_id) + ->orderBy('id', 'DESC') + ->paginate(0) + ->appends($request->all()); + + return $datas; + } + + public function activation(Request $request, $hospital_id) + { + $request->validate([ + 'active' => 'required', + 'reason' => 'required', + ]); + + // abort(404); + + $hostpital = CorporateHospital::findOrFail($hospital_id); + $hostpital->active = $request->active; + $hostpital->reason = $request->reason; + + if ($hostpital->save()) { + return response()->json([ + 'hostpital' => $hostpital, + 'message' => 'Status Updated Successfully' + ]); + } + } + + public function dataHospital(Request $request, $corporate_id) + { + $data = DB::table('organizations') + ->where('type', 'hospital') + ->where('status', 'active') + ->orderBy('id', 'desc') + ->get(); + return $data; + } + + /** + * Show the form for creating a new resource. + * @return Renderable + */ + public function create() + { + return view('internal::create'); + } + + /** + * Store a newly created resource in storage. + * @param Request $request + * @return Renderable + */ + public function store(Request $request, $corporate_id) + { + $request->validate([ + 'corporate_id' => 'required', + 'code' => 'required', + 'name' => 'required', + 'organization_id' => 'required', + ]); + + $newCorporateHospital = CorporateHospital::create([ + 'corporate_id' => $corporate_id, + 'code' => $request->code, + 'name' => $request->name, + 'organization_id' => $request->organization_id, + 'description' => $request->description ? $request->description : null, + ]); + + return $newCorporateHospital; + } + + /** + * Show the specified resource. + * @param int $id + * @return Renderable + */ + public function show($id) + { + return view('internal::show'); + } + + /** + * Show the form for editing the specified resource. + * @param int $id + * @return Renderable + */ + public function edit($corporate_id, $id) + { + $corporatePlan = CorporateDivision::findOrFail($id); + + return $corporatePlan; + } + + /** + * Update the specified resource in storage. + * @param Request $request + * @param int $id + * @return Renderable + */ + public function update(Request $request, $corporate_id, $id) + { + $corporatePlan = CorporateHospital::findOrFail($id); + $request->validate([ + 'corporate_id' => 'required', + 'code' => 'required', + 'name' => 'required', + 'organization_id' => 'required', + ]); + + $corporatePlan->fill([ + 'corporate_id' => $corporate_id, + 'code' => $request->code, + 'name' => $request->name, + 'organization_id' => $request->organization_id, + 'description' => $request->description ? $request->description : null, + ])->save(); + + return $corporatePlan; + } + + /** + * Remove the specified resource from storage. + * @param int $id + * @return Renderable + */ + public function destroy($id) + { + // + } +} diff --git a/Modules/Internal/Routes/api.php b/Modules/Internal/Routes/api.php index a8d6ed5e..3485ed3a 100644 --- a/Modules/Internal/Routes/api.php +++ b/Modules/Internal/Routes/api.php @@ -19,6 +19,7 @@ use Modules\Internal\Http\Controllers\Api\DiagnosisTemplateController; use Modules\Internal\Http\Controllers\Api\DiagnosisExclusionController; use Modules\Internal\Http\Controllers\Api\DistrictController; use Modules\Internal\Http\Controllers\Api\DivisionController; +use Modules\Internal\Http\Controllers\Api\HospitalController; use Modules\Internal\Http\Controllers\Api\DoctorController; use Modules\Internal\Http\Controllers\Api\DoctorRatingController; use Modules\Internal\Http\Controllers\Api\DrugController; @@ -80,6 +81,7 @@ Route::prefix('internal')->group(function () { Route::post('corporates/{corporate_id}/corporate-plans', [CorporatePlanController::class, 'store']); Route::get('corporates/{corporate_id}/corporate-plans/{id}/edit', [CorporatePlanController::class, 'edit']); Route::put('corporates/{corporate_id}/corporate-plans/{id}', [CorporatePlanController::class, 'update']); + Route::post('corporates/{corporate_id}/corporate-plans/filter', [CorporatePlanController::class, 'filter']); Route::put('plans/{plan_id}/activation', [CorporatePlanController::class, 'activation']); Route::get('corporates/{corporate_id}/plans', [PlanController::class, 'index']); @@ -99,6 +101,12 @@ Route::prefix('internal')->group(function () { Route::get('corporates/{corporate_id}/divisions/{id}/edit', [DivisionController::class, 'edit']); Route::put('corporates/{corporate_id}/divisions/{id}', [DivisionController::class, 'update']); + Route::get('corporates/{corporate_id}/hospitals', [HospitalController::class, 'index']); + Route::put('hospitals/{hospital_id}/activation', [HospitalController::class, 'activation']); + Route::get('corporates/{corporate_id}/hospitals/data', [HospitalController::class, 'dataHospital']); + Route::post('corporates/{corporate_id}/hospitals/save', [HospitalController::class, 'store']); + Route::put('corporates/{corporate_id}/hospitals/{id}/edit', [HospitalController::class, 'update']); + Route::get('corporates/{corporate_id}/members', [CorporateMemberController::class, 'index']); Route::get('corporates/{corporate_id}/members/list', [CorporateMemberController::class, 'generateMemberList']); Route::post('corporates/{corporate_id}/members/import', [CorporateMemberController::class, 'import']); @@ -106,8 +114,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']); @@ -119,8 +128,12 @@ Route::prefix('internal')->group(function () { Route::post('corporates/{corporate_id}/services/{service_code}/specialities/exclusion', [CorporateServiceController::class, 'storeExclusion']); Route::get('corporates/{corporate_id}/formulariums', [CorporateFormulariumController::class, 'index']); + Route::get('corporates/{corporate_id}/formulariums/{formularium_id}', [CorporateFormulariumController::class, 'show']); + Route::get('corporates/{corporate_id}/formulariums/create', [CorporateFormulariumController::class, 'create']); + Route::post('corporates/{corporate_id}/formulariums', [CorporateFormulariumController::class, 'store']); Route::get('corporates/{corporate_id}/formulariums/list', [CorporateFormulariumController::class, 'generateFormulariumList']); Route::post('corporates/{corporate_id}/formulariums/import', [CorporateFormulariumController::class, 'import']); + Route::put('corporates/{corporate_id}/formulariums-update-status/{id}', [CorporateFormulariumController::class, 'active']); Route::put('corporates/{corporate_id}/formulariums/{formularium_id}/{action}', [CorporateFormulariumController::class, 'updateStatus']); Route::controller(CorporateController::class)->group(function () { Route::post('add-files-doc', 'addFilesDoc'); diff --git a/Modules/Internal/Services/MemberEnrollmentService.php b/Modules/Internal/Services/MemberEnrollmentService.php index 257842ba..2a57f484 100644 --- a/Modules/Internal/Services/MemberEnrollmentService.php +++ b/Modules/Internal/Services/MemberEnrollmentService.php @@ -326,6 +326,7 @@ class MemberEnrollmentService public function __construct(Member $member) { + app()->setLocale('en'); $this->member = $member; } diff --git a/Modules/Internal/Transformers/CorporateFormulariumResource.php b/Modules/Internal/Transformers/CorporateFormulariumResource.php index bb639c34..9839b5d6 100644 --- a/Modules/Internal/Transformers/CorporateFormulariumResource.php +++ b/Modules/Internal/Transformers/CorporateFormulariumResource.php @@ -14,27 +14,11 @@ class CorporateFormulariumResource extends JsonResource */ public function toArray($request) { - - return [ - 'id' => $this->formularium->id, - 'code' => $this->formularium->code, - 'name' => $this->formularium->name, - 'description' => $this->formularium->description, - 'manufacturer' => $this->formularium->manufacturer, - 'category_name' => $this->formularium->category_name, - 'kategori_obat' => $this->formularium->kategori_obat, - 'uom' => $this->formularium->uom, - 'general_indication' => $this->formularium->general_indication, - 'composition' => $this->formularium->composition, - 'atc_code' => $this->formularium->atc_code, - 'class' => $this->formularium->class, - 'bpom_registration' => $this->formularium->bpom_registration, - 'classifications' => $this->formularium->classifications, - 'cat_for' => $this->formularium->cat_for, - 'items_count' => $this->formularium->items_count, - 'status' => $this->active ? 'active' : 'inactive', - // 'corporate_formulariums' => $this->formua, + 'id' => $this->id, + 'formulaurium_category_id' => $this->formularium_template->id, + 'category' => $this->formularium_template->name, + 'description' => $this->formularium_template->description, 'active' => $this->active == 1 ? 'Active' : 'Inactive', ]; } diff --git a/app/Models/CorporateFormularium.php b/app/Models/CorporateFormularium.php index 24e62b0f..b0e840c6 100644 --- a/app/Models/CorporateFormularium.php +++ b/app/Models/CorporateFormularium.php @@ -6,6 +6,7 @@ use App\Traits\Blameable; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; +use Altek\Accountant\Contracts\Recordable; class CorporateFormularium extends Model { @@ -15,7 +16,7 @@ class CorporateFormularium extends Model protected $fillable = [ 'corporate_id', - 'formularium_id', + 'formularium_template_id', 'active' ]; @@ -24,8 +25,8 @@ class CorporateFormularium extends Model return $this->belongsTo(Corporate::class); } - public function formularium() + public function formularium_template() { - return $this->belongsTo(Formularium::class); + return $this->belongsTo(FormulariumTemplate::class); } } diff --git a/app/Models/CorporateHospital.php b/app/Models/CorporateHospital.php new file mode 100644 index 00000000..f38259e5 --- /dev/null +++ b/app/Models/CorporateHospital.php @@ -0,0 +1,36 @@ +belongsTo(Corporate::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 . "%"); + }); + } +} diff --git a/app/Models/Exclusion.php b/app/Models/Exclusion.php index 93090f9b..7cfd5f74 100644 --- a/app/Models/Exclusion.php +++ b/app/Models/Exclusion.php @@ -19,6 +19,7 @@ class Exclusion extends Model 'exclusionable_id', 'exclusionable_type', 'active', + 'reason' ]; protected $hidden = [ diff --git a/app/Models/Formularium.php b/app/Models/Formularium.php index 83adb6bc..1d3a545a 100644 --- a/app/Models/Formularium.php +++ b/app/Models/Formularium.php @@ -37,11 +37,6 @@ class Formularium extends Model $this->attributes['code'] = !empty($value) ? $value : Str::upper(Str::random('6')); } - public function corporateFormulariums() - { - return $this->hasMany(CorporateFormularium::class, 'formularium_id', 'id'); - } - public function items() { return $this->belongsToMany(Drug::class, 'formularium_items', 'formularium_id', 'item_id'); diff --git a/app/Models/FormulariumTemplate.php b/app/Models/FormulariumTemplate.php index d15017a8..afaca178 100644 --- a/app/Models/FormulariumTemplate.php +++ b/app/Models/FormulariumTemplate.php @@ -23,4 +23,9 @@ class FormulariumTemplate extends Model 'updated_by', // 'deleted_by', ]; + + // public function corporateFormulariums() + // { + // return $this->hasMany(CorporateFormularium::class, 'formularium_template_id', 'id'); + // } } diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 7a637a80..0a910438 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -7,10 +7,12 @@ use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Validator; use Illuminate\Support\ServiceProvider; use App\Models\Corporate; +use App\Models\CorporateFormularium; 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; @@ -40,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))); @@ -51,7 +53,7 @@ class AppServiceProvider extends ServiceProvider // }); Corporate::updated(function ($model) { - + $this->logAuditTrail($model, 'updated'); }); @@ -60,7 +62,7 @@ class AppServiceProvider extends ServiceProvider }); Member::updated(function ($model) { - + $this->logAuditTrail($model, 'updated'); }); @@ -68,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'); }); @@ -81,7 +93,7 @@ class AppServiceProvider extends ServiceProvider // Corporate Plans CorporatePlan::updated(function ($model) { - + $this->logAuditTrail($model, 'updated'); }); @@ -91,7 +103,7 @@ class AppServiceProvider extends ServiceProvider // Corporate Benefits CorporateBenefit::updated(function ($model) { - + $this->logAuditTrail($model, 'updated'); }); @@ -102,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 @@ -144,6 +155,14 @@ class AppServiceProvider extends ServiceProvider $this->logAuditTrail($model, 'deleted'); }); + // Formualrium Template + CorporateFormularium::updated(function ($model) { + $this->logAuditTrail($model, 'updated'); + }); + CorporateFormularium::deleted(function ($model) { + $this->logAuditTrail($model, 'deleted'); + }); + } diff --git a/database/migrations/2023_10_19_132434_create_corporate_hospitals.php b/database/migrations/2023_10_19_132434_create_corporate_hospitals.php new file mode 100644 index 00000000..ae434a69 --- /dev/null +++ b/database/migrations/2023_10_19_132434_create_corporate_hospitals.php @@ -0,0 +1,42 @@ +id(); + $table->bigInteger('corporate_id'); + $table->bigInteger('organization_id'); + $table->string('code', 255); + $table->string('name', 255); + $table->text('description')->nullable(); + $table->tinyInteger('active')->default(1); + $table->text('reason')->nullable(); + $table->timestamps(); + $table->softDeletes(); + $table->bigInteger('created_by')->nullable(); + $table->bigInteger('updated_by')->nullable(); + $table->bigInteger('deleted_by')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('corporate_hospitals'); + } +}; diff --git a/database/migrations/2023_10_20_091646_rename_feild_formularium_table.php b/database/migrations/2023_10_20_091646_rename_feild_formularium_table.php new file mode 100644 index 00000000..8a781ac3 --- /dev/null +++ b/database/migrations/2023_10_20_091646_rename_feild_formularium_table.php @@ -0,0 +1,32 @@ +renameColumn('formularium_id', 'formularium_template_id'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('corporate_formulariums', function (Blueprint $table) { + $table->renameColumn('formularium_template_id', 'formularium_id'); + }); + } +}; diff --git a/database/migrations/2023_10_21_115939_add_column_reason_to_exclusion.php b/database/migrations/2023_10_21_115939_add_column_reason_to_exclusion.php new file mode 100644 index 00000000..eb08cb27 --- /dev/null +++ b/database/migrations/2023_10_21_115939_add_column_reason_to_exclusion.php @@ -0,0 +1,32 @@ +string('reason')->after('active'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('exclusions', function (Blueprint $table) { + $table->dropColumn('reason'); + }); + } +}; diff --git a/frontend/dashboard/.env.development b/frontend/dashboard/.env.development index fc2b48bf..0bf5d75c 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/package-lock.json b/frontend/dashboard/package-lock.json index 73633129..b5dbaf0e 100644 --- a/frontend/dashboard/package-lock.json +++ b/frontend/dashboard/package-lock.json @@ -135,11 +135,11 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", - "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dependencies": { - "@babel/highlight": "^7.22.10", + "@babel/highlight": "^7.22.13", "chalk": "^2.4.2" }, "engines": { @@ -155,21 +155,21 @@ } }, "node_modules/@babel/core": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.11.tgz", - "integrity": "sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.0.tgz", + "integrity": "sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ==", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.10", - "@babel/generator": "^7.22.10", - "@babel/helper-compilation-targets": "^7.22.10", - "@babel/helper-module-transforms": "^7.22.9", - "@babel/helpers": "^7.22.11", - "@babel/parser": "^7.22.11", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.11", - "@babel/types": "^7.22.11", - "convert-source-map": "^1.7.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helpers": "^7.23.0", + "@babel/parser": "^7.23.0", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.0", + "@babel/types": "^7.23.0", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", @@ -183,18 +183,10 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/eslint-parser": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.22.11.tgz", - "integrity": "sha512-YjOYZ3j7TjV8OhLW6NCtyg8G04uStATEUe5eiLuCZaXz2VSDQ3dsAtm2D+TuQyAqNMUK2WacGo0/uma9Pein1w==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.22.15.tgz", + "integrity": "sha512-yc8OOBIQk1EcRrpizuARSQS0TWAcOMpEJ1aafhNznaeYkeL+OhqnDObGFylB8ka8VFF/sZc+S4RzHyO+3LjQxg==", "dev": true, "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", @@ -209,21 +201,12 @@ "eslint": "^7.5.0 || ^8.0.0" } }, - "node_modules/@babel/eslint-parser/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/generator": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz", - "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dependencies": { - "@babel/types": "^7.22.10", + "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -257,12 +240,12 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz", - "integrity": "sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", "dependencies": { "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", "browserslist": "^4.21.9", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -279,14 +262,6 @@ "yallist": "^3.0.2" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -349,9 +324,9 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "engines": { "node": ">=6.9.0" } @@ -369,12 +344,12 @@ } }, "node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" @@ -404,26 +379,26 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", - "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", - "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", + "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", "@babel/helper-simple-access": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.5" + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -525,17 +500,17 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", - "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", "engines": { "node": ">=6.9.0" } @@ -556,24 +531,24 @@ } }, "node_modules/@babel/helpers": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.11.tgz", - "integrity": "sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg==", + "version": "7.23.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.1.tgz", + "integrity": "sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA==", "dependencies": { - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.11", - "@babel/types": "^7.22.11" + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.0", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", - "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, @@ -582,9 +557,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.11.tgz", - "integrity": "sha512-R5zb8eJIBPJriQtbH/htEQy4k7E2dHWlD2Y2VT07JCzwYZHBxV5ZYtM0UhXSNMT74LyxuM+b1jdL7pSesXbC/g==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "bin": { "parser": "bin/babel-parser.js" }, @@ -1919,9 +1894,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.11.tgz", - "integrity": "sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==", + "version": "7.23.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.1.tgz", + "integrity": "sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -1948,31 +1923,31 @@ "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, "node_modules/@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.11.tgz", - "integrity": "sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.0.tgz", + "integrity": "sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw==", "dependencies": { - "@babel/code-frame": "^7.22.10", - "@babel/generator": "^7.22.10", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.11", - "@babel/types": "^7.22.11", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1981,12 +1956,12 @@ } }, "node_modules/@babel/types": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.11.tgz", - "integrity": "sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dependencies": { "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2080,6 +2055,11 @@ "stylis": "4.2.0" } }, + "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, "node_modules/@emotion/babel-plugin/node_modules/stylis": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", @@ -2236,9 +2216,9 @@ } }, "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2248,9 +2228,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", - "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.2.tgz", + "integrity": "sha512-0MGxAVt1m/ZK+LTJp/j0qF7Hz97D9O/FH9Ms3ltnyIdDD57cbb1ACIQTkbHvNXtWDv5TPq7w5Kq56+cNukbo7g==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -2296,9 +2276,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.21.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", - "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "version": "13.22.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", + "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -2317,37 +2297,37 @@ "dev": true }, "node_modules/@eslint/js": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", - "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz", + "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@floating-ui/core": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.4.1.tgz", - "integrity": "sha512-jk3WqquEJRlcyu7997NtR5PibI+y5bi+LS3hPmguVClypenMsCY3CBa3LAQnozRCtCrYWSEtAdiskpamuJRFOQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz", + "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==", "dependencies": { - "@floating-ui/utils": "^0.1.1" + "@floating-ui/utils": "^0.1.3" } }, "node_modules/@floating-ui/dom": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.1.tgz", - "integrity": "sha512-KwvVcPSXg6mQygvA1TjbN/gh///36kKtllIF8SUm0qpFj8+rvYrpvlYdL1JoA71SHpDqgSSdGOSoQ0Mp3uY5aw==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", + "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", "dependencies": { - "@floating-ui/core": "^1.4.1", - "@floating-ui/utils": "^0.1.1" + "@floating-ui/core": "^1.4.2", + "@floating-ui/utils": "^0.1.3" } }, "node_modules/@floating-ui/react-dom": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.1.tgz", - "integrity": "sha512-rZtAmSht4Lry6gdhAJDrCp/6rKN7++JnL1/Anbr/DdeyYXQPxvg/ivrbYvJulbRf4vL8b212suwMM2lxbv+RQA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.2.tgz", + "integrity": "sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ==", "dependencies": { - "@floating-ui/dom": "^1.3.0" + "@floating-ui/dom": "^1.5.1" }, "peerDependencies": { "react": ">=16.8.0", @@ -2355,9 +2335,9 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.1.tgz", - "integrity": "sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw==" + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.4.tgz", + "integrity": "sha512-qprfWkn82Iw821mcKofJ5Pk9wgioHicxcQMxx+5zt5GSKoqdWvgG5AxVmpmUUjzTLPVSH5auBrhI93Deayn/DA==" }, "node_modules/@hookform/resolvers": { "version": "2.9.11", @@ -2368,9 +2348,9 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", - "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", + "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -2550,20 +2530,20 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.14.6", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.6.tgz", - "integrity": "sha512-QZEU3pyGWLuaHbxvOlShol7U1FVgzWBR0OH9H8D7L8w4/vto5N5jJVvlqFQS3T0zbR6YGHxFaiL6Ky87jQg7aw==", + "version": "5.14.10", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.10.tgz", + "integrity": "sha512-kPHu/NhZq1k+vSZR5wq3AyUfD4bnfWAeuKpps0+8PS7ZHQ2Lyv1cXJh+PlFdCIOa0PK98rk3JPwMzS8BMhdHwQ==", "funding": { "type": "opencollective", "url": "https://opencollective.com/mui" } }, "node_modules/@mui/icons-material": { - "version": "5.14.6", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.6.tgz", - "integrity": "sha512-7Cujy7lRGTj2T3SvY9C9ZOTFDtrXJogeNnRcU/ODyNoxwskMNPFOcc15F+98MAdJenBVLJPYu+vPP6DUvEpNrA==", + "version": "5.14.9", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.9.tgz", + "integrity": "sha512-xTRQbDsogsJo7tY5Og8R9zbuG2q+KIPVIM6JQoKxtJlz9DPOw1u0T2fGrvwD+XAOVifQf6epNMcGCDLfJAz4Nw==", "dependencies": { - "@babel/runtime": "^7.22.10" + "@babel/runtime": "^7.22.15" }, "engines": { "node": ">=12.0.0" @@ -2681,16 +2661,16 @@ } }, "node_modules/@mui/material": { - "version": "5.14.6", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.6.tgz", - "integrity": "sha512-C3UgGrmtvcGkQkm0ONBU7bTdapTjQc2Se3b2354xMmU7lgSgW7VM6EP9wIH5XqqoJ60m9l/s9kbTWX0Y+EaWvA==", + "version": "5.14.10", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.10.tgz", + "integrity": "sha512-ejFMppnO+lzBXpzju+N4SSz0Mhmi5sihXUGcr5FxpgB6bfUP0Lpe32O0Sw/3s8xlmLEvG1fqVT0rRyAVMlCA+A==", "dependencies": { - "@babel/runtime": "^7.22.10", - "@mui/base": "5.0.0-beta.12", - "@mui/core-downloads-tracker": "^5.14.6", - "@mui/system": "^5.14.6", + "@babel/runtime": "^7.22.15", + "@mui/base": "5.0.0-beta.16", + "@mui/core-downloads-tracker": "^5.14.10", + "@mui/system": "^5.14.10", "@mui/types": "^7.2.4", - "@mui/utils": "^5.14.6", + "@mui/utils": "^5.14.10", "@types/react-transition-group": "^4.4.6", "clsx": "^2.0.0", "csstype": "^3.1.2", @@ -2725,19 +2705,17 @@ } }, "node_modules/@mui/material/node_modules/@mui/base": { - "version": "5.0.0-beta.12", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.12.tgz", - "integrity": "sha512-tZjjXNAyUpwSDT1uRliZMhRQkWYzELJ8Qi61EuOMRpi36HIwnK2T7Nr4RI423Sv8G2EEikDAZj7je33eNd73NQ==", + "version": "5.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.16.tgz", + "integrity": "sha512-OYxhC81c9bO0wobGcM8rrY5bRwpCXAI21BL0P2wz/2vTv4ek7ALz9+U5M8wgdmtRNUhmCmAB4L2WRwFRf5Cd8Q==", "dependencies": { - "@babel/runtime": "^7.22.10", - "@emotion/is-prop-valid": "^1.2.1", - "@floating-ui/react-dom": "^2.0.1", + "@babel/runtime": "^7.22.15", + "@floating-ui/react-dom": "^2.0.2", "@mui/types": "^7.2.4", - "@mui/utils": "^5.14.6", + "@mui/utils": "^5.14.10", "@popperjs/core": "^2.11.8", "clsx": "^2.0.0", - "prop-types": "^15.8.1", - "react-is": "^18.2.0" + "prop-types": "^15.8.1" }, "engines": { "node": ">=12.0.0" @@ -2771,12 +2749,12 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" }, "node_modules/@mui/private-theming": { - "version": "5.14.6", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.6.tgz", - "integrity": "sha512-3VBLFGizBXfofyk33bwRg6t9L648aKnLmOKPfY1wFuiXq3AEYwobK65iDci/tHKxm/VKbZ6A7PFjLejvB3EvRQ==", + "version": "5.14.10", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.10.tgz", + "integrity": "sha512-f67xOj3H06wWDT9xBg7hVL/HSKNF+HG1Kx0Pm23skkbEqD2Ef2Lif64e5nPdmWVv+7cISCYtSuE2aeuzrZe78w==", "dependencies": { - "@babel/runtime": "^7.22.10", - "@mui/utils": "^5.14.6", + "@babel/runtime": "^7.22.15", + "@mui/utils": "^5.14.10", "prop-types": "^15.8.1" }, "engines": { @@ -2797,11 +2775,11 @@ } }, "node_modules/@mui/styled-engine": { - "version": "5.14.6", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.6.tgz", - "integrity": "sha512-I6zeu/OP1Hk4NsX1Oj85TiYl1dER0JMsLJVn76J1Ihl24A5EbiZQKJp3Mn+ufA79ypkdAvM9aQCAQyiVBFcUHg==", + "version": "5.14.10", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.10.tgz", + "integrity": "sha512-EJckxmQHrsBvDbFu1trJkvjNw/1R7jfNarnqPSnL+jEQawCkQIqVELWLrlOa611TFtxSJGkdUfCFXeJC203HVg==", "dependencies": { - "@babel/runtime": "^7.22.10", + "@babel/runtime": "^7.22.15", "@emotion/cache": "^11.11.0", "csstype": "^3.1.2", "prop-types": "^15.8.1" @@ -2828,15 +2806,15 @@ } }, "node_modules/@mui/system": { - "version": "5.14.6", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.6.tgz", - "integrity": "sha512-/n0ae1MegWjiV1BpRU8jgg4E0zBjeB2VYsT/68ag/xaDuq3/TaDKJeT9REIvyBvwlG3CI3S2O+tRELktxCD1kg==", + "version": "5.14.10", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.10.tgz", + "integrity": "sha512-QQmtTG/R4gjmLiL5ECQ7kRxLKDm8aKKD7seGZfbINtRVJDyFhKChA1a+K2bfqIAaBo1EMDv+6FWNT1Q5cRKjFA==", "dependencies": { - "@babel/runtime": "^7.22.10", - "@mui/private-theming": "^5.14.6", - "@mui/styled-engine": "^5.14.6", + "@babel/runtime": "^7.22.15", + "@mui/private-theming": "^5.14.10", + "@mui/styled-engine": "^5.14.10", "@mui/types": "^7.2.4", - "@mui/utils": "^5.14.6", + "@mui/utils": "^5.14.10", "clsx": "^2.0.0", "csstype": "^3.1.2", "prop-types": "^15.8.1" @@ -2888,13 +2866,12 @@ } }, "node_modules/@mui/utils": { - "version": "5.14.6", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.6.tgz", - "integrity": "sha512-AznpqLu6hrFnpHgcvsSSMCG+cDbkcCYfo+daUwBVReNYv4l+NQ8+wvBAF4aUMi155N7xWbbgh0cyKs6Wdsm3aA==", + "version": "5.14.10", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.10.tgz", + "integrity": "sha512-Rn+vYQX7FxkcW0riDX/clNUwKuOJFH45HiULxwmpgnzQoQr3A0lb+QYwaZ+FAkZrR7qLoHKmLQlcItu6LT0y/Q==", "dependencies": { - "@babel/runtime": "^7.22.10", + "@babel/runtime": "^7.22.15", "@types/prop-types": "^15.7.5", - "@types/react-is": "^18.2.1", "prop-types": "^15.8.1", "react-is": "^18.2.0" }, @@ -2906,7 +2883,13 @@ "url": "https://opencollective.com/mui" }, "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, "node_modules/@mui/utils/node_modules/react-is": { @@ -3073,9 +3056,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.8.0.tgz", - "integrity": "sha512-mrfKqIHnSZRyIzBcanNJmVQELTnX+qagEDlcKO90RgRBVOZGSGvZKeDihTRfWcqoDn5N/NkUcwWTccnpN18Tfg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.9.0.tgz", + "integrity": "sha512-bV63itrKBC0zdT27qYm6SDZHlkXwFL1xMBuhkn+X7l0+IIhNaH5wuuvZKp6eKhCD4KFhujhfhCT1YxXW6esUIA==", "engines": { "node": ">=14.0.0" } @@ -3272,9 +3255,9 @@ "dev": true }, "node_modules/@types/lodash": { - "version": "4.14.197", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.197.tgz", - "integrity": "sha512-BMVOiWs0uNxHVlHBgzTIqJYmj+PgCo4euloGF+5m4okL3rEYzM2EEv78mw8zWSMM57dM7kVIgJ2QDvwHSoCI5g==" + "version": "4.14.199", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.199.tgz", + "integrity": "sha512-Vrjz5N5Ia4SEzWWgIVwnHNEnb1UE1XMkvY5DGXrAeOGE9imk0hgTHh5GyDjLDJi9OTCn9oo9dXH1uToK1VRfrg==" }, "node_modules/@types/node": { "version": "17.0.21", @@ -3325,18 +3308,10 @@ "@types/react": "^17" } }, - "node_modules/@types/react-is": { - "version": "18.2.1", - "resolved": "https://registry.npmjs.org/@types/react-is/-/react-is-18.2.1.tgz", - "integrity": "sha512-wyUkmaaSZEzFZivD8F2ftSyAfk6L+DfFliVj/mYdOXbVjRcS87fQJLTnhk6dRZPuJjI+9g6RZJO4PNCngUrmyw==", - "dependencies": { - "@types/react": "*" - } - }, "node_modules/@types/react-lazy-load-image-component": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@types/react-lazy-load-image-component/-/react-lazy-load-image-component-1.5.3.tgz", - "integrity": "sha512-hTzsQQ64mmPR6W03DQr6zhzeBGn17ExnVd7sLHqTQZQVd9Oi0Dy7tfSPgK0+AZV5YNC+e8Jw7oq9kzYfDkCDCA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@types/react-lazy-load-image-component/-/react-lazy-load-image-component-1.6.0.tgz", + "integrity": "sha512-KIwp3KA2o6vtX1nN80tOCnr9Knx1a+QATUw/+fv2hBnAWuC9TWtWXtgJK8tsiFnK5o1u70veqI+3z6Rt3YhhKA==", "dev": true, "dependencies": { "@types/react": "*", @@ -3372,9 +3347,9 @@ "dev": true }, "node_modules/@types/stylis": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.0.tgz", - "integrity": "sha512-n4sx2bqL0mW1tvDf/loQ+aMX7GQD3lc3fkCMC55VFNDu/vBOabO+LTIeXKM14xK0ppk5TUGcWRjiSpIlUpghKw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.1.tgz", + "integrity": "sha512-OSaMrXUKxVigGlKRrET39V2xdhzlztQ9Aqumn1WbCBKHOi9ry7jKSd7rkyj0GzmWaU960Rd+LpOFpLfx5bMQAg==", "dev": true }, "node_modules/@types/trusted-types": { @@ -3523,9 +3498,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3670,9 +3645,9 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3841,9 +3816,9 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4152,16 +4127,16 @@ } }, "node_modules/array.prototype.findlastindex": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.2.tgz", - "integrity": "sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", + "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" + "get-intrinsic": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -4220,14 +4195,15 @@ } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", - "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", "call-bind": "^1.0.2", "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "get-intrinsic": "^1.2.1", "is-array-buffer": "^3.0.2", "is-shared-array-buffer": "^1.0.2" @@ -4461,9 +4437,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.10", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", - "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", "funding": [ { "type": "opencollective", @@ -4479,9 +4455,9 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001517", - "electron-to-chromium": "^1.4.477", - "node-releases": "^2.0.13", + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", "update-browserslist-db": "^1.0.11" }, "bin": { @@ -4555,9 +4531,9 @@ "integrity": "sha1-IsxKNKCrxDlQ9CxkEQJKP2NmtFo=" }, "node_modules/caniuse-lite": { - "version": "1.0.30001524", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001524.tgz", - "integrity": "sha512-Jj917pJtYg9HSJBF95HVX3Cdr89JUyLT4IZ8SvM5aDRni95swKgYi3TgYLH5hnGfPE/U1dg6IfZ50UsIlLkwSA==", + "version": "1.0.30001517", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz", + "integrity": "sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==", "funding": [ { "type": "opencollective", @@ -4704,12 +4680,9 @@ } }, "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dependencies": { - "safe-buffer": "~5.1.1" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, "node_modules/core-js": { "version": "3.21.1", @@ -4859,11 +4832,25 @@ "node": ">=0.10.0" } }, - "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "node_modules/define-data-property": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.0.tgz", + "integrity": "sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==", "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -4940,9 +4927,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.503", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.503.tgz", - "integrity": "sha512-LF2IQit4B0VrUHFeQkWhZm97KuJSGF2WJqq1InpY+ECpFRkXd8yTIaTtJxsO0OKDmiBYwWqcrNaXOurn2T2wiA==" + "version": "1.4.467", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.467.tgz", + "integrity": "sha512-2qI70O+rR4poYeF2grcuS/bCps5KJh6y1jtZMDDEteyKJQrzLOEhFyXCLcHW6DTBjKjWkk26JhWoAi+Ux9A0fg==" }, "node_modules/emoji-regex": { "version": "9.2.2", @@ -4959,18 +4946,18 @@ } }, "node_modules/es-abstract": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", - "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.2.tgz", + "integrity": "sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.2", "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", + "function.prototype.name": "^1.1.6", "get-intrinsic": "^1.2.1", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", @@ -4986,23 +4973,23 @@ "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", + "is-typed-array": "^1.1.12", "is-weakref": "^1.0.2", "object-inspect": "^1.12.3", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.0", - "safe-array-concat": "^1.0.0", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", "typed-array-buffer": "^1.0.0", "typed-array-byte-length": "^1.0.0", "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.10" + "which-typed-array": "^1.1.11" }, "engines": { "node": ">= 0.4" @@ -5012,14 +4999,14 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.14.tgz", - "integrity": "sha512-JgtVnwiuoRuzLvqelrvN3Xu7H9bu2ap/kQ2CrM62iidP8SKuD99rWU3CJy++s7IVL2qb/AjXPGR/E7i9ngd/Cw==", + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", + "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", "dev": true, "dependencies": { "asynciterator.prototype": "^1.0.0", "call-bind": "^1.0.2", - "define-properties": "^1.2.0", + "define-properties": "^1.2.1", "es-abstract": "^1.22.1", "es-set-tostringtag": "^2.0.1", "function-bind": "^1.1.1", @@ -5029,8 +5016,8 @@ "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "internal-slot": "^1.0.5", - "iterator.prototype": "^1.1.0", - "safe-array-concat": "^1.0.0" + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.0.1" } }, "node_modules/es-set-tostringtag": { @@ -5144,16 +5131,16 @@ } }, "node_modules/eslint": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", - "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz", + "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.48.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint/js": "8.50.0", + "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", @@ -5293,14 +5280,14 @@ } }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", "dev": true, "dependencies": { "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { @@ -5312,23 +5299,6 @@ "ms": "^2.1.1" } }, - "node_modules/eslint-import-resolver-node/node_modules/resolve": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", - "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/eslint-import-resolver-typescript": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.7.1.tgz", @@ -5445,15 +5415,6 @@ "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/eslint-plugin-jest": { "version": "25.7.0", "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", @@ -5596,15 +5557,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/eslint-plugin-testing-library": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.0.5.tgz", @@ -5780,9 +5732,9 @@ } }, "node_modules/eslint/node_modules/globals": { - "version": "13.21.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", - "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -6169,15 +6121,15 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -6325,7 +6277,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -6923,16 +6874,16 @@ "dev": true }, "node_modules/iterator.prototype": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.0.tgz", - "integrity": "sha512-rjuhAk1AJ1fssphHD0IFV6TWL40CwRZ53FrztKx43yk2v6rguBYsY4Bj1VU4HmoMmKwZUlx7mfnhDf9cOp4YTw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", "dev": true, "dependencies": { - "define-properties": "^1.1.4", - "get-intrinsic": "^1.1.3", + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", - "has-tostringtag": "^1.0.0", - "reflect.getprototypeof": "^1.0.3" + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" } }, "node_modules/jake": { @@ -7417,14 +7368,14 @@ } }, "node_modules/object.groupby": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.0.tgz", - "integrity": "sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", + "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "es-abstract": "^1.21.2", + "es-abstract": "^1.22.1", "get-intrinsic": "^1.2.1" } }, @@ -7845,9 +7796,9 @@ } }, "node_modules/react-hook-form": { - "version": "7.45.4", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.45.4.tgz", - "integrity": "sha512-HGDV1JOOBPZj10LB3+OZgfDBTn+IeEsNOKiq/cxbQAIbKaiJUe/KV8DBUzsx0Gx/7IG/orWqRRm736JwOfUSWQ==", + "version": "7.46.2", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.46.2.tgz", + "integrity": "sha512-x1DWmHQchV7x2Rq9l99M/cQHC8JGchAnw9Z0uTz5KrPa0bTl/Inm1NR7ceOARfIrkNuQNAhuSuZPYa6k7QYn3Q==", "engines": { "node": ">=12.22.0" }, @@ -7943,11 +7894,11 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" }, "node_modules/react-router": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.15.0.tgz", - "integrity": "sha512-NIytlzvzLwJkCQj2HLefmeakxxWHWAP+02EGqWEZy+DgfHHKQMUoBBjUQLOtFInBMhWtb3hiUy6MfFgwLjXhqg==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.16.0.tgz", + "integrity": "sha512-VT4Mmc4jj5YyjpOi5jOf0I+TYzGpvzERy4ckNSvSh2RArv8LLoCxlsZ2D+tc7zgjxcY34oTz2hZaeX5RVprKqA==", "dependencies": { - "@remix-run/router": "1.8.0" + "@remix-run/router": "1.9.0" }, "engines": { "node": ">=14.0.0" @@ -7957,12 +7908,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.15.0.tgz", - "integrity": "sha512-aR42t0fs7brintwBGAv2+mGlCtgtFQeOzK0BM1/OiqEzRejOZtpMZepvgkscpMUnKb8YO84G7s3LsHnnDNonbQ==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.16.0.tgz", + "integrity": "sha512-aTfBLv3mk/gaKLxgRDUPbPw+s4Y/O+ma3rEN1u8EgEpLpPe6gNjIsWt9rxushMHHMb7mSwxRGdGlGdvmFsyPIg==", "dependencies": { - "@remix-run/router": "1.8.0", - "react-router": "6.15.0" + "@remix-run/router": "1.9.0", + "react-router": "6.16.0" }, "engines": { "node": ">=14.0.0" @@ -8004,15 +7955,15 @@ } }, "node_modules/reflect.getprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.3.tgz", - "integrity": "sha512-TTAOZpkJ2YLxl7mVHWrNo3iDMEkYlva/kgFcXndqMgbo/AZUmmavEkdXV+hXtE4P8xdyEKRzalaFqZVuwIk/Nw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", + "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.1", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "globalthis": "^1.0.3", "which-builtin-type": "^1.1.3" }, @@ -8042,9 +7993,9 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.10", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", - "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==", + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "dev": true }, "node_modules/regenerator-transform": { @@ -8057,13 +8008,13 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "set-function-name": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -8284,13 +8235,13 @@ } }, "node_modules/safe-array-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", - "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", + "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -8304,7 +8255,8 @@ "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/safe-regex-test": { "version": "1.0.0", @@ -8330,10 +8282,9 @@ } }, "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -8348,6 +8299,19 @@ "upper-case-first": "^2.0.2" } }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/shallowequal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", @@ -8499,14 +8463,14 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -8516,28 +8480,28 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" diff --git a/frontend/dashboard/src/@types/corporates.ts b/frontend/dashboard/src/@types/corporates.ts index 77a11e1d..61d35871 100644 --- a/frontend/dashboard/src/@types/corporates.ts +++ b/frontend/dashboard/src/@types/corporates.ts @@ -25,6 +25,13 @@ export type Division = { name?: string; } +export type Hospital = { + id: number; + corporate_id: number; + code: string; + name?: string; +} + export type Employee = { id: number; name: string; diff --git a/frontend/dashboard/src/@types/diagnosis.ts b/frontend/dashboard/src/@types/diagnosis.ts index 2d2d65db..8bd53e58 100644 --- a/frontend/dashboard/src/@types/diagnosis.ts +++ b/frontend/dashboard/src/@types/diagnosis.ts @@ -5,9 +5,12 @@ export type Icd = { version?: string; code: string; name: string; + service_code: string; + active: number; description?: any; childs?: Icd[]; status: string; + rules:any }; 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) => ( { - // Load Corporate - console.log('calling corporate' + corporate_id); - axios.get(`corporates/${corporate_id}`) .then((res) => { setCorporate(res.data) diff --git a/frontend/dashboard/src/pages/Corporates/Benefit/List.tsx b/frontend/dashboard/src/pages/Corporates/Benefit/List.tsx index cbbfbf12..4aae7269 100644 --- a/frontend/dashboard/src/pages/Corporates/Benefit/List.tsx +++ b/frontend/dashboard/src/pages/Corporates/Benefit/List.tsx @@ -1,4 +1,5 @@ // @mui +import * as Yup from 'yup'; import { Box, Button, @@ -38,6 +39,8 @@ import HistoryIcon from '@mui/icons-material/History'; import CachedOutlinedIcon from '@mui/icons-material/CachedOutlined'; import FindInPageOutlinedIcon from '@mui/icons-material/FindInPageOutlined'; +import { yupResolver } from '@hookform/resolvers/yup'; +import { useForm } from 'react-hook-form'; // hooks import React, { ChangeEvent, Component, useEffect, useRef, useState } from 'react'; @@ -73,6 +76,8 @@ import { Edit } from '@mui/icons-material'; import { fData, fNumber } from '@/utils/formatNumber'; import DialogUpdateStatus from '@/components/DialogUpdateStatus'; +import { ro } from 'date-fns/locale'; + export default function PlanList() { const { themeStretch } = useSettings(); const { corporate_id } = useParams(); @@ -313,12 +318,18 @@ export default function PlanList() { } type DataContent = { - code: string; - name: string; + service: string; id: number; - status: string|number; + status: number; + plan: string, + benefit_code: string, + customer_benefit_code: string, }; + type FormValuesProps = { + value: string; + active: boolean; + }; // Generate the every row of the table const [isDialogOpen, setDialogOpen] = useState(false) @@ -335,6 +346,14 @@ export default function PlanList() { const [open, setOpen] = React.useState(false); const [openEdit, setOpenEdit] = React.useState(false); + const handleActivate = (isOpen: boolean, dataValue: DataContent) => { + console.log(dataValue) + setDialogOpen(isOpen) + setDataValue(dataValue) + setDescriptionValue('Are you sure to inactive this service ?') + setUrl(url) + }; + // const handleActivate = (model: any, status: string) => { // axios // .put(`/benefits/${row.id}/activation`, { @@ -362,36 +381,36 @@ export default function PlanList() { // }); // }; - - const handleActivate = (isOpen: boolean, dataValue: DataContent) => { - setDialogOpen(isOpen) - setDataValue(dataValue) - setDescriptionValue('Are you sure to inactive this service ?') - setUrl(url) - }; - let frequency_period_name: string + let limit_frequency: string switch (row.max_frequency_period) { case '1' : frequency_period_name = 'Daily Visit'; + limit_frequency = row.daily_frequency ? row.daily_frequency : '1'; break; case '2': frequency_period_name = 'Weekly'; + limit_frequency = row.weekly_frequency ? row.weekly_frequency : '7'; break; case '3': frequency_period_name = 'Monthly'; + limit_frequency = row.monthly_frequency ? row.monthly_frequency : '30'; break; case '4': frequency_period_name = 'Yearly'; + limit_frequency = row.yearly_frequency ? row.yearly_frequency : '365'; break; case '5': frequency_period_name = 'Disability'; + limit_frequency = row.max_days_for_disability ? row.max_days_for_disability : '-'; break; case '6': frequency_period_name = 'Visit'; + limit_frequency = row.daily_frequency ? row.daily_frequency : '-'; break; default: frequency_period_name = 'Policy Period'; + limit_frequency = row.daily_frequency ? row.daily_frequency : '-'; } return ( @@ -408,7 +427,8 @@ export default function PlanList() { {row.corporate_benefit_code} {row.benefit?.description} { fNumber(row.limit_amount)} - { row.max_frequency_period} + { frequency_period_name} + { limit_frequency} {row.active == 1 && ( @@ -476,7 +496,18 @@ export default function PlanList() { History - handleActivate(true, {code: row.code, name: row.service_code, id:row.id, status: row.active}) }> + + handleActivate(true, { + service: row.benefit?.service_code, + plan: row.plan?.code, + benefit_code: row.benefit?.code, + customer_benefit_code: row.corporate_benefit_code, + id:row.id, + status: row.active + }) + } + > Update Status @@ -866,7 +897,7 @@ export default function PlanList() { const loadDataTableData = async (appliedFilter = null) => { setDataTableLoading(true); const filter = appliedFilter ? appliedFilter : Object.fromEntries([...searchParams.entries()]); - const response = await axios.get('/corporates/' + corporate_id + '/benefits', { + const response = await axios.get('/corporates/' + corporate_id + '/corporate-benefits', { params: filter, }); // console.log(response.data); @@ -879,6 +910,19 @@ export default function PlanList() { fontWeight: 'bold', }; + const onSubmit = async (row : any) => { + try { + handleUpdate(dataValue.status, dataValue.id, row.reason) + } catch (error: any) { + console.log('data gagal'); + } + + const ascent = document?.querySelector('ascent'); + if (ascent != null) { + ascent.innerHTML = ''; + } + }; + const applyFilter = async (searchFilter: string) => { await loadDataTableData({ search: searchFilter }); setSearchParams({ search: searchFilter }); @@ -894,25 +938,64 @@ export default function PlanList() { loadDataTableData(); }, []); + const NewCorporateSchema = Yup.object().shape({ + reason: Yup.string().required('Reason Edit is required'), + }); + + const methods = useForm({ + resolver: yupResolver(NewCorporateSchema), + }); + + + const { + reset, + handleSubmit, + formState: { isSubmitting }, + } = methods; + + const handleUpdate = (active: number, id: number, reason:string) => { + console.log(active) + axios + .put(`/benefits/${id}/activation`, { + active: active, + reason: reason + }) + .then((res) => { + window.location.reload(); + }); + } + const getContent = () => ( <> - Are you sure to {dataValue?.status == 1 ? 'inactive' : 'active'} this service ? + Are you sure to {dataValue?.status == 1 ? 'inactive' : 'active'} this benefit ? - + + Service + + + {dataValue?.service} + + + Plan + + + {dataValue?.plan} + + Code - - {dataValue?.code} + + {dataValue?.benefit_code} - - Service Name + + Customer Benefit Code - - {dataValue?.name} + + {dataValue?.customer_benefit_code} @@ -1012,6 +1095,9 @@ export default function PlanList() { Limit Benefit + + Freq. Period + Limit Frequency @@ -1058,7 +1144,7 @@ export default function PlanList() { title={{ name: 'Reason For Update' }} /> )} - {/* */} + /> ); } diff --git a/frontend/dashboard/src/pages/Corporates/Benefit/sections/History.tsx b/frontend/dashboard/src/pages/Corporates/Benefit/sections/History.tsx index 7cd79003..0a2b9a3f 100644 --- a/frontend/dashboard/src/pages/Corporates/Benefit/sections/History.tsx +++ b/frontend/dashboard/src/pages/Corporates/Benefit/sections/History.tsx @@ -155,6 +155,7 @@ export default function CustomizedAccordions() { if (key !== 'reason') { return null; // Melewati iterasi saat key adalah 'deleted_by' } + renderedValue = item.new_values[key]; const field = key.charAt(0).toUpperCase() + key.slice(1); diff --git a/frontend/dashboard/src/pages/Corporates/CorporateTabNavigations.tsx b/frontend/dashboard/src/pages/Corporates/CorporateTabNavigations.tsx index fa838add..c0e5c26c 100644 --- a/frontend/dashboard/src/pages/Corporates/CorporateTabNavigations.tsx +++ b/frontend/dashboard/src/pages/Corporates/CorporateTabNavigations.tsx @@ -64,10 +64,10 @@ export default function CorporateTabNavigations({ position }: Props) { path: 'formulariums', label: 'Formularium', }, - { - path: 'claim-history', - label: 'Claim History', - }, + // { + // path: 'claim-history', + // label: 'Claim History', + // }, ]; useEffect(() => { let currentIndex = mainTabItems.findIndex((item) => item.path === position); diff --git a/frontend/dashboard/src/pages/Corporates/DiagnosisExclusion/Edit.tsx b/frontend/dashboard/src/pages/Corporates/DiagnosisExclusion/Edit.tsx new file mode 100644 index 00000000..5065a27a --- /dev/null +++ b/frontend/dashboard/src/pages/Corporates/DiagnosisExclusion/Edit.tsx @@ -0,0 +1,273 @@ +/** + * Core + * ============================================ + */ +import axios from '@/utils/axios'; +import { useForm } from 'react-hook-form'; +import { useEffect, useState } from 'react'; +import { useNavigate, useParams } from 'react-router-dom'; +import { Box, IconButton, Typography, Grid, Card, TextField, Autocomplete, Button } from '@mui/material'; + +/** + * Components + * ============================================ +*/ +import Page from '../../../components/Page'; +import { LoadingButton } from "@mui/lab"; +import { FormProvider, RHFCustomMultiCheckbox, RHFTextField } from '@/components/hook-form'; +import { enqueueSnackbar } from 'notistack'; + +/** + * Icon + * ============================================ + */ +import ArrowBackIosNew from '@mui/icons-material/ArrowBackIosNew'; + +export default function Divisions() { + const pageTitle = 'Edit Exclusion'; + const navigate = useNavigate() + const { corporate_id, exclusion_id } = useParams(); // id di url + const [ plans, setPlans ] = useState([]); // 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..71540108 100644 --- a/frontend/dashboard/src/pages/Corporates/DiagnosisExclusion/List.tsx +++ b/frontend/dashboard/src/pages/Corporates/DiagnosisExclusion/List.tsx @@ -1,4 +1,5 @@ // @mui +import * as Yup from 'yup'; import { Autocomplete, Box, @@ -46,6 +47,9 @@ import React, { ChangeEvent, Component, useEffect, useRef, useState } from 'reac import useSettings from '../../../hooks/useSettings'; import { Link, useParams, useSearchParams, useNavigate } from 'react-router-dom'; // components +import { yupResolver } from '@hookform/resolvers/yup'; +import { useForm } from 'react-hook-form'; + import axios from '../../../utils/axios'; import { LaravelPaginatedData } from '../../../@types/paginated-data'; import { Icd } from '../../../@types/diagnosis'; @@ -59,6 +63,8 @@ import TableMoreMenu from '@/components/table/TableMoreMenu'; import { EditOutlined, FindInPageOutlined } from '@mui/icons-material'; import Label from '@/components/Label'; import { display } from '@mui/system'; +import DialogUpdateStatus from '@/components/DialogUpdateStatus' +import { FormProvider, RHFSelect } from '@/components/hook-form'; export default function List(props: any) { const { themeStretch } = useSettings(); @@ -272,6 +278,14 @@ export default function List(props: any) { ...icd, }; } + type DataContent = { + service: string; + id: number; + status: number; + code: string, + name: string, + rules: string, + }; const plans = props?.data.map((plan: any) => { return { value: plan.code, @@ -305,6 +319,16 @@ export default function List(props: any) { const { row, index, data } = props; } + const [isDialogOpen, setDialogOpen] = useState(false) + let titles = { + name: 'Update Status', + icon: '-' + } + const [dataValue, setDataValue] = useState(''); + const [dataDescription, setDescriptionValue] = useState(''); + const [url, setUrl] = useState(''); + + function Row(props: { row: ReturnType; data: any; @@ -337,9 +361,6 @@ export default function List(props: any) { const [openEdit, setOpenEdit] = React.useState(false); - console.log('open', open); - console.log('openEdit', openEdit); - // const [plans, setPlans] = useState([]); const plans = data; @@ -469,30 +490,53 @@ export default function List(props: any) { console.log('exclusions', exclusions); - const handleActivate = (row: any) => { - axios - .put(`/corporates/diagnosis-exclusions/update_activation`, { - id: row.id, - 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; - // }), - // }); - }) - .catch((error) => { - enqueueSnackbar( - error.response.data.message ?? error.message ?? 'Failed Processing Request', - { variant: 'error' } - ); - }); + // const handleActivate = (row: any) => { + + // axios + // .put(`/corporates/diagnosis-exclusions/update_activation`, { + // id: row.id, + // active: row.active == 1 ? 0 : 1, + // }) + // .then((res) => { + // 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) => { + // 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' } + // ); + // } + // }); + // }; + + const handleActivate = (isOpen: boolean, dataValue: DataContent) => { + console.log(dataValue) + setDialogOpen(isOpen) + setDataValue(dataValue) + setDescriptionValue('Are you sure to inactive this service ?') + setUrl(url) }; return ( @@ -514,7 +558,7 @@ export default function List(props: any) { {if(open==true) setOpen(!open)}}> {row.active == 1 && ( - navigate(`/corporates/${corporate_id}/diagnosis-exclusions/history`)} > + navigate(`/corporates/${corporate_id}/diagnosis-exclusions/${row.id}/edit`)} > Edit - handleActivate(row)}> + handleActivate(true, { + code: row.code, + name: row.name, + rules: Object.keys(row.rules).length ? 'With Rules' : 'All', + id:row.id, + status: row.active, + service: row.service_code + }) + } > Update Status @@ -571,16 +623,30 @@ export default function List(props: any) { MSC : - - {row?.rules?.msc && row?.rules?.msc[0] ? ( - row?.rules?.msc[0].split(',').map((text,i) => { - return ( - - - - ) - }) - ) : '-'} + + {row?.rules?.msc && row?.rules?.msc[0] ? ( + row?.rules?.msc[0].split(',').map((text, i) => { + let labelMSC: string = text; + switch (labelMSC) { + case 'm': + labelMSC = 'Member'; + break; + case 'c': + labelMSC = 'Child'; + break; + case 's': + labelMSC = 'Spouse'; + break; + default: + labelMSC = 'Member'; + } + return ( + + + + ); + }) + ) : '-'} @@ -589,9 +655,14 @@ export default function List(props: any) { {row?.rules?.gender && row?.rules?.gender[0] ? ( - - - + row?.rules?.gender[0].split(',').map((text,i) => { + const capitalizedText = text.charAt(0).toUpperCase() + text.slice(1); + return ( + + + + ) + }) ) : '-'} @@ -630,222 +701,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} */}
@@ -944,6 +799,18 @@ export default function List(props: any) { fontWeight: 'bold', }; + const onSubmit = async (row : any) => { + try { + handleUpdate(dataValue.status, dataValue.id, row.reason) + } catch (error: any) { + console.log('data gagal'); + } + + const ascent = document?.querySelector('ascent'); + if (ascent != null) { + ascent.innerHTML = ''; + } + }; const applyFilter = async (searchFilter: any) => { await loadDataTableData({ search: searchFilter }); setSearchParams({ search: searchFilter }); @@ -961,6 +828,136 @@ export default function List(props: any) { const navigate = useNavigate() + const NewCorporateSchema = Yup.object().shape({ + reason: Yup.string().required('Reason Edit is required'), + }); + + const methods = useForm({ + resolver: yupResolver(NewCorporateSchema), + }); + + + const { + reset, + handleSubmit, + formState: { isSubmitting }, + } = methods; + + const handleUpdate = (active: number, id: number, reason:string) => { + console.log(active) + axios + .put(`/corporates/diagnosis-exclusions/update_activation`, { + id: id, + active: active, + reason: reason + }) + .then((res) => { + window.location.reload(); + }); + } + + const getContent = () => ( + <> + + Are you sure to {dataValue?.status == 1 ? 'inactive' : 'active'} this benefit ? + + + + + Service + + + {dataValue?.service} + + + Code + + + {dataValue?.code} + + + Name + + + {dataValue?.name} + + + Rules + + + {dataValue?.rules} + + + + + + Reason for update* + + + + + + + + + + + + + + {dataValue?.status == 1? + + Inactive + + : + + Active + + + + } + + + + + + ); + return ( @@ -1033,6 +1030,16 @@ export default function List(props: any) { + + ); } diff --git a/frontend/dashboard/src/pages/Corporates/Hospital/CreateUpdate.tsx b/frontend/dashboard/src/pages/Corporates/Hospital/CreateUpdate.tsx index d4ad3ea9..b975c1ca 100644 --- a/frontend/dashboard/src/pages/Corporates/Hospital/CreateUpdate.tsx +++ b/frontend/dashboard/src/pages/Corporates/Hospital/CreateUpdate.tsx @@ -1,64 +1,63 @@ - import { useNavigate, useParams } from "react-router-dom"; import HeaderBreadcrumbs from "../../../components/HeaderBreadcrumbs"; import Page from "../../../components/Page"; import useSettings from "../../../hooks/useSettings"; -import { useEffect, useMemo, useState } from 'react'; -import axios from '../../../utils/axios'; -import { useSnackbar } from 'notistack'; -import CorporatePlanForm from './Form'; -import { CorporatePlan } from '../../../@types/corporates'; +import { useContext, useEffect, useMemo, useState } from 'react'; +import CorporateHospitalForm from './Form'; +import { Hospital } from '../../../@types/corporates'; +import { Corporate } from "@/@types/corporates"; +import { ConfiguredCorporateContext } from "@/contexts/ConfiguredCorporateContext"; +import { Stack, Typography } from '@mui/material'; +import ArrowBackIosIcon from '@mui/icons-material/ArrowBackIos'; -export default function PlanCreate() { - const { themeStretch } = useSettings(); +export default function HospitalCreate() { const { corporate_id, id } = useParams(); - const [ currentCorporatePlan, setCurrentCorporatePlan ] = useState(); const navigate = useNavigate(); + const [corporate, setCorporate] = useState(); + + const configuredCorporateContext = useContext(ConfiguredCorporateContext); + const isEdit = !!id; useEffect(() => { - if (isEdit) { - axios.get('/corporates/'+corporate_id+'/divisions/'+id+'/edit') - .then((res) => { - setCurrentCorporatePlan(res.data); - }) - .catch((err) => { - if (err.response.status === 404) { - navigate('/404'); - } - }) - } - }, [corporate_id, id]); + setCorporate(configuredCorporateContext.currentCorporate); + }, [corporate_id, id, configuredCorporateContext]); return ( - - - - + + {isEdit ? ( + + navigate(-1)}/> + Edit Hospital + + ) : ( + + )} + ); } diff --git a/frontend/dashboard/src/pages/Corporates/Hospital/Form.tsx b/frontend/dashboard/src/pages/Corporates/Hospital/Form.tsx index 2e088d92..b0d708bf 100644 --- a/frontend/dashboard/src/pages/Corporates/Hospital/Form.tsx +++ b/frontend/dashboard/src/pages/Corporates/Hospital/Form.tsx @@ -1,129 +1,171 @@ -import * as Yup from 'yup'; -import { LoadingButton } from "@mui/lab"; -import { 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 { Button, Card, Grid, Stack, Typography, FormControl, InputLabel, Select, FormHelperText, MenuItem } from "@mui/material"; +import { useEffect, useMemo, useState } from 'react'; 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) { +export default function CorporateHospitalForm({ isEdit }: 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] - ); + const { corporate_id, id, organization_id } = useParams(); + const [dataHospital, setDataHospital] = 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(() => { - if (isEdit && currentCorporatePlan) { - reset(defaultValues); + 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 = { + corporate_id : corporate_id ? corporate_id : null, + organization_id : dataHospital ? dataHospital[index].id : null, + code : dataHospital ? dataHospital[index].code : null, + name : dataHospital ? dataHospital[index].name : null, } - if (!isEdit) { - reset(defaultValues); + setAddData(data); + + } + const handleSaveData = () => { + //Save data + axios + .post('/corporates/'+corporate_id+'/hospitals/save', (addData ? addData : dataDefault)) + .then((response) => { + if(response.data) + { + enqueueSnackbar('Data saved successfully', { variant: 'success' }); + } + }) + .catch((error) => { + enqueueSnackbar('Failed to add data', { variant: 'error' }); + }); + } + + const handlePageChangeUpdate = (id: any) => { + setIndexData(id); + const foundData = dataHospital?.find(item => item.id === id); + const dataUpdate = { + corporate_id : corporate_id ? corporate_id : null, + organization_id : dataHospital ? foundData.id : null, + code : dataHospital ? foundData.code : null, + name : dataHospital ? foundData.name : null, } - }, [isEdit, currentCorporatePlan]); + setUpdateData(dataUpdate); + } - 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('/corporate/' + corporate_id + '/divisions', data) - .then((res) => { - enqueueSnackbar('Division created successfully', { variant: 'success' }); - }) - .then((res) => { - navigate('/corporate/' + 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' }); + const handleUpdateData = () => { + //Update data + if(updateData) + { + axios + .put('/corporates/'+corporate_id+'/hospitals/'+id+'/edit', updateData) + .then((response) => { + if(response.data) + { + enqueueSnackbar('Data updated successfully', { variant: 'success' }); + navigate(-1); + window.history.replaceState(null, '', '/corporates/'+corporate_id+'/hospitals'); } + }) + .catch((error) => { + enqueueSnackbar('Failed to update data', { variant: 'error' }); }); - } else { - await axios - .put('/corporate/' + corporate_id + '/divisions/' + currentCorporatePlan?.id , data) - .then((res) => { - enqueueSnackbar('Division updated successfully', { variant: 'success' }); - }) - .then((res) => { - navigate('/corporate/' + corporate_id + '/divisions/' , { replace: true }); - }) - .catch(({ response }) => { - enqueueSnackbar('Update Failed : '+ response.data.message, { variant: 'error' }); - }); } - }; + else + { + enqueueSnackbar('Data has not changed.', { variant: 'error' }); + } + + } return ( - - - - - + + + + Hospital * + {dataHospital && dataHospital.length > 0 ? ( + isEdit ? ( + + + Hospital + + + + + ) : ( + + + Hospital + + + + + ) + ) : ( + + Loading + - Division Detail - - - - - - - { isEdit? 'Update' : 'Create' } - - - - - - - - - - - - - + )} + + + + {isEdit ? ( + + ):( + + )} + + + + + ); } 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/Index.tsx b/frontend/dashboard/src/pages/Corporates/Hospital/Index.tsx index d5fa1fa3..bbd1aa3f 100644 --- a/frontend/dashboard/src/pages/Corporates/Hospital/Index.tsx +++ b/frontend/dashboard/src/pages/Corporates/Hospital/Index.tsx @@ -1,32 +1,33 @@ -import { Card, Grid, Typography } from '@mui/material'; -import { useParams } from 'react-router-dom'; -import HeaderBreadcrumbs from '../../../components/HeaderBreadcrumbs'; -import Page from '../../../components/Page'; -import useSettings from '../../../hooks/useSettings'; -import CorporateTabNavigations from '../CorporateTabNavigations'; -import DivisionsList from './List'; +import { Corporate } from "@/@types/corporates"; +import { ConfiguredCorporateContext } from "@/contexts/ConfiguredCorporateContext"; +import { Card } from "@mui/material"; +import { useContext, useEffect, useState } from "react"; +import { useParams } from "react-router-dom"; +import HeaderBreadcrumbs from "../../../components/HeaderBreadcrumbs"; +import Page from "../../../components/Page"; +import useSettings from "../../../hooks/useSettings"; +import CorporateTabNavigations from "../CorporateTabNavigations"; +import List from "./List"; -import { useContext, useEffect, useState } from 'react'; -import { ConfiguredCorporateContext } from '@/contexts/ConfiguredCorporateContext'; -import { Corporate } from '@/@types/corporates'; -export default function Divisions() { - const { themeStretch } = useSettings(); + +export default function hospitals() { const { corporate_id } = useParams(); - - const [corporate, setCorporate] = useState(); + + const [corporate, setCorporate] = useState(); const configuredCorporateContext = useContext(ConfiguredCorporateContext); useEffect(() => { setCorporate(configuredCorporateContext.currentCorporate); - }, [configuredCorporateContext]); + }, [configuredCorporateContext]) return ( - + + - Feature Not Implemented Yet + ); diff --git a/frontend/dashboard/src/pages/Corporates/Hospital/List.tsx b/frontend/dashboard/src/pages/Corporates/Hospital/List.tsx index fb019971..74f4bc94 100644 --- a/frontend/dashboard/src/pages/Corporates/Hospital/List.tsx +++ b/frontend/dashboard/src/pages/Corporates/Hospital/List.tsx @@ -1,124 +1,158 @@ // @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 KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; -import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight'; +import { + Button, + Card, + IconButton, + MenuItem, + Paper, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + TextField, + Typography, + Stack, + Collapse, + Box, + FormControl, + InputLabel, + Select, + FormHelperText, +} from '@mui/material'; 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 { Link, useNavigate, useParams, useSearchParams } from 'react-router-dom'; +import React, { ChangeEvent, useEffect, useRef, useState } from 'react'; +import { useNavigate, useParams, useSearchParams } from 'react-router-dom'; // components import axios from '../../../utils/axios'; import { CorporatePlan } from '../../../@types/corporates'; import { LaravelPaginatedData } from '../../../@types/paginated-data'; import BasePagination from '../../../components/BasePagination'; +import TableMoreMenu from '@/components/table/TableMoreMenu'; +import EditOutlinedIcon from '@mui/icons-material/EditOutlined'; +import HistoryIcon from '@mui/icons-material/History'; +import FindInPageOutlinedIcon from '@mui/icons-material/FindInPageOutlined'; +import CachedOutlinedIcon from '@mui/icons-material/CachedOutlined'; +import { Dialog, DialogTitle, DialogContent, DialogActions } from '@mui/material'; +import CloseIcon from '@mui/icons-material/Close'; +import { enqueueSnackbar } from 'notistack'; +import Label from '../../../components/Label'; export default function PlanList() { - const { themeStretch } = useSettings(); const { corporate_id } = useParams(); const [searchParams, setSearchParams] = useSearchParams(); const navigate = useNavigate(); - + 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(() => { - // console.log('Search Input: useEffect') + useEffect(() => { setSearchText(searchParams.get('search') ?? ''); - }, [searchParams]) + }, [searchParams]); return (
- + ); } // Called on every row to map the data to the columns - function createData( plan: CorporatePlan ): CorporatePlan { + function createData(plan: CorporatePlan): CorporatePlan { return { ...plan, - } + }; } // Generate the every row of the table function Row(props: { row: ReturnType }) { const { row } = props; const [open, setOpen] = React.useState(false); + const style1 = { + color: '#637381' + } return ( - *': { borderBottom: 'unset' } }}> - - setOpen(!open)} - > - {open ? : } - + *': 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)}> + + Details + + handleEditData(row)}> + + Edit + + handleEditDataStatus(row)}> + + Update Status + + navigate ('/corporates/'+corporate_id+'/hospitals/'+row.id+'/history')}> + + History + + + } + /> - {row.id} - {row.code} - {row.name} - {row.description} - - {/* COLLAPSIBLE ROW */} - - + {if(open==true) setOpen(!open)}}> + - - - 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 - - ) - } */} - -
-
} + + + Detail + + + Code: + {row.code ? row.code : '-'} + + + Hospital Name: + {row.name ? row.name : '-'} + + + +
@@ -131,104 +165,230 @@ 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 : any | null = null) => { + const loadDataTableData = async (appliedFilter: any | null = null) => { setDataTableLoading(true); const filter = appliedFilter ? appliedFilter : Object.fromEntries([...searchParams.entries()]); - const response = await axios.get('/corporates/'+corporate_id+'/divisions', { params: filter }); - // console.log(response.data); + // Get Data Hospitals + const response = await axios.get('/corporates/' + corporate_id + '/hospitals', { + params: filter, + }); setDataTableLoading(false); - setDataTableData(response.data); - } - - const headStyle = { - fontWeight: 'bold', }; const applyFilter = async (searchFilter: any) => { - 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(); - }, []) + }, []); + + //validation dialog + const [nameField, setNameField] = useState(''); + const [codeField, setCodeField] = useState(''); + // ID for edit data + const [idField, setIdField] = useState(''); + + const handleAddData = () => { + navigate('/corporates/'+corporate_id+'/hospitals/create'); + } + //Edit data + const handleEditData = (data : any) => { + navigate('/corporates/'+corporate_id+'/hospitals/edit/'+data.id+'/'+data.organization_id); + } + // End dialog for hospitals + + // Dialog for update status hospitals + const [openDialogStatus, setOpenDialogStatus] = useState(false); + const [activeField, setActiveField] = useState(0); + const [reasonUpdate,setReasonUpdate] = useState('Agreement changed'); + + const handleCloseDialogUpdate = () => { + setOpenDialogStatus(false); + setNameField(''); + setCodeField(''); + setIdField(''); + setActiveField(activeField); + } + + const handleSaveUpdateData = () => { + let activeValue = 0; + if(activeField === 1) + { + activeValue = 0; + } + else + { + activeValue = 1; + } + const updateData = { + reason: reasonUpdate, + active : activeValue, + id: idField, + }; + axios + .put('/hospitals/'+idField+'/activation', updateData) + .then((response) => { + enqueueSnackbar('Data updated successfully', { variant: 'success' }); + loadDataTableData(); + handleCloseDialogUpdate(); + }) + .catch((error) => { + enqueueSnackbar('Failed to add data', { variant: 'error' }); + }); + } + + const handleEditDataStatus = (data: any) => { + setIdField(data.id); + setNameField(data.name); + setCodeField(data.code); + setActiveField(data.active); + setOpenDialogStatus(true); + } + // End dialog for update status devisions + + return ( - - - - - - - - + + + + + {/* The Main Table */} - + {/* Table Head */} + - - ID - Code - Name - Description + + Code + + + Hospital + + + Status + + + - - {dataTableIsLoading ? - ( - - - Loading - - - ) : ( - dataTableData.data.length == 0 ? - ( - - - No Data - - - ) : ( - - {dataTableData.data.map(row => ( - - ))} - - ) + + {/* Condition Table Body */} + {dataTableIsLoading ? ( + + + + Loading + + + + ) : dataTableData.data.length == 0 ? ( + + + + No Data + + + + ) : ( + + {dataTableData.data.map((row) => ( + + ))} + )}
- -
+ {/* Paginations */} + +
+ {/* Dialog Update Status */} + + + + + Update Status + + + + + + + + + Are you sure to {activeField == 1 ? 'Inactive' : 'Active'} this hospital ? + + + Code + {nameField} + + + Hospital Name + {codeField} + + + + + Reason for update* + + + Reason for update + + + + + + + + + + + +
); -} +} \ No newline at end of file diff --git a/frontend/dashboard/src/pages/Corporates/Index.tsx b/frontend/dashboard/src/pages/Corporates/Index.tsx index bc51d257..d5c86350 100644 --- a/frontend/dashboard/src/pages/Corporates/Index.tsx +++ b/frontend/dashboard/src/pages/Corporates/Index.tsx @@ -297,7 +297,7 @@ export default function Corporates() { Import */} - 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 4374d949..35e208ca 100644 --- a/frontend/dashboard/src/pages/Corporates/Member/List.tsx +++ b/frontend/dashboard/src/pages/Corporates/Member/List.tsx @@ -29,6 +29,9 @@ import { Grid, Tooltip, Divider, + ButtonBase, + FormControl, + FormHelperText, } from '@mui/material'; import Iconify from '@/components/Iconify'; import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; @@ -40,7 +43,7 @@ import InsertDriveFileIcon from '@mui/icons-material/InsertDriveFile'; // hooks import React, { ChangeEvent, Component, useEffect, useRef, useState } from 'react'; import useSettings from '../../../hooks/useSettings'; -import {Link, useParams, useSearchParams } from 'react-router-dom'; +import {Link, useParams, useNavigate, useSearchParams } from 'react-router-dom'; // components import axios from '../../../utils/axios'; import { Plan } from '../../../@types/corporates'; @@ -52,8 +55,15 @@ import { LoadingButton } from '@mui/lab'; import DialogLog from './sections/DialogLog'; import HistoryIcon from '@mui/icons-material/History'; import { makeFormData } from '@/utils/jsonToFormData'; +import DownloadIcon from '@mui/icons-material/Download'; +import TableMoreMenu from '@/components/table/TableMoreMenu'; +import FindInPageOutlinedIcon from '@mui/icons-material/FindInPageOutlined'; +import CachedOutlinedIcon from '@mui/icons-material/CachedOutlined'; +import { Dialog, DialogTitle, DialogContent, DialogActions } from '@mui/material'; +import CloseIcon from '@mui/icons-material/Close'; export default function CorporatePlanList({handleSubmitSuccess}) { + const navigate = useNavigate(); // Files MCU const fileMcuInput = useRef(null); const [fileMcus, setFileMcus] = useState([]); @@ -196,17 +206,17 @@ export default function CorporatePlanList({handleSubmitSuccess}) { setTimeout(() => { loadDataTableData(); }, 2000); - enqueueSnackbar(responseData.message ?? 'Berhasil tambah file MemberID '+member_id+', silahkan lihat dilaporan', { variant: 'success' }); + enqueueSnackbar(responseData.message ?? 'Berhasil tambah file Member ID '+member_id+', silahkan lihat dilaporan', { variant: 'success' }); handleSubmitSuccess(); } }) .catch(({ response }) => { const responseData = response?.data; - if(responseData) - { - enqueueSnackbar(responseData.message ?? 'Something Went Wrong', { variant: 'error' }); - } + if(responseData) + { + enqueueSnackbar(responseData.message ?? 'Something Went Wrong', { variant: 'error' }); + } }) .then(() => { setSubmitLoading(false); @@ -319,12 +329,10 @@ export default function CorporatePlanList({handleSubmitSuccess}) { {!currentImportFileName && ( - {/*

kjasndkjandskjasndkjansdkjansd

*/} - )} - {row.active != 1 && ( - - )} + + {row.members_effective_date ? row.members_effective_date : '-'} - - - - - - + + {row.name ? row.name : '-'} + + + {row.current_plan?.code} + + + {row.activation_date ? row.activation_date : '-'} + + + {row.terminated_date ? row.terminated_date : '-'} + + + + setOpen(!open)}> + + Details + + handleEditDataStatus(row)}> + + Update Status + + navigate ('/corporates/'+corporate_id+'/members/'+row.id+'/history')}> + + History + + + } + /> {/* COLLAPSIBLE ROW */} - - - + {if(open==true) setOpen(!open)}}> + - - Detail - - - - - Mapping ID - - - : {row.principal_id ?? '-'} - - - Policy Number - - - : {row.current_policy?.code ?? '-'} - - - NRIC - - - : {row.nric ?? '-'} - - - - NIK - - - : {row.employeds[0]?.nik ?? '-'} - - - Email - - - : {row.email ?? '-'} - - - Phone - - - : {row.person?.phone ?? '-'} - - - - - - - Birth Date - - - : {row.birth_date ?? '-'} - - - Gender - - - : {row.gender ?? '-'} - - - Marital Status - - - : {row.marital_status ?? '-'} - - - Language - - - : {row.language ?? '-'} - - - Race - - - : {row.race ?? '-'} - - - Relationship - - - : {row.relation_with_principal ?? '-'} - - - - - Claim History - - - - - Requested - - - : {row.total_claims?.requested} - - - - Pending - - - : {row.total_claims?.received} - - - - Approved - - - : {row.total_claims?.approved} - - - - Declined - - - : {row.total_claims?.declined} - - - - Paid - - - : {row.total_claims?.paid} - - - - - File History - - - - - {row.file_mcu_names - ? row.file_mcu_names.split(',').map((fileName, index) => ( -
{fileName}
- )) - : '-'} -
-
-
-
- - - - } - // sx={{ p: 1.8 }} - // onClick={() => {handleDownloadLog(row)}} - onClick={() => { - setDialogLogOpen(true); - }} - loading={loadingLog} - > - Download LOG - + + + Detail + + + Mapping ID: + {row.principal_id ? row.principal_id : '-'} + Birth Date: + {row.birth_date ? row.birth_date : '-'} - {/* -------------------------------Upload Dokumen MCU------------------------------- */} - - {/*} - spacing={1} - sx={{ marginY: 2}} - > - {fileMcus && - fileMcus - .filter((datas) => datas.id === row.id) - .map((datas, index) => ( - - {datas.file.name} - { - removeMcuFiles(datas.id, index); - }} - sx={{ cursor: 'pointer' }} - > - - ))} - */} - { - handleMcuInputChange(row.id, row.member_id)(event); - }} - accept="application/pdf" - /> - { - fileMcuInput.current.click(); - }} - > - - Add Result - + + Policy Number: + {row.current_policy?.code ? row.current_policy?.code : '-'} + Gender: + {row.gender ? row.gender : '-'} - + + NRIC: + {row.nric ? row.nric : '-'} + Marital Status: + {row.marital_status ? row.marital_status : '-'} + + + NIK: + {row.employeds[0]?.nik ? row.employeds[0]?.nik : '-'} + Language: + {row.language ? row.language : '-'} + + + Email: + {row.email ? row.email : '-'} + Race: + {row.race ? row.race : '-'} + + + Phone Number: + {row.person?.phone ? row.person?.phone : '-'} + Relationship: + {row.relation_with_principal ? row.relation_with_principal : '-'} + +
+ Claim History + + + Requested: + {row.total_claims?.requested ? row.total_claims?.requested : '-'} + + + Pending: + {row.total_claims?.received ? row.total_claims?.received : '-'} + + + Approved: + {row.total_claims?.approved ? row.total_claims?.approved : '-'} + + + Declined: + {row.total_claims?.declined ? row.total_claims?.declined : '-'} + + + Paid: + {row.total_claims?.paid ? row.total_claims?.paid : '-'} + + + Files History + + + {row.file_mcu_names + ? row.file_mcu_names.split(',').map((fileName, index) => ( + <> + + + {fileName} + + + )) + : '-'} + + + + fileMcuInput.current?.click()}> + + + + Upload Result + + + { + handleMcuInputChange(row.id, row.member_id)(event); + }} + accept="application/pdf" + /> + + + + + + + + } + // sx={{ p: 1.8 }} + // onClick={() => {handleDownloadLog(row)}} + onClick={() => { + setDialogLogOpen(true); + }} + loading={loadingLog} + > + Download LOG + + + + + - - @@ -746,33 +664,73 @@ export default function CorporatePlanList({handleSubmitSuccess}) { const headStyle = { fontWeight: 'bold', }; + const [reasonUpdate,setReasonUpdate] = useState('Agreement changed'); + const [nameUpdate, setNameUpdate] = useState(''); + const [memberIdUpdate, setMemberIdUpdate] = useState(''); + const [activeUpdate, setActiveUpdate] = useState(0); + const [idUpdate, setIdUpdate] = useState(''); + + const [openDialogStatus, setOpenDialogStatus] = useState(false); + + const handleCloseDialogUpdate = () => { + setNameUpdate(''); + setMemberIdUpdate(''); + setActiveUpdate(activeUpdate); + setIdUpdate(''); + setOpenDialogStatus(false); + } + + const handleSaveUpdateData = () => { + let activeValue = 0; + if(activeUpdate === 1) + { + activeValue = 0; + } + else + { + activeValue = 1; + } + const updateData = { + reason: reasonUpdate, + active : activeValue, + id: idUpdate, + }; + axios + .put('/members/'+idUpdate+'/activation', updateData) + .then((response) => { + enqueueSnackbar('Data updated successfully', { variant: 'success' }); + loadDataTableData(); + handleCloseDialogUpdate(); + }) + .catch((error) => { + enqueueSnackbar('Failed to add data', { variant: 'error' }); + }); + } + + const handleEditDataStatus = (data:any) => { + setNameUpdate(data.name); + setMemberIdUpdate(data.member_id); + setActiveUpdate(data.active); + setIdUpdate(data.id); + setOpenDialogStatus(true); + } return ( - {/* The Main Table */} - + - {columns.map((column, index) => ( - - {column.label} + + {column.label} ))} - - Status - - - Action - - {/* - Action - */} + - + {dataTableIsLoading ? ( @@ -801,6 +759,62 @@ export default function CorporatePlanList({handleSubmitSuccess}) { + {/* Dialog Update Status */} + + + + + Update Status + + + + + + + + + Are you sure to {activeUpdate == 1 ? 'Inactive' : 'Active'} this member ? + + + Member ID + {memberIdUpdate} + + + Name + {nameUpdate} + + + + + Reason for update* + + + Reason for update + + + + + + + + + + + {isDialog === 'edit' && ( { axios - .put(`/members/${id}/activation`, { + .put(`/members/${memberId}/activation`, { // service_code: service.service_code, active: status == 'active', - reason: model.reason + reason: model.reason, + id: memberId, }) .then((res) => { // Memuat ulang halaman saat ini @@ -133,7 +136,7 @@ const DialogTopUpLimit = ({ title, openDialog, setOpenDialog, data }: MuiDialogP const data = { service_code : service_code, reason : row.reason, - id : id, + id : memberId, } handleActivate(data, status) } catch (error: any) { @@ -157,18 +160,18 @@ const DialogTopUpLimit = ({ title, openDialog, setOpenDialog, data }: MuiDialogP + Reason for update* - - - - - - + name="reason" + label="Reason for update" + > + + + + + + - (null); @@ -227,16 +240,7 @@ export default function CorporatePlanList() { { + if (!serviceCodeArray.includes(row.service_code)) { + serviceCodeArray.push(row.service_code); + } + + if (!codeArray.includes(row.code)) { + codeArray.push(row.code); + } + + if (!typeArray.includes(row.type)) { + typeArray.push(row.type); + } + + if (!planArray.includes(row.corporate_plan_id)) { + planArray.push(row.corporate_plan_id); + } + + }); + + const optionServiceCode = serviceCodeArray.map((value) => { + return { + value: value, + label: value + }; + }); + const optionCode = codeArray.map((value) => { + return { + value: value, + label: value + }; + }); + const optionType = typeArray.map((value) => { + return { + value: value, + label: value + }; + }); + const optionPlan = planArray.map((value) => { + return { + value: value, + label: value + }; + }); + + + console.log(optionCode) + setServiceCode(optionServiceCode) + setType(optionType) + setCode(optionCode) + setCodePlan(optionPlan) + }; const headStyle = { @@ -854,7 +889,7 @@ export default function CorporatePlanList() { .then((res) => { window.location.reload(); }); -} + } const getContent = () => ( <> diff --git a/frontend/dashboard/src/routes/index.tsx b/frontend/dashboard/src/routes/index.tsx index 07f2b8d0..de0d3b64 100644 --- a/frontend/dashboard/src/routes/index.tsx +++ b/frontend/dashboard/src/routes/index.tsx @@ -177,6 +177,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,7 +190,18 @@ export default function Router() { path: ':corporate_id/hospitals', element: , }, - + { + path: ':corporate_id/hospitals/create', + element: , + }, + { + path: ':corporate_id/hospitals/edit/:id/:organization_id', + element: , + }, + { + path: ':corporate_id/hospitals/:id/history', + element: , + }, { path: ':corporate_id/claim-history', element: , @@ -438,7 +453,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'))); @@ -468,6 +483,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')) ); @@ -515,9 +533,11 @@ const CorporateServicesCreate = Loadable(lazy(() => import('../pages/Corporates/ const CorporateServicesHistory = Loadable(lazy(() => import('../pages/Corporates/Services/sections/History'))); const CorporateHospitals = Loadable(lazy(() => import('../pages/Corporates/Hospital/Index'))); +const HospitalCreateUpdate = Loadable(lazy(() => import('../pages/Corporates/Hospital/CreateUpdate'))); 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'))