send email dan daily monitoring

This commit is contained in:
2023-12-25 09:52:03 +07:00
parent 40371bd53a
commit 5a439922d9
7 changed files with 233 additions and 14 deletions

View File

@@ -20,6 +20,7 @@ use Modules\Internal\Services\MemberEnrollmentService;
use PDF; use PDF;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\File;
class CorporateMemberController extends Controller class CorporateMemberController extends Controller
{ {
@@ -393,4 +394,36 @@ class CorporateMemberController extends Controller
"file_url" => url('files/CorporateMembershipList.xlsx') "file_url" => url('files/CorporateMembershipList.xlsx')
]); ]);
} }
public function sendAllECard(Request $request, $corporate_id){
$members = DB::table('members')
->leftJoin('corporate_employees', 'members.id', '=', 'corporate_employees.member_id')
->where('corporate_employees.corporate_id', $corporate_id)
->get()
->toArray();
foreach($members as $member){
$pdf = PDF::loadView('pdf.ecard', compact(['member']));
// Simpan file PDF ke direktori yang diinginkan
$pdfPath = storage_path('app/pdf/ecards/E-card-' . $member->name . '.pdf');
// Cek apakah file sudah ada
if (!File::exists($pdfPath)) {
$pdf = PDF::loadView('pdf.ecard', compact('member'));
$pdf->save($pdfPath);
}
$dataEmail = [
'email' => $member->email,
'name' => $member->name,
'subject' => 'Digital E Card '. $member->name,
'body' => '<h1>Hi ' . $member->name . '</h1>',
'attach' => $pdfPath,
];
$sendEmail = Helper::sendEmailattachData($dataEmail);
}
return true;
}
} }

View File

@@ -68,7 +68,7 @@ class DailyMonitoringController extends Controller
$claimList = DB::table('request_logs') $claimList = DB::table('request_logs')
->leftJoin('services', 'services.code', '=', 'request_logs.service_code') ->leftJoin('services', 'services.code', '=', 'request_logs.service_code')
->leftJoin('members', 'members.id', '=', 'request_logs.member_id') ->leftJoin('members', 'members.id', '=', 'request_logs.member_id')
->select('request_logs.id','request_logs.submission_date AS admission_date','request_logs.discharge_date','request_logs.code','services.name as service_name','request_logs.status','members.name',) ->select('request_logs.id','request_logs.submission_date AS admission_date','request_logs.discharge_date','request_logs.code','services.name as service_name','request_logs.status','members.name', 'members.member_id')
->where('request_logs.service_code', 'IP') ->where('request_logs.service_code', 'IP')
->where('request_logs.status_final_log', 'approved') ->where('request_logs.status_final_log', 'approved')
->where("request_logs.member_id", "=", $memberDetail->id) ->where("request_logs.member_id", "=", $memberDetail->id)

View File

