Merge branch 'staging' of https://dev.sismedika.online/febio/aso into staging
This commit is contained in:
@@ -10,6 +10,8 @@ use Illuminate\Support\Facades\DB;
|
|||||||
use Modules\Internal\Http\Controllers\Api\RequestLogController as primeCenterRequestLog;
|
use Modules\Internal\Http\Controllers\Api\RequestLogController as primeCenterRequestLog;
|
||||||
use App\Helpers\Helper;
|
use App\Helpers\Helper;
|
||||||
use App\Models\File;
|
use App\Models\File;
|
||||||
|
use Dompdf\Dompdf;
|
||||||
|
use Dompdf\Options;
|
||||||
|
|
||||||
class RequestLogController extends Controller
|
class RequestLogController extends Controller
|
||||||
{
|
{
|
||||||
@@ -99,6 +101,7 @@ class RequestLogController extends Controller
|
|||||||
})
|
})
|
||||||
->select(
|
->select(
|
||||||
'request_logs.id',
|
'request_logs.id',
|
||||||
|
'request_logs.member_id',
|
||||||
'request_logs.final_log',
|
'request_logs.final_log',
|
||||||
'request_logs.code',
|
'request_logs.code',
|
||||||
'members.name as full_name',
|
'members.name as full_name',
|
||||||
@@ -281,4 +284,97 @@ class RequestLogController extends Controller
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function downlodLog($request_log_id)
|
||||||
|
{
|
||||||
|
$dataRequestLog = DB::table('request_logs')
|
||||||
|
->where('request_logs.id', '=', $request_log_id)
|
||||||
|
->first();
|
||||||
|
$dataMember = DB::table('members')
|
||||||
|
->where('members.id', '=', $dataRequestLog->member_id)
|
||||||
|
->select(
|
||||||
|
'members.principal_id',
|
||||||
|
'members.name',
|
||||||
|
'members.birth_date',
|
||||||
|
'members.member_id',
|
||||||
|
'members.gender',
|
||||||
|
DB::raw('
|
||||||
|
(Select persons.nik FROM persons WHERE persons.id = members.person_id LIMIT 1) AS nik
|
||||||
|
'),
|
||||||
|
DB::raw('
|
||||||
|
"Link Sehat" AS penjamin
|
||||||
|
'),
|
||||||
|
DB::raw('
|
||||||
|
(Select corporates.name FROM corporates
|
||||||
|
INNER JOIN corporate_employees ON corporate_employees.corporate_id = corporates.id
|
||||||
|
WHERE corporate_employees.member_id = members.id LIMIT 1) AS nama_perusahaan
|
||||||
|
'),
|
||||||
|
DB::raw('
|
||||||
|
(Select member_policies.policy_id FROM member_policies WHERE member_policies.member_id = members.member_id LIMIT 1) AS no_polis
|
||||||
|
'),
|
||||||
|
DB::raw('
|
||||||
|
(Select member_policies.status FROM member_policies WHERE member_policies.member_id = members.member_id LIMIT 1) AS status_polis
|
||||||
|
'),
|
||||||
|
DB::raw('
|
||||||
|
(Select plans.code FROM member_plans
|
||||||
|
INNER JOIN plans ON plans.id = member_plans.plan_id
|
||||||
|
WHERE member_plans.member_id = members.id LIMIT 1) AS code_plan
|
||||||
|
'),
|
||||||
|
DB::raw('
|
||||||
|
(Select plans.limit_rules FROM member_plans
|
||||||
|
INNER JOIN plans ON plans.id = member_plans.plan_id
|
||||||
|
WHERE member_plans.member_id = members.id LIMIT 1) AS limit_rules
|
||||||
|
'),
|
||||||
|
DB::raw('
|
||||||
|
"IDR" AS mata_uang
|
||||||
|
'),
|
||||||
|
'members.members_effective_date AS mulai',
|
||||||
|
'members.members_expire_date AS akhir'
|
||||||
|
)
|
||||||
|
->first();
|
||||||
|
$data['namaKaryawan'] = '';
|
||||||
|
if($dataMember->principal_id)
|
||||||
|
{
|
||||||
|
$dataNamaKaryawan = DB::table('members')
|
||||||
|
->where('members.member_id', '=', $dataMember->principal_id)
|
||||||
|
->select('members.name')
|
||||||
|
->limit(1)
|
||||||
|
->first();
|
||||||
|
$data['namaKaryawan'] = $dataNamaKaryawan->name;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
$data['namaKaryawan'] = $dataMember->name;
|
||||||
|
}
|
||||||
|
|
||||||
|
$data['dataMember'] = $dataMember;
|
||||||
|
|
||||||
|
$data['request_logs'] = $dataRequestLog;
|
||||||
|
|
||||||
|
$pdf = new Dompdf();
|
||||||
|
|
||||||
|
$options = new Options();
|
||||||
|
$options->set('isHtml5ParserEnabled', true);
|
||||||
|
$options->set('isPhpEnabled', true);
|
||||||
|
$options->set(['isRemoteEnabled' => true]);
|
||||||
|
$pdf->setOptions($options);
|
||||||
|
|
||||||
|
// Halaman 1
|
||||||
|
$html1 = view('pdf.req_log_page_1', $data);
|
||||||
|
|
||||||
|
// Halaman 2
|
||||||
|
$html2 = view('pdf.req_log_page_2', $data);
|
||||||
|
|
||||||
|
// Gabung konten HTML dari dua tampilan
|
||||||
|
$htmlCombined = $html1 . $html2;
|
||||||
|
|
||||||
|
$pdf->loadHtml($htmlCombined);
|
||||||
|
$pdf->render();
|
||||||
|
|
||||||
|
$headers = [
|
||||||
|
'Content-Type' => 'application/pdf',
|
||||||
|
'Content-Disposition' => 'inline; filename="file.pdf"',
|
||||||
|
];
|
||||||
|
|
||||||
|
return response($pdf->output(), 200, $headers);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ Route::prefix('v1')->group(function() {
|
|||||||
Route::get('get-request-log', 'getRequestLog');
|
Route::get('get-request-log', 'getRequestLog');
|
||||||
Route::get('get-final-log', 'getFinalLog');
|
Route::get('get-final-log', 'getFinalLog');
|
||||||
Route::post('request-final-log', 'requestFinalLog');
|
Route::post('request-final-log', 'requestFinalLog');
|
||||||
|
Route::get('download-log/{request_log_id}', 'downlodLog');
|
||||||
});
|
});
|
||||||
//Notification
|
//Notification
|
||||||
Route::controller(NotificationController::class)->group(function() {
|
Route::controller(NotificationController::class)->group(function() {
|
||||||
|
|||||||
@@ -98,8 +98,8 @@ export default function Router() {
|
|||||||
element: <Claim />,
|
element: <Claim />,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: '/detail/:id',
|
path: '/claim/detail/:id',
|
||||||
element: <DetailClaimReport />,
|
element: <DetailClaim />,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
@@ -126,3 +126,4 @@ const Claim = Loadable(lazy(() => import('@/pages/Claim')));
|
|||||||
const NotFound = Loadable(lazy(() => import('@/pages/Page404')));
|
const NotFound = Loadable(lazy(() => import('@/pages/Page404')));
|
||||||
|
|
||||||
const DetailClaimReport = Loadable(lazy(()=> import('@/sections/dashboard/Detail')));
|
const DetailClaimReport = Loadable(lazy(()=> import('@/sections/dashboard/Detail')));
|
||||||
|
const DetailClaim = Loadable(lazy(()=> import('@/sections/claim/Detail')));
|
||||||
|
|||||||
69
frontend/hospital-portal/src/sections/claim/Detail.tsx
Normal file
69
frontend/hospital-portal/src/sections/claim/Detail.tsx
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
// mui
|
||||||
|
import { Container, Grid, Stack, Typography } from '@mui/material';
|
||||||
|
// components
|
||||||
|
import Page from '../../components/Page';
|
||||||
|
// utils
|
||||||
|
import useSettings from '../../hooks/useSettings';
|
||||||
|
// section
|
||||||
|
import CardFamilyInformation from '../../sections/alarm-center/user-profile/CardFamilyInformation';
|
||||||
|
// react
|
||||||
|
import { useNavigate, useParams } from 'react-router-dom';
|
||||||
|
import ButtonBack from '../../components/ButtonBack';
|
||||||
|
import { useEffect, useState, useContext } from 'react';
|
||||||
|
import axios from '../../utils/axios';
|
||||||
|
// pages
|
||||||
|
import DetailTimeline from '../../sections/dashboard/DetailTimeline';
|
||||||
|
import DetailStepper from '../../sections/dashboard/DetailStepper';
|
||||||
|
import { format } from 'date-fns';
|
||||||
|
import ArrowBackIosIcon from '@mui/icons-material/ArrowBackIos';
|
||||||
|
import { LanguageContext } from '@/contexts/LanguageContext';
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
export default function Detail() {
|
||||||
|
const { localeData }: any = useContext(LanguageContext);
|
||||||
|
const navigate = useNavigate();
|
||||||
|
const { themeStretch } = useSettings();
|
||||||
|
const [data, setData] = useState();
|
||||||
|
|
||||||
|
const { id } = useParams();
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
axios
|
||||||
|
.get('/detail-claim-requests/' + id)
|
||||||
|
.then((response) => {
|
||||||
|
setData(response.data);
|
||||||
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
console.error(error);
|
||||||
|
});
|
||||||
|
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Page title="Detail">
|
||||||
|
<Container maxWidth={themeStretch ? false : 'xl'}>
|
||||||
|
<Stack direction="row" alignItems="center" sx={{ marginBottom: 3 }}>
|
||||||
|
<ArrowBackIosIcon onClick={() => navigate(-1)} sx={{cursor:'pointer'}}/>
|
||||||
|
<Typography variant="h5" sx={{marginLeft:2}}>Detail</Typography>
|
||||||
|
{data ? (
|
||||||
|
<Stack direction="row" spacing={2} ml="auto">
|
||||||
|
<Typography variant="body2" sx={{color: '#757575'}}>{localeData.txtDialogMember5}</Typography>
|
||||||
|
<Typography variant="body2" fontWeight="bold">{(data && data.data) ? format(new Date(data.data.status.submission_date), "d MMM yyyy") : ''}</Typography>
|
||||||
|
</Stack>
|
||||||
|
) : ''}
|
||||||
|
</Stack>
|
||||||
|
{data ? (
|
||||||
|
<Grid container spacing={2}>
|
||||||
|
<Grid item xs={12} md={12}>
|
||||||
|
<DetailStepper data={data}/>
|
||||||
|
</Grid>
|
||||||
|
<Grid item xs={12} md={12}>
|
||||||
|
<DetailTimeline data={data}/>
|
||||||
|
</Grid>
|
||||||
|
</Grid>
|
||||||
|
) : ''}
|
||||||
|
</Container>
|
||||||
|
</Page>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
import * as React from 'react';
|
||||||
|
import Box from '@mui/material/Box';
|
||||||
|
import Stepper from '@mui/material/Stepper';
|
||||||
|
import Step from '@mui/material/Step';
|
||||||
|
import StepLabel from '@mui/material/StepLabel';
|
||||||
|
import { useEffect, useState } from 'react';
|
||||||
|
import ClearIcon from '@mui/icons-material/Clear';
|
||||||
|
|
||||||
|
const steps = [
|
||||||
|
'Request',
|
||||||
|
'Review',
|
||||||
|
'Approval',
|
||||||
|
'Decline',
|
||||||
|
];
|
||||||
|
|
||||||
|
export default function HorizontalLinearAlternativeLabelStepper({data}) {
|
||||||
|
const [active, setActive] = useState(0);
|
||||||
|
const [status, SetStatus] = useState(null);
|
||||||
|
let updatedSteps = [...steps];
|
||||||
|
useEffect(() => {
|
||||||
|
if (data && data.data) {
|
||||||
|
if (data.data.status.status === 'requested') {
|
||||||
|
setActive(1);
|
||||||
|
updatedSteps = updatedSteps.filter(step => step !== 'Decline');
|
||||||
|
}
|
||||||
|
else if (data.data.status.status === 'reviewed') {
|
||||||
|
setActive(2);
|
||||||
|
updatedSteps = updatedSteps.filter(step => step !== 'Decline');
|
||||||
|
}
|
||||||
|
else if (data.data.status.status === 'approved')
|
||||||
|
{
|
||||||
|
setActive(3);
|
||||||
|
updatedSteps = updatedSteps.filter(step => step !== 'Decline');
|
||||||
|
}
|
||||||
|
else if(data.data.status.status === 'declined')
|
||||||
|
{
|
||||||
|
setActive(4)
|
||||||
|
updatedSteps = updatedSteps.filter(step => step !== 'Approval');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SetStatus(updatedSteps);
|
||||||
|
}, [data]);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Box sx={{ width: '100%', marginBottom: 2 }}>
|
||||||
|
<Stepper activeStep={active} alternativeLabel>
|
||||||
|
{status?.map((label) => (
|
||||||
|
<Step key={label}>
|
||||||
|
<StepLabel icon={label==='Decline' ? <ClearIcon sx={{ color: 'white', backgroundColor: 'red', borderRadius: '50%' }} /> : ''}>{label}</StepLabel>
|
||||||
|
</Step>
|
||||||
|
))}
|
||||||
|
</Stepper>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
386
frontend/hospital-portal/src/sections/claim/DetailTimeline.tsx
Normal file
386
frontend/hospital-portal/src/sections/claim/DetailTimeline.tsx
Normal file
@@ -0,0 +1,386 @@
|
|||||||
|
import * as React from 'react';
|
||||||
|
import Timeline from '@mui/lab/Timeline';
|
||||||
|
import TimelineItem, { timelineItemClasses } from '@mui/lab/TimelineItem';
|
||||||
|
import TimelineSeparator from '@mui/lab/TimelineSeparator';
|
||||||
|
import TimelineConnector from '@mui/lab/TimelineConnector';
|
||||||
|
import TimelineContent from '@mui/lab/TimelineContent';
|
||||||
|
import TimelineDot from '@mui/lab/TimelineDot';
|
||||||
|
import {Typography, Card, Stack, ButtonBase, Box, Divider} from '@mui/material';
|
||||||
|
import { styled } from '@mui/material/styles';
|
||||||
|
import Paper from '@mui/material/Paper';
|
||||||
|
import Button from '@mui/material/Button';
|
||||||
|
import AddIcon from '@mui/icons-material/Add';
|
||||||
|
import Iconify from '../../components/Iconify';
|
||||||
|
import { useEffect, useState, useRef } from 'react';
|
||||||
|
import { format } from 'date-fns';
|
||||||
|
import { LoadingButton } from '@mui/lab';
|
||||||
|
import axios from '../../utils/axios';
|
||||||
|
import { makeFormData } from '@/utils/jsonToFormData';
|
||||||
|
import { enqueueSnackbar } from 'notistack';
|
||||||
|
import { useParams} from 'react-router-dom';
|
||||||
|
import InsertDriveFileIcon from '@mui/icons-material/InsertDriveFile';
|
||||||
|
|
||||||
|
const Item1 = styled(Paper)(({ theme }) => ({
|
||||||
|
...theme.typography.body2,
|
||||||
|
padding: theme.spacing(1),
|
||||||
|
textAlign: 'center',
|
||||||
|
backgroundColor: '#919EAB29',
|
||||||
|
color: '#637381',
|
||||||
|
width: 'fit-content',
|
||||||
|
marginRight: 'auto',
|
||||||
|
}));
|
||||||
|
|
||||||
|
const Item2 = styled(Paper)(({ theme }) => ({
|
||||||
|
backgroundColor: theme.palette.mode === 'dark' ? '#1A2027' : '#fff',
|
||||||
|
...theme.typography.body2,
|
||||||
|
padding: theme.spacing(1),
|
||||||
|
textAlign: 'center',
|
||||||
|
color: theme.palette.text.secondary,
|
||||||
|
width: 'fit-content',
|
||||||
|
marginLeft: 'auto',
|
||||||
|
}));
|
||||||
|
|
||||||
|
export default function NoOppositeContent({data}) {
|
||||||
|
const [timeline, setTimeline] = useState(null);
|
||||||
|
const [requestFile, setRequestFile] = useState(null);
|
||||||
|
useEffect(() => {
|
||||||
|
if (data && data.data) {
|
||||||
|
setTimeline(data.data.timeline);
|
||||||
|
setRequestFile(data.data.request_files);
|
||||||
|
}
|
||||||
|
|
||||||
|
}, [data]);
|
||||||
|
|
||||||
|
// Diagnosis
|
||||||
|
const fileRequestDocumentInputDiagnosis = useRef<HTMLInputElement>(null);
|
||||||
|
const [fileDiagnosis, setFileDiagnosis] = useState([]);
|
||||||
|
const handleRequestDocumentInputChangeDiagnosis = (event) => {
|
||||||
|
if (event.target.files[0]) {
|
||||||
|
setFileDiagnosis([...fileDiagnosis, ...event.target.files]);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const removeFileDiagnois = (filesState, index) => {
|
||||||
|
setFileDiagnosis(
|
||||||
|
filesState.filter((file, fileIndex) => {
|
||||||
|
return fileIndex != index;
|
||||||
|
})
|
||||||
|
);
|
||||||
|
};
|
||||||
|
// Kondisi
|
||||||
|
const fileRequestDocumentInputKondisi = useRef<HTMLInputElement>(null);
|
||||||
|
const [fileKondisi, setFileKondisi] = useState([]);
|
||||||
|
const handleRequestDocumentInputChangeKondisi = (event) => {
|
||||||
|
if (event.target.files[0]) {
|
||||||
|
setFileKondisi([...fileKondisi, ...event.target.files]);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const removeFileKondisi = (filesState, index) => {
|
||||||
|
setFileKondisi(
|
||||||
|
filesState.filter((file, fileIndex) => {
|
||||||
|
return fileIndex != index;
|
||||||
|
})
|
||||||
|
);
|
||||||
|
};
|
||||||
|
// Result
|
||||||
|
const fileRequestDocumentInputResult = useRef<HTMLInputElement>(null);
|
||||||
|
const [fileResult, setFileResult] = useState([]);
|
||||||
|
const handleRequestDocumentInputChangeResult = (event) => {
|
||||||
|
if (event.target.files[0]) {
|
||||||
|
setFileResult([...fileResult, ...event.target.files]);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const removeFileResult = (filesState, index) => {
|
||||||
|
setFileResult(
|
||||||
|
filesState.filter((file, fileIndex) => {
|
||||||
|
return fileIndex != index;
|
||||||
|
})
|
||||||
|
);
|
||||||
|
};
|
||||||
|
const { id } = useParams();
|
||||||
|
const [submitLoading, setSubmitLoading] = useState(false);
|
||||||
|
const submitRequestFiles = () => {
|
||||||
|
setSubmitLoading(true);
|
||||||
|
const formData = makeFormData({
|
||||||
|
fileDiagnosis: fileDiagnosis,
|
||||||
|
fileKondisis: fileKondisi,
|
||||||
|
fileResults: fileResult
|
||||||
|
});
|
||||||
|
axios
|
||||||
|
.post('claim-requests/'+id+'/request-files', formData)
|
||||||
|
.then((response) => {
|
||||||
|
window.location.reload();
|
||||||
|
})
|
||||||
|
.catch(({ response }) => {
|
||||||
|
enqueueSnackbar(response.data.message ?? 'Something Went Wrong', { variant: 'error' });
|
||||||
|
});
|
||||||
|
}
|
||||||
|
const submitButton = requestFile?.find((dataRequestFile) => dataRequestFile.check_files === null);
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
{timeline?.map((dataTimeline, index) => (
|
||||||
|
<Timeline
|
||||||
|
sx={{
|
||||||
|
[`& .${timelineItemClasses.root}:before`]: {
|
||||||
|
flex: 0,
|
||||||
|
padding: 0,
|
||||||
|
},
|
||||||
|
}}
|
||||||
|
key={index}
|
||||||
|
>
|
||||||
|
<Typography variant="body2" gutterBottom fontWeight="bold">{dataTimeline.date ? format(new Date(dataTimeline.date), "d MMM yyyy") : ''}</Typography>
|
||||||
|
<TimelineItem>
|
||||||
|
<TimelineSeparator>
|
||||||
|
<TimelineDot />
|
||||||
|
<TimelineConnector />
|
||||||
|
</TimelineSeparator>
|
||||||
|
<TimelineContent spacing={3}>
|
||||||
|
<Card sx={{ borderRadius: '6px', paddingY: 2 }}>
|
||||||
|
<Stack sx={{marginLeft: 2, marginRight: 2, marginTop: 2 }}>
|
||||||
|
<Stack direction="row" spacing={2} sx={{marginBottom: 2, paddingBottom: 2, borderBottom: '1px solid #919EAB52' }}>
|
||||||
|
<Item1>{dataTimeline.date ? format(new Date(dataTimeline.date), "HH : mm") : ''}</Item1>
|
||||||
|
<Item2 sx={{backgroundColor: dataTimeline.txt_status_backgroundColor, color: dataTimeline.txt_status_color}}>{dataTimeline.txt_status}</Item2>
|
||||||
|
</Stack>
|
||||||
|
<Stack direction="row" spacing={2} sx={{marginBottom: 2}}>
|
||||||
|
<Typography variant="body2" gutterBottom>Detail:</Typography>
|
||||||
|
<Typography variant="body2" gutterBottom>{dataTimeline.description}</Typography>
|
||||||
|
</Stack>
|
||||||
|
{dataTimeline.status === 'reviewed' && requestFile ? (
|
||||||
|
<>
|
||||||
|
{submitButton ? (
|
||||||
|
<Typography variant="body2" gutterBottom>Request Document</Typography>
|
||||||
|
) : (
|
||||||
|
<Typography sx={{color: '#19BBBB'}} variant="body2" gutterBottom>Request Document Success Uploaded</Typography>
|
||||||
|
)}
|
||||||
|
{/* Diagnosis */}
|
||||||
|
{requestFile?.map((dataRequestFile, index) => {
|
||||||
|
if(dataRequestFile.type !== 'claim-diagnosis' || dataRequestFile.check_files !== null){
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
<Stack spacing={2} sx={{marginBottom: 2}} key={index}>
|
||||||
|
<Typography variant="body2" gutterBottom fontWeight="bold">
|
||||||
|
Diagnosis
|
||||||
|
</Typography>
|
||||||
|
<Stack
|
||||||
|
divider={<Divider orientation="horizontal" flexItem />}
|
||||||
|
spacing={1}
|
||||||
|
sx={{ marginY: 2 }}
|
||||||
|
>
|
||||||
|
{fileDiagnosis &&
|
||||||
|
fileDiagnosis.map((file, index) => (
|
||||||
|
<Stack direction="row" justifyContent={'space-between'} key={index}>
|
||||||
|
<Stack direction="row" spacing={1} sx={{color: '#19BBBB'}}>
|
||||||
|
<InsertDriveFileIcon />
|
||||||
|
<Typography variant="body2" gutterBottom>{file.name ? file.name : '-'}</Typography>
|
||||||
|
</Stack>
|
||||||
|
<Iconify
|
||||||
|
icon="eva:trash-2-outline"
|
||||||
|
color={'darkred'}
|
||||||
|
onClick={() => {
|
||||||
|
removeFileDiagnois(fileDiagnosis, index);
|
||||||
|
}}
|
||||||
|
sx={{cursor: 'pointer'}}
|
||||||
|
></Iconify>
|
||||||
|
</Stack>
|
||||||
|
))}
|
||||||
|
</Stack>
|
||||||
|
<ButtonBase
|
||||||
|
sx={{
|
||||||
|
p: 4,
|
||||||
|
border: '2px dashed #F9FAFB',
|
||||||
|
bgcolor: '#919EAB52',
|
||||||
|
borderRadius: '8px',
|
||||||
|
width: '100%',
|
||||||
|
height: '60px',
|
||||||
|
}}
|
||||||
|
onClick={() => fileRequestDocumentInputDiagnosis.current?.click()}
|
||||||
|
>
|
||||||
|
<Box
|
||||||
|
sx={{
|
||||||
|
display: 'flex',
|
||||||
|
placeItems: 'center',
|
||||||
|
gap: 1,
|
||||||
|
placeContent: 'center',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Iconify icon="icon-park-outline:upload-one" fontSize="3em" />
|
||||||
|
<Typography variant="body1" fontWeight="bold">
|
||||||
|
Add Result
|
||||||
|
</Typography>
|
||||||
|
</Box>
|
||||||
|
<input
|
||||||
|
type="file"
|
||||||
|
id={`file-${index}`}
|
||||||
|
ref={fileRequestDocumentInputDiagnosis}
|
||||||
|
style={{ display: 'none' }}
|
||||||
|
multiple
|
||||||
|
onChange={(event) => handleRequestDocumentInputChangeDiagnosis(event)}
|
||||||
|
accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel, text/plain, application/pdf"
|
||||||
|
/>
|
||||||
|
</ButtonBase>
|
||||||
|
</Stack>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
{/* Kondisi */}
|
||||||
|
{requestFile?.map((dataRequestFile, index) => {
|
||||||
|
if(dataRequestFile.type !== 'claim-kondisi' || dataRequestFile.check_files !== null){
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
<Stack spacing={2} sx={{marginBottom: 2}} key={index}>
|
||||||
|
<Typography variant="body2" gutterBottom fontWeight="bold">
|
||||||
|
Condition
|
||||||
|
</Typography>
|
||||||
|
<Stack
|
||||||
|
divider={<Divider orientation="horizontal" flexItem />}
|
||||||
|
spacing={1}
|
||||||
|
sx={{ marginY: 2 }}
|
||||||
|
>
|
||||||
|
{fileKondisi &&
|
||||||
|
fileKondisi.map((file, index) => (
|
||||||
|
<Stack direction="row" justifyContent={'space-between'} key={index}>
|
||||||
|
<Stack direction="row" spacing={1} sx={{color: '#19BBBB'}}>
|
||||||
|
<InsertDriveFileIcon />
|
||||||
|
<Typography variant="body2" gutterBottom>{file.name ? file.name : '-'}</Typography>
|
||||||
|
</Stack>
|
||||||
|
<Iconify
|
||||||
|
icon="eva:trash-2-outline"
|
||||||
|
color={'darkred'}
|
||||||
|
onClick={() => {
|
||||||
|
removeFileKondisi(fileKondisi, index);
|
||||||
|
}}
|
||||||
|
sx={{cursor: 'pointer'}}
|
||||||
|
></Iconify>
|
||||||
|
</Stack>
|
||||||
|
))}
|
||||||
|
</Stack>
|
||||||
|
<ButtonBase
|
||||||
|
sx={{
|
||||||
|
p: 4,
|
||||||
|
border: '2px dashed #F9FAFB',
|
||||||
|
bgcolor: '#919EAB52',
|
||||||
|
borderRadius: '8px',
|
||||||
|
width: '100%',
|
||||||
|
height: '60px',
|
||||||
|
}}
|
||||||
|
onClick={() => fileRequestDocumentInputKondisi.current?.click()}
|
||||||
|
>
|
||||||
|
<Box
|
||||||
|
sx={{
|
||||||
|
display: 'flex',
|
||||||
|
placeItems: 'center',
|
||||||
|
gap: 1,
|
||||||
|
placeContent: 'center',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Iconify icon="icon-park-outline:upload-one" fontSize="3em" />
|
||||||
|
<Typography variant="body1" fontWeight="bold">
|
||||||
|
Add Result
|
||||||
|
</Typography>
|
||||||
|
</Box>
|
||||||
|
<input
|
||||||
|
type="file"
|
||||||
|
id={`file-${index}`}
|
||||||
|
ref={fileRequestDocumentInputKondisi}
|
||||||
|
style={{ display: 'none' }}
|
||||||
|
multiple
|
||||||
|
onChange={(event) => handleRequestDocumentInputChangeKondisi(event)}
|
||||||
|
accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel, text/plain, application/pdf"
|
||||||
|
/>
|
||||||
|
</ButtonBase>
|
||||||
|
</Stack>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
{/* Supporting Result */}
|
||||||
|
{requestFile?.map((dataRequestFile, index) => {
|
||||||
|
if(dataRequestFile.type !== 'claim-result' || dataRequestFile.check_files !== null){
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
<Stack spacing={2} sx={{marginBottom: 2}} key={index}>
|
||||||
|
<Typography variant="body2" gutterBottom fontWeight="bold">
|
||||||
|
Supporting Result
|
||||||
|
</Typography>
|
||||||
|
<Stack
|
||||||
|
divider={<Divider orientation="horizontal" flexItem />}
|
||||||
|
spacing={1}
|
||||||
|
sx={{ marginY: 2 }}
|
||||||
|
>
|
||||||
|
{fileResult &&
|
||||||
|
fileResult.map((file, index) => (
|
||||||
|
<Stack direction="row" justifyContent={'space-between'} key={index}>
|
||||||
|
<Stack direction="row" spacing={1} sx={{color: '#19BBBB'}}>
|
||||||
|
<InsertDriveFileIcon />
|
||||||
|
<Typography variant="body2" gutterBottom>{file.name ? file.name : '-'}</Typography>
|
||||||
|
</Stack>
|
||||||
|
<Iconify
|
||||||
|
icon="eva:trash-2-outline"
|
||||||
|
color={'darkred'}
|
||||||
|
onClick={() => {
|
||||||
|
removeFileResult(fileResult, index);
|
||||||
|
}}
|
||||||
|
sx={{cursor: 'pointer'}}
|
||||||
|
></Iconify>
|
||||||
|
</Stack>
|
||||||
|
))}
|
||||||
|
</Stack>
|
||||||
|
<ButtonBase
|
||||||
|
sx={{
|
||||||
|
p: 4,
|
||||||
|
border: '2px dashed #F9FAFB',
|
||||||
|
bgcolor: '#919EAB52',
|
||||||
|
borderRadius: '8px',
|
||||||
|
width: '100%',
|
||||||
|
height: '60px',
|
||||||
|
}}
|
||||||
|
onClick={() => fileRequestDocumentInputResult.current?.click()}
|
||||||
|
>
|
||||||
|
<Box
|
||||||
|
sx={{
|
||||||
|
display: 'flex',
|
||||||
|
placeItems: 'center',
|
||||||
|
gap: 1,
|
||||||
|
placeContent: 'center',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Iconify icon="icon-park-outline:upload-one" fontSize="3em" />
|
||||||
|
<Typography variant="body1" fontWeight="bold">
|
||||||
|
Add Result
|
||||||
|
</Typography>
|
||||||
|
</Box>
|
||||||
|
<input
|
||||||
|
type="file"
|
||||||
|
id={`file-${index}`}
|
||||||
|
ref={fileRequestDocumentInputResult}
|
||||||
|
style={{ display: 'none' }}
|
||||||
|
multiple
|
||||||
|
onChange={(event) => handleRequestDocumentInputChangeResult(event)}
|
||||||
|
accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel, text/plain, application/pdf"
|
||||||
|
/>
|
||||||
|
</ButtonBase>
|
||||||
|
</Stack>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
{submitButton ? (
|
||||||
|
<LoadingButton
|
||||||
|
variant="contained"
|
||||||
|
sx={{ marginTop: 2, p: 2, backgroundColor: '#19BBBB' }}
|
||||||
|
onClick={() => {
|
||||||
|
submitRequestFiles();
|
||||||
|
}}
|
||||||
|
loading={submitLoading}
|
||||||
|
>
|
||||||
|
Submit
|
||||||
|
</LoadingButton>
|
||||||
|
) : ''}
|
||||||
|
</>
|
||||||
|
) : ''}
|
||||||
|
</Stack>
|
||||||
|
</Card>
|
||||||
|
</TimelineContent>
|
||||||
|
</TimelineItem>
|
||||||
|
</Timeline>
|
||||||
|
))}
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -313,7 +313,7 @@ export default function TableList() {
|
|||||||
action:
|
action:
|
||||||
<TableMoreMenu actions={
|
<TableMoreMenu actions={
|
||||||
<>
|
<>
|
||||||
<MenuItem>
|
<MenuItem onClick={() => navigate ('/claim/detail/'+obj.claim_request_id)}>
|
||||||
<Iconify icon="eva:eye-fill" />
|
<Iconify icon="eva:eye-fill" />
|
||||||
View
|
View
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
|
|||||||
@@ -44,7 +44,6 @@ export default function FormRequestClaim({ member, handleSubmitSuccess }: FormRe
|
|||||||
axios
|
axios
|
||||||
.post('/request-log', formData)
|
.post('/request-log', formData)
|
||||||
.then((response) => {
|
.then((response) => {
|
||||||
console.log(response);
|
|
||||||
if (response && response.data && response.data.meta) {
|
if (response && response.data && response.data.meta) {
|
||||||
enqueueSnackbar(response.data.meta.message, { variant: 'success' });
|
enqueueSnackbar(response.data.meta.message, { variant: 'success' });
|
||||||
handleSubmitSuccess();
|
handleSubmitSuccess();
|
||||||
|
|||||||
@@ -51,23 +51,16 @@ function handleChangeTab(event: React.SyntheticEvent, newValue: string) {
|
|||||||
const [data, setData] = useState([]);
|
const [data, setData] = useState([]);
|
||||||
|
|
||||||
// Download LOG
|
// Download LOG
|
||||||
async function handleDownloadLog(claimRequest:any) {
|
async function handleDownloadLog(request_log_id:any) {
|
||||||
return axios
|
return axios
|
||||||
.get(`claim-requests/${claimRequest}/log`, {
|
.get(`download-log/${request_log_id}`, {
|
||||||
responseType: 'blob',
|
responseType: 'blob',
|
||||||
})
|
})
|
||||||
.then((response) => {
|
.then((response) => {
|
||||||
window.open(URL.createObjectURL(response.data));
|
window.open(URL.createObjectURL(response.data), '_blank');
|
||||||
// setLoadingLog(false);
|
|
||||||
})
|
})
|
||||||
// .then((blobFile) => {
|
|
||||||
// new File([blobFile], 'asdads.pdf', { type: blobFile.type })
|
|
||||||
// setLoadingLog(false);
|
|
||||||
// })
|
|
||||||
.catch((response) => {
|
.catch((response) => {
|
||||||
console.log(response);
|
|
||||||
enqueueSnackbar(response.message, { variant: 'error' });
|
enqueueSnackbar(response.message, { variant: 'error' });
|
||||||
// setLoadingLog(false);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -357,13 +350,13 @@ function handleChangeTab(event: React.SyntheticEvent, newValue: string) {
|
|||||||
<Iconify icon="eva:eye-fill" />
|
<Iconify icon="eva:eye-fill" />
|
||||||
View
|
View
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
{obj.status === 'approved' ? (
|
{/* {obj.status === 'approved' ? ( */}
|
||||||
<MenuItem onClick={() => handleDownloadLog(obj.claim_request_id)}>
|
<MenuItem onClick={() => handleDownloadLog(obj.id)}>
|
||||||
<Iconify icon="eva:download-fill" />
|
<Iconify icon="eva:download-fill" />
|
||||||
Download LOG
|
Download LOG
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
):''}
|
{/* ):''} */}
|
||||||
{obj.final_log === 0 ? (
|
{obj.final_log === 0 && obj.status === 'approved' ? (
|
||||||
<MenuItem onClick={() => handleRequestFinalLog(obj.id, obj.full_name, obj.no_polis, obj.submission_date) }>
|
<MenuItem onClick={() => handleRequestFinalLog(obj.id, obj.full_name, obj.no_polis, obj.submission_date) }>
|
||||||
<Iconify icon="fa:file-text" />
|
<Iconify icon="fa:file-text" />
|
||||||
Request Final LOG
|
Request Final LOG
|
||||||
|
|||||||
@@ -355,7 +355,7 @@ export default function TableListFinalLog() {
|
|||||||
Download LOG
|
Download LOG
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
):''}
|
):''}
|
||||||
{!obj.check_claim ? (
|
{!obj.check_claim && obj.status === 'approved' ? (
|
||||||
<MenuItem onClick={() => handleRequestClaimSubmit(obj.member_id, obj.service_code, obj.id, obj.full_name, obj.no_polis, obj.submission_date) }>
|
<MenuItem onClick={() => handleRequestClaimSubmit(obj.member_id, obj.service_code, obj.id, obj.full_name, obj.no_polis, obj.submission_date) }>
|
||||||
<Iconify icon="fa:file-text" />
|
<Iconify icon="fa:file-text" />
|
||||||
Submit Claim
|
Submit Claim
|
||||||
|
|||||||
268
resources/views/pdf/req_log_page_1.blade.php
Normal file
268
resources/views/pdf/req_log_page_1.blade.php
Normal file
@@ -0,0 +1,268 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<style>
|
||||||
|
.triangle1 {
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
border-left: 10.24px solid transparent;
|
||||||
|
border-right: 318.24px solid transparent;
|
||||||
|
border-bottom: 75.5px solid #008C8C;
|
||||||
|
position: absolute;
|
||||||
|
top: -55.12px;
|
||||||
|
left: -60.91px;
|
||||||
|
transform: rotate(-12deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.triangle2 {
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
border-left: 10.24px solid transparent;
|
||||||
|
border-right: 550.24px solid transparent;
|
||||||
|
border-bottom: 110.5px solid #19BBBB;
|
||||||
|
position: absolute;
|
||||||
|
top: -55.12px;
|
||||||
|
left: -100.91px;
|
||||||
|
transform: rotate(-20deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
height: 100vh;
|
||||||
|
background-color: #ffffff; /* Ganti dengan warna latar belakang yang diinginkan */
|
||||||
|
}
|
||||||
|
.content {
|
||||||
|
padding: 20px;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content img {
|
||||||
|
width: 25%;
|
||||||
|
max-width: 600px; /* batasan lebar maksimum gambar */
|
||||||
|
margin-top: 20px; /* jarak antara segitiga dan gambar */
|
||||||
|
}
|
||||||
|
.corner-text {
|
||||||
|
font-family: 'Calibri', sans-serif;
|
||||||
|
font-size: 14px;
|
||||||
|
color: #666666;
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
|
||||||
|
.top-right {
|
||||||
|
top: 10px;
|
||||||
|
right: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bottom-right {
|
||||||
|
bottom: 10px;
|
||||||
|
right: 10px;
|
||||||
|
}
|
||||||
|
.bottom-left {
|
||||||
|
bottom: 10px;
|
||||||
|
left: 10px;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
.title-container {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
text-align: center;
|
||||||
|
position: relative;
|
||||||
|
margin-top: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
font-family: 'Calibri', sans-serif;
|
||||||
|
font-size: 18px;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.additional-text {
|
||||||
|
font-family: 'Calibri', sans-serif;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
.claim-info {
|
||||||
|
font-family: 'Calibri', sans-serif;
|
||||||
|
font-size: 14px;
|
||||||
|
/* color: #008C8C; */
|
||||||
|
text-align: left;
|
||||||
|
margin-top: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
table {
|
||||||
|
width: 100%;
|
||||||
|
border-collapse: collapse;
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
table, th, td {
|
||||||
|
/* border: 1px solid #008C8C; */
|
||||||
|
}
|
||||||
|
|
||||||
|
th, td {
|
||||||
|
padding: 4px;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
.hot-line {
|
||||||
|
font-family: 'Calibri', sans-serif;
|
||||||
|
background-color: #048B8C;
|
||||||
|
text-align: center;
|
||||||
|
align-items: center;
|
||||||
|
font-size: 14px;
|
||||||
|
margin-top: 10px;
|
||||||
|
padding: 2px;
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
.txt-tindakan {
|
||||||
|
font-family: 'Calibri', sans-serif;
|
||||||
|
margin-top: 10px;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
.txt-pernyataan {
|
||||||
|
font-family: 'Calibri', sans-serif;
|
||||||
|
margin-top: 40px;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="triangle2"></div>
|
||||||
|
<div class="triangle1"></div>
|
||||||
|
<div class="content">
|
||||||
|
<div class="corner-text top-right">
|
||||||
|
The Future Of Healthcare At Your Fingertips
|
||||||
|
</div>
|
||||||
|
<img src="data:image/png;base64,{{ base64_encode(file_get_contents( public_path('images/logo-default.png') )) }}">
|
||||||
|
<div class="title-container">
|
||||||
|
<div class="title">
|
||||||
|
<b>SURAT JAMINAN</b>
|
||||||
|
</div>
|
||||||
|
<div class="additional-text">
|
||||||
|
(SURAT JAMINAN INI HARUS DITANDATANGANI OLEH PASIEN)
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<table class="claim-info">
|
||||||
|
<tr>
|
||||||
|
<td style="width: 20%;">No. Klaim</td>
|
||||||
|
<td style="width: 1%;">:</td>
|
||||||
|
<td style="width: 29%;">{{$request_logs->code}}</td>
|
||||||
|
<td style="width: 20%;">Tanggal</td>
|
||||||
|
<td style="width: 1%;">:</td>
|
||||||
|
<td style="width: 29%;">{{ \Carbon\Carbon::parse($request_logs->submission_date)->format('d M Y') }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Kepada</td>
|
||||||
|
<td>:</td>
|
||||||
|
<td>{{ $dataMember->name }}</td>
|
||||||
|
<td>Plan Polis</td>
|
||||||
|
<td>:</td>
|
||||||
|
<td>{{ $dataMember->code_plan }}</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<div class="hot-line">
|
||||||
|
(HOT LINE LINK SEHAT)
|
||||||
|
</div>
|
||||||
|
<div class="txt-tindakan">
|
||||||
|
Link Sehat bertindak mewakili perusahaan asuransi/penanggung untuk mengeluarkan Surat Jaminan Awal untuk peserta dibawah ini :
|
||||||
|
</div>
|
||||||
|
<table class="claim-info">
|
||||||
|
<tr>
|
||||||
|
<td style="width: 20%;">Jenis Surat Jaminan</td>
|
||||||
|
<td style="width: 1%;">:</td>
|
||||||
|
<td style="width: 29%;"><b>SURAT JAMINAN AWAL</b></td>
|
||||||
|
<td style="width: 20%;">Penjamin</td>
|
||||||
|
<td style="width: 1%;">:</td>
|
||||||
|
<td style="width: 29%;">{{ $dataMember->penjamin }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Nama Peserta</td>
|
||||||
|
<td>:</td>
|
||||||
|
<td>{{ $dataMember->name }}</td>
|
||||||
|
<td>Nama Perusahaan</td>
|
||||||
|
<td>:</td>
|
||||||
|
<td>{{ $dataMember->nama_perusahaan }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Nama Karyawan</td>
|
||||||
|
<td>:</td>
|
||||||
|
<td>{{ $namaKaryawan }}</td>
|
||||||
|
<td>No. Polis</td>
|
||||||
|
<td>:</td>
|
||||||
|
<td>{{ $dataMember->code_plan }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Tanggal Lahir</td>
|
||||||
|
<td>:</td>
|
||||||
|
<td>{{ \Carbon\Carbon::parse($dataMember->birth_date)->format('d M Y') }}</td>
|
||||||
|
<td>Produk</td>
|
||||||
|
<td>:</td>
|
||||||
|
<td>{{ $dataMember->no_polis }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Jenis Kelamin</td>
|
||||||
|
<td>:</td>
|
||||||
|
<td>{{ $dataMember->gender == 'male' ? 'Laki-Laki' : 'Perempuan' }}</td>
|
||||||
|
<td>Tipe</td>
|
||||||
|
<td>:</td>
|
||||||
|
<td>{{ $dataMember->limit_rules == '999999999' ? 'As Charge' : 'Max Amount, Rp '.number_format($dataMember->limit_rules, 2, ',', '.') }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Member ID</td>
|
||||||
|
<td>:</td>
|
||||||
|
<td>{{ $dataMember->member_id }}</td>
|
||||||
|
<td>Status Polis</td>
|
||||||
|
<td>:</td>
|
||||||
|
<td>{{ $dataMember->status_polis == 'active' ? 'Aktif' : 'Tidak Aktif' }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Identitas Peserta</td>
|
||||||
|
<td>:</td>
|
||||||
|
<td>{{ $dataMember->nik }}</td>
|
||||||
|
<td>Tanggal Mulai Akhir</td>
|
||||||
|
<td>:</td>
|
||||||
|
<td>{{ \Carbon\Carbon::parse($dataMember->mulai)->format('d M Y') }} - {{ \Carbon\Carbon::parse($dataMember->akhir)->format('d M Y') }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Hak Kamar Pasien</td>
|
||||||
|
<td>:</td>
|
||||||
|
<td></td>
|
||||||
|
<td>Mata Uang</td>
|
||||||
|
<td>:</td>
|
||||||
|
<td>{{ $dataMember->mata_uang }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Tanggal Pembayaran</td>
|
||||||
|
<td>:</td>
|
||||||
|
<td></td>
|
||||||
|
<td>Rumah Sakit</td>
|
||||||
|
<td>:</td>
|
||||||
|
<td></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td></td>
|
||||||
|
<td></td>
|
||||||
|
<td></td>
|
||||||
|
<td>Alamat</td>
|
||||||
|
<td>:</td>
|
||||||
|
<td></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<div class="txt-pernyataan">
|
||||||
|
Surat Jaminan ini dinyatakan berlaku apabila disertai surat jaminan akhir dengan nominal yang tertera pada akhir perawatan.
|
||||||
|
</div>
|
||||||
|
<div class="corner-text bottom-right">
|
||||||
|
The Future Of Healthcare At Your Fingertips
|
||||||
|
</div>
|
||||||
|
<div class="corner-text bottom-left">
|
||||||
|
<b>PT Link Medis Sehat</b><br>
|
||||||
|
<b>Primaya Hospital Corporate</b><br>
|
||||||
|
Graha Cempaka Mas Blok D5-6<br>
|
||||||
|
Jl. Let. Jend. Suprapto, Jakarta Pusat 10640, Indonesia<br>
|
||||||
|
<b>Telp</b> (021) 4217746/47
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
254
resources/views/pdf/req_log_page_2.blade.php
Normal file
254
resources/views/pdf/req_log_page_2.blade.php
Normal file
@@ -0,0 +1,254 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<style>
|
||||||
|
.triangle1 {
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
border-left: 10.24px solid transparent;
|
||||||
|
border-right: 318.24px solid transparent;
|
||||||
|
border-bottom: 75.5px solid #008C8C;
|
||||||
|
position: absolute;
|
||||||
|
top: -55.12px;
|
||||||
|
left: -60.91px;
|
||||||
|
transform: rotate(-12deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.triangle2 {
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
border-left: 10.24px solid transparent;
|
||||||
|
border-right: 550.24px solid transparent;
|
||||||
|
border-bottom: 110.5px solid #19BBBB;
|
||||||
|
position: absolute;
|
||||||
|
top: -55.12px;
|
||||||
|
left: -100.91px;
|
||||||
|
transform: rotate(-20deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
height: 100vh;
|
||||||
|
background-color: #ffffff; /* Ganti dengan warna latar belakang yang diinginkan */
|
||||||
|
}
|
||||||
|
.content {
|
||||||
|
padding: 20px;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content img {
|
||||||
|
width: 25%;
|
||||||
|
max-width: 600px; /* batasan lebar maksimum gambar */
|
||||||
|
margin-top: 20px; /* jarak antara segitiga dan gambar */
|
||||||
|
}
|
||||||
|
.corner-text {
|
||||||
|
font-family: 'Calibri', sans-serif;
|
||||||
|
font-size: 14px;
|
||||||
|
color: #666666;
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
|
||||||
|
.top-right {
|
||||||
|
top: 10px;
|
||||||
|
right: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bottom-right {
|
||||||
|
bottom: 10px;
|
||||||
|
right: 10px;
|
||||||
|
}
|
||||||
|
.bottom-right-ttd {
|
||||||
|
color: #000000;
|
||||||
|
bottom: 120px;
|
||||||
|
right: 10px;
|
||||||
|
}
|
||||||
|
.bottom-left {
|
||||||
|
bottom: 10px;
|
||||||
|
left: 10px;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
.bottom-left-ttd {
|
||||||
|
color: #000000;
|
||||||
|
bottom: 120px;
|
||||||
|
left: 10px;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bottom-left-ttd-1 {
|
||||||
|
color: #000000;
|
||||||
|
bottom: 250px;
|
||||||
|
left: 10px;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
.title-container-page {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
text-align: center;
|
||||||
|
position: relative;
|
||||||
|
margin-top: 40px;
|
||||||
|
border: 1px solid; /* Warna garis tepi dan lebar dapat disesuaikan */
|
||||||
|
padding: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
font-family: 'Calibri', sans-serif;
|
||||||
|
font-size: 18px;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.additional-text {
|
||||||
|
font-family: 'Calibri', sans-serif;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
.claim-info {
|
||||||
|
font-family: 'Calibri', sans-serif;
|
||||||
|
font-size: 12px;
|
||||||
|
/* color: #008C8C; */
|
||||||
|
text-align: left;
|
||||||
|
margin-top: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
table {
|
||||||
|
width: 100%;
|
||||||
|
border-collapse: collapse;
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
table, th, td {
|
||||||
|
/* border: 1px solid #008C8C; */
|
||||||
|
}
|
||||||
|
|
||||||
|
th, td {
|
||||||
|
padding: 4px;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
.hot-line {
|
||||||
|
font-family: 'Calibri', sans-serif;
|
||||||
|
background-color: #048B8C;
|
||||||
|
text-align: center;
|
||||||
|
align-items: center;
|
||||||
|
font-size: 14px;
|
||||||
|
margin-top: 10px;
|
||||||
|
padding: 2px;
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
.txt-tindakan {
|
||||||
|
font-family: 'Calibri', sans-serif;
|
||||||
|
margin-top: 10px;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
.txt-pernyataan {
|
||||||
|
font-family: 'Calibri', sans-serif;
|
||||||
|
margin-top: 40px;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
.txt-syarat {
|
||||||
|
font-family: 'Calibri', sans-serif;
|
||||||
|
font-size: 14px;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
container {
|
||||||
|
position: relative;
|
||||||
|
height: 100vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
.left-bottom {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 10px;
|
||||||
|
left: 10px;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.right-bottom {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 10px;
|
||||||
|
right: 10px;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="triangle2"></div>
|
||||||
|
<div class="triangle1"></div>
|
||||||
|
<div class="content">
|
||||||
|
<div class="corner-text top-right">
|
||||||
|
The Future Of Healthcare At Your Fingertips
|
||||||
|
</div>
|
||||||
|
<img src="data:image/png;base64,{{ base64_encode(file_get_contents( public_path('images/logo-default.png') )) }}">
|
||||||
|
<div class="title-container-page">
|
||||||
|
<div class="txt-syarat">SYARAT DAN KETENTUAN</div>
|
||||||
|
<table class="claim-info">
|
||||||
|
<tr>
|
||||||
|
<td style="width: 100%;">1. Surat jaminan ini hanya berlaku untuk diagnosa yang tercantum diatas.
|
||||||
|
Apabila ditemukan adanya perubahan atau penambahan diagnosa, maka Link Sehat berhak membatalkan surat jaminan.
|
||||||
|
Mohon untuk menghubungi Link Sehat apabila ada perubahan diagnosa dan diagnosa tambahan.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td style="width: 100%;">2. Surat jaminan ini dinyatakan berlaku apabila disertai surat jaminan akhir dengan
|
||||||
|
nominal yang tertera pada kolom diatas.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td style="width: 100%;">3. Surat jaminan ini tidak berlaku untuk biaya diluar medis seperti makan/minum
|
||||||
|
diluar ketentuan, tagihan telepon, binatu, dan lain-lain. Mohon ditagihkan langsung kepeserta.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td style="width: 100%;">4. Rumah sakit harap segera menghubungi Link Sehat apabila biaya rumah sakit melebihi batas tertanggung diatas.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td style="width: 100%;">5. Rumah sakit wajib menghubungi Link Sehat sebelum pasien meninggalkan rumah sakit
|
||||||
|
dapat menghubungi biaya apa saja yang dijamin oleh Link Sehat. Jika peserta meninggalkan rumah sakit sebelum mengkonfirmasikan ke Link Sehat,
|
||||||
|
maka Link Sehat tidak bertanggung jawab atas biaya yang tidak dijamin oleh pihak asuransi.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td style="width: 100%;">6. Peserta bertanggung jawab untuk menyelesaikan secara langsung kepada pihak rumah sakit dan penyedia jasa medis
|
||||||
|
apabila terjadi selisih biaya (ekses) atas seluruh biaya perawatan, biaya medis, dan yang lain yang telah terjadi sehubungan
|
||||||
|
dengan rawat inap, maupun atas perihal perawatan medis yang tidak tercakup dalam polis asuransi dikarenakan karena alasan apapun.
|
||||||
|
Apabila biaya-biaya tersebut telah dijamin oleh Link Sehat atas nama nasabah, maka peserta akan membayar kembali ke pihak Link Sehat
|
||||||
|
secara penuh termasuk biaya berhubungan dengan penagihan (apabila ada) yang terjadi ke pihak Link Sehat atas biaya yang tidak termasuk dalam manfaat polis.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td style="width: 100%;">7. Dengan ini perserta menyatakan mengetahui dan menyetujui ketentuan selisih biaya yang telah disebutkan diatas.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td style="width: 100%;">8. Dalam hal surat jaminan ini tidak ditandatangani oleh peserta yang bersangkutan maka rumah sakit berkewajiban untuk menyampaikan keadaan tersebut
|
||||||
|
kepada Link Sehat dalam kurun waktu paling lambat 1x24 jam, dalam hal tidak ada perubahan dalam jangka waktu yang telah ditentukan tersebut
|
||||||
|
maka dianggap peserta yang bersangkutan telah setuju dengan ketentuan yang terdapat dalam surat jaminan ini.</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<!-- <div class="container">
|
||||||
|
<div class="left-bottom">
|
||||||
|
Hormat Kami,<br>
|
||||||
|
Acknowledged,<br>
|
||||||
|
[Nama Analyst]
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
</div> -->
|
||||||
|
<div class="corner-text bottom-left-ttd-1">
|
||||||
|
Hormat Kami,<br>
|
||||||
|
Acknowledged,
|
||||||
|
</div>
|
||||||
|
<div class="corner-text bottom-left-ttd">
|
||||||
|
[..................................................]
|
||||||
|
</div>
|
||||||
|
<div class="corner-text bottom-right-ttd">
|
||||||
|
[{{ $dataMember->name }}]
|
||||||
|
</div>
|
||||||
|
<div class="corner-text bottom-right">
|
||||||
|
The Future Of Healthcare At Your Fingertip
|
||||||
|
</div>
|
||||||
|
<div class="corner-text bottom-left">
|
||||||
|
<b>PT Link Medis Sehat</b><br>
|
||||||
|
<b>Primaya Hospital Corporate</b><br>
|
||||||
|
Graha Cempaka Mas Blok D5-6<br>
|
||||||
|
Jl. Let. Jend. Suprapto, Jakarta Pusat 10640, Indonesia<br>
|
||||||
|
<b>Telp</b> (021) 4217746/47
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
37
resources/views/pdf/view.blade.php
Normal file
37
resources/views/pdf/view.blade.php
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
<!-- your/view.blade.php -->
|
||||||
|
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Ivan Julian</title>
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1, p {
|
||||||
|
/* Gaya teks Anda */
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
opacity: 0.3; /* Sesuaikan dengan tingkat kecerahan yang diinginkan */
|
||||||
|
z-index: -1; /* Letakkan gambar di belakang konten lain */
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<!-- Sisipkan gambar sebagai elemen img -->
|
||||||
|
<img src="{{public_path('images/logo-linksehat-vertical-default.png')}}" width="100px">
|
||||||
|
|
||||||
|
<!-- Konten HTML -->
|
||||||
|
<h1>Hello, {{ $key }}</h1>
|
||||||
|
<p>This is a simple example for generating PDF in Laravel using Dompdf.</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
Reference in New Issue
Block a user