From 0f4c84da6a20cbb5b78c4b1a8e63c9df0407f155 Mon Sep 17 00:00:00 2001 From: Dell Date: Fri, 15 Jul 2022 09:38:25 +0700 Subject: [PATCH] Fix Division --- .../Controllers/Api/DivisionController.php | 118 ++++++ Modules/Internal/Routes/api.php | 6 + app/Models/CorporateDivision.php | 22 + ...45441_create_corporate_divisions_table.php | 3 + frontend/dashboard/src/@types/member.ts | 5 + .../Corporates/CorporateTabNavigations.tsx | 2 +- .../Corporates/Division/CreateUpdate.tsx | 64 +++ .../src/pages/Corporates/Division/Form.tsx | 129 ++++++ .../src/pages/Corporates/Division/Index.tsx | 11 +- .../src/pages/Corporates/Division/List.tsx | 189 ++++----- .../{Division => Member}/Create.tsx | 51 ++- .../src/pages/Corporates/Member/Index.tsx | 13 +- .../src/pages/Corporates/Member/List.tsx | 380 +++++++++++++----- frontend/dashboard/src/routes/index.tsx | 6 +- 14 files changed, 761 insertions(+), 238 deletions(-) create mode 100644 Modules/Internal/Http/Controllers/Api/DivisionController.php create mode 100644 frontend/dashboard/src/@types/member.ts create mode 100644 frontend/dashboard/src/pages/Corporates/Division/CreateUpdate.tsx create mode 100644 frontend/dashboard/src/pages/Corporates/Division/Form.tsx rename frontend/dashboard/src/pages/Corporates/{Division => Member}/Create.tsx (85%) diff --git a/Modules/Internal/Http/Controllers/Api/DivisionController.php b/Modules/Internal/Http/Controllers/Api/DivisionController.php new file mode 100644 index 00000000..fd8a690b --- /dev/null +++ b/Modules/Internal/Http/Controllers/Api/DivisionController.php @@ -0,0 +1,118 @@ +filter($request->all()) + ->where('corporate_id', $corporate_id) + ->paginate(0) + ->appends($request->all()); + + return $benefits; + } + + /** + * 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([ + 'code' => [ + 'required', + Rule::unique('corporate_plans')->where('corporate_id', $corporate_id) + ], + 'name' => 'required' + ]); + + $newCorporatePlan = CorporateDivision::create([ + 'corporate_id' => $corporate_id, + 'code' => $request->code, + 'name' => $request->name, + ]); + + return $newCorporatePlan; + } + + /** + * 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 = CorporateDivision::findOrFail($id); + $request->validate([ + 'code' => [ + 'required', + Rule::unique('corporate_plans')->where('corporate_id', $corporate_id)->ignore($corporatePlan->id) + ], + 'name' => 'required' + ]); + + $corporatePlan->fill([ + 'code' => $request->code, + 'name' => $request->name, + 'active' => $request->active, + ])->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 c34f691c..e9ef230f 100644 --- a/Modules/Internal/Routes/api.php +++ b/Modules/Internal/Routes/api.php @@ -6,6 +6,7 @@ use Modules\Internal\Http\Controllers\Api\BenefitController; use Modules\Internal\Http\Controllers\Api\CorporateBenefitController; use Modules\Internal\Http\Controllers\Api\CorporateController; use Modules\Internal\Http\Controllers\Api\CorporatePlanController; +use Modules\Internal\Http\Controllers\Api\DivisionController; use Modules\Internal\Http\Controllers\Api\PlanController; /* @@ -51,5 +52,10 @@ Route::prefix('internal')->group(function () { Route::get('corporates/{corporate_id}/benefits', [BenefitController::class, 'index']); Route::post('corporates/{corporate_id}/benefits/import', [BenefitController::class, 'memberBenefitImport']); + + Route::get('corporates/{corporate_id}/divisions', [DivisionController::class, 'index']); + Route::post('corporates/{corporate_id}/divisions', [DivisionController::class, 'store']); + Route::get('corporates/{corporate_id}/divisions/{id}/edit', [DivisionController::class, 'edit']); + Route::put('corporates/{corporate_id}/divisions/{id}', [DivisionController::class, 'update']); }); }); diff --git a/app/Models/CorporateDivision.php b/app/Models/CorporateDivision.php index 1d005977..01ee64fd 100644 --- a/app/Models/CorporateDivision.php +++ b/app/Models/CorporateDivision.php @@ -8,4 +8,26 @@ use Illuminate\Database\Eloquent\Model; class CorporateDivision extends Model { use HasFactory; + + protected $fillable = [ + 'corporate_id', + 'code', + 'name', + 'description', + 'active', + ]; + + public function corporate() + { + return $this->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/database/migrations/2022_06_16_045441_create_corporate_divisions_table.php b/database/migrations/2022_06_16_045441_create_corporate_divisions_table.php index 87e51ada..135657c4 100644 --- a/database/migrations/2022_06_16_045441_create_corporate_divisions_table.php +++ b/database/migrations/2022_06_16_045441_create_corporate_divisions_table.php @@ -18,6 +18,9 @@ return new class extends Migration $table->foreignId('corporate_id')->nullable()->index(); $table->string('code'); $table->string('name')->nullable(); + $table->text('description')->nullable(); + $table->boolean('active')->default(true); + $table->unique(["corporate_id", "code"], 'corporate_plans_unique'); $table->timestamps(); $table->softDeletes(); diff --git a/frontend/dashboard/src/@types/member.ts b/frontend/dashboard/src/@types/member.ts new file mode 100644 index 00000000..a141bb56 --- /dev/null +++ b/frontend/dashboard/src/@types/member.ts @@ -0,0 +1,5 @@ +// ---------------------------------------------------------------------- + +export type Member = { + +}; diff --git a/frontend/dashboard/src/pages/Corporates/CorporateTabNavigations.tsx b/frontend/dashboard/src/pages/Corporates/CorporateTabNavigations.tsx index c41c776e..98931380 100644 --- a/frontend/dashboard/src/pages/Corporates/CorporateTabNavigations.tsx +++ b/frontend/dashboard/src/pages/Corporates/CorporateTabNavigations.tsx @@ -37,7 +37,7 @@ export default function CorporateTabNavigations({ position }: Props) { }, { 'path' : 'divisions', - 'label': 'Divisions', + 'label': 'Division', }, { 'path' : 'members', diff --git a/frontend/dashboard/src/pages/Corporates/Division/CreateUpdate.tsx b/frontend/dashboard/src/pages/Corporates/Division/CreateUpdate.tsx new file mode 100644 index 00000000..d4ad3ea9 --- /dev/null +++ b/frontend/dashboard/src/pages/Corporates/Division/CreateUpdate.tsx @@ -0,0 +1,64 @@ + +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'; + + + +export default function PlanCreate() { + const { themeStretch } = useSettings(); + const { corporate_id, id } = useParams(); + const [ currentCorporatePlan, setCurrentCorporatePlan ] = useState(); + const navigate = useNavigate(); + + 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]); + + + return ( + + + + + + ); +} diff --git a/frontend/dashboard/src/pages/Corporates/Division/Form.tsx b/frontend/dashboard/src/pages/Corporates/Division/Form.tsx new file mode 100644 index 00000000..dfdde430 --- /dev/null +++ b/frontend/dashboard/src/pages/Corporates/Division/Form.tsx @@ -0,0 +1,129 @@ +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 { useSnackbar } from 'notistack'; +import { useNavigate, useParams } from 'react-router-dom'; +import axios from '../../../utils/axios'; + +type Props = { + isEdit: boolean; + currentCorporatePlan?: CorporatePlan; +}; + +export default function CorporatePlanForm({ isEdit, currentCorporatePlan }: Props) { + + const { enqueueSnackbar } = useSnackbar(); + const navigate = useNavigate(); + const { corporate_id } = useParams(); + + const NewCorporatePlanSchema = Yup.object().shape({ + name: Yup.string().required('Name is required'), + code: Yup.string().required('Corporate Code is required'), + }); + + const defaultValues = useMemo( + () => ({ + name: currentCorporatePlan?.name || '', + code: currentCorporatePlan?.code || '', + active: currentCorporatePlan?.active === 1 ? true : false, + }), + [currentCorporatePlan] + ); + + useEffect(() => { + if (isEdit && currentCorporatePlan) { + reset(defaultValues); + } + if (!isEdit) { + reset(defaultValues); + } + }, [isEdit, currentCorporatePlan]); + + const methods = useForm({ + resolver: yupResolver(NewCorporatePlanSchema), + defaultValues, + }); + + const { + reset, + watch, + control, + setValue, + getValues, + setError, + handleSubmit, + formState: { isSubmitting }, + } = methods; + + + const onSubmit = async (data: any) => { + if (!isEdit) { + await axios + .post('/corporates/' + corporate_id + '/divisions', data) + .then((res) => { + enqueueSnackbar('Division created successfully', { variant: 'success' }); + }) + .then((res) => { + navigate('/corporates/' + corporate_id + '/divisions', { replace: true }); + }) + .catch(({ response }) => { + if (response.status === 422) { + for (const [key, value] of Object.entries(response.data.errors)) { + setError(key, { message: value[0] }); + enqueueSnackbar(value[0] ?? 'Failed Processing Request', { variant: 'error' }); + } + } + else { + enqueueSnackbar('Create Failed : '+ response.data.message, { variant: 'error' }); + } + }); + } else { + await axios + .put('/corporates/' + corporate_id + '/divisions/' + currentCorporatePlan?.id , data) + .then((res) => { + enqueueSnackbar('Division updated successfully', { variant: 'success' }); + }) + .then((res) => { + navigate('/corporates/' + corporate_id + '/divisions/' , { replace: true }); + }) + .catch(({ response }) => { + enqueueSnackbar('Update Failed : '+ response.data.message, { variant: 'error' }); + }); + } + }; + + return ( + + + + + + + Division Detail + + + + + + + { isEdit? 'Update' : 'Create' } + + + + + + + + + + + + + + ); +} diff --git a/frontend/dashboard/src/pages/Corporates/Division/Index.tsx b/frontend/dashboard/src/pages/Corporates/Division/Index.tsx index 59755fb1..00fe75bf 100644 --- a/frontend/dashboard/src/pages/Corporates/Division/Index.tsx +++ b/frontend/dashboard/src/pages/Corporates/Division/Index.tsx @@ -14,23 +14,22 @@ export default function Divisions() { const { corporate_id } = useParams(); return ( - + diff --git a/frontend/dashboard/src/pages/Corporates/Division/List.tsx b/frontend/dashboard/src/pages/Corporates/Division/List.tsx index ff879e31..4fcd82da 100644 --- a/frontend/dashboard/src/pages/Corporates/Division/List.tsx +++ b/frontend/dashboard/src/pages/Corporates/Division/List.tsx @@ -1,29 +1,56 @@ // @mui -import { Box, Button, Card, Collapse, Container, FormControl, Grid, IconButton, InputLabel, MenuItem, OutlinedInput, Paper, Select, SelectChangeEvent, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, TextField, Typography, Badge, Tab, Tabs, CardHeader, Stack } from '@mui/material'; +import { Box, Button, Card, Collapse, IconButton, InputLabel, MenuItem, OutlinedInput, Paper, Select, SelectChangeEvent, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, TextField, Typography, Badge, Tab, Tabs, CardHeader, Stack, Menu, ButtonGroup } from '@mui/material'; import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight'; -import PublishIcon from '@mui/icons-material/Publish'; import AddIcon from '@mui/icons-material/Add'; +import UploadIcon from '@mui/icons-material/Upload'; +import CancelIcon from '@mui/icons-material/Cancel'; // hooks +import React, { Component, useEffect, useRef, useState } from 'react'; import useSettings from '../../../hooks/useSettings'; +import { Link, useNavigate, useParams, useSearchParams } from 'react-router-dom'; // components -import Page from '../../../components/Page'; import axios from '../../../utils/axios'; -import useAuth from '../../../hooks/useAuth'; -import { Link , NavLink as RouterLink, useParams } from 'react-router-dom'; -import React, { useEffect, useRef } from 'react'; -import { Theme, useTheme } from '@mui/material/styles'; -import { Corporate } from '../../../@types/corporates'; +import { CorporatePlan } from '../../../@types/corporates'; import { LaravelPaginatedData } from '../../../@types/paginated-data'; -import CorporateTabNavigations from '../CorporateTabNavigations'; -export default function DivisionsList() { +export default function PlanList() { const { themeStretch } = useSettings(); + const { corporate_id } = useParams(); + const [searchParams, setSearchParams] = useSearchParams(); + const navigate = useNavigate(); + + function SearchInput(props: any) { + // SEARCH + const searchInput = useRef(null); + const [searchText, setSearchText] = useState(""); + + const handleSearchChange = (event: any) => { + 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') + setSearchText(searchParams.get('search') ?? ''); + }, [searchParams]) + + return ( +
+ + + ); + } // Called on every row to map the data to the columns - function createData( corporate: Corporate ): Corporate { + function createData( plan: CorporatePlan ): CorporatePlan { return { - ...corporate, + ...plan, } } @@ -44,17 +71,25 @@ export default function DivisionsList() { {open ? : } + {row.id} {row.code} {row.name} + {row.description} + {/* COLLAPSIBLE ROW */} - + - + + + No Extra Data + + + {false && - History + Rules @@ -66,27 +101,23 @@ export default function DivisionsList() { - {row.history ? row.history.map((historyRow) => ( - - - {historyRow?.date} - - {historyRow?.customerId} - {historyRow?.amount} - - {Math.round(historyRow?.amount * 1000 * 100) / 100} - + {/* {row.history ? row.history.map((historyRow) => ( */} + + {row.start} - {row.end} + {row.start} + {row.start} + {row.start} - )) + {/* )) : ( No Data ) - } + } */}
-
+
}
@@ -111,98 +142,43 @@ export default function DivisionsList() { total: 0 }); - const loadDataTableData = async () => { + const loadDataTableData = async (appliedFilter = null) => { setDataTableLoading(true); - const response = await axios.get('/corporates'); + const filter = appliedFilter ? appliedFilter : Object.fromEntries([...searchParams.entries()]); + const response = await axios.get('/corporates/'+corporate_id+'/divisions', { params: filter }); // console.log(response.data); setDataTableLoading(false); setDataTableData(response.data); } - useEffect(() => { - loadDataTableData(); - }, []) - const headStyle = { fontWeight: 'bold', }; - // FILTER SELECT - const ITEM_HEIGHT = 48; - const ITEM_PADDING_TOP = 8; - const MenuProps = { - PaperProps: { - style: { - maxHeight: ITEM_HEIGHT * 4.5 + ITEM_PADDING_TOP, - width: 250, - }, - }, - }; - - const names = [ - 'PLAN001', - 'PLAN002', - 'PLAN003', - 'PLAN004', - 'PLAN005', - ]; - function getStyles(name: string, personName: string[], theme: Theme) { - return { - fontWeight: - personName.indexOf(name) === -1 - ? theme.typography.fontWeightRegular - : theme.typography.fontWeightMedium, - }; - } - - const theme = useTheme(); - const [planIdFilter, setPlanIdFilter] = React.useState([]); - - const handleChangePlanID = (event: SelectChangeEvent) => { - const { - target: { value }, - } = event; - setPlanIdFilter( - // On autofill we get a stringified value. - typeof value === 'string' ? value.split(',') : value, - ); - }; - - const [statusFilter, setStatusFilter] = React.useState([]); - const handleChangeStatus = (event: SelectChangeEvent) => { - const { - target: { value }, - } = event; - setStatusFilter( - // On autofill we get a stringified value. - typeof value === 'string' ? value.split(',') : value, - ); - }; - // END FILTER SELECT - - // IMPORT - const importMember = React.useRef(null); - const handleImportButton = (event: any) => { - if (importMember?.current) - importMember.current ? importMember.current.click() : console.log('fuck'); - else - alert('No file selected') + const applyFilter = async (searchFilter) => { + await loadDataTableData({ "search" : searchFilter }); + setSearchParams({ "search" : searchFilter }); } - const { corporate_id } = useParams(); - + useEffect(() => { + loadDataTableData(); + }, []) + return ( - - {/* - */} - - + @@ -211,10 +187,11 @@ export default function DivisionsList() { - # + + ID Code Name - Action + Description {dataTableIsLoading ? diff --git a/frontend/dashboard/src/pages/Corporates/Division/Create.tsx b/frontend/dashboard/src/pages/Corporates/Member/Create.tsx similarity index 85% rename from frontend/dashboard/src/pages/Corporates/Division/Create.tsx rename to frontend/dashboard/src/pages/Corporates/Member/Create.tsx index be6d220d..c6a6250a 100644 --- a/frontend/dashboard/src/pages/Corporates/Division/Create.tsx +++ b/frontend/dashboard/src/pages/Corporates/Member/Create.tsx @@ -13,7 +13,7 @@ import { useMemo, useState } from 'react'; -export default function Divisions() { +export default function PlanCreate() { const { themeStretch } = useSettings(); const { corporate_id } = useParams(); @@ -111,11 +111,38 @@ export default function Divisions() { }, ]; + const products = [ + { + 'name' : 'Inpatient', + 'code' : 'IP', + }, + { + 'name' : 'Outpatient', + 'code' : 'OP', + }, + { + 'name' : 'Dental', + 'code' : 'DT', + }, + { + 'name' : 'Dental', + 'code' : 'DTL', + }, + { + 'name' : 'Matternity', + 'code' : 'MT', + }, + { + 'name' : 'Special Benefit', + 'code' : 'SB', + }, + ]; + return ( - + @@ -144,9 +171,17 @@ export default function Divisions() { - Division Detail + Plan Detail - + + + + + + + + + Benefit Configuration diff --git a/frontend/dashboard/src/pages/Corporates/Member/Index.tsx b/frontend/dashboard/src/pages/Corporates/Member/Index.tsx index 59755fb1..bd264631 100644 --- a/frontend/dashboard/src/pages/Corporates/Member/Index.tsx +++ b/frontend/dashboard/src/pages/Corporates/Member/Index.tsx @@ -14,23 +14,22 @@ export default function Divisions() { const { corporate_id } = useParams(); return ( - + @@ -38,7 +37,7 @@ export default function Divisions() { - + diff --git a/frontend/dashboard/src/pages/Corporates/Member/List.tsx b/frontend/dashboard/src/pages/Corporates/Member/List.tsx index ff879e31..223f9e31 100644 --- a/frontend/dashboard/src/pages/Corporates/Member/List.tsx +++ b/frontend/dashboard/src/pages/Corporates/Member/List.tsx @@ -1,29 +1,163 @@ // @mui -import { Box, Button, Card, Collapse, Container, FormControl, Grid, IconButton, InputLabel, MenuItem, OutlinedInput, Paper, Select, SelectChangeEvent, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, TextField, Typography, Badge, Tab, Tabs, CardHeader, Stack } from '@mui/material'; +import { Box, Button, Card, Collapse, IconButton, InputLabel, MenuItem, OutlinedInput, Paper, Select, SelectChangeEvent, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, TextField, Typography, Badge, Tab, Tabs, CardHeader, Stack, Menu, ButtonGroup } from '@mui/material'; import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight'; -import PublishIcon from '@mui/icons-material/Publish'; import AddIcon from '@mui/icons-material/Add'; +import UploadIcon from '@mui/icons-material/Upload'; +import CancelIcon from '@mui/icons-material/Cancel'; // hooks +import React, { Component, useEffect, useRef, useState } from 'react'; import useSettings from '../../../hooks/useSettings'; +import { useParams, useSearchParams } from 'react-router-dom'; // components -import Page from '../../../components/Page'; import axios from '../../../utils/axios'; -import useAuth from '../../../hooks/useAuth'; -import { Link , NavLink as RouterLink, useParams } from 'react-router-dom'; -import React, { useEffect, useRef } from 'react'; -import { Theme, useTheme } from '@mui/material/styles'; -import { Corporate } from '../../../@types/corporates'; +import { Plan } from '../../../@types/corporates'; import { LaravelPaginatedData } from '../../../@types/paginated-data'; -import CorporateTabNavigations from '../CorporateTabNavigations'; -export default function DivisionsList() { +export default function CorporatePlanList() { const { themeStretch } = useSettings(); + const { corporate_id } = useParams(); + const [searchParams, setSearchParams] = useSearchParams(); + + function SearchInput(props: any) { + // SEARCH + const searchInput = useRef(null); + const [searchText, setSearchText] = useState(""); + + const handleSearchChange = (event: any) => { + 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') + setSearchText(searchParams.get('search') ?? ''); + }, [searchParams]) + + return ( +
+ + + ); + } + + function ImportForm(props: any) { + // IMPORT + // Create Button Menu + const [anchorEl, setAnchorEl] = React.useState(null); + const createMenu = Boolean(anchorEl); + const importPlan = useRef(null) + const [currentImportFileName, setCurrentImportFileName] = useState(null) + + const handleClick = (event: React.MouseEvent) => { + setAnchorEl(event.currentTarget); + }; + + const handleClose = () => { + setAnchorEl(null); + }; + + const handleImportButton = () => { + if (importPlan?.current) { + handleClose(); + importPlan.current ? importPlan.current.click() : console.log('No File selected'); + } else { + alert('No file selected') + } + } + + const handleCancelImportButton = () => { + importPlan.current.value = ""; + importPlan.current.dispatchEvent(new Event("change", { bubbles: true })); + } + + const handleImportChange = (event: any) => { + if (event.target.files[0]) { + setCurrentImportFileName(event.target.files[0].name) + } else { + setCurrentImportFileName(null); + } + } + + const handleUpload = () => { + if (importPlan.current?.files.length) { + const formData = new FormData(); + formData.append("file", importPlan.current?.files[0]) + axios.post(`corporates/${corporate_id}/members/import`, formData ) + .then(response => { + handleCancelImportButton(); + loadDataTableData(); + alert('Succesfully read '+ response.data.total_successed_row + ' with ' + response.data.total_failed_row + ' failed rows'); + }) + .catch(response => { + alert('Looks like something went wrong. Please check your data and try again. ' + response.message) + }) + } else { + alert('No File Selected') + } + } + + return ( +
+ + {( !currentImportFileName && + + {/*

kjasndkjandskjasndkjansdkjansd

*/} + + + Import + Download Template + +
+ )} + + {( currentImportFileName && + + + + + + + + )} +
+ ); + } // Called on every row to map the data to the columns - function createData( corporate: Corporate ): Corporate { + function createData( member: Member ): Member { return { - ...corporate, + ...member, } } @@ -44,17 +178,69 @@ export default function DivisionsList() { {open ? : } + {row.service_code} + {row.corporate_plan?.code} {row.code} - {row.name} + {row.type} + {row.start} + {row.end} + {row.require_referral} + {row.referral_source} + {row.referral_duration} + {row.family_plan} + {row.family_plan_share_rules} + {row.limit_rules} + {row.layer} + {row.layer_conditions} + {row.budget_type} + {row.budget_code} + {row.budget_conditions} + {row.surgery_limit} + {row.non_surgery_limit} + {row.max_claim_limit} + {row.max_claim_count} + {row.area_limit} + {row.limit_shared_plans} + {row.limit_shared_plan_type} + {row.cashless_percentage} + {row.reimbursement_percentage} + {row.digital_percentage} + {row.co_share_m_percentage} + {row.co_share_s_percentage} + {row.co_share_c_percentage} + {row.cashless_deductible} + {row.reimbursement_deductible} + {row.digital_deductible} + {row.co_share_m_deductible} + {row.co_share_s_deductible} + {row.co_share_c_deductible} + {row.co_share_deductible_condition} + {row.msc} + {row.genders} + {row.min_age} + {row.max_age} + {row.rule_of_excess} + {row.max_excess_covered} + {row.prorate_type} + {row.prorate_lookup} + {row.currency} + {row.max_surgery_reinstatement_days} + {row.max_surgery_periode_days} + {/* COLLAPSIBLE ROW */} - + - + + + No Extra Data + + + {false && - History + Rules
@@ -66,27 +252,23 @@ export default function DivisionsList() { - {row.history ? row.history.map((historyRow) => ( - - - {historyRow?.date} - - {historyRow?.customerId} - {historyRow?.amount} - - {Math.round(historyRow?.amount * 1000 * 100) / 100} - + {/* {row.history ? row.history.map((historyRow) => ( */} + + {row.start} - {row.end} + {row.start} + {row.start} + {row.start} - )) + {/* )) : ( No Data ) - } + } */}
- + } @@ -111,99 +293,32 @@ export default function DivisionsList() { total: 0 }); - const loadDataTableData = async () => { + const loadDataTableData = async (appliedFilter = null) => { setDataTableLoading(true); - const response = await axios.get('/corporates'); + const filter = appliedFilter ? appliedFilter : Object.fromEntries([...searchParams.entries()]); + const response = await axios.get('/corporates/'+corporate_id+'/plans', { params: filter }); // console.log(response.data); setDataTableLoading(false); setDataTableData(response.data); } - useEffect(() => { - loadDataTableData(); - }, []) - const headStyle = { fontWeight: 'bold', }; - // FILTER SELECT - const ITEM_HEIGHT = 48; - const ITEM_PADDING_TOP = 8; - const MenuProps = { - PaperProps: { - style: { - maxHeight: ITEM_HEIGHT * 4.5 + ITEM_PADDING_TOP, - width: 250, - }, - }, - }; - - const names = [ - 'PLAN001', - 'PLAN002', - 'PLAN003', - 'PLAN004', - 'PLAN005', - ]; - function getStyles(name: string, personName: string[], theme: Theme) { - return { - fontWeight: - personName.indexOf(name) === -1 - ? theme.typography.fontWeightRegular - : theme.typography.fontWeightMedium, - }; - } - - const theme = useTheme(); - const [planIdFilter, setPlanIdFilter] = React.useState([]); - - const handleChangePlanID = (event: SelectChangeEvent) => { - const { - target: { value }, - } = event; - setPlanIdFilter( - // On autofill we get a stringified value. - typeof value === 'string' ? value.split(',') : value, - ); - }; - - const [statusFilter, setStatusFilter] = React.useState([]); - const handleChangeStatus = (event: SelectChangeEvent) => { - const { - target: { value }, - } = event; - setStatusFilter( - // On autofill we get a stringified value. - typeof value === 'string' ? value.split(',') : value, - ); - }; - // END FILTER SELECT - - // IMPORT - const importMember = React.useRef(null); - const handleImportButton = (event: any) => { - if (importMember?.current) - importMember.current ? importMember.current.click() : console.log('fuck'); - else - alert('No file selected') + const applyFilter = async (searchFilter) => { + await loadDataTableData({ "search" : searchFilter }); + setSearchParams({ "search" : searchFilter }); } - const { corporate_id } = useParams(); - + useEffect(() => { + loadDataTableData(); + }, []) + return ( - - - {/* - */} - -