From 5a439922d936f76c738b6318b3c0264fe28398e8 Mon Sep 17 00:00:00 2001 From: Tb Fajri Date: Mon, 25 Dec 2023 09:52:03 +0700 Subject: [PATCH 1/9] send email dan daily monitoring --- .../Api/CorporateMemberController.php | 33 ++++ .../Api/DailyMonitoringController.php | 2 +- Modules/Internal/Routes/api.php | 2 + app/Helpers/Helper.php | 41 ++++- .../Components/ClaimListRow.tsx | 4 +- .../Components/DetailMonitoringForm.tsx | 158 +++++++++++++++++- .../DailyMonitoring/Model/Types.ts | 7 + 7 files changed, 233 insertions(+), 14 deletions(-) diff --git a/Modules/Internal/Http/Controllers/Api/CorporateMemberController.php b/Modules/Internal/Http/Controllers/Api/CorporateMemberController.php index 19fc5583..549a01a0 100644 --- a/Modules/Internal/Http/Controllers/Api/CorporateMemberController.php +++ b/Modules/Internal/Http/Controllers/Api/CorporateMemberController.php @@ -20,6 +20,7 @@ use Modules\Internal\Services\MemberEnrollmentService; use PDF; use Illuminate\Support\Facades\DB; use Illuminate\Database\Eloquent\Builder; +use Illuminate\Support\Facades\File; class CorporateMemberController extends Controller { @@ -393,4 +394,36 @@ class CorporateMemberController extends Controller "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' => '

Hi ' . $member->name . '

', + 'attach' => $pdfPath, + ]; + $sendEmail = Helper::sendEmailattachData($dataEmail); + } + + return true; + + } } diff --git a/Modules/Internal/Http/Controllers/Api/DailyMonitoringController.php b/Modules/Internal/Http/Controllers/Api/DailyMonitoringController.php index 09347128..1d70de74 100644 --- a/Modules/Internal/Http/Controllers/Api/DailyMonitoringController.php +++ b/Modules/Internal/Http/Controllers/Api/DailyMonitoringController.php @@ -68,7 +68,7 @@ class DailyMonitoringController extends Controller $claimList = DB::table('request_logs') ->leftJoin('services', 'services.code', '=', 'request_logs.service_code') ->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.status_final_log', 'approved') ->where("request_logs.member_id", "=", $memberDetail->id) diff --git a/Modules/Internal/Routes/api.php b/Modules/Internal/Routes/api.php index c97454bd..4a262d30 100644 --- a/Modules/Internal/Routes/api.php +++ b/Modules/Internal/Routes/api.php @@ -284,6 +284,8 @@ Route::prefix('internal')->group(function () { Route::resource('doctors', DoctorController::class); 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::post('files-mcu', 'filesMcu'); }); diff --git a/app/Helpers/Helper.php b/app/Helpers/Helper.php index 5ce5c9a4..12eb9f96 100644 --- a/app/Helpers/Helper.php +++ b/app/Helpers/Helper.php @@ -317,7 +317,6 @@ class Helper { // Buat instance PHPMailer $mail = new PHPMailer(true); - try { // Server settings $mail->isSMTP(); @@ -341,8 +340,46 @@ class Helper // Kirim email $mail->send(); return true; + } 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; } } diff --git a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/ClaimListRow.tsx b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/ClaimListRow.tsx index 67e46a89..3b758f82 100644 --- a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/ClaimListRow.tsx +++ b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/ClaimListRow.tsx @@ -89,11 +89,11 @@ export default function ClaimListRow ({ ...props }: Props) { - navigate(`/case_management/daily_monitoring/${props.row.member_id}/claims/${props.row.claim_code}/list_monitoring`)}> + navigate(`/case_management/daily_monitoring/${props.row.member_id}/claims/${props.row.code}/list_monitoring`)}> View - navigate(`/case_management/daily_monitoring/${props.row.member_id}/claims/${props.row.claim_code}/add_monitoring`)}> + navigate(`/case_management/daily_monitoring/${props.row.member_id}/claims/${props.row.code}/add_monitoring`)}> Daily Monitoring diff --git a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringForm.tsx b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringForm.tsx index b06b9721..fae9e07d 100644 --- a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringForm.tsx +++ b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringForm.tsx @@ -4,7 +4,7 @@ */ import { useFieldArray, useForm } from 'react-hook-form'; 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"; /** @@ -28,11 +28,16 @@ import RemoveIcon from '@mui/icons-material/Remove'; */ import { AddMonitoringDetail } from '../Model/Functions'; 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() { const { member_id, claim_code } = useParams(); const navigate = useNavigate() const pageTitle = claim_code??'_ _ _ _'; + const fileInput = useRef(null); // setup form // ==================================== @@ -50,6 +55,9 @@ export default function DetailMonitoringList() { medical_plan : [{ medical_plan_str: '' }], + non_medikamentosa_plan : [{ + non_medikamentosa_plan_str: '' + }], created_at : '' }; @@ -57,9 +65,37 @@ export default function DetailMonitoringList() { 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 // ===================================== @@ -197,7 +233,7 @@ export default function DetailMonitoringList() { {/* Complaints */} - + {/* @@ -212,7 +248,7 @@ export default function DetailMonitoringList() { /> - + */} {/* Analysis */} @@ -242,7 +278,7 @@ export default function DetailMonitoringList() { { - fields.map((field,index) => { + fields1.map((field,index) => { return ( @@ -253,10 +289,10 @@ export default function DetailMonitoringList() { /> { - index == (fields.length-1) ? + index == (fields1.length-1) ? ( - append({medical_plan_str: ''})}> + append1({medical_plan_str: ''})}> @@ -264,7 +300,7 @@ export default function DetailMonitoringList() { : ( - remove(index)}> + remove1(index)}> @@ -278,6 +314,110 @@ export default function DetailMonitoringList() { + {/* Non Medikamentosa Plan* */} + + + + + Non Medikamentosa Plan* : + + + + { + fields2.map((field,index) => { + return ( + + + + + { + index == (fields2.length-1) ? + ( + + append2({non_medikamentosa_plan_str: ''})}> + + + + ) + : + ( + + remove2(index)}> + + + + ) + } + + ) + }) + } + + + + + {/* Confirmation Medical Letter */} + + + + + Confirmation Medical Letter* + + + + { + formValues.lab_result_file.map((file: any, index: number) => ( + + + + {file.name ? file.name : '-'} + + handleRemoveFile(index)} + sx={{cursor: 'pointer'}} + > + + )) + } + + + fileInput.current?.click()}> + + + + Upload Result + + + + + + + + + + {/* Medical Action Letter */} + {/* Button Cancle & Save */} diff --git a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Model/Types.ts b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Model/Types.ts index 216c89e0..5d8c058d 100644 --- a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Model/Types.ts +++ b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Model/Types.ts @@ -35,6 +35,8 @@ export type ClaimListType = { admission_date : string, discharge_date : string, claim_code : string, + code : string, + service_name : string, claim_status : string, service_type : string, member_id : string @@ -55,9 +57,14 @@ export type DetailMonitoringListType = { analysis : string, complaints : string, medical_plan : MedicalPlanStrType[], + non_medikamentosa_plan : NonMedikamentosaPlanType[], created_at : string|null } export type MedicalPlanStrType = { medical_plan_str: string } + +export type NonMedikamentosaPlanType = { + non_medikamentosa_plan_str: string +} From 10f702f2f0178cb1bce19f234aff907277158f03 Mon Sep 17 00:00:00 2001 From: Tb Fajri Date: Mon, 25 Dec 2023 09:54:15 +0700 Subject: [PATCH 2/9] report dan design ecard --- public/files/Benefit Usage Report.xlsx | Bin 7315 -> 7397 bytes .../Corporate Plan & Benefit Import2.xlsx | Bin 0 -> 15653 bytes .../CorporatePlan&BenefitImportData.xlsx | Bin 3772 -> 0 bytes public/files/TemplateFormulariumList.xlsx | Bin 3883 -> 3884 bytes resources/views/pdf/ecard.blade.php | 81 ++++++++++++++++++ 5 files changed, 81 insertions(+) create mode 100644 public/files/Corporate Plan & Benefit Import2.xlsx create mode 100644 resources/views/pdf/ecard.blade.php diff --git a/public/files/Benefit Usage Report.xlsx b/public/files/Benefit Usage Report.xlsx index 50ec024540744e883ad7eed68da96aa40480ccfd..e80910f30e932f0c14f62344c788de5773dc577f 100644 GIT binary patch delta 5125 zcmZ8l2UJtb)()XbhZvC1LN`H*p`)Qm4N?*U7A}a=jSvtiN;?##7YPBR7b&qKAVp9> zL?K8~iVz|q2q;MBQUrlNc>nv>dT-X6+53Foo;@@BtW(yPp);eygFVa40tJCVM?lA} zdQ|fSF)=f2Ml93Lp{k$FZn_pam=Z-sTrY(kS=h1sNOXlMAiLK&`5)D4J zA+V4}{VCdG?GUe~jn`>PJq<|u=;tp%T8q@#*|`#@Eq%=zpXI!W#+~NorR%|dzh`G4 z*10V@5w+vLvv}y`lbUGF-D{W|las&;+Cf0|!74olm=xOb)d|n-ClSt#^QT+i#hZsIjr(bEZF0eZ_54^fcIp?vbaY zbz-r`rhPCwZ+B@nwEhd?{<4c!=x!rTGdwSxAn`nD|F7xN<-EFOhgQC{!iL@5?%)@2 zQf$=@Pyvh~zg14IW+WAnONs`cK3hiZ3x_A~J_W{>n_EH`6zlJN?_JrwTfn2g<(#rk z79S4n4Ck~_Imb6nbWZc$&KxARn@p!J$2xC$>^|A(bvB*dYMy`V6EsXLifcYYYn!-# zdcn$#tMzt+U;W3WhDTj*iCX>Rgwasq-)8$afSbS9KMX{~2WUQjHgWUxs{7}2=+=+} zfm=r+xPhgeP@kPs^~~xMpYoh4$KwuQ5_@|B>z_9PSsq}2pTcu+eqaUD+)N8f+nu=V zE}GP(){`AL;!NCdA`09J`n8L%m6%#}5=}wZg%Rt=pJ)b?J|xWk4A0Zx+x>3pb2R;U zHt@dUFL&owPc56~i1p%k1c6%-zx+sx86{RNHe*)$K0D{=BSLT&o8&k6weSOf%Jq<` zN5j%<=o>oEmr7uTdAg?;r@nXG>aUuga-I6^-W>iT^hVQX zp3W@VSg5_Ujp6ada4oTRwyJKE`Ig0S2}i)VFg}7XvbgA%wtv9B>7~uR_w53C*!5$P zcGyN=AD`zN{W5X$ShN1Vs-fzPmC;h)rDl&OsV!V-mm>OvijH|!CfU$7-l}*WA49p_ z*Gbn<6lnd=udiUh|p0JqM4zw4Vz*>^UF z;B=Gcp1->^J{5k~@sHfoW@#NRTG-$2Jsq(ghDQJBuOcw{Y}+g37jkBkITzn4i)V4h zRkr8gC%@V?KCqp9SJ@7;W%$~71u>wIQ_Do5T~udCdNR_yaW&m9*1Qobo38^YH9JF+ zo_ub8M2O?HjMS|85iyP&1&FF1#3lZATRJ~pmL=`Btg*Dd8`XSPr~hK}_y~go8=rY+ zChd>138z3H4_WGG&gXP(SWaVd_?3?8WF?688x#ACc|E0z6psGdww#W&1g8Du{qget z=%cqBeTVPW$Al7C{dET>B>r#CI3A@Yf3meUUMoQg+T3lrM&6Tp4O zD0}(D)f@zO4&tjNw89d4Q$F!}&Sj0GZ?`R>2LDhhI*C|0&h@jYwrR#WP>#jSiJA^+ z+*CTEHytr)4v_ICrDE`e0saI?s`1rC;{>x(%OvA;fqrT)Cfxaug2Wr^=t0V*AnpiA zxeg>#B0&KODHlrMOftS>R;p@N8ZCpf5=gkhhL|zZaV%;0Yq}#=3ftIw?pX0#c^~Q6D_9y0(5(o*+2U_srUO zHo7Ffr-Ce9lYmv2YS69|tfrSt(Q`_Ks!!|QO&awoJC?qB`J{BMej;v}?}W$3KA?s( zdsvX4Vq+Shf~%hP4pWy_nkChNvtdSH zOeFDcx#;cS81F;W%UBChgntsmK=}uFz)gl(MC>zBx8>M4FI&<_*zpg}FxNH7a{GraCNBbff=$G8DSp6Q%gkl|#%HL^?NwNI;Z zoSC;RgeIHm4e`>XMru-@YI1nysprsTK}3=X5n`=H_0W>}*8A;S(E0*L+*uy>k74x( z`Nll##abMbc`Vz#qpT+F0z(7?+}B1XTz|;dMKb8buytX8ASyK*>#65#d_MWsd|&!mPj}POj~Me% z+u2&U)^Lkhe=&5zx1Qj^53+~^rSuqI8e!o;)X$BiuL@%=&J>qPW5I$5m@tASj+o>p z%V!j`V6in9us}NsK~wi~Lks7ibyPPlr8L{7SWdSP>#Yvd-|71OGso8=w}OrIg3=bPg6VaSyb*r^t-p$_ZWIOnY#HAe583XwZ@8A{ z^ho7a6bKK#jl39-WKBWR(vi2wNI4WAo_5(>Hol!nfySa>znzZJczfQJ<0R#_q#YPaScsNZxf;zc_<8fE-%UjYxhr_IgbC*0SMzcQL0A;AJ=D zx8HIMLY+(9L1n67TUS1k2p5<6jHJ2yX><39+!Bmr=7x#UM|&fs_p#Q`h?FanALh>S znq={6JP{{cKo2#BAii}9qu-7YU@H`ECGo_^;sgh@`pXbX_%H0Hm!0(h?m!-IN-}#b z&U#faoGsv=`6A85U7b%2B{+$@f!b(2az+^9ksjF)-pvN@4uW?#^371g5X^dHB|Y+W zc(*28gz>t#FR~>V{_zddHrDhHXQfAu(IX#UDOp%8$)7eF4t|i$y@S=<#@6p*--RP= zW{qGgCElwgK=LlO{ulP?>Xz0#^3!Jg;Xn1^S>t^2L3hRBjGWF{12 zTjmzgZcxUfuzo6}hjLc+{^ML6doIrNi{7kG%>A;-5!L z4gqpe*bTME<;;c@wMeWddkHUl2~m}Q9>hPdC^-J0N-$uOV{_9M~?ZS~N>fgyV9>M{=vtD2l9^tjD^L z;vfWFX~!l1?Y;G|W!WIzT!47GPOuB0PUE3o;XnR9*El-)#?RBa;9z?!p)mP}Yk5}t zWVs);9IY+0|b^H{e=#ev~LoTzk^A=enyv0Qy#m_vs1FCxle6TtG z(P8vg<@$CS8EF?FDx%J)ijUA=W(B@SPw24`FeuUi_9 zgH~bVQbP{Y21<$yjFDlua-Cw6U8Yy?P|wLRyv893{KN$1uEhCLh;@@^yX$j;LsGkK zl8dp@kV;!8{6wA5HmO9JDFhf;xO?-!M?FXaz6AR5CnuDV^TVJZBWHEx`emE!+qwmb zx-zvaVZ&)x%bB(eNwm<$}+BySL9GK(xhlP3%2@h2WTSh9pjZu)}usuM6XN1-ts)*qE6n2{JZTRUc04o^p06v_|( zuI-}B*EV4gr)|C*TOU6&`@1%n%U6;swnuI&jBWt}BfC`Zf%(m^GwR_7j0LXpn_;9= z=jWvUY=I>?$`Zz0-C@AU(1q)OFryCLcqulLSd4$4>iMXiI#4_A?pq~R{?ux�~@b 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 RfPfGHfB66_GUs|L{XZXVq|5*S literal 0 HcmV?d00001 diff --git a/public/files/CorporatePlan&BenefitImportData.xlsx b/public/files/CorporatePlan&BenefitImportData.xlsx index 59c346bfb59ee7ba4d45f8987f8e25f5976664c8..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 3772 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 Y{;G0>5s2~N4HoKGlX^t%YzI&O1A@Oh?f?J) diff --git a/public/files/TemplateFormulariumList.xlsx b/public/files/TemplateFormulariumList.xlsx index 65cec25bef1902e5d749a4587321396047de5aed..d0d36f09f5827d8cb4d15733d2c7daa4e9e8dcb0 100644 GIT binary patch delta 484 zcmZ22w?>XPz?+#xgn@~HgW+^&`bOR|MrI&AxsCBVh~C`5v=S_^S%+miGg#yqI}b$3 zSB{;WKqcW`tZp_6lecrK*8dgZ4ZqB^_9jo}?&dUgU!OG>wHM|~Zwz4Ck#|2X>iRC- z-6!8Z{r`CS_X?5K%~_9aBh;;9m1YTvG>gS5f8FNt{;O4`!^Y1s=6l|nOnJeO1bjoVHyX5dfAkS*`4*sQglMWvhzt428o+C1W zb)Na1VjB)&W9f^YH#;IT_vKo1Ni{BHWxZwX6WsMbLiO*(181d!E8MC#oVwd`JVlM) z?_9|J@0s)aV_wXEbbk8t?S)rdUOimNvOufru%=&~noa?~uZ+%{?YlL9o{*pa%5;^{ zq^F!qIU}!4+3=h7^d{>~DJ>#Dyo#2FC5Ea=|BU~hVtMj#k?xzPAJkVl%$i?iNFiRrX9gBs d%O}nFdGbjX+KmqstzUL|~g@rlZH()Yefd6lrVU%R?W zpsn-Xq3*Z55&8#R9hb-oFLSYe&wKbrr>w@iNe(Xr@~T(w;9r`%@!_M%+Z%%Go!)I= zIxqdsQm%DlWKTwzSyJFE{oB4xZV4|O8o%*fZg~_R=2>r2@b!qM&0^b#r|S*{Z<@fa zE}kXPmU2Q(?~DJ(f=h51zDo4p=avUbPD)=MReXQ-yQsEo~_L_>5!!= zXOp~=W?eT)-){0odXljdSB>J%fYk=8)~fzl|2t*o)5INO--`YShb}mG`fA8O+1jtD zK|G235;z>Ma`QpL@fnXDILOs`t-y2&uLYQ%&+81PpYpnbX^y0063q#R>ob diff --git a/resources/views/pdf/ecard.blade.php b/resources/views/pdf/ecard.blade.php new file mode 100644 index 00000000..003b4dfa --- /dev/null +++ b/resources/views/pdf/ecard.blade.php @@ -0,0 +1,81 @@ + + + + + Guarantee Letter {{ $member->name }} + + {{-- --}} + + + + +

Hi {{ $member->name }}

+ + \ No newline at end of file From fd49cd9a12a18331c920068cd6f05b0414773f7f Mon Sep 17 00:00:00 2001 From: ivan-sim Date: Tue, 26 Dec 2023 10:44:12 +0700 Subject: [PATCH 3/9] Detail Claim --- frontend/hospital-portal/src/routes/index.tsx | 5 +- .../src/sections/claim/Detail.tsx | 69 ++++ .../src/sections/claim/DetailStepper.tsx | 58 +++ .../src/sections/claim/DetailTimeline.tsx | 386 ++++++++++++++++++ .../src/sections/claim/TableList.tsx | 2 +- .../src/sections/dashboard/FormRequestLog.tsx | 1 - .../src/sections/dashboard/TableList.tsx | 2 +- .../sections/dashboard/TableListFinalLog.tsx | 2 +- 8 files changed, 519 insertions(+), 6 deletions(-) create mode 100644 frontend/hospital-portal/src/sections/claim/Detail.tsx create mode 100644 frontend/hospital-portal/src/sections/claim/DetailStepper.tsx create mode 100644 frontend/hospital-portal/src/sections/claim/DetailTimeline.tsx diff --git a/frontend/hospital-portal/src/routes/index.tsx b/frontend/hospital-portal/src/routes/index.tsx index b3006919..a0165145 100644 --- a/frontend/hospital-portal/src/routes/index.tsx +++ b/frontend/hospital-portal/src/routes/index.tsx @@ -98,8 +98,8 @@ export default function Router() { element: , }, { - path: '/detail/:id', - element: , + path: '/claim/detail/:id', + element: , }, ], }, @@ -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'))); diff --git a/frontend/hospital-portal/src/sections/claim/Detail.tsx b/frontend/hospital-portal/src/sections/claim/Detail.tsx new file mode 100644 index 00000000..9c1ed9b8 --- /dev/null +++ b/frontend/hospital-portal/src/sections/claim/Detail.tsx @@ -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 ( + + + + navigate(-1)} sx={{cursor:'pointer'}}/> + Detail + {data ? ( + + {localeData.txtDialogMember5} + {(data && data.data) ? format(new Date(data.data.status.submission_date), "d MMM yyyy") : ''} + + ) : ''} + + {data ? ( + + + + + + + + + ) : ''} + + + ); +} \ No newline at end of file diff --git a/frontend/hospital-portal/src/sections/claim/DetailStepper.tsx b/frontend/hospital-portal/src/sections/claim/DetailStepper.tsx new file mode 100644 index 00000000..18dc959a --- /dev/null +++ b/frontend/hospital-portal/src/sections/claim/DetailStepper.tsx @@ -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 ( + + + {status?.map((label) => ( + + : ''}>{label} + + ))} + + + ); +} diff --git a/frontend/hospital-portal/src/sections/claim/DetailTimeline.tsx b/frontend/hospital-portal/src/sections/claim/DetailTimeline.tsx new file mode 100644 index 00000000..9d8b7b7f --- /dev/null +++ b/frontend/hospital-portal/src/sections/claim/DetailTimeline.tsx @@ -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(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(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(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) => ( + + {dataTimeline.date ? format(new Date(dataTimeline.date), "d MMM yyyy") : ''} + + + + + + + + + + {dataTimeline.date ? format(new Date(dataTimeline.date), "HH : mm") : ''} + {dataTimeline.txt_status} + + + Detail: + {dataTimeline.description} + + {dataTimeline.status === 'reviewed' && requestFile ? ( + <> + {submitButton ? ( + Request Document + ) : ( + Request Document Success Uploaded + )} + {/* Diagnosis */} + {requestFile?.map((dataRequestFile, index) => { + if(dataRequestFile.type !== 'claim-diagnosis' || dataRequestFile.check_files !== null){ + return null; + } + return ( + + + Diagnosis + + } + spacing={1} + sx={{ marginY: 2 }} + > + {fileDiagnosis && + fileDiagnosis.map((file, index) => ( + + + + {file.name ? file.name : '-'} + + { + removeFileDiagnois(fileDiagnosis, index); + }} + sx={{cursor: 'pointer'}} + > + + ))} + + fileRequestDocumentInputDiagnosis.current?.click()} + > + + + + Add Result + + + handleRequestDocumentInputChangeDiagnosis(event)} + accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel, text/plain, application/pdf" + /> + + + ); + })} + {/* Kondisi */} + {requestFile?.map((dataRequestFile, index) => { + if(dataRequestFile.type !== 'claim-kondisi' || dataRequestFile.check_files !== null){ + return null; + } + return ( + + + Condition + + } + spacing={1} + sx={{ marginY: 2 }} + > + {fileKondisi && + fileKondisi.map((file, index) => ( + + + + {file.name ? file.name : '-'} + + { + removeFileKondisi(fileKondisi, index); + }} + sx={{cursor: 'pointer'}} + > + + ))} + + fileRequestDocumentInputKondisi.current?.click()} + > + + + + Add Result + + + handleRequestDocumentInputChangeKondisi(event)} + accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel, text/plain, application/pdf" + /> + + + ); + })} + {/* Supporting Result */} + {requestFile?.map((dataRequestFile, index) => { + if(dataRequestFile.type !== 'claim-result' || dataRequestFile.check_files !== null){ + return null; + } + return ( + + + Supporting Result + + } + spacing={1} + sx={{ marginY: 2 }} + > + {fileResult && + fileResult.map((file, index) => ( + + + + {file.name ? file.name : '-'} + + { + removeFileResult(fileResult, index); + }} + sx={{cursor: 'pointer'}} + > + + ))} + + fileRequestDocumentInputResult.current?.click()} + > + + + + Add Result + + + handleRequestDocumentInputChangeResult(event)} + accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel, text/plain, application/pdf" + /> + + + ); + })} + {submitButton ? ( + { + submitRequestFiles(); + }} + loading={submitLoading} + > + Submit + + ) : ''} + + ) : ''} + + + + + + ))} + + ); +} diff --git a/frontend/hospital-portal/src/sections/claim/TableList.tsx b/frontend/hospital-portal/src/sections/claim/TableList.tsx index 513ea292..61badfaf 100644 --- a/frontend/hospital-portal/src/sections/claim/TableList.tsx +++ b/frontend/hospital-portal/src/sections/claim/TableList.tsx @@ -313,7 +313,7 @@ export default function TableList() { action: - + navigate ('/claim/detail/'+obj.claim_request_id)}> View diff --git a/frontend/hospital-portal/src/sections/dashboard/FormRequestLog.tsx b/frontend/hospital-portal/src/sections/dashboard/FormRequestLog.tsx index 9110d837..1f6433c2 100644 --- a/frontend/hospital-portal/src/sections/dashboard/FormRequestLog.tsx +++ b/frontend/hospital-portal/src/sections/dashboard/FormRequestLog.tsx @@ -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(); diff --git a/frontend/hospital-portal/src/sections/dashboard/TableList.tsx b/frontend/hospital-portal/src/sections/dashboard/TableList.tsx index b1575b08..d18c3844 100644 --- a/frontend/hospital-portal/src/sections/dashboard/TableList.tsx +++ b/frontend/hospital-portal/src/sections/dashboard/TableList.tsx @@ -363,7 +363,7 @@ function handleChangeTab(event: React.SyntheticEvent, newValue: string) { Download LOG ):''} - {obj.final_log === 0 ? ( + {obj.final_log === 0 && obj.status === 'approved' ? ( handleRequestFinalLog(obj.id, obj.full_name, obj.no_polis, obj.submission_date) }> Request Final LOG diff --git a/frontend/hospital-portal/src/sections/dashboard/TableListFinalLog.tsx b/frontend/hospital-portal/src/sections/dashboard/TableListFinalLog.tsx index 06dc44d8..4a71e61d 100644 --- a/frontend/hospital-portal/src/sections/dashboard/TableListFinalLog.tsx +++ b/frontend/hospital-portal/src/sections/dashboard/TableListFinalLog.tsx @@ -355,7 +355,7 @@ export default function TableListFinalLog() { Download LOG ):''} - {!obj.check_claim ? ( + {!obj.check_claim && obj.status === 'approved' ? ( handleRequestClaimSubmit(obj.member_id, obj.service_code, obj.id, obj.full_name, obj.no_polis, obj.submission_date) }> Submit Claim From a2a65ec35327491c849724fb1b2a64ea80ad1ab3 Mon Sep 17 00:00:00 2001 From: ivan-sim Date: Tue, 26 Dec 2023 11:43:33 +0700 Subject: [PATCH 4/9] test update --- .../hospital-portal/src/sections/dashboard/TableList.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/hospital-portal/src/sections/dashboard/TableList.tsx b/frontend/hospital-portal/src/sections/dashboard/TableList.tsx index d18c3844..06a7be69 100644 --- a/frontend/hospital-portal/src/sections/dashboard/TableList.tsx +++ b/frontend/hospital-portal/src/sections/dashboard/TableList.tsx @@ -357,12 +357,12 @@ function handleChangeTab(event: React.SyntheticEvent, newValue: string) { View - {obj.status === 'approved' ? ( - handleDownloadLog(obj.claim_request_id)}> + {/* {obj.status === 'approved' ? ( */} + handleDownloadLog(24)}> Download LOG - ):''} + {/* ):''} */} {obj.final_log === 0 && obj.status === 'approved' ? ( handleRequestFinalLog(obj.id, obj.full_name, obj.no_polis, obj.submission_date) }> From b5c8d8c3b6b893e56909b1245437449fef3c4fde Mon Sep 17 00:00:00 2001 From: ivan-sim Date: Tue, 26 Dec 2023 11:51:07 +0700 Subject: [PATCH 5/9] test update1 --- frontend/hospital-portal/src/sections/dashboard/TableList.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/hospital-portal/src/sections/dashboard/TableList.tsx b/frontend/hospital-portal/src/sections/dashboard/TableList.tsx index 06a7be69..44cdedc9 100644 --- a/frontend/hospital-portal/src/sections/dashboard/TableList.tsx +++ b/frontend/hospital-portal/src/sections/dashboard/TableList.tsx @@ -358,7 +358,7 @@ function handleChangeTab(event: React.SyntheticEvent, newValue: string) { View {/* {obj.status === 'approved' ? ( */} - handleDownloadLog(24)}> + handleDownloadLog(38)}> Download LOG From 841b319aeb5180d610e4c010818ea40a99d34e01 Mon Sep 17 00:00:00 2001 From: ivan-sim Date: Tue, 26 Dec 2023 16:41:45 +0700 Subject: [PATCH 6/9] test update2 --- .../Controllers/Api/RequestLogController.php | 25 +++++++++++++ Modules/HospitalPortal/Routes/api.php | 1 + .../src/sections/dashboard/TableList.tsx | 15 ++------ resources/views/pdf/view.blade.php | 37 +++++++++++++++++++ 4 files changed, 67 insertions(+), 11 deletions(-) create mode 100644 resources/views/pdf/view.blade.php diff --git a/Modules/HospitalPortal/Http/Controllers/Api/RequestLogController.php b/Modules/HospitalPortal/Http/Controllers/Api/RequestLogController.php index a3d8ea35..1484056f 100644 --- a/Modules/HospitalPortal/Http/Controllers/Api/RequestLogController.php +++ b/Modules/HospitalPortal/Http/Controllers/Api/RequestLogController.php @@ -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 { @@ -281,4 +283,27 @@ class RequestLogController extends Controller } } } + + public function downlodLog($request_log_id) + { + $data = ['key' => $request_log_id]; + $pdf = new Dompdf(); + + $options = new Options(); + $options->set('isHtml5ParserEnabled', true); + $options->set('isPhpEnabled', true); + $pdf->setOptions($options); + + $html = view('pdf.view', $data); + $pdf->loadHtml($html); + + $pdf->render(); + + $headers = [ + 'Content-Type' => 'application/pdf', + 'Content-Disposition' => 'inline; filename="file.pdf"', + ]; + + return response($pdf->output(), 200, $headers); + } } diff --git a/Modules/HospitalPortal/Routes/api.php b/Modules/HospitalPortal/Routes/api.php index fabf81c9..f0717cc0 100644 --- a/Modules/HospitalPortal/Routes/api.php +++ b/Modules/HospitalPortal/Routes/api.php @@ -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() { diff --git a/frontend/hospital-portal/src/sections/dashboard/TableList.tsx b/frontend/hospital-portal/src/sections/dashboard/TableList.tsx index 44cdedc9..b3f95ca0 100644 --- a/frontend/hospital-portal/src/sections/dashboard/TableList.tsx +++ b/frontend/hospital-portal/src/sections/dashboard/TableList.tsx @@ -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); }); } @@ -358,7 +351,7 @@ function handleChangeTab(event: React.SyntheticEvent, newValue: string) { View {/* {obj.status === 'approved' ? ( */} - handleDownloadLog(38)}> + handleDownloadLog(obj.id)}> Download LOG diff --git a/resources/views/pdf/view.blade.php b/resources/views/pdf/view.blade.php new file mode 100644 index 00000000..dd2e4a16 --- /dev/null +++ b/resources/views/pdf/view.blade.php @@ -0,0 +1,37 @@ + + + + + + + + Ivan Julian + + + + + + + +

