send email dan daily monitoring
This commit is contained in:
@@ -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;
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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');
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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'}>
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user