Merge branch 'staging' of https://dev.sismedika.online/febio/aso into staging

This commit is contained in:
2023-12-28 15:51:11 +07:00
13 changed files with 1181 additions and 19 deletions

View File

@@ -10,6 +10,8 @@ use Illuminate\Support\Facades\DB;
use Modules\Internal\Http\Controllers\Api\RequestLogController as primeCenterRequestLog;
use App\Helpers\Helper;
use App\Models\File;
use Dompdf\Dompdf;
use Dompdf\Options;
class RequestLogController extends Controller
{
@@ -99,6 +101,7 @@ class RequestLogController extends Controller
})
->select(
'request_logs.id',
'request_logs.member_id',
'request_logs.final_log',
'request_logs.code',
'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);
}
}

View File

@@ -54,6 +54,7 @@ Route::prefix('v1')->group(function() {
Route::get('get-request-log', 'getRequestLog');
Route::get('get-final-log', 'getFinalLog');
Route::post('request-final-log', 'requestFinalLog');
Route::get('download-log/{request_log_id}', 'downlodLog');
});
//Notification
Route::controller(NotificationController::class)->group(function() {

View File

@@ -98,8 +98,8 @@ export default function Router() {
element: <Claim />,
},
{
path: '/detail/:id',
element: <DetailClaimReport />,
path: '/claim/detail/:id',
element: <DetailClaim />,
},
],
},
@@ -126,3 +126,4 @@ const Claim = Loadable(lazy(() => import('@/pages/Claim')));
const NotFound = Loadable(lazy(() => import('@/pages/Page404')));
const DetailClaimReport = Loadable(lazy(()=> import('@/sections/dashboard/Detail')));
const DetailClaim = Loadable(lazy(()=> import('@/sections/claim/Detail')));

View 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>
);
}

View File

@@ -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>
);
}

View 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>
))}
</>
);
}

View File

@@ -313,7 +313,7 @@ export default function TableList() {
action:
<TableMoreMenu actions={
<>
<MenuItem>
<MenuItem onClick={() => navigate ('/claim/detail/'+obj.claim_request_id)}>
<Iconify icon="eva:eye-fill" />
View
</MenuItem>

View File

@@ -44,7 +44,6 @@ export default function FormRequestClaim({ member, handleSubmitSuccess }: FormRe
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();

View File

@@ -51,23 +51,16 @@ function handleChangeTab(event: React.SyntheticEvent, newValue: string) {
const [data, setData] = useState([]);
// Download LOG
async function handleDownloadLog(claimRequest:any) {
async function handleDownloadLog(request_log_id:any) {
return axios
.get(`claim-requests/${claimRequest}/log`, {
.get(`download-log/${request_log_id}`, {
responseType: 'blob',
})
.then((response) => {
window.open(URL.createObjectURL(response.data));
// setLoadingLog(false);
window.open(URL.createObjectURL(response.data), '_blank');
})
// .then((blobFile) => {
// new File([blobFile], 'asdads.pdf', { type: blobFile.type })
// setLoadingLog(false);
// })
.catch((response) => {
console.log(response);
enqueueSnackbar(response.message, { variant: 'error' });
// setLoadingLog(false);
});
}
@@ -357,13 +350,13 @@ function handleChangeTab(event: React.SyntheticEvent, newValue: string) {
<Iconify icon="eva:eye-fill" />
View
</MenuItem>
{obj.status === 'approved' ? (
<MenuItem onClick={() => handleDownloadLog(obj.claim_request_id)}>
{/* {obj.status === 'approved' ? ( */}
<MenuItem onClick={() => handleDownloadLog(obj.id)}>
<Iconify icon="eva:download-fill" />
Download LOG
</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) }>
<Iconify icon="fa:file-text" />
Request Final LOG

View File

@@ -355,7 +355,7 @@ export default function TableListFinalLog() {
Download LOG
</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) }>
<Iconify icon="fa:file-text" />
Submit Claim

View 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>

View 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.&nbsp;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.&nbsp;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.&nbsp;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.&nbsp;Rumah sakit harap segera menghubungi Link Sehat apabila biaya rumah sakit melebihi batas tertanggung diatas.</td>
</tr>
<tr>
<td style="width: 100%;">5.&nbsp;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.&nbsp;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.&nbsp;Dengan ini perserta menyatakan mengetahui dan menyetujui ketentuan selisih biaya yang telah disebutkan diatas.</td>
</tr>
<tr>
<td style="width: 100%;">8.&nbsp;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>

View 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>