Merge pull request #4297 from sunsetsystems/whrwork3
[openemr.git] / portal / home.php
blob90f8f2ce501da233ab24ec03c8fdab0c77cc874b
1 <?php
3 /**
4 * Patient Portal Home
6 * @package OpenEMR
7 * @link http://www.open-emr.org
8 * @author Jerry Padgett <sjpadgett@gmail.com>
9 * @author Brady Miller <brady.g.miller@gmail.com>
10 * @author Shiqiang Tao <StrongTSQ@gmail.com>
11 * @copyright Copyright (c) 2016-2019 Jerry Padgett <sjpadgett@gmail.com>
12 * @copyright Copyright (c) 2019-2020 Brady Miller <brady.g.miller@gmail.com>
13 * @copyright Copyright (c) 2020 Shiqiang Tao <StrongTSQ@gmail.com>
14 * @license https://github.com/openemr/openemr/blob/master/LICENSE GNU General Public License 3
17 require_once("verify_session.php");
18 require_once("$srcdir/patient.inc");
19 require_once("$srcdir/options.inc.php");
20 require_once("lib/portal_mail.inc");
21 require_once(__DIR__ . "/../library/appointments.inc.php");
23 use OpenEMR\Common\Csrf\CsrfUtils;
24 use OpenEMR\Core\Header;
26 if (isset($_SESSION['register']) && $_SESSION['register'] === true) {
27 require_once(__DIR__ . "/../src/Common/Session/SessionUtil.php");
28 OpenEMR\Common\Session\SessionUtil::portalSessionCookieDestroy();
29 header('Location: ' . $landingpage . '&w');
30 exit();
33 if (!isset($_SESSION['portal_init'])) {
34 $_SESSION['portal_init'] = true;
37 $whereto = $_SESSION['whereto'] ?? 'documentscard';
39 $user = isset($_SESSION['sessionUser']) ? $_SESSION['sessionUser'] : 'portal user';
40 $result = getPatientData($pid);
42 $msgs = getPortalPatientNotes($_SESSION['portal_username']);
43 $msgcnt = count($msgs);
44 $newcnt = 0;
45 foreach ($msgs as $i) {
46 if ($i['message_status'] == 'New') {
47 $newcnt += 1;
53 <!DOCTYPE html>
54 <html>
55 <head>
56 <title><?php echo xlt('OpenEMR Portal'); ?> | <?php echo xlt('Home'); ?></title>
57 <meta name="description" content="Developed By sjpadgett@gmail.com" />
59 <script>
60 var tab_mode = true;
61 function restoreSession() {
62 //dummy functions so the dlgopen function will work in the patient portal
63 return true;
65 var isPortal = 1;
66 </script>
67 <?php
68 echo "<script>var cpid=" . js_escape($pid) . ";var cuser=" . js_escape($user) . ";var webRoot=" . js_escape($GLOBALS['web_root']) . ";var ptName=" . js_escape($_SESSION['ptName']) . ";var webroot_url = webRoot;</script>";
70 Header::setupHeader(['no_main-theme', 'datetime-picker', 'patientportal-style']); ?>
72 <script src="../interface/main/tabs/js/dialog_utils.js?v=<?php echo $v_js_includes; ?>"></script>
73 <link href="<?php echo $GLOBALS['web_root']; ?>/portal/sign/css/signer_modal.css?v=<?php echo $v_js_includes; ?>" rel="stylesheet" />
75 <script src="<?php echo $GLOBALS['web_root']; ?>/portal/sign/assets/signature_pad.umd.js?v=<?php echo $v_js_includes; ?>"></script>
76 <script src="<?php echo $GLOBALS['web_root']; ?>/portal/sign/assets/signer_api.js?v=<?php echo $v_js_includes; ?>"></script>
78 <?php if ($GLOBALS['payment_gateway'] == 'Stripe') { ?>
79 <script src="https://js.stripe.com/v3/"></script>
80 <?php } ?>
81 <?php if ($GLOBALS['payment_gateway'] == 'AuthorizeNet') {
82 // Must be loaded from their server
83 $script = "https://jstest.authorize.net/v1/Accept.js"; // test script
84 if ($GLOBALS['gateway_mode_production']) {
85 $script = "https://js.authorize.net/v1/Accept.js"; // Production script
86 } ?>
87 <script src="<?php echo $script; ?>"></script>
88 <?php } ?>
90 <script>
91 $(function () {
92 if($('body').css('direction') == "rtl") {
93 $('.float-left').each(function() {
94 $(this).addClass('float-right').removeClass('float-left');
95 });
96 $('.dropdown-menu-right').each(function() {
97 $(this).removeClass('dropdown-menu-right');
98 });
99 $('.dropdown-menu-md-right').each(function() {
100 $(this).removeClass('dropdown-menu-md-right');
103 $("#profilereport").load("get_profile.php", {}, function () {
104 $("table").addClass("table table-sm");
105 $(".demographics td").removeClass("label");
106 $(".demographics td").addClass("bold");
107 $(".insurance table").addClass("table-sm table-striped");
108 $("#editDems").click(function () {
109 showProfileModal()
113 $("#medicationlist").load("./get_medications.php", {}, function () {
115 $("#labresults").load("./get_lab_results.php", {}, function () {
117 $("#amendmentslist").load("./get_amendments.php", {}, function () {
119 $("#problemslist").load("./get_problems.php", {}, function () {
121 $("#allergylist").load("./get_allergies.php", {}, function () {
123 $("#reports").load("./report/portal_patient_report.php?pid='<?php echo attr_url($pid) ?>'", {}, function () {
126 <?php if ($GLOBALS['portal_two_payments']) { ?>
127 $("#payment").load("./portal_payment.php", {}, function () {
129 <?php } ?>
131 <?php if ($GLOBALS['easipro_enable'] && !empty($GLOBALS['easipro_server']) && !empty($GLOBALS['easipro_name'])) { ?>
132 $("#pro").load("./get_pro.php", {}, function () {
134 <?php } ?>
136 $(".generateDoc_download").click(function () {
137 $("#doc_form").submit();
140 function showProfileModal() {
141 var title = <?php echo xlj('Profile Edits Red = Charted Values Blue = Patient Edits'); ?> +' ';
143 var params = {
144 buttons: [
145 {text: <?php echo xlj('Help'); ?>, close: false, style: 'info', id: 'formHelp'},
146 {text: <?php echo xlj('Cancel'); ?>, close: true, style: 'default'},
147 {text: <?php echo xlj('Revert Edits'); ?>, close: false, style: 'danger', id: 'replaceAllButton'},
148 {text: <?php echo xlj('Send for Review'); ?>, close: false, style: 'success', id: 'donePatientButton'}
150 sizeHeight: 'full',
151 allowDrag: false,
152 onClosed: 'reload',
153 resolvePromiseOn: 'init',
154 type: 'GET',
155 url: webRoot + '/portal/patient/patientdata?pid=' + encodeURIComponent(cpid) + '&user=' + encodeURIComponent(cuser)
157 dlgopen('', '', 'modal-xl', 500, '', title, params).then(function (dialog) {
158 $('div.modal-body', dialog).addClass('overflow-auto');
162 function saveProfile() {
163 page.updateModel();
166 var gowhere = '#' + <?php echo js_escape($whereto); ?>;
167 $(gowhere).collapse('show');
169 $('#cardgroup').on('show.bs.collapse', '.collapse', function () {
170 $('#cardgroup').find('.collapse.show').collapse('hide');
173 $("[data-toggle='pill']").on("click", function (e) {
174 e.preventDefault();
175 // don't toggle if already active.
176 if ($(this).hasClass('active')) {
177 return false;
179 $(".nav-item").removeClass("active");
180 let canHide = $(".navbar-toggler-icon").is(":visible");
181 if (canHide) {
182 $("[data-toggle='sidebar-offcanvas']").click();
185 $('#popwait').addClass('d-none');
186 $('#callccda').click(function () {
187 $('#popwait').removeClass('d-none');
190 function editAppointment(mode, deid) {
191 let mdata = {};
192 let title = '';
193 if (mode === 'add') {
194 title = <?php echo xlj('Request New Appointment'); ?>;
195 mdata = {pid: deid};
196 } else if (mode === 'recurring') {
197 let msg = <?php echo xlj("A Recurring Appointment. Please contact your appointment desk for any changes."); ?>;
198 signerAlertMsg(msg, 8000);
199 return false;
200 } else {
201 title = <?php echo xlj('Edit Appointment'); ?>;
202 mdata = {eid: deid};
204 var params = {
205 dialogId: 'editpop',
206 buttons: [
207 {text: 'Cancel', close: true, style: 'btn-sm btn-secondary'},
209 allowDrag: false,
210 sizeHeight: 'full',
211 size: 750,
212 title: title,
213 type: "GET",
214 url: './add_edit_event_user.php',
215 data: mdata
218 * A couple notes on dialog.ajax .alert etc.
219 * opener is not required. library will handle for you.
220 * these run in the same scope as calling script.
221 * so same styles, dependencies are in scope.
222 * a promise is returned for doing other neat stuff.
224 * */
225 dialog.ajax(params);
228 function changeCredentials(e) {
229 title = <?php echo xlj('Please Enter New Credentials'); ?>;
230 dlgopen("./account/index_reset.php", '', 575, 500, null, title, {});
233 <?php if ($GLOBALS['easipro_enable'] && !empty($GLOBALS['easipro_server']) && !empty($GLOBALS['easipro_name'])) {
235 function writeResult(score, stdErr, assessmentOID) {
236 $.ajax({
237 url: '../library/ajax/easipro_util.php',
238 data: {
239 'csrf_token_form': <?php echo js_escape(CsrfUtils::collectCsrfToken()); ?>,
240 'function': 'record_result',
241 'score': score,
242 'stdErr': stdErr,
243 'assessmentOID': assessmentOID
245 type: 'POST',
246 dataType: 'script'
250 function selectResponse(obj, assessmentOID) {
251 $.ajax({
252 url: '../library/ajax/easipro_util.php',
253 type: "POST",
254 data: {
255 'csrf_token_form': <?php echo js_escape(CsrfUtils::collectCsrfToken()); ?>,
256 'function': 'select_response',
257 'assessmentOID': assessmentOID,
258 'ItemResponseOID': obj.name,
259 'Response': +obj.id
261 dataType: "json",
262 success: function (data) {
263 if (data.DateFinished != '') {
264 document.getElementById("Content").innerHTML = jsText(<?php echo xlj('You have finished the assessment.'); ?>) + "<br /> " + jsText(<?php echo xlj('Thank you'); ?>);
265 document.getElementById("asst_" + assessmentOID).innerHTML = "<i class='fa fa-check-circle'></i>";
266 document.getElementById("asst_status_" + assessmentOID).innerHTML = "completed";
267 $.ajax({
268 url: '../library/ajax/easipro_util.php',
269 type: "POST",
270 data: {
271 'csrf_token_form': <?php echo js_escape(CsrfUtils::collectCsrfToken()); ?>,
272 'function': 'collect_results',
273 'assessmentOID': assessmentOID
275 dataType: "json",
276 success: function (data) {
277 writeResult(data.Items[0].Theta, data.Items[0].StdError, assessmentOID);
280 return
282 var screen = "";
283 for (var j = 0; j < data.Items[0].Elements.length; j++) {
284 if (typeof (data.Items[0].Elements[j].Map) == 'undefined') {
285 screen = screen + "<div style=\'height: 30px\' >" + data.Items[0].Elements[j].Description + "</div>"
286 } else {
287 for (var k = 0; k < data.Items[0].Elements[j].Map.length; k++) {
288 screen = screen + "<div style=\'height: 50px\' ><input type=\'button\' class='btn-submit' id=\'" + data.Items[0].Elements[j].Map[k].Value + "\' name=\'" + data.Items[0].Elements[j].Map[k].ItemResponseOID + "\' value=\'" + data.Items[0].Elements[j].Map[k].Description + "\' onclick=selectResponse(this,'" + assessmentOID + "') />" + "</div>";
292 document.getElementById("Content").innerHTML = screen;
294 error: function (jqXHR, textStatus, errorThrown) {
295 //document.write(jqXHR.responseText + ':' + textStatus + ':' + errorThrown);
296 alert("An error occurred");
301 function startAssessment(param, assessmentOID) {
302 param.innerHTML = "<i class='fa fa-circle-o-notch fa-spin'></i> " + jsText(<?php echo xlj('Loading'); ?>);
304 $.ajax({
305 url: '../library/ajax/easipro_util.php',
306 type: "POST",
307 data: {
308 'csrf_token_form': <?php echo js_escape(CsrfUtils::collectCsrfToken()); ?>,
309 'function': 'start_assessment',
310 'assessmentOID': assessmentOID
312 dataType: "json",
313 success: function (data) {
314 var screen = "";
315 for (var j = 0; j < data.Items[0].Elements.length; j++) {
316 if (typeof (data.Items[0].Elements[j].Map) == 'undefined') {
317 screen = screen + "<div style=\'height: 30px\' >" + data.Items[0].Elements[j].Description + "</div>"
318 } else {
319 for (var k = 0; k < data.Items[0].Elements[j].Map.length; k++) {
320 screen = screen + "<div style=\'height: 50px\' ><input type=\'button\' class='btn-submit' id=\'" + data.Items[0].Elements[j].Map[k].Value + "\' name=\'" + data.Items[0].Elements[j].Map[k].ItemResponseOID + "\' value=\'" + data.Items[0].Elements[j].Map[k].Description + "\' onclick=selectResponse(this,'" + assessmentOID + "') />" + "</div>";
324 document.getElementById("Content").innerHTML = screen;
326 param.innerHTML = jsText(<?php echo xlj('Start Assessment') ?>);
328 error: function (jqXHR, textStatus, errorThrown) {
329 param.innerHTML = jsText(<?php echo xlj('Start Assessment') ?>);
331 //document.write(jqXHR.responseText);
332 alert("An error occurred");
336 <?php
337 } // end if $GLOBALS['easipro_enable']?>
338 </script>
339 </head>
341 <body class="fixed">
342 <header class="header">
343 <nav class="navbar navbar-expand-md fixed-top navbar-light bg-light">
344 <div class="container-fluid">
345 <a href="home.php" class="navbar-brand d-none d-sm-block">
346 <img class="img-fluid" width="140" src='<?php echo $GLOBALS['images_static_relative']; ?>/logo-full-con.png' />
347 </a>
348 <!-- Sidebar toggle button-->
349 <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#left-collapse" aria-controls="left-collapse" aria-expanded="false" aria-label="Toggle navigation"><span class="navbar-toggler-icon"></span>
350 </button>
351 <ul class="nav navbar-nav flex-row sticky-top">
352 <li class="nav-item dropdown">
353 <a href="#" class="nav-link dropdown-toggle" id="newmsgs" data-toggle="dropdown" data-display="static" aria-haspopup="true" aria-expanded="true"> <i class="fa fa-envelope"></i>
354 <span class="badge badge-pill badge-success"><?php echo text($newcnt); ?></span></a>
355 <div class="dropdown-menu dropdown-menu-md-right" aria-labelledby="newmsgs">
356 <h6 class="dropdown-header"><?php echo xlt('You have'); ?> <?php echo text($newcnt); ?> <?php echo xlt('new messages'); ?></h6>
357 <!-- inner menu: contains the actual data -->
358 <?php
359 foreach ($msgs as $i) {
360 if ($i['message_status'] == 'New') {
361 echo "<div><a class='dropdown-item' href='#secure-msgs-card' data-toggle='collapse' data-parent='#cardgroup'><strong>" . text($i['title']) . "</strong></a></div>";
365 <div>
366 <a class="dropdown-item" href="#secure-msgs-card" data-toggle="collapse" data-parent="#cardgroup"><?php echo xlt('See All Messages'); ?></a>
367 </div>
368 </div>
369 </li>
370 <li class="nav-item dropdown">
371 <a href="#" class="nav-link dropdown-toggle" id="profiletab" data-toggle="dropdown" data-display="static" aria-haspopup="true" aria-expanded="false"> <i class="fa fa-user"></i>
372 <span><?php echo text($result['fname'] . " " . $result['lname']); ?> <i class="caret"></i></span></a>
373 <div class="dropdown-menu dropdown-menu-md-right" aria-labelledby="profiletab">
374 <div class="dropdown-header text-center"><?php echo xlt('Account'); ?></div>
375 <a class="dropdown-item" href="<?php echo $GLOBALS['web_root']; ?>/portal/messaging/messages.php"> <i class="fa fa-envelope-o fa-fw"></i> <?php echo xlt('Messages'); ?>
376 <span class="badge badge-pill badge-danger"><?php echo text($msgcnt); ?></span></a>
377 <div class="dropdown-divider"></div>
378 <?php if ($GLOBALS['allow_portal_chat']) {
380 <a class="dropdown-item" href="<?php echo $GLOBALS['web_root']; ?>/portal/messaging/secure_chat.php?fullscreen=true"> <i class="fa fa-user fa-fw"></i><?php echo xlt('Chat'); ?></a>
381 <?php
382 } ?>
383 <a class="dropdown-item" href="javascript:changeCredentials(event)"> <i class="fa fa-cog fa-fw"></i> <?php echo xlt('Change Credentials'); ?></a>
384 <div class="dropdown-divider"></div>
385 <a class="dropdown-item" href="logout.php"><i class="fa fa-ban fa-fw"></i> <?php echo xlt('Logout'); ?></a>
386 </div>
387 </li>
388 </ul>
389 </div>
390 </nav>
391 </header>
392 <div class="wrapper d-flex">
393 <!-- Left side column. contains the logo and sidebar -->
394 <aside class="left-side sidebar-offcanvas collapse collapse-md mt-3 border-right bg-secondary" id="left-collapse">
395 <nav class="sidebar">
396 <!-- Sidebar user panel -->
397 <ul class="nav nav-pills flex-column sticky-top text-dark">
398 <div class="user-panel">
399 <div class="float-left image">
400 <i class="fa fa-user"></i>
401 </div>
402 <div class="float-left info">
403 <p><?php echo xlt('Welcome') . ' ' . text($result['fname']); ?></p>
404 </div>
405 </div>
406 <!-- css class was sidebar-menu -->
407 <li class="nav-item" data-toggle="pill"><a class="nav-link" href="#profilecard" data-toggle="collapse" data-parent="#cardgroup"><i class="fas fa-id-card"></i> <?php echo xlt('Profile'); ?></a></li>
408 <li class="nav-item" data-toggle="pill"><a class="nav-link" href="#lists" data-toggle="collapse" data-parent="#cardgroup"><i class="fas fa-list"></i> <?php echo xlt('Lists'); ?></a></li>
409 <li class="nav-item" data-toggle="pill"><a class="nav-link" href="#documentscard" data-toggle="collapse" data-parent="#cardgroup"><i class="fas fa-file-medical"></i> <?php echo xlt('Patient Documents'); ?></a>
410 </li>
411 <?php if ($GLOBALS['allow_portal_appointments']) { ?>
412 <li class="nav-item" data-toggle="pill"><a class="nav-link" href="#appointmentcard" data-toggle="collapse" data-parent="#cardgroup"><i class="fas fa-calendar-check"></i> <?php echo xlt("Appointment"); ?></a></li>
413 <?php } ?>
414 <?php if ($GLOBALS['portal_two_ledger'] || $GLOBALS['portal_two_payments']) { ?>
415 <li class="nav-item dropdown accounting-menu"><a href="#" class="nav-link dropdown-toggle" data-toggle="dropdown"><i class="fas fa-file-invoice-dollar"></i> <?php echo xlt('Accountings'); ?></a>
416 <div class="dropdown-menu">
417 <?php if ($GLOBALS['portal_two_ledger']) { ?>
418 <span data-toggle="pill"><a class="dropdown-item" href="#ledgercard" data-toggle="collapse" data-parent="#cardgroup"><i class="fas fa-folder-open"></i> <?php echo xlt('Ledger'); ?></a></span>
419 <?php } ?>
420 <?php if ($GLOBALS['portal_two_payments']) { ?>
421 <span data-toggle="pill"><a class="dropdown-item" href="#paymentcard" data-toggle="collapse" data-parent="#cardgroup"><i class="fas fa-credit-card"></i> <?php echo xlt('Make Payment'); ?></a></span>
422 <?php } ?>
423 </div>
424 </li>
425 <?php } ?>
426 <li class="nav-item dropdown reporting-menu"><a href="#" class="nav-link dropdown-toggle" data-toggle="dropdown"><i class="fas fa-book-medical"></i> <?php echo xlt('Reports'); ?></a>
427 <div class="dropdown-menu">
428 <?php if ($GLOBALS['ccda_alt_service_enable'] > 1) { ?>
429 <a class="dropdown-item" id="callccda" href="<?php echo $GLOBALS['web_root']; ?>/ccdaservice/ccda_gateway.php?action=startandrun"><i class="fas fa-envelope"></i> <?php echo xlt('View CCD'); ?></a>
430 <?php } ?>
431 <?php if (!empty($GLOBALS['portal_onsite_document_download'])) { ?>
432 <span data-toggle="pill"><a class="dropdown-item" href="#reportcard" data-toggle="collapse"
433 data-parent="#cardgroup"><i class="fa fa-folder-open"></i> <?php echo xlt('Report Content'); ?></a></span>
435 <span data-toggle="pill"><a class="dropdown-item" href="#downloadcard" data-toggle="collapse"
436 data-parent="#cardgroup"><i class="fa fa-download"></i> <?php echo xlt('Download Lab Documents'); ?></a></span>
437 <?php } ?>
438 </div>
439 </li>
440 <li class="nav-item" data-toggle="pill">
441 <a class="nav-link" href="#secure-msgs-card" data-toggle="collapse" data-parent="#cardgroup"><i class="fas fa-envelope"></i> <?php echo xlt('Secure Messaging'); ?>
442 <span class="badge badge-pill badge-success ml-1"><?php echo text($newcnt); ?>
443 </span>
444 </a>
445 </li>
446 <?php if ($GLOBALS['allow_portal_chat']) { ?>
447 <li class="nav-item" data-toggle="pill"><a class="nav-link" href="#messagescard" data-toggle="collapse"
448 data-parent="#cardgroup"><i class="fas fa-comment-medical"></i> <?php echo xlt("Secure Chat"); ?></a></li>
449 <?php } ?>
450 <?php if ($GLOBALS['easipro_enable'] && !empty($GLOBALS['easipro_server']) && !empty($GLOBALS['easipro_name'])) { ?>
451 <li class="nav-item" data-toggle="pill"><a class="nav-link" href="#procard" data-toggle="collapse" data-parent="#cardgroup"><i class="fa fa-edit"></i> <?php echo xlt("Patient Reported Outcomes"); ?></a></li>
452 <?php } ?>
453 <li class="nav-item" data-toggle="pill"><a class="nav-link" href="#openSignModal" data-toggle="modal" data-type="patient-signature"><i class="fas fa-file-signature"></i> <?php echo xlt('Signature on File'); ?></a></li>
454 <li class="nav-item"><a class="nav-link" href="logout.php"><i class="fa fa-ban"></i> <?php echo xlt('Logout'); ?></a></li>
455 </ul>
456 </nav>
457 </aside>
458 <!-- Right side column. Contains content of the page -->
459 <aside class="right-side mt-3">
460 <!-- Main content -->
461 <section class="flex-column" id="cardgroup">
462 <div id="popwait" class="alert alert-warning d-none"><strong><?php echo xlt('Working!'); ?></strong> <?php echo xlt('Please wait...'); ?></div>
463 <div class="collapse" id="lists">
464 <div class="card">
465 <header class="card-header bg-primary text-light"><?php echo xlt('Medications'); ?> </header>
466 <div id="medicationlist" class="card-body bg-light"></div>
467 </div>
468 <div class="card">
469 <header class="card-header bg-primary text-light"><?php echo xlt('Medications Allergy List'); ?> </header>
470 <div id="allergylist" class="card-body bg-light"></div>
471 </div>
472 <div class="card">
473 <header class="card-header bg-primary text-light"><?php echo xlt('Issues List'); ?></header>
474 <div id="problemslist" class="card-body bg-light"></div>
475 </div>
476 <div class="card">
477 <header class="card-header bg-primary text-light"><?php echo xlt('Amendment List'); ?> </header>
478 <div id="amendmentslist" class="card-body bg-light"></div>
479 </div>
480 <div class="card">
481 <header class="card-header bg-primary text-light"><?php echo xlt('Lab Results'); ?> </header>
482 <div id="labresults" class="card-body bg-light"></div>
483 </div>
484 </div><!-- /.lists -->
485 <?php if ($GLOBALS['allow_portal_appointments']) { ?>
486 <div class="collapse mt-2" id="appointmentcard">
487 <div class="jumbotron jumbotron-fluid m-5 p-3">
488 <div class="container-fluid">
489 <h3 class="text-center"><?php echo xlt('Appointments'); ?></h3>
490 <?php
491 $current_date2 = date('Y-m-d');
492 $apptLimit = 30;
493 $appts = fetchNextXAppts($current_date2, $pid, $apptLimit);
494 if ($appts) {
495 $stringCM = "(" . xl("Comments field entry present") . ")";
496 $stringR = "(" . xl("Recurring appointment") . ")";
497 $count = 0;
498 foreach ($appts as $row) {
499 $status_title = getListItemTitle('apptstat', $row['pc_apptstatus']);
500 $count++;
501 $dayname = xl(date("l", strtotime($row ['pc_eventDate'])));
502 $dispampm = "am";
503 $disphour = substr($row ['pc_startTime'], 0, 2) + 0;
504 $dispmin = substr($row ['pc_startTime'], 3, 2);
505 if ($disphour >= 12) {
506 $dispampm = "pm";
507 if ($disphour > 12) {
508 $disphour -= 12;
512 if ($row ['pc_hometext'] != "") {
513 $etitle = xlt('Comments') . ": " . $row ['pc_hometext'] . "\r\n";
514 } else {
515 $etitle = "";
518 echo '<div class="card p-2">';
519 $mode = (int)$row['pc_recurrtype'] > 0 ? text("recurring") : $row['pc_recurrtype'];
520 $appt_type_icon = (int)$row['pc_recurrtype'] > 0 ? "<i class='float-right fa fa-edit text-danger bg-light'></i>" : "<i class='float-right fa fa-edit text-success bg-light'></i>";
521 echo "<div class='card-header clearfix'><a href='#' onclick='editAppointment(" . attr_js($mode) . "," . attr_js($row ['pc_eid']) . ")'" . " title='" . attr($etitle) . "'>" . $appt_type_icon . "</a></div>";
522 echo "<div class='body font-weight-bold'><p>" . text($dayname . ", " . $row ['pc_eventDate']) . "&nbsp;";
523 echo text($disphour . ":" . $dispmin . " " . $dispampm) . "<br />";
524 echo xlt("Type") . ": " . text($row ['pc_catname']) . "<br />";
525 echo xlt("Provider") . ": " . text($row ['ufname'] . " " . $row ['ulname']) . "<br />";
526 echo xlt("Status") . ": " . text($status_title);
527 echo "</p></div></div>";
529 if ($count == $apptLimit) {
530 echo "<p>" . xlt("Display limit reached") . "<br>" . xlt("More appointments may exist") . "</p>";
532 } else { // if no appts
533 echo "<h3 class='text-center'>" . xlt('No Appointments') . "</h3>";
535 echo '</div>'; ?>
536 <span><a class='btn btn-primary btn-block' href='#' onclick="editAppointment('add',<?php echo attr_js($pid); ?>)"><?php echo xlt('Schedule A New Appointment'); ?></a>
537 </span>
538 </div>
539 </div><!-- /.row -->
540 <?php
541 } ?>
542 <?php if ($GLOBALS['portal_two_payments']) {
544 <div class="collapse" id="paymentcard">
545 <div class="card">
546 <header class="card-header bg-primary text-light"> <?php echo xlt('Payments'); ?> </header>
547 <div id="payment" class="card-body bg-light"></div>
548 </div>
549 </div>
550 <?php } ?>
551 <?php if ($GLOBALS['allow_portal_chat']) { ?>
552 <div class="collapse" id="messagescard">
553 <div class="card pt-0 pb-0">
554 <header class="card-header bg-primary text-light"><?php echo xlt('Secure Chat'); ?> </header>
555 <div id="messages" class="card-body p-0 overflow-auto" style="height: calc(100vh - 120px);">
556 <iframe src="./messaging/secure_chat.php" class="w-100 h-100"></iframe>
557 </div>
558 </div>
559 </div>
560 <?php
561 } ?>
562 <div class="card collapse" id="reportcard">
563 <header class="card-header bg-primary text-light"><?php echo xlt('Reports'); ?></header>
564 <div id="reports" class="card-body"></div>
565 </div>
566 <?php if (!empty($GLOBALS['portal_onsite_document_download'])) {
568 <div class="card collapse" id="downloadcard">
569 <header class="card-header bg-primary text-light"> <?php echo xlt('Download Documents'); ?> </header>
570 <div id="docsdownload" class="card-body">
571 <div>
572 <span class="text"><?php echo xlt('Download all patient documents'); ?></span>
573 <form name='doc_form' id='doc_form' action='./get_patient_documents.php' method='post'>
574 <input type="button" class="generateDoc_download" value="<?php echo xla('Download'); ?>" />
575 </form>
576 </div>
577 </div><!-- /.card-body -->
578 </div>
579 <?php } ?>
580 <?php if ($GLOBALS['portal_two_ledger']) { ?>
581 <div class="collapse" id="ledgercard">
582 <div class="card">
583 <header class="card-header bg-primary text-light"><?php echo xlt('Ledger'); ?></header>
584 <div id="patledger" class="card-body">
585 <iframe src="./report/pat_ledger.php" class="w-100 vh-100 border-0" scrolling="yes"></iframe>
586 </div>
587 </div>
588 </div>
589 <?php } ?>
590 <?php if ($GLOBALS['easipro_enable'] && !empty($GLOBALS['easipro_server']) && !empty($GLOBALS['easipro_name'])) {
592 <div class="card collapse" id="procard">
593 <header class="card-header bg-primary text-light"> <?php echo xlt('Patient Reported Outcomes'); ?> </header>
594 <div id="pro" class="card-body bg-light"></div>
595 </div>
596 <?php } ?>
597 <div class="card collapse" id="profilecard">
598 <div id="profilereport" class="card-body bg-light"></div>
599 </div>
600 <div class="collapse" id="documentscard">
601 <div class="card">
602 <div id="patdocuments" class="card-body">
603 <iframe src="<?php echo $GLOBALS['web_root']; ?>/portal/patient/onsitedocuments?pid=<?php echo attr_url($pid); ?>" class="w-100 vh-100 border-0" scrolling="yes"></iframe>
604 </div>
605 </div>
606 </div>
607 <div class="collapse" id="secure-msgs-card">
608 <div class="card">
609 <div id="secure-msgs" class="card-body">
610 <iframe src="<?php echo $GLOBALS['web_root']; ?>/portal/messaging/messages.php" class="w-100 vh-100 border-0" scrolling="yes"></iframe>
611 </div>
612 </div>
613 </div>
614 </section>
615 </aside><!-- /.right-side -->
616 </div><!-- ./wrapper -->
617 </body>
618 </html>