Update service hospital dan prime center

This commit is contained in:
ivan-sim
2023-11-14 16:53:08 +07:00
parent c3b140d1f8
commit 8f77d8bec0
7 changed files with 107 additions and 65 deletions

View File

@@ -17,6 +17,7 @@ use Modules\HospitalPortal\Transformers\ClaimRequestResource;
use Modules\HospitalPortal\Transformers\ClaimRequestShowResource; use Modules\HospitalPortal\Transformers\ClaimRequestShowResource;
use PDF; use PDF;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Modules\HospitalPortal\Helpers\ApiResponse;
class ClaimRequestController extends Controller class ClaimRequestController extends Controller
{ {
@@ -64,7 +65,7 @@ class ClaimRequestController extends Controller
{ {
$request->validate([ $request->validate([
'member_id' => 'required', 'member_id' => 'required',
'service_code' => 'required|in:OP,IP' 'service_code' => 'required'
]); ]);
$code = $this->getNextCode(); $code = $this->getNextCode();
$member = Member::find($request->member_id); $member = Member::find($request->member_id);
@@ -145,7 +146,7 @@ class ClaimRequestController extends Controller
} }
} }
return Helper::responseJson(data: $request->toArray(), message: 'Claim Request berhasil ajukan!'); return ApiResponse::apiResponse("Success", [], trans('message.success'), 200);
} }
/** /**
@@ -226,7 +227,8 @@ class ClaimRequestController extends Controller
public static function getNextCode() public static function getNextCode()
{ {
$last_number = ClaimRequest::withTrashed()->max('code'); $last_number = ClaimRequest::withTrashed()->max('code');
$next_number = empty($last_number) ? 1 : ((int) explode('-', $last_number)[2] + 1); $last_number_parts = explode('-', $last_number);
$next_number = count($last_number_parts) < 3 ? 1 : ((int) $last_number_parts[2] + 1);
return self::makeCode($next_number); return self::makeCode($next_number);
} }

View File

@@ -9,6 +9,7 @@ use Illuminate\Http\Request;
use Illuminate\Routing\Controller; use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Validator; use Illuminate\Support\Facades\Validator;
use Modules\HospitalPortal\Helpers\ApiResponse; use Modules\HospitalPortal\Helpers\ApiResponse;
use Illuminate\Support\Facades\DB;
class MemberController extends Controller class MemberController extends Controller
{ {
@@ -35,20 +36,43 @@ class MemberController extends Controller
} }
else else
{ {
$res_data = Member::query() $members = DB::table('members')
->where('member_id', $request->no_polis) ->leftJoin('member_policies', 'member_policies.member_id','=', 'members.member_id')
->where('birth_date', $request->birth_date) ->leftJoin('persons', 'persons.id', '=', 'members.person_id')
->with(['person', 'currentCorporate', ->where('members.member_id', '=', $request->no_polis)
// 'currentCorporate.corporateServices' => function ($corporateService) { ->where('members.birth_date', '=', $request->birth_date)
// $corporateService->where('status', 'active'); ->select(
// }, 'members.id',
// 'currentCorporate.corporateServices.service' 'members.member_id',
// 'currentPlan.benefits', 'member_policies.policy_id',
// 'currentPlan.corporateBenefit.plan', 'persons.nik',
'currentPolicy', 'members.email',
'currentPlan.corporateBenefits.benefit' 'members.birth_date',
]) 'members.gender',
->firstOrFail(); 'members.marital_status',
'members.language',
'members.race',
'members.relation_with_principal')
->first();
$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;
$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;
return ApiResponse::apiResponse("Success", $res_data, trans('message.success'), 200); return ApiResponse::apiResponse("Success", $res_data, trans('message.success'), 200);
} }
} }

View File

@@ -723,7 +723,7 @@ class ClaimController extends Controller
$data_claim_requests = DB::table('claim_requests') $data_claim_requests = DB::table('claim_requests')
->leftJoin('claims', 'claim_requests.id', '=', 'claims.claim_request_id') ->leftJoin('claims', 'claim_requests.id', '=', 'claims.claim_request_id')
->where('claims.id', $claim_id) ->where('claims.id', $claim_id)
->select('claim_requests.id') ->select('claim_requests.id', 'claim_requests.member_id')
->first(); ->first();
$claim_id = $data_claim_requests->id; $claim_id = $data_claim_requests->id;
@@ -738,9 +738,9 @@ class ClaimController extends Controller
->first(); ->first();
//Service Type //Service Type
$service_type = DB::table('corporate_services') $service_type = DB::table('claim_requests')
->leftJoin('services','corporate_services.service_code', 'services.code') ->leftJoin('services','claim_requests.service_code', 'services.code')
->where('corporate_services.corporate_id', $corporate_id->id) ->where('claim_requests.id', $claim_id)
->select('services.name', 'services.code', 'services.id') ->select('services.name', 'services.code', 'services.id')
->get(); ->get();
$results['service_type'] = $service_type; $results['service_type'] = $service_type;
@@ -751,14 +751,13 @@ class ClaimController extends Controller
->select('claims.plan_id') ->select('claims.plan_id')
->first(); ->first();
//Benefit Name //Benefit Name
$benefit_name = DB::table('corporate_benefits') $benefit_name = DB::table('member_plans')
->leftJoin('benefits', 'corporate_benefits.benefit_id', 'benefits.id') ->leftJoin('corporate_benefits','corporate_benefits.plan_id', '=', 'member_plans.plan_id')
->where('corporate_benefits.corporate_id', $corporate_id->id) ->leftJoin('benefits', 'benefits.id', '=', 'corporate_benefits.benefit_id')
->where('corporate_benefits.plan_id', $plan_id->plan_id) ->where('member_plans.member_id', '=', $data_claim_requests->member_id)
->select('benefits.code', 'benefits.description', 'benefits.id') ->select('benefits.code', 'benefits.description', 'benefits.id')
->get(); ->get();
$results['benefit_name'] = $benefit_name; $results['benefit_name'] = $benefit_name;
//Hospital //Hospital

View File

@@ -1327,7 +1327,7 @@ export default function Detail() {
</InputLabel> </InputLabel>
<Select <Select
id="service_type" id="service_type"
value={valServiceType} value={valServiceType ? serviceTypeData?.[0].id : ''}
fullWidth fullWidth
label="Service Type" label="Service Type"
error={!!valServiceTypeError} error={!!valServiceTypeError}
@@ -1335,6 +1335,7 @@ export default function Detail() {
setValServiceType(e.target.value); setValServiceType(e.target.value);
setValServiceTypeError(e.target.value === '' ? 'This field is required' : ''); setValServiceTypeError(e.target.value === '' ? 'This field is required' : '');
}} }}
disabled
> >
{serviceTypeData?.map((item, index) => ( {serviceTypeData?.map((item, index) => (

View File

@@ -69,7 +69,7 @@ export default function CardSearchMember(handleSubmitSuccess) {
.then((response) => { .then((response) => {
setOpenDialogBenefit(true) setOpenDialogBenefit(true)
setCurrentMember(response.data.data) setCurrentMember(response.data.data)
setNameMember(response.data.data.name); setNameMember(response.data.data.members.name);
}) })
.catch(({response}) => { .catch(({response}) => {
enqueueSnackbar(response.data.errors ? response.data.errors[0] : (response.data ? response.data.meta.message : 'Opps, Something went Wrong!'), {variant : "error"}) enqueueSnackbar(response.data.errors ? response.data.errors[0] : (response.data ? response.data.meta.message : 'Opps, Something went Wrong!'), {variant : "error"})

View File

@@ -43,8 +43,6 @@ export default function DialogMember(member, handleSubmitSuccess) {
function TabPanel(props) { function TabPanel(props) {
const { children, value, index, ...other } = props; const { children, value, index, ...other } = props;
console.log('current', value)
return ( return (
<div <div
role="tabpanel" role="tabpanel"
@@ -79,58 +77,58 @@ export default function DialogMember(member, handleSubmitSuccess) {
<Stack direction="column" spacing={2}> <Stack direction="column" spacing={2}>
<Stack direction="row" justifyContent="space-between"> <Stack direction="row" justifyContent="space-between">
<Typography sx={{width:'50%'}} variant="body2">Member ID</Typography> <Typography sx={{width:'50%'}} variant="body2">Member ID</Typography>
<Typography sx={{width:'50%', fontWeight: 'bold'}} variant="body2">{ member?.member_id ?? '-'}</Typography> <Typography sx={{width:'50%', fontWeight: 'bold'}} variant="body2">{ member?.members.member_id ?? '-'}</Typography>
</Stack> </Stack>
<Stack direction="row" justifyContent="space-between"> <Stack direction="row" justifyContent="space-between">
<Typography sx={{width:'50%'}} variant="body2">Policy Number</Typography> <Typography sx={{width:'50%'}} variant="body2">Policy Number</Typography>
<Typography sx={{width:'50%', fontWeight: 'bold'}} variant="body2">{ member?.current_policy?.code ?? '-'}</Typography> <Typography sx={{width:'50%', fontWeight: 'bold'}} variant="body2">{ member?.members.policy_id ?? '-'}</Typography>
</Stack> </Stack>
<Stack direction="row" justifyContent="space-between"> <Stack direction="row" justifyContent="space-between">
<Typography sx={{width:'50%'}} variant="body2">NRIC</Typography> <Typography sx={{width:'50%'}} variant="body2">NRIC</Typography>
<Typography sx={{width:'50%', fontWeight: 'bold'}} variant="body2">{member?.person?.nik ?? '-'}</Typography> <Typography sx={{width:'50%', fontWeight: 'bold'}} variant="body2">{member?.members.nik ?? '-'}</Typography>
</Stack> </Stack>
<Stack direction="row" justifyContent="space-between"> <Stack direction="row" justifyContent="space-between">
<Typography sx={{width:'50%'}} variant="body2">NIK</Typography> <Typography sx={{width:'50%'}} variant="body2">NIK</Typography>
<Typography sx={{width:'50%', fontWeight: 'bold'}} variant="body2">{member?.person?.nik ?? '-'}</Typography> <Typography sx={{width:'50%', fontWeight: 'bold'}} variant="body2">{member?.members.nik ?? '-'}</Typography>
</Stack> </Stack>
<Stack direction="row" justifyContent="space-between"> <Stack direction="row" justifyContent="space-between">
<Typography sx={{width:'50%'}} variant="body2">Email</Typography> <Typography sx={{width:'50%'}} variant="body2">Email</Typography>
<Typography sx={{width:'50%', fontWeight: 'bold'}} variant="body2">{member?.email ?? '-'}</Typography> <Typography sx={{width:'50%', fontWeight: 'bold'}} variant="body2">{member?.members.email ?? '-'}</Typography>
</Stack> </Stack>
<Stack direction="row" justifyContent="space-between"> <Stack direction="row" justifyContent="space-between">
<Typography sx={{width:'50%'}} variant="body2">Date of Birth</Typography> <Typography sx={{width:'50%'}} variant="body2">Date of Birth</Typography>
<Typography sx={{width:'50%', fontWeight: 'bold'}} variant="body2">{member?.birth_date ? format(new Date(member.birth_date), "d MMM yyyy") : '-'}</Typography> <Typography sx={{width:'50%', fontWeight: 'bold'}} variant="body2">{member?.members.birth_date ? format(new Date(member.members.birth_date), "d MMM yyyy") : '-'}</Typography>
</Stack> </Stack>
<Stack direction="row" justifyContent="space-between"> <Stack direction="row" justifyContent="space-between">
<Typography sx={{width:'50%'}} variant="body2">Gender</Typography> <Typography sx={{width:'50%'}} variant="body2">Gender</Typography>
<Typography sx={{width:'50%', fontWeight: 'bold'}} variant="body2">{member?.gender ?? '-'}</Typography> <Typography sx={{width:'50%', fontWeight: 'bold'}} variant="body2">{member?.members.gender ?? '-'}</Typography>
</Stack> </Stack>
<Stack direction="row" justifyContent="space-between"> <Stack direction="row" justifyContent="space-between">
<Typography sx={{width:'50%'}} variant="body2">Marital Status</Typography> <Typography sx={{width:'50%'}} variant="body2">Marital Status</Typography>
<Typography sx={{width:'50%', fontWeight: 'bold'}} variant="body2">{member?.marital_status ?? '-'}</Typography> <Typography sx={{width:'50%', fontWeight: 'bold'}} variant="body2">{member?.members.marital_status ?? '-'}</Typography>
</Stack> </Stack>
<Stack direction="row" justifyContent="space-between"> <Stack direction="row" justifyContent="space-between">
<Typography sx={{width:'50%'}} variant="body2">Language</Typography> <Typography sx={{width:'50%'}} variant="body2">Language</Typography>
<Typography sx={{width:'50%', fontWeight: 'bold'}} variant="body2">{member?.language ?? '-'}</Typography> <Typography sx={{width:'50%', fontWeight: 'bold'}} variant="body2">{member?.members.language ?? '-'}</Typography>
</Stack> </Stack>
<Stack direction="row" justifyContent="space-between"> <Stack direction="row" justifyContent="space-between">
<Typography sx={{width:'50%'}} variant="body2">Race</Typography> <Typography sx={{width:'50%'}} variant="body2">Race</Typography>
<Typography sx={{width:'50%', fontWeight: 'bold'}} variant="body2">{member?.race ?? '-'}</Typography> <Typography sx={{width:'50%', fontWeight: 'bold'}} variant="body2">{member?.members.race ?? '-'}</Typography>
</Stack> </Stack>
<Stack direction="row" justifyContent="space-between"> <Stack direction="row" justifyContent="space-between">
<Typography sx={{width:'50%'}} variant="body2">Relationship</Typography> <Typography sx={{width:'50%'}} variant="body2">Relationship</Typography>
<Typography sx={{width:'50%', fontWeight: 'bold'}} variant="body2">{member?.relation_with_principal ?? '-'}</Typography> <Typography sx={{width:'50%', fontWeight: 'bold'}} variant="body2">{member?.members.relation_with_principal != '' ? member?.members.relation_with_principal : '-'}</Typography>
</Stack> </Stack>
</Stack> </Stack>
</TabPanel> </TabPanel>
<TabPanel value={currentTab} index={'benefit'}> <TabPanel value={currentTab} index={'benefit'}>
<Grid container spacing={2}> <Grid container spacing={2}>
{ member && member?.current_plan?.corporate_benefits?.map((corporateBenefit, index) => {return ( { member && member?.benefits?.map((corporateBenefit, index) => {return (
<Grid item sm={6} key={index}> <Grid item sm={6} key={index}>
<Card sx={{p: 2}}> <Card sx={{p: 2}}>
<Typography variant="body2" sx={{fontWeight: 'bold'}}>{corporateBenefit.benefit.description}</Typography> <Typography variant="body2" sx={{fontWeight: 'bold'}}>{corporateBenefit.description}</Typography>
<Typography variant="body2" sx={{color: '#919EAB'}}>{corporateBenefit.benefit.code}</Typography> <Typography variant="body2" sx={{color: '#919EAB'}}>{corporateBenefit.code}</Typography>
</Card> </Card>
</Grid> </Grid>

View File

@@ -26,7 +26,7 @@ export default function FormRequestClaim({ member, handleSubmitSuccess }) {
}, },
})); }));
const [serviceCode, setServiceCode] = useState('IP'); const [serviceCode, setServiceCode] = useState('');
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------
// Files Diagnosa // Files Diagnosa
@@ -96,9 +96,14 @@ export default function FormRequestClaim({ member, handleSubmitSuccess }) {
const [submitLoading, setSubmitLoading] = useState(false); const [submitLoading, setSubmitLoading] = useState(false);
function submitRequest() { function submitRequest() {
if(serviceCode == '')
{
enqueueSnackbar('Please select services', { variant: 'error' });
return false;
}
setSubmitLoading(true); setSubmitLoading(true);
const formData = makeFormData({ const formData = makeFormData({
member_id: member.id, member_id: member.members.id,
result_files: fileHasilPenunjangs, result_files: fileHasilPenunjangs,
diagnosa_files: fileDiagnosas, diagnosa_files: fileDiagnosas,
kondisi_files: fileKondisis, kondisi_files: fileKondisis,
@@ -107,11 +112,11 @@ export default function FormRequestClaim({ member, handleSubmitSuccess }) {
axios axios
.post('/claim-requests', formData) .post('/claim-requests', formData)
.then((response) => { .then((response) => {
enqueueSnackbar(response.data.message ?? 'Berhasil membuat data', { variant: 'success' }); enqueueSnackbar(response.data.data.message ?? 'Berhasil membuat data', { variant: 'success' });
handleSubmitSuccess(); handleSubmitSuccess();
}) })
.catch(({ response }) => { .catch(({ response }) => {
enqueueSnackbar(response.data.message ?? 'Something Went Wrong', { variant: 'error' }); enqueueSnackbar(response.data.data.message ?? 'Something Went Wrong', { variant: 'error' });
}) })
.then(() => { .then(() => {
setSubmitLoading(false); setSubmitLoading(false);
@@ -127,26 +132,39 @@ export default function FormRequestClaim({ member, handleSubmitSuccess }) {
<Typography variant='body2' sx={{fontWeight:'bold'}}>{format(new Date(), "d MMM yyyy")}</Typography> <Typography variant='body2' sx={{fontWeight:'bold'}}>{format(new Date(), "d MMM yyyy")}</Typography>
</Stack> </Stack>
<Stack direction="column" spacing={2} sx={{marginBottom: 2}}>
<Typography variant="body1" sx={{fontWeight:'bold'}}>
Services
</Typography>
<Card sx={{ p: 1, background: '#f4f6f8', marginBottom: 2 }}>
<Stack direction="row" spacing={2}>
{member && member?.services?.map((dataServices, index) => (
<Button
key={index}
sx={{padding: 2, width: '100%'}}
color="primary"
variant={serviceCode === dataServices.service_code ? 'outlined' : ''}
onClick={() => { setServiceCode(dataServices.service_code) }}
>
{dataServices.name}
</Button>
))}
</Stack>
</Card>
<Card sx={{ p: 1, background: '#f4f6f8', marginBottom: 2 }}>
<Stack direction="row" spacing={2}>
<Button sx={{padding: 2, width: '100%'}} color="primary" variant={serviceCode == 'IP' ? 'outlined' : ''} onClick={() => {setServiceCode('IP')}}>Inpatient</Button>
<Button sx={{padding: 2, width: '100%'}} color="primary" variant={serviceCode == 'OP' ? 'outlined' : ''} onClick={() => {setServiceCode('OP')}}>Outpatient</Button>
</Stack> </Stack>
</Card>
<Card sx={{ p: 1, background: '#f4f6f8', marginBottom: 2 }}> <Card sx={{ p: 1, background: '#f4f6f8'}}>
<Stack direction="row"> <Stack direction="row">
<Avatar <Avatar
src="https://minimal-assets-api.vercel.app/assets/images/avatars/avatar_5.jpg" src="https://minimal-assets-api.vercel.app/assets/images/avatars/avatar_5.jpg"
alt={member?.full_name ?? ''} alt={member?.members.name ?? ''}
sx={{ marginTop: 1, width: 48, height: 48 }} sx={{ marginTop: 1, width: 48, height: 48 }}
/> />
<Stack sx={{ p: 1 }}> <Stack sx={{ p: 1 }}>
<Typography variant="body2">{member?.full_name ?? ''}</Typography> <Typography variant="body2">{member?.members.name ?? ''}</Typography>
<Typography variant="body2" sx={{color:'#637381'}}>{member?.member_id ?? ''}</Typography> <Typography variant="body2" sx={{color:'#637381'}}>{member?.members.member_id ?? ''}</Typography>
</Stack> </Stack>
</Stack> </Stack>
</Card> </Card>
@@ -173,7 +191,7 @@ export default function FormRequestClaim({ member, handleSubmitSuccess }) {
<Stack <Stack
divider={<Divider orientation="horizontal" flexItem />} divider={<Divider orientation="horizontal" flexItem />}
spacing={4} spacing={4}
sx={{ marginY: 2 }} sx={{ marginY: 2, marginBottom: 6 }}
> >
{/* -------------------------------Upload Dokumen Kondisi------------------------------- */} {/* -------------------------------Upload Dokumen Kondisi------------------------------- */}
<Stack sx={{ marginTop: 2 }}> <Stack sx={{ marginTop: 2 }}>
@@ -226,7 +244,7 @@ export default function FormRequestClaim({ member, handleSubmitSuccess }) {
style={{ display: 'none' }} style={{ display: 'none' }}
multiple multiple
onChange={handleKondisiInputChange} onChange={handleKondisiInputChange}
accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel, text/plain, application/pdf" accept="application/pdf"
/> />
</ButtonBase> </ButtonBase>
</Stack> </Stack>
@@ -287,7 +305,7 @@ export default function FormRequestClaim({ member, handleSubmitSuccess }) {
style={{ display: 'none' }} style={{ display: 'none' }}
multiple multiple
onChange={handleDiagnosaInputChange} onChange={handleDiagnosaInputChange}
accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel, text/plain, application/pdf" accept="application/pdf"
/> />
</ButtonBase> </ButtonBase>
</Stack> </Stack>
@@ -348,7 +366,7 @@ export default function FormRequestClaim({ member, handleSubmitSuccess }) {
style={{ display: 'none' }} style={{ display: 'none' }}
multiple multiple
onChange={handleResultInputChange} onChange={handleResultInputChange}
accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel, text/plain, application/pdf" accept="application/pdf"
/> />
</ButtonBase> </ButtonBase>
</Stack> </Stack>
@@ -362,7 +380,7 @@ export default function FormRequestClaim({ member, handleSubmitSuccess }) {
}} }}
loading={submitLoading} loading={submitLoading}
> >
LOG Request Request LOG
</LoadingButton> </LoadingButton>
</Stack> </Stack>
); );