diff --git a/Modules/HospitalPortal/Http/Controllers/Api/MemberController.php b/Modules/HospitalPortal/Http/Controllers/Api/MemberController.php index b11abbb0..7d5dbdcc 100644 --- a/Modules/HospitalPortal/Http/Controllers/Api/MemberController.php +++ b/Modules/HospitalPortal/Http/Controllers/Api/MemberController.php @@ -43,6 +43,7 @@ class MemberController extends Controller ->where('members.birth_date', '=', $request->birth_date) ->select( 'members.id', + 'members.name', 'members.member_id', 'member_policies.policy_id', 'persons.nik', @@ -54,26 +55,53 @@ class MemberController extends Controller 'members.race', 'members.relation_with_principal') ->first(); - $res_data['members'] = $members; + if($members) + { + $res_data['members'] = $members; - $benefits = DB::table('member_plans') - ->leftJoin('corporate_benefits','corporate_benefits.plan_id', '=', 'member_plans.plan_id') - ->leftJoin('benefits', 'benefits.id', '=', 'corporate_benefits.benefit_id') - ->where('member_plans.member_id', '=', $members->id) - ->select('benefits.description','benefits.code','corporate_benefits.corporate_id') - ->get(); - $res_data['benefits'] = $benefits; + $benefits = DB::table('member_plans') + ->leftJoin('corporate_benefits','corporate_benefits.plan_id', '=', 'member_plans.plan_id') + ->leftJoin('benefits', 'benefits.id', '=', 'corporate_benefits.benefit_id') + ->leftJoin('plans', 'plans.id', '=', 'member_plans.plan_id') + ->leftJoin('services', 'services.code', '=', 'plans.service_code') + ->where('member_plans.member_id', '=', $members->id) + ->select( + 'benefits.description', + 'benefits.code', + 'corporate_benefits.corporate_id', + 'plans.service_code' + ) + ->get(); + $res_data['benefits'] = $benefits; - $services = DB::table('member_plans') - ->leftJoin('plans', 'plans.id', '=', 'member_plans.plan_id') - ->leftJoin('services', 'services.code', '=', 'plans.service_code') - ->where('member_plans.member_id', $members->id) - ->select('plans.service_code', 'services.name') - ->get(); - $res_data['services'] = $services; + $services = DB::table('member_plans') + ->leftJoin('plans', 'plans.id', '=', 'member_plans.plan_id') + ->leftJoin('services', 'services.code', '=', 'plans.service_code') + ->where('member_plans.member_id', $members->id) + ->select('plans.service_code', 'services.name') + ->get(); + $res_data['services'] = $services; + // Group Services + $groupServices = []; + foreach ($res_data['benefits'] as $benefit) { + $serviceCode = $benefit->service_code; + $groupServices[$serviceCode][] = [ + 'description' => $benefit->description, + 'code' => $benefit->code, + ]; + } + + $res_data['groupServices'] = $groupServices; + + + return ApiResponse::apiResponse("Success", $res_data, trans('Message.success'), 200); + } + else + { + return ApiResponse::apiResponse("Data Not Found", $data, trans('Message.not_found'), 404); + } - return ApiResponse::apiResponse("Success", $res_data, trans('Message.success'), 200); } } } diff --git a/Modules/HospitalPortal/Http/Controllers/Api/RequestLogController.php b/Modules/HospitalPortal/Http/Controllers/Api/RequestLogController.php new file mode 100644 index 00000000..377c50a0 --- /dev/null +++ b/Modules/HospitalPortal/Http/Controllers/Api/RequestLogController.php @@ -0,0 +1,51 @@ + $request->member_id, + 'service_code' => $request->service_code + ]; + $validator = Validator::make($request->all(), [ + 'member_id' => 'required', + 'service_code' => 'required' + ], [ + 'member_id.required' => trans('Validation.required',['attribute' => 'Member ID']), + 'service_code.required' => trans('Validation.required',['attribute' => 'Service Code']), + ]); + if ($validator->fails()) + { + return ApiResponse::apiResponse('Bad Request', $data, $validator->errors(), 400); + } + else + { + + $requestLogControllerInstance = new PrimeCenterRequestLog(); + $response = $requestLogControllerInstance->createNew($request); + + if($response->original['statusCode'] == 200) + { + return ApiResponse::apiResponse("Success", $data, trans('Message.success'), 200); + } + else + { + return ApiResponse::apiResponse('Server Error', $data, trans('Message.server_error'), 500); + } + } + } +} diff --git a/Modules/HospitalPortal/Routes/api.php b/Modules/HospitalPortal/Routes/api.php index 2aff378c..bde509b5 100644 --- a/Modules/HospitalPortal/Routes/api.php +++ b/Modules/HospitalPortal/Routes/api.php @@ -6,6 +6,7 @@ use Modules\HospitalPortal\Http\Controllers\Api\ClaimRequestController; use Modules\HospitalPortal\Http\Controllers\Api\MemberController; use Modules\HospitalPortal\Http\Controllers\ClaimController; use Modules\HospitalPortal\Http\Controllers\Api\NotificationController; +use Modules\HospitalPortal\Http\Controllers\Api\RequestLogController; use Modules\HospitalPortal\Http\Middleware\Authentication; use Modules\HospitalPortal\Http\Middleware\Authorization; @@ -47,6 +48,10 @@ Route::prefix('v1')->group(function() { Route::controller(MemberController::class)->group(function () { Route::post('search-member', 'search'); }); + // Request LOG + Route::controller(RequestLogController::class)->group(function () { + Route::post('request-log', 'requestLog'); + }); //Notification Route::controller(NotificationController::class)->group(function() { //get notifications diff --git a/frontend/hospital-portal/public/lang/en-US.json b/frontend/hospital-portal/public/lang/en-US.json index 7850d55b..d150075b 100644 --- a/frontend/hospital-portal/public/lang/en-US.json +++ b/frontend/hospital-portal/public/lang/en-US.json @@ -9,7 +9,14 @@ "txtCardSearchMember3" : "Date Birth", "txtCardSearchMember4" : "Member ID", "txtCardSearchMember5" : "Member", - "txtDialogMember1" : "Benefit", + "txtDialogMember1" : "Services", "txtDialogMember2" : "Request LOG", - "txtDialogMember3" : "Detail" + "txtDialogMember3" : "Detail", + "txtDialogMember4" : "Please select services", + "txtDialogMember5" : "Submission Date", + "txtDateBirth" : "Date of Birth", + "txtGender" : "Gender", + "txtMaritalStatus" : "Marital Status", + "txtLanguage" : "Language", + "txtRelationship" : "Relationship" } diff --git a/frontend/hospital-portal/public/lang/id-ID.json b/frontend/hospital-portal/public/lang/id-ID.json index 182c705d..4354359e 100644 --- a/frontend/hospital-portal/public/lang/id-ID.json +++ b/frontend/hospital-portal/public/lang/id-ID.json @@ -9,7 +9,14 @@ "txtCardSearchMember3" : "Tanggal Lahir", "txtCardSearchMember4" : "Member ID", "txtCardSearchMember5" : "Member", - "txtDialogMember1" : "Manfaat", + "txtDialogMember1" : "Layanan", "txtDialogMember2" : "Request LOG", - "txtDialogMember3" : "Detail" + "txtDialogMember3" : "Detail", + "txtDialogMember4" : "Mohon pilih layanan", + "txtDialogMember5" : "Tanggal Pengajuan", + "txtDateBirth" : "Tanggal Lahir", + "txtGender" : "Jenis Kelamin", + "txtMaritalStatus" : "Status Perkawinan", + "txtLanguage" : "Bahasa", + "txtRelationship" : "Hubungan" } diff --git a/frontend/hospital-portal/src/sections/dashboard/CardSearchMember.tsx b/frontend/hospital-portal/src/sections/dashboard/CardSearchMember.tsx index 0f8a1453..77ae25a2 100644 --- a/frontend/hospital-portal/src/sections/dashboard/CardSearchMember.tsx +++ b/frontend/hospital-portal/src/sections/dashboard/CardSearchMember.tsx @@ -46,8 +46,8 @@ const ItemNotificationStyle = styled(Card)(({ theme }) => ({ // ---------------------------------------------------------------------- -export default function CardSearchMember(handleSubmitSuccess) { - const { localeData } = useContext(LanguageContext); +export default function CardSearchMember(handleSubmitSuccess:()=> void) { + const { localeData }: any = useContext(LanguageContext); const {enqueueSnackbar} = useSnackbar(); const [noPolis, setNoPolis] = useState('AW001-01'); @@ -112,7 +112,7 @@ export default function CardSearchMember(handleSubmitSuccess) { { + onChange={(newValue:any) => { setBirthDate( (newValue)); }} inputFormat="dd-MM-yyyy" @@ -144,7 +144,7 @@ export default function CardSearchMember(handleSubmitSuccess) { openDialog={openDialogBenefit} setOpenDialog={setOpenDialogBenefit} content={DialogMember(currentMember, () => {setOpenDialogBenefit(false); handleSubmitSuccess()})} - maxWidth="md" + maxWidth="sm" /> ); diff --git a/frontend/hospital-portal/src/sections/dashboard/DialogMember.tsx b/frontend/hospital-portal/src/sections/dashboard/DialogMember.tsx index c6863e48..3aa254f1 100644 --- a/frontend/hospital-portal/src/sections/dashboard/DialogMember.tsx +++ b/frontend/hospital-portal/src/sections/dashboard/DialogMember.tsx @@ -1,7 +1,22 @@ // mui import { styled } from '@mui/material/styles'; import { LoadingButton, TabPanel } from "@mui/lab"; -import { Button, Card, Divider, Grid, LinearProgress, linearProgressClasses, Typography } from "@mui/material"; +import { + Button, + Card, + Divider, + Grid, + LinearProgress, + linearProgressClasses, + Typography, + Paper, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + Collapse, } from "@mui/material"; import { Tab, Tabs } from "@mui/material"; import { Box, Stack } from "@mui/material"; import React, { useEffect, useState, useContext } from "react"; @@ -10,11 +25,14 @@ import { fPostFormat } from '@/utils/formatTime'; import { Avatar } from '@mui/material'; import Iconify from '@/components/Iconify'; import FormRequestClaim from './FormRequestClaim'; +import FormRequestLog from './FormRequestLog'; import { LanguageContext } from '@/contexts/LanguageContext'; import { format } from 'date-fns'; +import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; +import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight'; -export default function DialogMember(member, handleSubmitSuccess) { - const { localeData } = useContext(LanguageContext); +export default function DialogMember(member:any, handleSubmitSuccess:() => void) { + const { localeData }: any = useContext(LanguageContext); const [currentTab, setCurrentTab] = useState('request') // ---------------------------------------------------------------------- @@ -41,7 +59,7 @@ export default function DialogMember(member, handleSubmitSuccess) { }, })); - function TabPanel(props) { + function TabPanel(props:any) { const { children, value, index, ...other } = props; return (
); } + + const [openRows, setOpenRows] = useState({}); + + const handleRowToggle = (index:number) => { + setOpenRows((prevOpenRows:any) => ({ + ...prevOpenRows, + [index]: !prevOpenRows[index], + })); + }; return (
@@ -69,7 +96,7 @@ export default function DialogMember(member, handleSubmitSuccess) { aria-label="wrapped label tabs example" > - + @@ -96,19 +123,19 @@ export default function DialogMember(member, handleSubmitSuccess) { {member?.members.email ?? '-'} - Date of Birth + {localeData.txtDateBirth} {member?.members.birth_date ? format(new Date(member.members.birth_date), "d MMM yyyy") : '-'} - Gender + {localeData.txtGender} {member?.members.gender ?? '-'} - Marital Status + {localeData.txtMaritalStatus} {member?.members.marital_status ?? '-'} - Language + {localeData.txtLanguage} {member?.members.language ?? '-'} @@ -116,29 +143,51 @@ export default function DialogMember(member, handleSubmitSuccess) { {member?.members.race ?? '-'} - Relationship + {localeData.txtRelationship} {member?.members.relation_with_principal != '' ? member?.members.relation_with_principal : '-'} - - - - { member && member?.benefits?.map((corporateBenefit, index) => {return ( - - - {corporateBenefit.description} - {corporateBenefit.code} - - - - )})} - + + + + {member && member.groupServices && Object.keys(member.groupServices).map((serviceCode, index) => ( + + + {serviceCode} + + {openRows[index] ? ( + handleRowToggle(index)} /> + ) : ( + handleRowToggle(index)} /> + )} + + + + + {/* COLLAPSIBLE ROW */} + + + {/* Loop through the array for the current serviceCode */} + {member.groupServices[serviceCode].map((item:any, innerIndex:number) => ( + + + {item.description} + {item.code} + + + ))} + + + + + + ))} +
+
- - - +
diff --git a/frontend/hospital-portal/src/sections/dashboard/FormRequestLog.tsx b/frontend/hospital-portal/src/sections/dashboard/FormRequestLog.tsx new file mode 100644 index 00000000..9110d837 --- /dev/null +++ b/frontend/hospital-portal/src/sections/dashboard/FormRequestLog.tsx @@ -0,0 +1,128 @@ +import { LoadingButton } from '@mui/lab'; +import +{ + Avatar, + FormControl, + InputLabel, + Select, + FormHelperText, + MenuItem +} from '@mui/material'; +import { Card } from '@mui/material'; +import { Stack, Typography } from '@mui/material'; +import axios from '@/utils/axios'; +import { enqueueSnackbar } from 'notistack'; +import { useRef, useState, useContext } from 'react'; +import { makeFormData } from '@/utils/jsonToFormData'; +import { format } from 'date-fns'; +import { LanguageContext } from '@/contexts/LanguageContext'; + +interface MemberType { + members: any; + services: any; +} +interface FormRequestClaimProps { + member: MemberType; + handleSubmitSuccess: () => void; +} +export default function FormRequestClaim({ member, handleSubmitSuccess }: FormRequestClaimProps) { + const { localeData }: any = useContext(LanguageContext); + const [serviceCode, setServiceCode] = useState(''); + + const [submitLoading, setSubmitLoading] = useState(false); + function submitRequest() { + if(serviceCode == '') + { + enqueueSnackbar(localeData.txtDialogMember4, { variant: 'warning' }); + return false; + } + setSubmitLoading(true); + const formData = { + member_id: member.members.id, + service_code: serviceCode + }; + axios + .post('/request-log', formData) + .then((response) => { + console.log(response); + if (response && response.data && response.data.meta) { + enqueueSnackbar(response.data.meta.message, { variant: 'success' }); + handleSubmitSuccess(); + } + }) + .catch(({ response }) => { + if (response && response.data && response.data.meta) { + enqueueSnackbar(response.data.meta.message, { variant: 'error' }); + } + }) + .then(() => { + setSubmitLoading(false); + }); + } + + interface MemberService { + service_code: string; + name: string; + } + + return ( + + + + {localeData.txtDialogMember5} + + {format(new Date(), "d MMM yyyy")} + + + + + {localeData.txtDialogMember1}* + + + {localeData.txtDialogMember1} + + + + + + + + + + + + {member?.members.name ?? ''} + {member?.members.member_id ?? ''} + + + + + { + submitRequest(); + }} + loading={submitLoading} + > + {localeData.txtDialogMember2} + + + ); +}