From d999d8695920a7c1426720d38829d89fe7b460c9 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 24 May 2023 16:55:56 +0700 Subject: [PATCH] update --- .env.example | 59 --- .../Http/Controllers/Api/DataController.php | 32 ++ .../Http/Controllers/Api/TopUpController.php | 18 +- .../Dashboard/MemberAlarmCenterResources.php | 1 + app/Models/Person.php | 5 + app/Services/CorporateMemberService.php | 6 +- frontend/client-portal/.env.development | 4 +- .../src/components/ButtonBack.tsx | 28 ++ .../dashboard/header/LanguagePopover.tsx | 4 +- .../src/pages/AlarmCenter/Index.tsx | 18 +- .../src/pages/AlarmCenter/List.tsx | 31 +- .../pages/AlarmCenter/ServiceMonitoring.tsx | 14 +- .../src/pages/AlarmCenter/UserProfile.tsx | 38 +- .../pages/ClaimReport/DialogDetailClaim.tsx | 178 ++++++++ .../src/pages/ClaimReport/Index.tsx | 6 + .../src/pages/ClaimReport/List.tsx | 404 ++++++++++++++++++ frontend/client-portal/src/routes/index.tsx | 6 + .../user-profile/CardPersonalInformation.tsx | 176 +++++++- .../sections/claim-report/CardClaimStatus.tsx | 6 +- .../sections/dashboard/DialogTopUpLimit.tsx | 32 +- .../Corporates/Member/sections/DialogLog.tsx | 1 + routes/api.php | 51 ++- 22 files changed, 979 insertions(+), 139 deletions(-) delete mode 100755 .env.example create mode 100644 Modules/Client/Http/Controllers/Api/DataController.php create mode 100644 frontend/client-portal/src/components/ButtonBack.tsx create mode 100644 frontend/client-portal/src/pages/ClaimReport/DialogDetailClaim.tsx create mode 100644 frontend/client-portal/src/pages/ClaimReport/List.tsx diff --git a/.env.example b/.env.example deleted file mode 100755 index 174599a2..00000000 --- a/.env.example +++ /dev/null @@ -1,59 +0,0 @@ -APP_NAME=Laravel -APP_ENV=local -APP_KEY= -APP_DEBUG=true -APP_URL=http://localhost - -LOG_CHANNEL=stack -LOG_DEPRECATIONS_CHANNEL=null -LOG_LEVEL=debug - -DB_CONNECTION=mysql -DB_HOST=127.0.0.1 -DB_PORT=3306 -DB_DATABASE=laravel -DB_USERNAME=root -DB_PASSWORD= - -OLDLMS_DB_CONNECTION=mysql -OLDLMS_DB_HOST=127.0.0.1 -OLDLMS_DB_PORT=3306 -OLDLMS_DB_DATABASE=linksehat -OLDLMS_DB_USERNAME=mysql -OLDLMS_DB_PASSWORD=password - -BROADCAST_DRIVER=log -CACHE_DRIVER=file -FILESYSTEM_DISK=local -QUEUE_CONNECTION=sync -SESSION_DRIVER=file -SESSION_LIFETIME=120 - -MEMCACHED_HOST=127.0.0.1 - -REDIS_HOST=127.0.0.1 -REDIS_PASSWORD=null -REDIS_PORT=6379 - -MAIL_MAILER=smtp -MAIL_HOST=mailhog -MAIL_PORT=1025 -MAIL_USERNAME=null -MAIL_PASSWORD=null -MAIL_ENCRYPTION=null -MAIL_FROM_ADDRESS="hello@example.com" -MAIL_FROM_NAME="${APP_NAME}" - -AWS_ACCESS_KEY_ID= -AWS_SECRET_ACCESS_KEY= -AWS_DEFAULT_REGION=us-east-1 -AWS_BUCKET= -AWS_USE_PATH_STYLE_ENDPOINT=false - -PUSHER_APP_ID= -PUSHER_APP_KEY= -PUSHER_APP_SECRET= -PUSHER_APP_CLUSTER=mt1 - -MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" -MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" diff --git a/Modules/Client/Http/Controllers/Api/DataController.php b/Modules/Client/Http/Controllers/Api/DataController.php new file mode 100644 index 00000000..6999959f --- /dev/null +++ b/Modules/Client/Http/Controllers/Api/DataController.php @@ -0,0 +1,32 @@ +json($data); + } catch (\Exception $e) { + return response()->json(['error' => 'Member not found'], 404); + } + } + + public function update(Request $request, $id) + { + try { + $data = Person::findOrFail($id); + $data->update($request->all()); + + return response()->json(['message' => 'Data updated successfully']); + } catch (\Exception $e) { + return response()->json(['error' => 'Failed to update data'], 500); + } + } +} diff --git a/Modules/Client/Http/Controllers/Api/TopUpController.php b/Modules/Client/Http/Controllers/Api/TopUpController.php index 9eaf45c9..b39832ef 100755 --- a/Modules/Client/Http/Controllers/Api/TopUpController.php +++ b/Modules/Client/Http/Controllers/Api/TopUpController.php @@ -3,6 +3,7 @@ namespace Modules\Client\Http\Controllers\Api; use App\Helpers\Helper; +use App\Models\CorporatePolicy; use Illuminate\Contracts\Support\Renderable; use Illuminate\Http\Request; use Illuminate\Routing\Controller; @@ -33,9 +34,22 @@ class TopUpController extends Controller * @param Request $request * @return Renderable */ - public function store(Request $request) + public function store(Request $request, $corporate_id) { - // + + $data = $request->validate([ + 'topup' => 'required|numeric', + ]); + + $corporatePolicy = CorporatePolicy::query()->where('corporate_id',$corporate_id)->firstOrFail(); + if (!$corporatePolicy) { + return response() -> json (['message' => 'Corporate policy not found'],404); + } + + $corporatePolicy -> total_premi += $data ['topup']; + $corporatePolicy -> save(); + + return response () -> json (['message' => 'Amount added to total_premi successfully'], 200); } /** diff --git a/Modules/Client/Transformers/Dashboard/MemberAlarmCenterResources.php b/Modules/Client/Transformers/Dashboard/MemberAlarmCenterResources.php index 6bb0587b..9186f04b 100755 --- a/Modules/Client/Transformers/Dashboard/MemberAlarmCenterResources.php +++ b/Modules/Client/Transformers/Dashboard/MemberAlarmCenterResources.php @@ -15,6 +15,7 @@ class MemberAlarmCenterResources extends JsonResource { return [ 'id' => $this->id, + 'personId' => $this->person_id, 'memberId' => $this->member_id, 'fullName' => $this->full_name, 'service' => $this->service_code, diff --git a/app/Models/Person.php b/app/Models/Person.php index af6fb438..85315bcd 100755 --- a/app/Models/Person.php +++ b/app/Models/Person.php @@ -146,4 +146,9 @@ class Person extends Model return "other"; } } + + public function updatePerson() + { + $this -> update ( $data ); + } } diff --git a/app/Services/CorporateMemberService.php b/app/Services/CorporateMemberService.php index afcec6f6..bf715f11 100755 --- a/app/Services/CorporateMemberService.php +++ b/app/Services/CorporateMemberService.php @@ -11,7 +11,6 @@ class CorporateMemberService public function getAllMemberDashboards(int $corporateId, Request $request) { $limit = $request->has('perPage') ? $request->input('perPage') : 10; - return Member::query() ->joinCorporateEmployees('left') ->joinCorporateDivisions('left') @@ -34,8 +33,9 @@ class CorporateMemberService 'division' => 'corporate_divisions.name', default => '' }; - - $query->getQuery()->orderBy($orderBy, $request->order); + if ($request->order){ + $query->getQuery()->orderBy($orderBy, $request->order); + } }) ->select(['members.id', 'members.person_id', 'members.member_id', 'members.name', 'corporate_divisions.name AS division_name', 'members.active']) ->selectRaw("(select sum(`claims`.`total_claim`) from `claims` where `members`.`id` = `claims`.`member_id` AND `claims`.`deleted_at` IS NULL) AS `claims_sum_total_claim`") diff --git a/frontend/client-portal/.env.development b/frontend/client-portal/.env.development index 2badd03d..ced427a5 100755 --- a/frontend/client-portal/.env.development +++ b/frontend/client-portal/.env.development @@ -2,6 +2,6 @@ GENERATE_SOURCEMAP=false PORT=8083 -REACT_APP_HOST_API_URL="http://localhost:8001" +REACT_APP_HOST_API_URL="http://localhost:8000" -VITE_API_URL="http://localhost:8001/api/client" +VITE_API_URL="http://localhost:8000/api/client" diff --git a/frontend/client-portal/src/components/ButtonBack.tsx b/frontend/client-portal/src/components/ButtonBack.tsx new file mode 100644 index 00000000..94dcc16c --- /dev/null +++ b/frontend/client-portal/src/components/ButtonBack.tsx @@ -0,0 +1,28 @@ +import * as React from 'react'; +import { IconButton } from '@mui/material'; +import ArrowBackIosNewIcon from '@mui/icons-material/ArrowBackIosNew'; +import { useNavigate } from 'react-router-dom'; + +export default function ButtonBack(props: any) { + const navigate = useNavigate(); + return ( + (props.url ? navigate(props.url) : navigate(-1))} + > + + + ); +} \ No newline at end of file diff --git a/frontend/client-portal/src/layouts/dashboard/header/LanguagePopover.tsx b/frontend/client-portal/src/layouts/dashboard/header/LanguagePopover.tsx index f8bc33e6..6a3bad33 100755 --- a/frontend/client-portal/src/layouts/dashboard/header/LanguagePopover.tsx +++ b/frontend/client-portal/src/layouts/dashboard/header/LanguagePopover.tsx @@ -14,7 +14,7 @@ const LANGS = [ value: 'en', icon: 'https://minimal-assets-api.vercel.app/assets/icons/ic_flag_en.svg', }, - { + /* { label: 'German', value: 'de', icon: 'https://minimal-assets-api.vercel.app/assets/icons/ic_flag_de.svg', @@ -23,7 +23,7 @@ const LANGS = [ label: 'French', value: 'fr', icon: 'https://minimal-assets-api.vercel.app/assets/icons/ic_flag_fr.svg', - }, + }, */ ]; // ---------------------------------------------------------------------- diff --git a/frontend/client-portal/src/pages/AlarmCenter/Index.tsx b/frontend/client-portal/src/pages/AlarmCenter/Index.tsx index 8cf7ae83..5ff13a54 100755 --- a/frontend/client-portal/src/pages/AlarmCenter/Index.tsx +++ b/frontend/client-portal/src/pages/AlarmCenter/Index.tsx @@ -8,6 +8,8 @@ import Page from '../../components/Page'; /* ---------------------------------- hooks --------------------------------- */ import useSettings from '../../hooks/useSettings'; import List from './List'; +import ServiceMonitoring from './ServiceMonitoring'; +import UserProfile from './UserProfile'; /* ------------------------------ tabs setting ------------------------------ */ @@ -105,21 +107,21 @@ export default function Drugs() { - - - + + + - - Item Two + {/* + - Item Two - - + + */} + diff --git a/frontend/client-portal/src/pages/AlarmCenter/List.tsx b/frontend/client-portal/src/pages/AlarmCenter/List.tsx index bcfcf455..298b8146 100755 --- a/frontend/client-portal/src/pages/AlarmCenter/List.tsx +++ b/frontend/client-portal/src/pages/AlarmCenter/List.tsx @@ -31,7 +31,8 @@ import useMap from '../../hooks/useMap'; import palette from '../../theme/palette'; import { UserCurrentCorporateContext } from '../../contexts/UserCurrentCorporate'; import { HeadCell, Order, PaginationTableProps } from '../../@types/table'; -import { useSearchParams } from 'react-router-dom'; +import { useSearchParams, useNavigate, Link } from 'react-router-dom'; + /* ---------------------------------- types --------------------------------- */ @@ -137,6 +138,8 @@ import { useSearchParams } from 'react-router-dom'; /* -------------------------------------------------------------------------- */ export default function List() { + const navigate = useNavigate(); + const { corporateValue } = useContext(UserCurrentCorporateContext); const [data, setData] = useState([]); @@ -198,6 +201,7 @@ export default function List() { paginationTable: paginationTable, setPaginationTable: setPaginationTable, }; + /* -------------------------------------------------------------------------- */ /* ------------------------------ handle search ----------------------------- */ @@ -224,18 +228,19 @@ export default function List() { /* -------------------------------- headCell -------------------------------- */ const headCells: HeadCell[] = [ - { - id: 'fullName', - align: 'left', - label: 'Name', - isSort: true, - }, { id: 'memberId', align: 'left', label: 'Member ID', isSort: true, }, + { + id: 'fullName', + align: 'left', + label: 'Name', + isSort: true, + }, + { id: 'start_date', align: 'center', @@ -268,17 +273,23 @@ export default function List() { ? appliedParams : Object.fromEntries([...searchParams.entries(), ['order', order], ['orderBy', orderBy]]); - const response = await axios.get(`/${corporateValue}/members?type=alarm-center`, { - params: parameters, + const response = await axios.get(`${corporateValue}/members?type=alarm-center`, { + params: { ...parameters }, }); setData( response.data.data.map((obj: any) => { return { ...obj, + memberId: + // + + , status: obj.status === 1 ? ( - + + + {/* Item 2 */} + + + 09:00 WIB + + Approval + + + + + + Details : Penilaian Dokter + + + + {/* Item 3 */} + + + 08:00 WIB + + Review + + + + + + Details : Klaim Diajukan + + + + + + + // + ); + }; + + export default DialogDetailClaim; + \ No newline at end of file diff --git a/frontend/client-portal/src/pages/ClaimReport/Index.tsx b/frontend/client-portal/src/pages/ClaimReport/Index.tsx index c4a833d9..7e46fa2b 100755 --- a/frontend/client-portal/src/pages/ClaimReport/Index.tsx +++ b/frontend/client-portal/src/pages/ClaimReport/Index.tsx @@ -16,6 +16,10 @@ import { UserCurrentCorporateContext } from '../../contexts/UserCurrentCorporate /* --------------------------------- orders --------------------------------- */ import { HeadCell, Order, PaginationTableProps } from '../../@types/table'; import { useSearchParams } from 'react-router-dom'; +import List from './List'; +import ClaimItems from '../Claims/components/ClaimItems'; +import DiagnosisHistory from '../Claims/components/DiagnosisHistory'; +import Documents from '../Claims/components/Documents'; export default function Drugs() { const { themeStretch } = useSettings(); @@ -154,6 +158,8 @@ export default function Drugs() { + + {/* , property: string) => void; + // order: Order; + // orderBy: string; + // } + + // function EnhancedTableHead(props: EnhancedTableProps) { + // const { order, orderBy, onRequestSort } = props; + // const createSortHandler = (property: string) => (event: React.MouseEvent) => { + // onRequestSort(event, property); + // }; + + // return ( + // + // + // No + // {headCells.map((headCell) => ( + // + // + // {headCell.label} + // {orderBy === headCell.id ? ( + // + // {order === 'desc' ? 'sorted descending' : 'sorted ascending'} + // + // ) : null} + // + // + // ))} + // + // + // ); + // } + + /* -------------------------------------------------------------------------- */ + + export default function List() { + const navigate = useNavigate(); + + const { corporateValue } = useContext(UserCurrentCorporateContext); + + const [data, setData] = useState([]); + + /* -------------------------------------------------------------------------- */ + /* setting up for the table */ + /* -------------------------------------------------------------------------- */ + const [isLoading, setIsLoading] = useState(true); + + const loadings = { + isLoading: isLoading, + setIsLoading: setIsLoading, + }; + + /* ------------------------------ handle params ----------------------------- */ + const [searchParams, setSearchParams] = useSearchParams(); + const [appliedParams, setAppliedParams] = useState({}); + + const params = { + searchParams: searchParams, + setSearchParams: setSearchParams, + appliedParams: appliedParams, + setAppliedParams: setAppliedParams, + }; + /* -------------------------------------------------------------------------- */ + + /* ------------------------------ handle order ------------------------------ */ + const [order, setOrder] = useState('asc'); + const [orderBy, setOrderBy] = useState('fullName'); + + const orders = { + order: order, + setOrder: setOrder, + orderBy: orderBy, + setOrderBy: setOrderBy, + }; + /* -------------------------------------------------------------------------- */ + + /* ---------------------------- handle pagination --------------------------- */ + const [page, setPage] = useState(0); + const [rowsPerPage, setRowsPerPage] = useState(10); + + const [paginationTable, setPaginationTable] = useState({ + current_page: 0, + from: 0, + last_page: 0, + links: [], + path: '', + per_page: 0, + to: 0, + total: 0, + }); + + const paginations = { + page: page, + setPage: setPage, + rowsPerPage: rowsPerPage, + setRowsPerPage: setRowsPerPage, + paginationTable: paginationTable, + setPaginationTable: setPaginationTable, + }; + + /* -------------------------------------------------------------------------- */ + + /* ------------------------------ handle search ----------------------------- */ + const [searchText, setSearchText] = useState(''); + + const handleSearchSubmit = async (event: React.FormEvent) => { + event.preventDefault(); + + if (searchText === '') { + searchParams.delete('search'); + const params = Object.fromEntries([...searchParams.entries()]); + setAppliedParams(params); + } else { + const params = Object.fromEntries([...searchParams.entries(), ['search', searchText]]); + setAppliedParams(params); + } + }; + + + const searchs = { + searchText: searchText, + setSearchText: setSearchText, + handleSearchSubmit: handleSearchSubmit, + }; + + /* -------------------------------- headCell -------------------------------- */ + const headCells: HeadCell[] = [ + { + id: 'memberId', + align: 'left', + label: 'Member ID', + isSort: true, + }, + { + id: 'fullName', + align: 'left', + label: 'Name', + isSort: true, + }, + + { + id: 'division', + align: 'left', + label: 'Divisi', + isSort: true, + }, + /* { + id: 'end_date', + align: 'center', + label: 'End Date', + isSort: false, + }, */ + { + id: 'status', + align: 'center', + label: 'Status', + isSort: true, + }, + { + id: 'action', + align: 'right', + label: '', + isSort: false, + }, + + ]; + + const [open, setOpen] = useState(null); + + const handleOpen = (event: React.MouseEvent) => { + setOpen(event.currentTarget); + }; + + const handleClose = () => { + setOpen(null); + }; + + /* const clickHandler = (isDialog: string) => { + switch (isDialog) { + + case 'infoDetail': + setDialogTitle('Claim Details'); + setIsDialog(isDialog); + setOpenDialog(true); + break; + + default: + break; + } + }; */ + /* -------------------------------------------------------------------------- */ + + + + useEffect(() => { + (async () => { + setIsLoading(true); + + await new Promise((resolve) => setTimeout(resolve, 250)); + + const parameters = + Object.keys(appliedParams).length !== 0 + ? appliedParams + : Object.fromEntries([...searchParams.entries(), ['order', order], ['orderBy', orderBy]]); + + const response = await axios.get(`${corporateValue}/members`, { + params: { ...parameters }, + }); + + setData( + response.data.data.map((obj: any) => { + + + return { + ...obj, + + /* memberId: , */ + status: + obj.status === 1 ? ( + + + + ) : ( + + ), + /* action: ( + clickHandler('infoDetail')}> + + + ), */ + + }; + }) + ); + + setPaginationTable(response.data); + setRowsPerPage(response.data.per_page); + + if (searchParams.get('page')) { + //@ts-ignore + const currentPage = parseInt(searchParams.get('page')) - 1; + + paginationTable.current_page = currentPage; + setPage(currentPage); + } + + setIsLoading(false); + })(); + }, [appliedParams, searchParams, order, orderBy, setSearchParams, corporateValue]); + + return ( + + + + + + ); + } + \ No newline at end of file diff --git a/frontend/client-portal/src/routes/index.tsx b/frontend/client-portal/src/routes/index.tsx index 0df569b0..15325387 100755 --- a/frontend/client-portal/src/routes/index.tsx +++ b/frontend/client-portal/src/routes/index.tsx @@ -8,6 +8,7 @@ import LoadingScreen from '../components/LoadingScreen'; import GuestGuard from '../guards/GuestGuard'; import { AuthProvider } from '../contexts/LaravelAuthContext'; import AuthGuard from '../guards/AuthGuard'; +// import DialogDetailClaim from '../sections/dashboard/DialogDetailClaim'; // ---------------------------------------------------------------------- @@ -106,6 +107,10 @@ export default function Router() { element: , index: true, }, + { + path: 'dialog-detail', + element: + }, ], }, { @@ -158,3 +163,4 @@ const AlarmCenterUserProfile = Loadable(lazy(() => import('../pages/AlarmCenter/ const ClaimReport = Loadable(lazy(() => import('../pages/ClaimReport/Index'))); const Claims = Loadable(lazy(() => import('../pages/Claims/Index'))); const ClaimShow = Loadable(lazy(() => import('../pages/Claims/Show'))); +const DialogDetailClaim = Loadable(lazy(()=> import('../pages/ClaimReport/DialogDetailClaim'))); \ No newline at end of file diff --git a/frontend/client-portal/src/sections/alarm-center/user-profile/CardPersonalInformation.tsx b/frontend/client-portal/src/sections/alarm-center/user-profile/CardPersonalInformation.tsx index afda43a9..79b127cc 100755 --- a/frontend/client-portal/src/sections/alarm-center/user-profile/CardPersonalInformation.tsx +++ b/frontend/client-portal/src/sections/alarm-center/user-profile/CardPersonalInformation.tsx @@ -1,12 +1,86 @@ // mui -import { Button, IconButton, Card, Stack, Typography } from '@mui/material'; -import { Visibility as VisibilityIcon } from '@mui/icons-material'; +import { Button, IconButton, Card, Stack, Typography, TextField } from '@mui/material'; +import { CardMembership, Visibility as VisibilityIcon } from '@mui/icons-material'; // components import Iconify from '../../../components/Iconify'; +import axios from '../../../utils/axios'; +import { useContext, useEffect, useState } from 'react'; +import { UserCurrentCorporateContext } from '../../../contexts/UserCurrentCorporate'; +import { useParams } from 'react-router-dom'; +import { Dialog, DialogTitle, DialogContent, DialogActions } from '@mui/material'; +import { enqueueSnackbar } from 'notistack'; -export default function CardPersonalInformation() { + + + + +export default function CardPersonalInformation({data}) { + /* const [data, setData] = useState(); */ + const [openDialog, setOpenDialog] = useState(false); + const [editedData, setEditedData] = useState(null); + const { id } = useParams(); + const [weight, setWeight] = useState(data?.last_weight_kg || ''); + const [height, setHeight] = useState(data?.last_height_cm || ''); + const [email, setEmail] = useState(data?.email || '' ); + const [phone, setPhone] = useState(data?.phone || '' ); + const [address, setAddress] = useState(data?.main_address_id || '' ); + + /* const [updatedData, setUpdatedData] = useState(data); */ + + const handleEditData = () => { + setWeight(data?.last_weight_kg || ''); + setHeight(data?.last_height_cm || ''); + setEmail(data?.email || ''); + setPhone(data?.phone||''); + setAddress(data?.main_address_id||''); + setEditedData(data); + setOpenDialog(true); + }; + + + + const handleCloseDialog = () => { + // Close the dialog + /* setOpenDialog(false); */ + // Reset the edited data + setEditedData(null); + setOpenDialog(false); + }; + + const handleSaveData = () => { + const updatedData = { + ...editedData, + last_weight_kg: weight, + last_height_cm: height, + email: email, + phone: phone, + main_address_id: address, + }; + + // Update the data in the database using the updatedData object + axios + .put('/data/' + id, updatedData) + .then((response) => { + // Handle the successful update + enqueueSnackbar('Data updated successfully', { variant: 'success' }); + setOpenDialog(false); + }) + .catch((error) => { + // Handle the error + enqueueSnackbar('Failed to update data', { variant: 'error' }); + }); + }; + + + + + + return ( + + + {/* Stack 1 */} Informasi Pribadi - + {/* Stack 2 */} @@ -45,15 +119,15 @@ export default function CardPersonalInformation() { Nama Lengkap - Jessica Lie + {data ?. name} - Berat Badan - 40 kg + Berat Badan + {data ?. last_weight_kg} kg - Tinggi Badan - 165 cm + Tinggi Badan + {data ?. last_height_cm} cm @@ -65,15 +139,15 @@ export default function CardPersonalInformation() { Tempat Lahir - Jakarta + {data ?. birth_place} Tanggal Lahir - 15-05-1996 + {data ?. birth_date} Jenis Kelamin - Perempuan + {data ?. gender} @@ -83,18 +157,17 @@ export default function CardPersonalInformation() { Nomor Telpon - 081256788765 + {data ?. phone} Email - Jessica.lie@gmail.com + {data?. email} Alamat - Jl. Kalimantan No.6, Rw. Mekar Jaya, Kec. Serpong, Kota Tangerang Selatan, Banten - 15310 + {data ?. main_address_id} @@ -110,7 +183,7 @@ export default function CardPersonalInformation() { > Nomor NIK - 081256788765 + {data ?. nik} + + + ); } diff --git a/frontend/client-portal/src/sections/claim-report/CardClaimStatus.tsx b/frontend/client-portal/src/sections/claim-report/CardClaimStatus.tsx index 595c1dec..fdfd94b5 100755 --- a/frontend/client-portal/src/sections/claim-report/CardClaimStatus.tsx +++ b/frontend/client-portal/src/sections/claim-report/CardClaimStatus.tsx @@ -28,10 +28,10 @@ const RootStyle = styled(Card)(({ theme }) => ({ // ---------------------------------------------------------------------- const defaultData = [ - { name: 'Requested', value: 0, color: palette.dark.primary.dark }, - { name: 'Approval', value: 0, color: palette.dark.warning.dark }, + { name: 'Requested', value: 5, color: palette.dark.primary.dark }, + { name: 'Approval', value: 1, color: palette.dark.warning.dark }, { name: 'Disbrusment', value: 0, color: palette.dark.success.dark }, - { name: 'Rejected', value: 0, color: palette.dark.error.dark }, + { name: 'Rejected', value: 3, color: palette.dark.error.dark }, ]; // ---------------------------------------------------------------------- diff --git a/frontend/client-portal/src/sections/dashboard/DialogTopUpLimit.tsx b/frontend/client-portal/src/sections/dashboard/DialogTopUpLimit.tsx index 17da9d74..bb156185 100755 --- a/frontend/client-portal/src/sections/dashboard/DialogTopUpLimit.tsx +++ b/frontend/client-portal/src/sections/dashboard/DialogTopUpLimit.tsx @@ -13,14 +13,17 @@ import Checkbox from '@mui/material/Checkbox'; import MuiDialog from '../../components/MuiDialog'; import { FormProvider, RHFTextField } from '../../components/hook-form'; // React -import { ReactElement, useEffect, useState } from 'react'; +import { useContext, ReactElement, useEffect, useState } from 'react'; import { fCurrency } from '../../utils/formatNumber'; +import { UserCurrentCorporateContext } from '../../contexts/UserCurrentCorporate'; + // yup import * as Yup from 'yup'; // form import { useForm } from 'react-hook-form'; import { yupResolver } from '@hookform/resolvers/yup'; import axios from '../../utils/axios'; +import { enqueueSnackbar } from 'notistack'; /* ---------------------------------- types --------------------------------- */ type MuiDialogProps = { @@ -76,6 +79,8 @@ export default function DialogTopUpLimit({ const [isDisabledInput, setIsDisabledInput] = useState(false); const [isDisabledButton, setIsDisabledButton] = useState(true); const [isCheckboxChecked, setIsCheckboxChecked] = useState(false); + const [ message, setMessage ] = useState (''); + const { corporateValue } = useContext(UserCurrentCorporateContext); const TopUpSchema = Yup.object().shape({ topup: Yup.number().max( @@ -112,15 +117,32 @@ export default function DialogTopUpLimit({ }, [openDialog, reset]); const onSubmit = async (data: FormValuesProps) => { + + await new Promise((resolve) => setTimeout(resolve, 500)); setIsDisabledInput(false); setIsDisabledButton(true); setIsCheckboxChecked(false); - // await axios.post(''); - - reset(); + try { + // Send the HTTP POST request to the backend + await axios.post(corporateValue + '/topup', { + topup: data.topup, + }); + + // Show a success notification + enqueueSnackbar('The request has been sent', { variant: 'success' }); + setOpenDialog(false); + + reset(); + } catch (error) { + // Show an error notification + enqueueSnackbar('An error occurred', { variant: 'error' }); + setOpenDialog(false); + } + + }; const onCheckHandler = (value: string) => { @@ -128,7 +150,7 @@ export default function DialogTopUpLimit({ value === '0' || value === '' ? setIsDisabledButton(true) : setIsDisabledButton(false); setIsCheckboxChecked(!isCheckboxChecked); // @ts-ignore - setValue('topup', data.maxTopUp); + setValue('topup', data.maxTopUp.toString()); }; const onTopupHandler = (value: string) => { diff --git a/frontend/dashboard/src/pages/Corporates/Member/sections/DialogLog.tsx b/frontend/dashboard/src/pages/Corporates/Member/sections/DialogLog.tsx index f4bfb088..03a4b8f2 100755 --- a/frontend/dashboard/src/pages/Corporates/Member/sections/DialogLog.tsx +++ b/frontend/dashboard/src/pages/Corporates/Member/sections/DialogLog.tsx @@ -63,6 +63,7 @@ const DialogLog = ({ title, openDialog, setOpenDialog, data }: MuiDialogProps) = useEffect(() => { setBenefitIds(data.member.current_plan?.benefits.filter((benefit) => benefit.pivot.active == 1).map((benefit) => benefit.id)) setCheckedBenefitIds(benefitIds) + console.log('Check All', benefitIds, 'X', data.member.current_plan?.benefits.map((benefit) => benefit.id)) }, []) const clickHandler = () => { diff --git a/routes/api.php b/routes/api.php index a24de889..8421779a 100755 --- a/routes/api.php +++ b/routes/api.php @@ -1,11 +1,14 @@ group(function() { - Route::get('member/{member_id}', [MembershipController::class, 'show'])->name('member.show'); - Route::post('check-membership', [MembershipController::class, 'check']); - Route::post('check-limit', [MembershipController::class, 'checkLimit']); - Route::post('check-coverage-limit', [MembershipController::class, 'checkLimit']); - Route::get('linking-rules', [MembershipController::class, 'linkingRules']); - Route::post('linking-validate', [MembershipController::class, 'linkingValidate']); +Route::prefix('client')->group(function () { - Route::post('claim-create', [ClaimController::class, 'store']); - Route::post('claim-update-diagnosis', [ClaimController::class, 'updateClaimDiagnosis']); + Route::controller(AuthController::class)->group(function () { + Route::post('login', 'login'); + Route::post('verify-code', 'validateOtp'); + }); -}); \ No newline at end of file + Route::middleware('auth:sanctum')->group(function () { + Route::post('logout', [AuthController::class, 'logout'])->name('logout'); + Route::get('user', [UserController::class, 'index']); + Route::get('data/{id}', [DataController::class, 'show']); + Route::put('data/{id}', [DataController::class, 'update' ]); + + Route::get('corporate-manage', [CorporateManageController::class, 'index']); + Route::prefix('{corporate_id}')->group(function () { + Route::get('policy', [CorporatePolicyController::class, 'index']); + Route::get('division', [CorporateDivisionController::class, 'index']); + Route::get('members', [CorporateMemberController::class, 'index']); + Route::get('claims/status', [ClaimController::class, 'status']); + Route::get('claims', [ClaimController::class, 'index']); + + Route::get('topup', [TopUpController::class, 'index']); + Route::post('topup', [TopUpController::class, 'store']); + }); + + Route::get('claims/{id}', [ClaimController::class, 'show']); + }); +});