@@ -284,6 +284,8 @@ Route::prefix('internal')->group(function () {
Route::resource('doctors', DoctorController::class); Route::resource('doctors', DoctorController::class);
Route::post('generate-log/{member_id}', [CorporateMemberController::class, 'generateLog']); Route::post('generate-log/{member_id}', [CorporateMemberController::class, 'generateLog']);
Route::post('send_card/{corporate_id}', [CorporateMemberController::class, 'sendAllECard']);
Route::controller(ClaimRequestController::class)->group(function () { Route::controller(ClaimRequestController::class)->group(function () {
Route::post('files-mcu', 'filesMcu'); Route::post('files-mcu', 'filesMcu');
}); });

View File

@@ -317,7 +317,6 @@ class Helper
{ {
// Buat instance PHPMailer // Buat instance PHPMailer
$mail = new PHPMailer(true); $mail = new PHPMailer(true);
try { try {
// Server settings // Server settings
$mail->isSMTP(); $mail->isSMTP();
@@ -341,8 +340,46 @@ class Helper
// Kirim email // Kirim email
$mail->send(); $mail->send();
return true; return true;
} catch (\Exception $e) { } catch (\Exception $e) {
//var_dump($mail->ErrorInfo);die(); dd($e);
return ($mail->ErrorInfo);
return false;
}
}
public static function sendEmailattachData($data = array())
{
// Buat instance PHPMailer
$mail = new PHPMailer(true);
try {
// Server settings
$mail->isSMTP();
$mail->Host = 'smtp.gmail.com';
$mail->SMTPAuth = true;
$mail->Username = env('EMAIL');
$mail->Password = env('PW_EMAIL');
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 465;
$mail->SMTPSecure = "ssl";
// Penerima email
$mail->setFrom(env('EMAIL'), env('NAME_EMAIL'));
$mail->addAddress($data['email'], $data['name']);
// Konten email
$mail->isHTML(true);
$mail->Subject = $data['subject'];
$mail->Body = $data['body'];
$mail->addAttachment($data['attach'], 'e-card.pdf');
// Kirim email
$mail->send();
return true;
} catch (\Exception $e) {
dd($mail->ErrorInfo);
return ($mail->ErrorInfo);
return false; return false;
} }
} }

View File

@@ -89,11 +89,11 @@ export default function ClaimListRow ({ ...props }: Props) {
<Stack direction="row" justifyContent="flex-end" spacing={1}> <Stack direction="row" justifyContent="flex-end" spacing={1}>
<TableMoreMenu actions={ <TableMoreMenu actions={
<> <>
<MenuItem onClick={() => navigate(`/case_management/daily_monitoring/${props.row.member_id}/claims/${props.row.claim_code}/list_monitoring`)}> <MenuItem onClick={() => navigate(`/case_management/daily_monitoring/${props.row.member_id}/claims/${props.row.code}/list_monitoring`)}>
<Visibility /> <Visibility />
View View
</MenuItem> </MenuItem>
<MenuItem onClick={() => navigate(`/case_management/daily_monitoring/${props.row.member_id}/claims/${props.row.claim_code}/add_monitoring`)}> <MenuItem onClick={() => navigate(`/case_management/daily_monitoring/${props.row.member_id}/claims/${props.row.code}/add_monitoring`)}>
<AddIcon /> <AddIcon />
Daily Monitoring Daily Monitoring
</MenuItem> </MenuItem>

View File

@@ -4,7 +4,7 @@
*/ */
import { useFieldArray, useForm } from 'react-hook-form'; import { useFieldArray, useForm } from 'react-hook-form';
import { useNavigate, useParams } from 'react-router-dom'; import { useNavigate, useParams } from 'react-router-dom';
import { Box, IconButton, Typography, Grid, Card, Button } from '@mui/material'; import { Box, IconButton, Typography, Grid, Card, Button, ButtonBase } from '@mui/material';
import { LoadingButton } from "@mui/lab"; import { LoadingButton } from "@mui/lab";
/** /**
@@ -28,11 +28,16 @@ import RemoveIcon from '@mui/icons-material/Remove';
*/ */
import { AddMonitoringDetail } from '../Model/Functions'; import { AddMonitoringDetail } from '../Model/Functions';
import { DetailMonitoringListType} from '../Model/Types'; import { DetailMonitoringListType} from '../Model/Types';
import FormCreateFilesUpload from '@/pages/CustomerService/FinalLog/Components/FormCreateFilesUpload';
import MultiFilePreview from '@/components/upload/MultiFilePreview';
import Iconify from '@/components/Iconify';
import { useRef } from 'react';
export default function DetailMonitoringList() { export default function DetailMonitoringList() {
const { member_id, claim_code } = useParams(); const { member_id, claim_code } = useParams();
const navigate = useNavigate() const navigate = useNavigate()
const pageTitle = claim_code??'_ _ _ _'; const pageTitle = claim_code??'_ _ _ _';
const fileInput = useRef<HTMLInputElement>(null);
// setup form // setup form
// ==================================== // ====================================
@@ -50,6 +55,9 @@ export default function DetailMonitoringList() {
medical_plan : [{ medical_plan : [{
medical_plan_str: '' medical_plan_str: ''
}], }],
non_medikamentosa_plan : [{
non_medikamentosa_plan_str: ''
}],
created_at : '' created_at : ''
}; };
@@ -57,9 +65,37 @@ export default function DetailMonitoringList() {
defaultValues defaultValues
}); });
const {fields, append, remove} = useFieldArray({name: 'medical_plan',control: methods.control}) const {fields: fields1, append: append1, remove: remove1} = useFieldArray({name: 'medical_plan',control: methods.control})
const {fields: fields2, append: append2, remove: remove2} = useFieldArray({name: 'non_medikamentosa_plan',control: methods.control})
const { handleSubmit, reset, formState: { isDirty, isSubmitting } } = methods; const { handleSubmit, reset, watch, setValue, formState: { isDirty, isSubmitting } } = methods;
const formValues = watch();
// Handle File Input
// =====================================
const handleInputChange = (event: any) => {
if (event.target.files[0]) {
let arr_lab_result_file = formValues.lab_result_file;
arr_lab_result_file.push(event.target.files[0]);
setValue('lab_result_file', arr_lab_result_file)
}
else {
console.log('NO FILE');
}
};
// Handle Remove File
// =====================================
const handleRemoveFile = (target_index: number) => {
let arr_lab_result_file = formValues.lab_result_file.filter((file: any, index: number) =>{
if (target_index !== index) {
return file;
}
});
setValue('lab_result_file', arr_lab_result_file)
};
// Submit Form // Submit Form
// ===================================== // =====================================
@@ -197,7 +233,7 @@ export default function DetailMonitoringList() {
</Grid> </Grid>
{/* Complaints */} {/* Complaints */}
<Grid item xs={12}> {/* <Grid item xs={12}>
<Grid container spacing={3}> <Grid container spacing={3}>
<Grid item xs={12}> <Grid item xs={12}>
<Typography variant="body1" component="div"> <Typography variant="body1" component="div">
@@ -212,7 +248,7 @@ export default function DetailMonitoringList() {
/> />
</Grid> </Grid>
</Grid> </Grid>
</Grid> </Grid> */}
{/* Analysis */} {/* Analysis */}
<Grid item xs={12}> <Grid item xs={12}>
@@ -242,7 +278,7 @@ export default function DetailMonitoringList() {
</Grid> </Grid>
<Grid item xs={12}> <Grid item xs={12}>
{ {
fields.map((field,index) => { fields1.map((field,index) => {
return ( return (
<Grid key={field.id} container sx={{ mb: 3 }}> <Grid key={field.id} container sx={{ mb: 3 }}>
<Grid item xs={11}> <Grid item xs={11}>
@@ -253,10 +289,10 @@ export default function DetailMonitoringList() {
/> />
</Grid> </Grid>
{ {
index == (fields.length-1) ? index == (fields1.length-1) ?
( (
<Grid item xs={1} sx={{ textAlign: 'center' }}> <Grid item xs={1} sx={{ textAlign: 'center' }}>
<IconButton size='large' color='primary' onClick={() => append({medical_plan_str: ''})}> <IconButton size='large' color='primary' onClick={() => append1({medical_plan_str: ''})}>
<AddIcon /> <AddIcon />
</IconButton> </IconButton>
</Grid> </Grid>
@@ -264,7 +300,7 @@ export default function DetailMonitoringList() {
: :
( (
<Grid item xs={1} sx={{ textAlign: 'center' }}> <Grid item xs={1} sx={{ textAlign: 'center' }}>
<IconButton size='large' color='error' onClick={() => remove(index)}> <IconButton size='large' color='error' onClick={() => remove1(index)}>
<RemoveIcon /> <RemoveIcon />
</IconButton> </IconButton>
</Grid> </Grid>
@@ -278,6 +314,110 @@ export default function DetailMonitoringList() {
</Grid> </Grid>
</Grid> </Grid>
{/* Non Medikamentosa Plan* */}
<Grid item xs={12}>
<Grid container spacing={3}>
<Grid item xs={12}>
<Typography variant="body1" component="div">
Non Medikamentosa Plan* :
</Typography>
</Grid>
<Grid item xs={12}>
{
fields2.map((field,index) => {
return (
<Grid key={field.id} container sx={{ mb: 3 }}>
<Grid item xs={11}>
<RHFTextField
id="analysis"
name={`non_medikamentosa_plan.${index}.non_medikamentosa_plan_str`}
placeholder='Non Medikamentosa'
/>
</Grid>
{
index == (fields2.length-1) ?
(
<Grid item xs={1} sx={{ textAlign: 'center' }}>
<IconButton size='large' color='primary' onClick={() => append2({non_medikamentosa_plan_str: ''})}>
<AddIcon />
</IconButton>
</Grid>
)
:
(
<Grid item xs={1} sx={{ textAlign: 'center' }}>
<IconButton size='large' color='error' onClick={() => remove2(index)}>
<RemoveIcon />
</IconButton>
</Grid>
)
}
</Grid>
)
})
}
</Grid>
</Grid>
</Grid>
{/* Confirmation Medical Letter */}
<Grid item xs={12}>
<Grid container spacing={3}>
<Grid item xs={12}>
<Typography variant="body1" component="div">
Confirmation Medical Letter*
</Typography>
</Grid>
<Grid item xs={12}>
{
formValues.lab_result_file.map((file: any, index: number) => (
<Stack direction="row" justifyContent={'space-between'} key={index} sx={{ mb: '16px' }}>
<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={() => handleRemoveFile(index)}
sx={{cursor: 'pointer'}}
></Iconify>
</Stack>
))
}
</Grid>
<Grid item xs={12} sx={{display: 'flex', gap: 1}}>
<ButtonBase sx={{ p: 4, border: '2px dashed #F9FAFB',bgcolor: '#919EAB52',borderRadius: '8px',width: '100%', height: '60px'}} onClick={() => fileInput.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">
Upload Result
</Typography>
</Box>
<input
type="file"
id="file"
ref={fileInput}
style={{ display: 'none' }}
multiple
onChange={handleInputChange}
accept="application/pdf"
/>
</ButtonBase>
</Grid>
</Grid>
</Grid>
{/* Medical Action Letter */}
{/* Button Cancle & Save */} {/* Button Cancle & Save */}
<Grid item xs={12} md={12}> <Grid item xs={12} md={12}>
<Box display="flex" justifyContent={'flex-end'}> <Box display="flex" justifyContent={'flex-end'}>

View File

@@ -35,6 +35,8 @@ export type ClaimListType = {
admission_date : string, admission_date : string,
discharge_date : string, discharge_date : string,
claim_code : string, claim_code : string,
code : string,
service_name : string,
claim_status : string, claim_status : string,
service_type : string, service_type : string,
member_id : string member_id : string
@@ -55,9 +57,14 @@ export type DetailMonitoringListType = {
analysis : string, analysis : string,
complaints : string, complaints : string,
medical_plan : MedicalPlanStrType[], medical_plan : MedicalPlanStrType[],
non_medikamentosa_plan : NonMedikamentosaPlanType[],
created_at : string|null created_at : string|null
} }
export type MedicalPlanStrType = { export type MedicalPlanStrType = {
medical_plan_str: string medical_plan_str: string
} }
export type NonMedikamentosaPlanType = {
non_medikamentosa_plan_str: string
}