Hello, {{ $key }}

+

This is a simple example for generating PDF in Laravel using Dompdf.

+ + From 9dc60b9141ebc395b74cb4b5fc51d572a442b7eb Mon Sep 17 00:00:00 2001 From: ivan-sim Date: Wed, 27 Dec 2023 16:11:07 +0700 Subject: [PATCH 7/9] Update Req LOG Template --- .../Controllers/Api/RequestLogController.php | 14 +- public/images/logo-default.png | Bin 0 -> 21008 bytes resources/views/pdf/req_log_page_1.blade.php | 268 ++++++++++++++++++ resources/views/pdf/req_log_page_2.blade.php | 254 +++++++++++++++++ 4 files changed, 533 insertions(+), 3 deletions(-) create mode 100644 public/images/logo-default.png create mode 100644 resources/views/pdf/req_log_page_1.blade.php create mode 100644 resources/views/pdf/req_log_page_2.blade.php diff --git a/Modules/HospitalPortal/Http/Controllers/Api/RequestLogController.php b/Modules/HospitalPortal/Http/Controllers/Api/RequestLogController.php index 1484056f..63189b87 100644 --- a/Modules/HospitalPortal/Http/Controllers/Api/RequestLogController.php +++ b/Modules/HospitalPortal/Http/Controllers/Api/RequestLogController.php @@ -292,18 +292,26 @@ class RequestLogController extends Controller $options = new Options(); $options->set('isHtml5ParserEnabled', true); $options->set('isPhpEnabled', true); + $options->set(['isRemoteEnabled' => true]); $pdf->setOptions($options); - $html = view('pdf.view', $data); - $pdf->loadHtml($html); + // 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); } } diff --git a/public/images/logo-default.png b/public/images/logo-default.png new file mode 100644 index 0000000000000000000000000000000000000000..267e2e13466f94378cef55007cdfee71d20ad328 GIT binary patch literal 21008 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 literal 0 HcmV?d00001 diff --git a/resources/views/pdf/req_log_page_1.blade.php b/resources/views/pdf/req_log_page_1.blade.php new file mode 100644 index 00000000..37dc64b8 --- /dev/null +++ b/resources/views/pdf/req_log_page_1.blade.php @@ -0,0 +1,268 @@ + + + + + + + + +
+
+
+
+ The Future Of Healthcare At Your Fingertips +
+ +
+
+ SURAT JAMINAN +
+
+ (SURAT JAMINAN INI HARUS DITANDATANGANI OLEH PASIEN) +
+
+ + + + + + + + + + + + + + + + + +
No. Klaim:Tanggal:
Kepada:Plan Polis:
+
+ (HOT LINE LINK SEHAT) +
+
+ Link Sehat bertindak mewakili perusahaan asuransi/penanggung untuk mengeluarkan Surat Jaminan Awal untuk peserta dibawah ini : +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Jenis Surat Jaminan:: SURAT JAMINAN AWALPenjamin:
Nama Peserta:Nama Perusahaan:
Nama karayawan:No. Polis:
Tanggal Lahir:Produk:
Jenis Kelamin:Tipe:
Member ID:Status Polis:
Identitas Peserta:Tanggal Mulai Akhir:
Hak Kamar Pasien:Mata Uang:
Tanggal Pembayaran:Rumah Sakit:
Alamat:
+
+ Surat Jaminan ini dinyatakan berlaku apabila disertai surat jaminan akhir dengan nominal yang tertera pada akhir perawatan. +
+
+ The Future Of Healthcare At Your Fingertips +
+
+ PT Link Medis Sehat
+ Primaya Hospital Corporate
+ Graha Cempaka Mas Blok D5-6
+ Jl. Let. Jend. Suprapto, Jakarta Pusat 10640, Indonesia
+ Telp (021) 4217746/47 +
+
+ + \ No newline at end of file diff --git a/resources/views/pdf/req_log_page_2.blade.php b/resources/views/pdf/req_log_page_2.blade.php new file mode 100644 index 00000000..aef600f0 --- /dev/null +++ b/resources/views/pdf/req_log_page_2.blade.php @@ -0,0 +1,254 @@ + + + + + + + + +
+
+
+
+ The Future Of Healthcare At Your Fingertips +
+ +
+
SYARAT DAN KETENTUAN
+ + + + + + + + + + + + + + + + + + + + + + + + + +
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.
2. Surat jaminan ini dinyatakan berlaku apabila disertai surat jaminan akhir dengan + nominal yang tertera pada kolom diatas.
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.
4. Rumah sakit harap segera menghubungi Link Sehat apabila biaya rumah sakit melebihi batas tertanggung diatas.
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.
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.
7. Dengan ini perserta menyatakan mengetahui dan menyetujui ketentuan selisih biaya yang telah disebutkan diatas.
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.
+
+ +
+ Hormat Kami,
+ Acknowledged, +
+
+ [Nama Analyst] +
+
+ [Nama Jelas Pasien dan TTD] +
+
+ The Future Of Healthcare At Your Fingertip +
+
+ PT Link Medis Sehat
+ Primaya Hospital Corporate
+ Graha Cempaka Mas Blok D5-6
+ Jl. Let. Jend. Suprapto, Jakarta Pusat 10640, Indonesia
+ Telp (021) 4217746/47 +
+
+ + \ No newline at end of file From 770da6c1f3bec5cbac7a9d327c0f556c57dc91c1 Mon Sep 17 00:00:00 2001 From: ivan-sim Date: Thu, 28 Dec 2023 13:35:53 +0700 Subject: [PATCH 8/9] Update req log --- .../Controllers/Api/RequestLogController.php | 65 ++++++++++++++++++- resources/views/pdf/req_log_page_1.blade.php | 40 ++++++------ resources/views/pdf/req_log_page_2.blade.php | 4 +- 3 files changed, 86 insertions(+), 23 deletions(-) diff --git a/Modules/HospitalPortal/Http/Controllers/Api/RequestLogController.php b/Modules/HospitalPortal/Http/Controllers/Api/RequestLogController.php index 63189b87..a347a99b 100644 --- a/Modules/HospitalPortal/Http/Controllers/Api/RequestLogController.php +++ b/Modules/HospitalPortal/Http/Controllers/Api/RequestLogController.php @@ -101,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', @@ -286,7 +287,69 @@ class RequestLogController extends Controller public function downlodLog($request_log_id) { - $data = ['key' => $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(); diff --git a/resources/views/pdf/req_log_page_1.blade.php b/resources/views/pdf/req_log_page_1.blade.php index 37dc64b8..768e27dd 100644 --- a/resources/views/pdf/req_log_page_1.blade.php +++ b/resources/views/pdf/req_log_page_1.blade.php @@ -148,18 +148,18 @@ No. Klaim : - + {{$request_logs->code}} Tanggal : - + {{ \Carbon\Carbon::parse($request_logs->submission_date)->format('d M Y') }} Kepada : - + {{ $dataMember->name }} Plan Polis : - + {{ $dataMember->code_plan }}
@@ -172,58 +172,58 @@ Jenis Surat Jaminan : - : SURAT JAMINAN AWAL + SURAT JAMINAN AWAL Penjamin : - + {{ $dataMember->penjamin }} Nama Peserta : - + {{ $dataMember->name }} Nama Perusahaan : - + {{ $dataMember->nama_perusahaan }} - Nama karayawan + Nama Karyawan : - + {{ $namaKaryawan }} No. Polis : - + {{ $dataMember->code_plan }} Tanggal Lahir : - + {{ \Carbon\Carbon::parse($dataMember->birth_date)->format('d M Y') }} Produk : - + {{ $dataMember->no_polis }} Jenis Kelamin : - + {{ $dataMember->gender == 'male' ? 'Laki-Laki' : 'Perempuan' }} Tipe : - + {{ $dataMember->limit_rules == '999999999' ? 'As Charge' : 'Max Amount, Rp '.number_format($dataMember->limit_rules, 2, ',', '.') }} Member ID : - + {{ $dataMember->member_id }} Status Polis : - + {{ $dataMember->status_polis == 'active' ? 'Aktif' : 'Tidak Aktif' }} Identitas Peserta : - + {{ $dataMember->nik }} Tanggal Mulai Akhir : - + {{ \Carbon\Carbon::parse($dataMember->mulai)->format('d M Y') }} - {{ \Carbon\Carbon::parse($dataMember->akhir)->format('d M Y') }} Hak Kamar Pasien @@ -231,7 +231,7 @@ Mata Uang : - + {{ $dataMember->mata_uang }} Tanggal Pembayaran diff --git a/resources/views/pdf/req_log_page_2.blade.php b/resources/views/pdf/req_log_page_2.blade.php index aef600f0..ea7a1425 100644 --- a/resources/views/pdf/req_log_page_2.blade.php +++ b/resources/views/pdf/req_log_page_2.blade.php @@ -234,10 +234,10 @@ Acknowledged,
- [Nama Analyst] + [..................................................]
- [Nama Jelas Pasien dan TTD] + [{{ $dataMember->name }}]
The Future Of Healthcare At Your Fingertip From 19e9e334e2d4482602c87449b7cfa12f3aed8912 Mon Sep 17 00:00:00 2001 From: Tb Fajri Date: Thu, 28 Dec 2023 15:50:56 +0700 Subject: [PATCH 9/9] update ecard dan daily monitoring --- .../Api/CorporateMemberController.php | 63 ++++- .../Api/DailyMonitoringController.php | 211 ++++++++++++++- Modules/Internal/Routes/api.php | 5 +- .../Services/MemberEnrollmentService.php | 6 + app/Models/Member.php | 35 ++- app/Models/RequestDailyMonitoring.php | 99 +++++++ ...40_create_request_log_daily_monitoring.php | 33 +++ ...add_column_to_request_log_medical_plan.php | 32 +++ .../Components/ClaimListRow.tsx | 58 +++- .../Components/DetailMonitoringForm.tsx | 255 ++++++++++++++++-- .../Components/DetailMonitoringList.tsx | 208 +++++++++++--- .../Components/DialogConfirmation.tsx | 92 +++++++ .../DailyMonitoring/Model/Functions.ts | 10 +- .../DailyMonitoring/Model/Types.ts | 18 ++ .../src/pages/Corporates/Member/List.tsx | 43 +++ public/images/background-vale.png | Bin 0 -> 9049 bytes public/images/logo-default.png | Bin 0 -> 21008 bytes resources/views/pdf/ecard.blade.php | 111 +++++--- 18 files changed, 1146 insertions(+), 133 deletions(-) create mode 100644 app/Models/RequestDailyMonitoring.php create mode 100644 database/migrations/2023_12_27_141340_create_request_log_daily_monitoring.php create mode 100644 database/migrations/2023_12_27_163050_add_column_to_request_log_medical_plan.php create mode 100644 frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DialogConfirmation.tsx create mode 100644 public/images/background-vale.png create mode 100644 public/images/logo-default.png diff --git a/Modules/Internal/Http/Controllers/Api/CorporateMemberController.php b/Modules/Internal/Http/Controllers/Api/CorporateMemberController.php index 549a01a0..9acc2340 100644 --- a/Modules/Internal/Http/Controllers/Api/CorporateMemberController.php +++ b/Modules/Internal/Http/Controllers/Api/CorporateMemberController.php @@ -21,6 +21,7 @@ use PDF; use Illuminate\Support\Facades\DB; use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Facades\File; +use Spatie\Browsershot\Browsershot; class CorporateMemberController extends Controller { @@ -396,34 +397,68 @@ class CorporateMemberController extends Controller } 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(); - - + $members = Member::with([ + 'currentPlan', + 'currentPolicy', + 'currentCorporate', + // 'currentPlan.corporateBenefits.benefit' + ])->whereHas('currentCorporate', function ($query) use ($corporate_id) { + $query->where('corporate_id', $corporate_id); + })->get(); + $data = []; + $countSuccesSend = 0; 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'); + $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 = PDF::loadView('pdf.ecard', compact('member'))->setPaper('A5', 'portrait'); $pdf->save($pdfPath); } $dataEmail = [ - 'email' => $member->email, + // 'email' => $member->email, + 'email' => 'tbfajri', 'name' => $member->name, 'subject' => 'Digital E Card '. $member->name, - 'body' => '

Hi ' . $member->name . '

', + 'body' => '

Hi ' . $member->name . '


ini adalah uji coba kirim e-card' , 'attach' => $pdfPath, ]; $sendEmail = Helper::sendEmailattachData($dataEmail); - } + + if ($sendEmail === true){ + $countSuccesSend ++; - return true; + File::delete($pdfPath); + } else { + $dataFaild = [ + 'email' => $member->email, + 'name' => $member->name, + 'message' => $sendEmail + ]; + array_push($data, $dataFaild); + } + } + $response = [ + 'data_fail_send' => count($data), + 'message' => $data, + 'data_succes_send' => $countSuccesSend, + ]; + + return response()->json($response); + } + + public function viewECard(Request $request, $member_id){ + $member = Member::with([ + 'currentPlan', + 'currentPolicy', + 'currentCorporate', + // 'currentPlan.corporateBenefits.benefit' + ])->find($member_id); + + $pdf = PDF::loadView('pdf.ecard', compact('member'))->setPaper('A5', 'portrait'); + return $pdf->download('Ecard - '.$member->full_name.'.pdf'); } + } diff --git a/Modules/Internal/Http/Controllers/Api/DailyMonitoringController.php b/Modules/Internal/Http/Controllers/Api/DailyMonitoringController.php index 1d70de74..d5da9d0f 100644 --- a/Modules/Internal/Http/Controllers/Api/DailyMonitoringController.php +++ b/Modules/Internal/Http/Controllers/Api/DailyMonitoringController.php @@ -3,12 +3,14 @@ namespace Modules\Internal\Http\Controllers\Api; use App\Models\DailyMonitoring; +use App\Models\RequestDailyMonitoring; use App\Models\MedicalPlan; use DB; use Exception; use Illuminate\Http\Request; use Illuminate\Routing\Controller; use Illuminate\Support\Facades\Validator; +use App\Models\File; /** * Bagaskoro BSD 27-10-2023 @@ -17,6 +19,7 @@ use Illuminate\Support\Facades\Validator; */ class DailyMonitoringController extends Controller { + protected $path_for_store = 'public/lab_result'; protected function messages() { return [ @@ -88,21 +91,17 @@ class DailyMonitoringController extends Controller /** * Detail Monitoring List - by claim_code */ - public function GetDetailMonitoringList(Request $request, $claim_code) + public function GetDetailMonitoringList(Request $request, $request_code) { - // get claim request - $claim_request = DB::table('claim_requests') + // get id request log + $request_logs = DB::table('request_logs') ->select('id') - ->where('code', $claim_code) + ->where('code', $request_code) ->first(); - // get claim - $claim = DB::table('claims') - ->select('id') - ->where('claim_request_id', empty($claim_request)==false ? $claim_request->id : '') - ->first(); - - $detail_list = DailyMonitoring::where('claim_id', empty($claim) == false ? $claim->id : '')->orderBy("created_at", "desc")->get()->makeHidden(['updated_at']); + $detail_list = RequestDailyMonitoring::where('request_log_id', empty($request_logs) == false ? $request_logs->id : '') + ->orderBy("created_at", "desc") + ->get(); return response()->json([ 'error' => false, @@ -213,4 +212,194 @@ class DailyMonitoringController extends Controller ],500); } } + + /** + * Add Detail Request LOG LIST + */ + public function AddDetailMonitoringListRequestLog(Request $request, $request_code) + { + $request->merge(['request_code' => $request_code]); + + // validation rule + $validator = Validator::make($request->all(),[ + 'request_code' => 'required|exists:request_logs,code', + 'subject' => 'required', + 'body_temperature' => 'required|numeric', + 'sistole' => 'required|numeric', + 'diastole' => 'required|numeric', + 'respiration_rate' => 'required|numeric', + 'analysis' => 'required', + 'medical_plan' => 'required', + 'non_medikamentosa_plan' => 'required', + ],$this->messages()); + + // validation error + if ($validator->fails()) { + return response()->json([ + 'error' => true, + 'message' => $validator->getMessageBag() + ],400); + } + + // get claim request + $request_log = DB::table('request_logs') + ->select('id') + ->where('code', $request_code) + ->first(); + DB::beginTransaction(); + try { + // insert claim daily monitoring + $db_response = RequestDailyMonitoring::create([ + 'request_log_id' => $request_log->id, + 'subject' => $request->subject, + 'sistole' => $request->sistole, + 'diastole' => $request->diastole, + 'body_temperature' => $request->body_temperature, + 'respiration_rate' => $request->respiration_rate, + 'analysis' => $request->analysis, + 'lab_date' => $request->lab_date, + 'provider' => $request->provider, + 'examination' => $request->examination, + ]); + + + // cek medical plan + $num_medical_plan = 0; + foreach ($request->medical_plan as $row) { + if ($row['medical_plan_str']) { + $num_medical_plan++; + } + } + + if ($num_medical_plan == 0) { + DB::rollBack(); + return response()->json([ + 'error' => true, + 'message' => [ + 'medical_plan' => ['medical plan harus diisi'] + ], + 'data' => [] + ],400); + } + + // insert medical plan + foreach ($request->medical_plan as $row) { + DB::table('request_log_medical_plan')->insert([ + 'request_log_daily_monitoring_id' => $db_response->id, + 'plan' => $row['medical_plan_str'], + 'type' => 1, + 'created_at' => date('Y-m-d'), + ]); + } + + // insert non medical plan + foreach ($request->non_medikamentosa_plan as $row) { + DB::table('request_log_medical_plan')->insert([ + 'request_log_daily_monitoring_id' => $db_response->id, + 'plan' => $row['non_medikamentosa_plan_str'], + 'type' => 2, + 'created_at' => date('Y-m-d'), + ]); + } + + // insert file result + if ($request->confirmation_medical_leter){ + foreach ($request->confirmation_medical_leter as $file) { + $name = 'labresult-' . uniqid(); + $extension= $file->getClientOriginalExtension(); + $fileName = $name . '.' . $extension; + $path = $file->storeAs($this->path_for_store, $fileName); + File::create([ + 'fileable_type' => 'App\Models\LaboratoriumResult', + 'fileable_id' => $db_response->id, + 'type' => 'confirmation-medical-letter', + 'name' => $name, + 'original_name' => $fileName, + 'extension' => $extension, + 'path' => $path, + ]); + + } + } + if ($request->medical_action_letter){ + foreach ($request->medical_action_letter as $file) { + $name = 'labresult-' . uniqid(); + $extension= $file->getClientOriginalExtension(); + $fileName = $name . '.' . $extension; + $path = $file->storeAs($this->path_for_store, $fileName); + File::create([ + 'fileable_type' => 'App\Models\LaboratoriumResult', + 'fileable_id' => $db_response->id, + 'type' => 'medical-action-letter', + 'name' => $name, + 'original_name' => $fileName, + 'extension' => $extension, + 'path' => $path, + ]); + + // $file->storeAs($this->path_for_store, $fileName); + } + } + if ($request->result){ + foreach ($request->result as $file) { + $name = 'labresult-' . uniqid(); + $extension= $file->getClientOriginalExtension(); + $fileName = $name . '.' . $extension; + $path = $file->storeAs($this->path_for_store, $fileName); + File::create([ + 'fileable_type' => 'App\Models\LaboratoriumResult', + 'fileable_id' => $db_response->id, + 'type' => 'laboratorium-result', + 'name' => $name, + 'original_name' => $fileName, + 'extension' => $extension, + 'path' => $path, + ]); + + // $file->storeAs($this->path_for_store, $fileName); + } + } + + + DB::commit(); + + return response()->json([ + 'error' => false, + 'message' => "success", + 'data' => [] + ],200); + } + catch (Exception $e) { + DB::rollBack(); + return response()->json([ + 'error' => true, + 'message' => $e->getMessage(), + 'data' => [] + ],500); + } + } + + /** + * Update Status Request LOG + */ + public function UpdateListRequestLog(Request $request, $request_code) + { + // get claim request + $request_log = DB::table('request_logs') + ->where('code', $request_code) + ->update(['discharge_date' => now()]); + if ($request_log) { + return response()->json([ + 'error' => false, + 'message' => "success", + 'data' => [] + ], 200); + } else { + return response()->json([ + 'error' => true, + 'message' => $e->getMessage(), + 'data' => [] + ],500); + } + } } diff --git a/Modules/Internal/Routes/api.php b/Modules/Internal/Routes/api.php index 4a262d30..a4b86bba 100644 --- a/Modules/Internal/Routes/api.php +++ b/Modules/Internal/Routes/api.php @@ -170,6 +170,8 @@ Route::prefix('internal')->group(function () { Route::prefix('daily_monitoring')->group(function () { Route::get('detail/{claim_code}/list', [DailyMonitoringController::class, 'GetDetailMonitoringList']); Route::post('detail/{claim_code}/add', [DailyMonitoringController::class, 'AddDetailMonitoringList']); + Route::post('detail/{claim_code}/add-request', [DailyMonitoringController::class, 'AddDetailMonitoringListRequestLog']); + Route::post('detail/{claim_code}/update-status', [DailyMonitoringController::class, 'UpdateListRequestLog']); }); // Laboratorium Result @@ -285,7 +287,8 @@ Route::prefix('internal')->group(function () { Route::post('generate-log/{member_id}', [CorporateMemberController::class, 'generateLog']); - Route::post('send_card/{corporate_id}', [CorporateMemberController::class, 'sendAllECard']); + Route::get('send_card/{corporate_id}', [CorporateMemberController::class, 'sendAllECard']); + Route::get('view_card/{member_id}', [CorporateMemberController::class, 'viewECard']); Route::controller(ClaimRequestController::class)->group(function () { Route::post('files-mcu', 'filesMcu'); }); diff --git a/Modules/Internal/Services/MemberEnrollmentService.php b/Modules/Internal/Services/MemberEnrollmentService.php index 278e7720..4c554386 100644 --- a/Modules/Internal/Services/MemberEnrollmentService.php +++ b/Modules/Internal/Services/MemberEnrollmentService.php @@ -324,6 +324,12 @@ class MemberEnrollmentService // "Ingestion Status", ]; + public $doc_headers_send_email = [ + "Name", + "Email", + "Message" + ]; + public function __construct(Member $member) { app()->setLocale('en'); diff --git a/app/Models/Member.php b/app/Models/Member.php index 1d0435a3..ef95adb6 100644 --- a/app/Models/Member.php +++ b/app/Models/Member.php @@ -255,19 +255,46 @@ class Member extends Model ); } - protected function birthDate(): Attribute + // protected function birthDate(): Attribute + // { + // // $date = $this->person->birth_date ?? ($this->birth_date ?? null); + // $date = $this->birth_date ?? ($this->person->birth_date ?? null); + // return Attribute::make( + // get: fn () => !empty($date) ? Carbon::parse($date)->format('Y-m-d') : null + // ); + // } + + protected function birthDateeCard(): Attribute { // $date = $this->person->birth_date ?? ($this->birth_date ?? null); - $date = $this->person->birth_date ?? ($this->birth_date ?? null); + $date = $this->birth_date ?? ($this->birth_date ?? this->person->birth_date); return Attribute::make( - get: fn () => !empty($date) ? Carbon::parse($date)->format('Y-m-d') : null + get: fn () => !empty($date) ? Carbon::parse($date)->format('d / M / Y') : null + ); + } + + protected function startDate(): Attribute + { + // $date = $this->person->birth_date ?? ($this->birth_date ?? null); + $date = $this->members_effective_date; + return Attribute::make( + get: fn () => !empty($date) ? Carbon::parse($date)->format('d / M / Y') : null + ); + } + + protected function endDate(): Attribute + { + // $date = $this->person->birth_date ?? ($this->birth_date ?? null); + $date = $this->members_expire_date; + return Attribute::make( + get: fn () => !empty($date) ? Carbon::parse($date)->format('d / M / Y') : null ); } protected function gender(): Attribute { return Attribute::make( - get: fn () => $this->person->gender ?? null + get: fn () => ucfirst($this->person->gender) ?? null ); } diff --git a/app/Models/RequestDailyMonitoring.php b/app/Models/RequestDailyMonitoring.php new file mode 100644 index 00000000..6eb1aa77 --- /dev/null +++ b/app/Models/RequestDailyMonitoring.php @@ -0,0 +1,99 @@ +attributes['body_temperature'], 0); + } + + public function getSistoleAttribute() + { + return round($this->attributes['sistole'], 0); + } + + public function getDiastoleAttribute() + { + return round($this->attributes['diastole'], 0); + } + + public function getRespirationRateAttribute() + { + return round($this->attributes['respiration_rate'], 0); + } + + public function getMedicalPlanAttribute() + { + $arr_medical_plan = []; + $medical_plan = DB::table('request_log_medical_plan')->where(['request_log_daily_monitoring_id' => $this->attributes['id'], 'type' => 1])->get(); + + foreach ($medical_plan as $row) { + $arr_medical_plan[] = [ + 'medical_plan_str' => $row->plan + ]; + } + + return $arr_medical_plan; + } + + public function getNonMedikamentosaPlanAttribute() + { + $arr_non_medikamentosa_plan = []; + $non_medikamentosa_plan = DB::table('request_log_medical_plan')->where(['request_log_daily_monitoring_id' => $this->attributes['id'], 'type' => 2])->get(); + + foreach ($non_medikamentosa_plan as $row) { + $arr_non_medikamentosa_plan[] = [ + 'non_medikamentosa_plan_str' => $row->plan + ]; + } + + return $arr_non_medikamentosa_plan; + } + + public function getDocumentAttribute() + { + $arr_document = []; + $document = DB::table('files')->where(['fileable_type' => 'App\Models\LaboratoriumResult', 'fileable_id' => $this->attributes['id']])->get(); + + foreach ($document as $row) { + $arr_document[] = [ + 'file_name' => $row->original_name, + 'path' => env('APP_URL') . '/storage/lab_result/' . $row->original_name, + 'type' => $row->type, + ]; + } + + return $arr_document; + } + + public function getDischargeDateAttribute() + { + return $discharge_date = DB::table('request_logs')->where('id', $this->attributes['request_log_id'])->select('discharge_date')->first(); + } + +} diff --git a/database/migrations/2023_12_27_141340_create_request_log_daily_monitoring.php b/database/migrations/2023_12_27_141340_create_request_log_daily_monitoring.php new file mode 100644 index 00000000..aa6f74e9 --- /dev/null +++ b/database/migrations/2023_12_27_141340_create_request_log_daily_monitoring.php @@ -0,0 +1,33 @@ +id(); + $table->foreignId('request_log_daily_monitoring_id'); + $table->string('plan'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('request_log_medical_plan'); + } +}; diff --git a/database/migrations/2023_12_27_163050_add_column_to_request_log_medical_plan.php b/database/migrations/2023_12_27_163050_add_column_to_request_log_medical_plan.php new file mode 100644 index 00000000..9e3115f5 --- /dev/null +++ b/database/migrations/2023_12_27_163050_add_column_to_request_log_medical_plan.php @@ -0,0 +1,32 @@ +integer('type')->after('plan'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('request_log_medical_plan', function (Blueprint $table) { + $table->dropColumn('type'); + }); + } +}; diff --git a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/ClaimListRow.tsx b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/ClaimListRow.tsx index 3b758f82..e08b4db5 100644 --- a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/ClaimListRow.tsx +++ b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/ClaimListRow.tsx @@ -22,6 +22,8 @@ import TableMoreMenu from '@/components/table/TableMoreMenu'; */ import { fDate } from "@/utils/formatTime"; import { ClaimListType } from "../Model/Types"; +import { ClearOutlined, LoopOutlined } from "@mui/icons-material"; +import DialogConfirmation from "./DialogConfirmation"; type Props = { row: ClaimListType, @@ -30,6 +32,14 @@ type Props = { export default function ClaimListRow ({ ...props }: Props) { const navigate = useNavigate() + const [openDialogSubmit, setOpenDialogSubmit] = useState(false); + const [code, setCode] = useState(''); + const [member_id, setMemberId] = useState(''); + const handleUpdate = (code: string, member_id: string) => { + setOpenDialogSubmit(true) + setMemberId(member_id) + setCode(code) + } return ( @@ -87,21 +97,45 @@ export default function ClaimListRow ({ ...props }: Props) { e.stopPropagation()}> - - navigate(`/case_management/daily_monitoring/${props.row.member_id}/claims/${props.row.code}/list_monitoring`)}> - - View - - navigate(`/case_management/daily_monitoring/${props.row.member_id}/claims/${props.row.code}/add_monitoring`)}> - - Daily Monitoring - - - } /> + {props.row.discharge_date == null ? + ( + + navigate(`/case_management/daily_monitoring/${props.row.member_id}/claims/${props.row.code}/list_monitoring`)}> + + View + + navigate(`/case_management/daily_monitoring/${props.row.member_id}/claims/${props.row.code}/add_monitoring`)}> + + Daily Monitoring + + handleUpdate(props.row.code, props.row.member_id)}> + + Update Status + + + } /> + ) : + ( + + navigate(`/case_management/daily_monitoring/${props.row.member_id}/claims/${props.row.code}/list_monitoring`)}> + + View + + + } /> + ) + } + + ); diff --git a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringForm.tsx b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringForm.tsx index fae9e07d..0960b7ab 100644 --- a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringForm.tsx +++ b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringForm.tsx @@ -4,7 +4,7 @@ */ import { useFieldArray, useForm } from 'react-hook-form'; import { useNavigate, useParams } from 'react-router-dom'; -import { Box, IconButton, Typography, Grid, Card, Button, ButtonBase } from '@mui/material'; +import { Box, IconButton, Typography, Grid, Card, Button, ButtonBase, Stack } from '@mui/material'; import { LoadingButton } from "@mui/lab"; /** @@ -13,6 +13,7 @@ import { LoadingButton } from "@mui/lab"; */ import Page from '@/components/Page'; import { FormProvider, RHFTextField } from '@/components/hook-form'; +import RHFDatePickerV2 from '@/components/hook-form/RHFDatePickerV2'; /** * Icon @@ -21,6 +22,7 @@ import { FormProvider, RHFTextField } from '@/components/hook-form'; import ArrowBackIosNew from '@mui/icons-material/ArrowBackIosNew'; import AddIcon from '@mui/icons-material/Add'; import RemoveIcon from '@mui/icons-material/Remove'; +import InsertDriveFileIcon from '@mui/icons-material/InsertDriveFile'; /** * Utils, Types, Functions @@ -37,7 +39,9 @@ export default function DetailMonitoringList() { const { member_id, claim_code } = useParams(); const navigate = useNavigate() const pageTitle = claim_code??'_ _ _ _'; - const fileInput = useRef(null); + const fileInput1 = useRef(null); + const fileInput2 = useRef(null); + const fileInput3 = useRef(null); // setup form // ==================================== @@ -58,7 +62,13 @@ export default function DetailMonitoringList() { non_medikamentosa_plan : [{ non_medikamentosa_plan_str: '' }], - created_at : '' + confirmation_medical_leter : [], + medical_action_letter : [], + result : [], + created_at : '', + lab_date : '', + provider : '', + examination : '', }; const methods = useForm({ @@ -72,29 +82,75 @@ export default function DetailMonitoringList() { const formValues = watch(); // Handle File Input // ===================================== - const handleInputChange = (event: any) => { + const handleInputChangeConfirmationMedicalLeter = (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]); + let arr_confirmation_medical_leter_file = formValues.confirmation_medical_leter; + arr_confirmation_medical_leter_file.push(event.target.files[0]); - setValue('lab_result_file', arr_lab_result_file) + setValue('confirmation_medical_leter', arr_confirmation_medical_leter_file); + } + else { + console.log('NO FILE'); + } + }; + const handleInputChangeMedicalActionLetter = (event: any) => { + if (event.target.files[0]) { + + let arr_medical_action_letter = formValues.medical_action_letter; + arr_medical_action_letter.push(event.target.files[0]); + + setValue('medical_action_letter', arr_medical_action_letter) + console.log('test2') } else { console.log('NO FILE'); } }; + const handleInputChangeResult = (event: any) => { + if (event.target.files[0]) { + + let arr_result = formValues.result; + arr_result.push(event.target.files[0]); + + setValue('result', arr_result) + console.log('test3') + } + 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) =>{ + const handleRemoveFileConfirmationMedicalLeter = (target_index: number) => { + let arr_confirmation_medical_leter_file = formValues.confirmation_medical_leter.filter((file: any, index: number) =>{ if (target_index !== index) { return file; } }); - setValue('lab_result_file', arr_lab_result_file) + setValue('confirmation_medical_leter', arr_confirmation_medical_leter_file) + }; + const handleRemoveFileMedicalActionLetter = (target_index: number) => { + let arr_medical_action_letter = formValues.medical_action_letter.filter((file: any, index: number) =>{ + if (target_index !== index) { + return file; + } + }); + + setValue('medical_action_letter', arr_medical_action_letter) + }; + const handleRemoveFileResult = (target_index: number) => { + let arr_result = formValues.result.filter((file: any, index: number) =>{ + if (target_index !== index) { + return file; + } + }); + + setValue('result', arr_result) }; // Submit Form @@ -106,8 +162,8 @@ export default function DetailMonitoringList() { if (response == true) { reset(); - navigate('case_management/daily_monitoring/'+claim_code+'claims'); - window.location.reload() + navigate('/case_management/daily_monitoring/'+member_id+'/claims', { replace: true }); + // window.location.reload() } } @@ -370,7 +426,7 @@ export default function DetailMonitoringList() { { - formValues.lab_result_file.map((file: any, index: number) => ( + formValues.confirmation_medical_leter.map((file: any, index: number) => ( @@ -379,7 +435,7 @@ export default function DetailMonitoringList() { handleRemoveFile(index)} + onClick={() => handleRemoveFileConfirmationMedicalLeter(index)} sx={{cursor: 'pointer'}} > @@ -387,7 +443,7 @@ export default function DetailMonitoringList() { } - fileInput.current?.click()}> + fileInput1.current?.click()}> - Upload Result + Upload File handleInputChangeConfirmationMedicalLeter(e)} accept="application/pdf" /> @@ -417,8 +473,165 @@ export default function DetailMonitoringList() { {/* Medical Action Letter */} + + + + + Medical Action Letter* + + + + { + formValues.medical_action_letter.map((file: any, index: number) => ( + + + + {file.name ? file.name : '-'} + + handleRemoveFileMedicalActionLetter(index)} + sx={{cursor: 'pointer'}} + > + + )) + } + + + fileInput2.current?.click()}> + + + + Upload File + + + + + + + + - {/* Button Cancle & Save */} + + {/* Laboratorium */} + + + + + Laboratorium Result* + + + + + Date* + + + + + Provider* + + + + + + + + + + + + Examination* + + + + + + + + Laboratorium Result* + + + + { + formValues.result.map((file: any, index: number) => ( + + + + {file.name ? file.name : '-'} + + handleRemoveFileResult(index)} + sx={{cursor: 'pointer'}} + > + + )) + } + + + fileInput3.current?.click()}> + + + + Upload File + + + + + + + + + + + {/* Button Cancel & Save */} @@ -426,7 +639,7 @@ export default function DetailMonitoringList() { Cancel - Save Changes + Add diff --git a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringList.tsx b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringList.tsx index da31d37d..3c96fa02 100644 --- a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringList.tsx +++ b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringList.tsx @@ -27,7 +27,7 @@ import FiberManualRecord from '@mui/icons-material/FiberManualRecord'; * Utils, Types, Functions * ============================================ */ -import { fDate } from "@/utils/formatTime"; +import { fDate, fDateOnly } from '@/utils/formatTime'; import { getMonitoringDetailList } from '../Model/Functions'; import { DetailMonitoringListType } from '../Model/Types'; @@ -87,6 +87,22 @@ export default function DetailMonitoringList() { > {row.created_at ? fDate(row.created_at) : '-'} + + {row.discharge_date.discharge_date ? + () : ()} + {/* card body */} @@ -160,21 +176,6 @@ export default function DetailMonitoringList() { - - - - - Subject : - - - - - {row.subject} - - - - - @@ -190,21 +191,6 @@ export default function DetailMonitoringList() { - - - - - Complaints : - - - - - {row.complaints} - - - - - @@ -215,7 +201,7 @@ export default function DetailMonitoringList() { { - row.medical_plan.map((data, index) => { + row.medical_plan?.map((data, index) => { return ( {data.medical_plan_str} @@ -227,6 +213,164 @@ export default function DetailMonitoringList() { + + + + + + Non Medikamentosa Plan : + + + + + { + row.non_medikamentosa_plan?.map((data, index) => { + return ( + + {data.non_medikamentosa_plan_str} + + ) + }) + } + + + + + + + + + + Laboratorium Result : + + + + + + Date + + + + + { row.lab_date != null ? fDate(row.lab_date) : '-'} + + + + + + + Location + + + + + {row.provider} + + + + + + + Examination + + + + + {row.examination} + + + + + + + + + + + Document Confirmation Medical Letter: + + + + + {row.document?.map((data, index) => ( + + {data.type === 'confirmation-medical-letter' ? ( + <> + +
+ {data.file_name} + + + ) : null} + + ))} + + + + + + + + + Document Medical Action Letter: + + + + + {row.document?.map((data, index) => ( + + {data.type === 'medical-action-letter' ? ( + <> + + + {data.file_name} + + + ) : null} + + ))} + + + + + + + + + Document Laboratorium Result: + + + + + {row.document?.map((data, index) => ( + + {data.type === 'laboratorium-result' ? ( + <> + + + {data.file_name} + + + ) : null} + + ))} + + + + + diff --git a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DialogConfirmation.tsx b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DialogConfirmation.tsx new file mode 100644 index 00000000..d391a9ad --- /dev/null +++ b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DialogConfirmation.tsx @@ -0,0 +1,92 @@ +import MuiDialog from "@/components/MuiDialog"; +import { Button, Card, Checkbox, DialogActions, Grid, Typography } from "@mui/material"; +import { Paper } from "@mui/material"; +import { Stack } from '@mui/material'; +import React, { useState } from 'react'; +import { fDate, fDateTimesecond, toTitleCase } from "@/utils/formatTime"; +import axios from "@/utils/axios"; +import { enqueueSnackbar } from "notistack"; +import { useNavigate } from "react-router"; +import { replace } from "lodash"; +import { ClaimListType } from "../Model/Types"; +import Label from "@/components/Label"; + + +type DialogConfirmationType = { + openDialog: boolean; + setOpenDialog: any; + onSubmit?: void; + row: ClaimListType; +} + +export default function DialogConfirmation({ setOpenDialog, openDialog, row} : DialogConfirmationType ) { + + const navigate = useNavigate(); + const handleSubmit = () => { + axios + .post(`case_management/daily_monitoring/detail/${row.code}/update-status`) + .then((response) => { + enqueueSnackbar('Close Monitoring Success', { variant: 'success' }); + setOpenDialog(false); + navigate(`/case_management/daily_monitoring/${row.member_id}/claims`, { replace: true }) + window.location.reload(); + }) + .catch(({ response }) => { + enqueueSnackbar(response.data.message ?? 'Something went wrong!', { variant: 'error' }); + }); + } + + const style1 = { + color: '#919EAB', + width: '30%' + } + const style2 = { + width: '70%' + } + const marginBottom1 = { + marginBottom: 1, + } + + const handleCloseDialog = () => { + setOpenDialog(false); + } + + const getContent = () => ( + + Are you sure to closed this monitoring ? + + + + Name + {row.name} + + + Code + {row.code} + + + Admision Date + + + + + + + + + + + + ); + + + return ( + + ); +} \ No newline at end of file diff --git a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Model/Functions.ts b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Model/Functions.ts index 05ace34d..fd68763e 100644 --- a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Model/Functions.ts +++ b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Model/Functions.ts @@ -1,6 +1,8 @@ import axios from '@/utils/axios'; +import { makeFormData } from '@/utils/jsonToFormData'; import { enqueueSnackbar } from 'notistack'; import { DailyMonitoringListType, DetailMonitoringListType, ResponseListingClaimType } from "./Types"; +import { fDate, fDateOnly } from '@/utils/formatTime'; /** * Listing Daily Monitoring @@ -44,9 +46,11 @@ export const getClaimList = async ( member_id: string ): Promise => { - const response = await axios.post(`/case_management/daily_monitoring/detail/${claim_code}/add`, { - ...data - }) + data.lab_date = data.lab_date != '' && data.lab_date != null ? fDateOnly(data.lab_date) : ''; + + const formData = makeFormData({...data}); + + const response = await axios.post(`/case_management/daily_monitoring/detail/${claim_code}/add-request`, formData) .then((res) =>{ enqueueSnackbar(res.data.message, { variant: 'success', diff --git a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Model/Types.ts b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Model/Types.ts index 5d8c058d..3e4706c5 100644 --- a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Model/Types.ts +++ b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Model/Types.ts @@ -35,6 +35,7 @@ export type ClaimListType = { admission_date : string, discharge_date : string, claim_code : string, + name : string, code : string, service_name : string, claim_status : string, @@ -56,8 +57,15 @@ export type DetailMonitoringListType = { diastole : string analysis : string, complaints : string, + lab_date : string, + provider : string, + examination : string, medical_plan : MedicalPlanStrType[], non_medikamentosa_plan : NonMedikamentosaPlanType[], + confirmation_medical_leter : files[], + medical_action_letter : files[], + result : files[], + document : document[], created_at : string|null } @@ -68,3 +76,13 @@ export type MedicalPlanStrType = { export type NonMedikamentosaPlanType = { non_medikamentosa_plan_str: string } + +export type files = { + file: string +} + +export type document = { + file_name: string, + path: string, + type: string +} diff --git a/frontend/dashboard/src/pages/Corporates/Member/List.tsx b/frontend/dashboard/src/pages/Corporates/Member/List.tsx index b2e0c17e..b6030f4f 100644 --- a/frontend/dashboard/src/pages/Corporates/Member/List.tsx +++ b/frontend/dashboard/src/pages/Corporates/Member/List.tsx @@ -94,6 +94,7 @@ export default function CorporatePlanList({handleSubmitSuccess}) { const { corporate_id } = useParams(); const [searchParams, setSearchParams] = useSearchParams(); const [importResult, setImportResult] = useState(null); + const [sendResult, setSendResult] = useState(null); const [openDialog, setOpenDialog] = useState(false); const [isDialog, setIsDialog] = useState(''); @@ -267,6 +268,25 @@ export default function CorporatePlanList({handleSubmitSuccess}) { }); } + const handleSendAllEcard = () => { + setImportLoading(true); + setDataTableLoading(true); + axios + .get(`send_card/${corporate_id}`) + .then((response) => { + loadDataTableData(); + }) + + .catch((response) => { + enqueueSnackbar( + 'Looks like something went wrong. Please check your data and try again.', + { variant: 'error' } + ); + setImportLoading(false); + loadDataTableData(); + }); + } + const handleCancelImportButton = () => { importPlan.current.value = ''; importPlan.current.dispatchEvent(new Event('change', { bubbles: true })); @@ -363,6 +383,9 @@ export default function CorporatePlanList({handleSubmitSuccess}) { Download Member + + Send All Ecard + )} @@ -413,6 +436,7 @@ export default function CorporatePlanList({handleSubmitSuccess}) { )} +
); } @@ -470,6 +494,21 @@ export default function CorporatePlanList({handleSubmitSuccess}) { const style1 = { color: '#637381' } + + + const handleDownloadEcard = (id: number) => { + axios + .get(`view_card/${id}`, { + responseType: 'blob', + }) + .then((response) => { + window.open(URL.createObjectURL(response.data)); + }) + .catch((response) => { + enqueueSnackbar(response.message, { variant: 'error' }); + }); + } + return ( @@ -527,6 +566,10 @@ export default function CorporatePlanList({handleSubmitSuccess}) { Update Status
+ handleDownloadEcard(row.id)}> + + Download E-card + navigate ('/corporates/'+corporate_id+'/members/'+row.id+'/history')}> History diff --git a/public/images/background-vale.png b/public/images/background-vale.png new file mode 100644 index 0000000000000000000000000000000000000000..e41e2fa3b57858ffefc7ae9e82fa1e2c32bde46d GIT binary patch literal 9049 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 literal 0 HcmV?d00001 diff --git a/public/images/logo-default.png b/public/images/logo-default.png new file mode 100644 index 0000000000000000000000000000000000000000..267e2e13466f94378cef55007cdfee71d20ad328 GIT binary patch literal 21008 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 literal 0 HcmV?d00001 diff --git a/resources/views/pdf/ecard.blade.php b/resources/views/pdf/ecard.blade.php index 003b4dfa..99c30f7e 100644 --- a/resources/views/pdf/ecard.blade.php +++ b/resources/views/pdf/ecard.blade.php @@ -2,7 +2,6 @@ - Guarantee Letter {{ $member->name }} {{-- --}} @@ -13,69 +12,111 @@ src: url('{{asset('fonts/PublicSans-Medium.ttf')}}') format('truetype'); } */ + html, body { + height: 100%; + margin: 0; + padding: 0; + } + body { font-family: 'Public Sans'; color: #404040; font-size: 20px; + margin: 0; /* Reset default margin */ + padding: 0; /* Reset default padding */ + background-image: url("{{ public_path('images/background-vale.png') }}"); + background-repeat: no-repeat; + background-size: cover; /* Adjust as needed */ } .text-sm { font-size: 18px; + color: #FFFFFF } .text-md { - font-size: 20px; + font-size: 18px; + color: #159C9C } .text-lg { font-size: 22px; + color: #117D7D; + } .text-gray { color: #919EAB; } - - #member-detail{ - - } - #member-detail td { - width: 50%; - padding: 10px 0px; - } - #member-detail td>div{ - margin-bottom: 5px; + + .content { + margin: 10% 0 0 0; } - .benefit-table-wrapper { - border: 1px solid #E0E0E0; - border-radius: 5px; - overflow: hidden; - } - #benefit-table { - width: 100%; - border-collapse: collapse; + .image-container { + margin-left: 75%; /* Adjust the margin as needed */ } - #benefit-table th, #benefit-table th { - width: 50%; + .label { + background-color: #117D7D; + color: #fff; + border-radius: 15px; + padding: 8px; /* Sesuaikan dengan kebutuhan Anda */ + font-size: 18px; + gap: 4px; + display: inline-flex; /* Untuk memastikan ikon dan teks berada dalam satu baris */ + align-items: center; /* Untuk memastikan ikon dan teks berada dalam satu baris */ } - #benefit-table th{ - font-size: 20px; - font-weight: 400; - padding: 15px; - text-align: left; + .label svg { + margin-right: 4px; /* Jarak antara ikon dan teks */ } - #benefit-table tr:first-child { - background: #F5F5F5; - border-bottom: 1px solid #E0E0E0; + .text-sm { + font-size: 18px; /* Sesuaikan dengan kebutuhan Anda */ } - #benefit-table td { - padding: 15px; - font-size: 20px; - } + -

Hi {{ $member->name }}

+



+
+
+ Member Name +

{{ $member->fullName }}

+ + Member ID +

{{ $member->member_id }}

+ + Policy Holder +

{{ $member->currentCorporate->name }}

+ + Policy Number +

{{ $member->currentPolicy->code }}

+ + Date of Birth +

{{ $member->birthDateeCard }}

+ + Gender +

{{ $member->gender }}

+ + Start Date +

{{ $member->startDate }}

+ +
+ +
+ + + + + + 08114123962 + + + Valid until: {{ $member->endDate }} +
+ +
+ + \ No newline at end of file