3 * Patient Flow Board (Patient Tracker) (Report Based on the appointment report)
5 * This program used to select and print the information captured in the Patient Flow Board program ,
6 * allowing the user to select and print the desired information.
8 * Copyright (C) 2015 Terry Hill <terry@lillysystems.com>
9 * Copyright (C) 2017 Brady Miller <brady.g.miller@gmail.com>
11 * LICENSE: This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License
13 * as published by the Free Software Foundation; either version 3
14 * of the License, or (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program. If not, see <http://opensource.org/licenses/gpl-license.php>;.
23 * @author Terry Hill <terry@lilysystems.com>
24 * @author Brady Miller <brady.g.miller@gmail.com>
25 * @link http://www.open-emr.org
28 $fake_register_globals=false;
29 $sanitize_all_escapes=true;
31 require_once("../globals.php");
32 require_once("../../library/patient.inc");
33 require_once "$srcdir/options.inc.php";
34 require_once "$srcdir/appointments.inc.php";
35 require_once("$srcdir/patient_tracker.inc.php");
37 $patient = $_REQUEST['patient'];
39 if ($patient && ! $_POST['form_from_date']) {
40 # This sets the dates in the date select calendars
41 # If a specific patient, default to 2 years ago.
43 $from_date = date("$tmp-m-d");
45 $from_date = fixDate($_POST['form_from_date'], date('Y-m-d'));
46 $to_date = fixDate($_POST['form_to_date'], date('Y-m-d'));
49 # check box information
50 $chk_show_details = false;
51 if ( $_POST['show_details'] ) {
52 $chk_show_details = true;
55 $chk_show_drug_screens = false;
56 if ( $_POST['show_drug_screens'] ) {
57 $chk_show_drug_screens = true;
60 $chk_show_completed_drug_screens = false;
61 if ( $_POST['show_completed_drug_screens'] ) {
62 $chk_show_completed_drug_screens = true;
65 # end check box information
67 $provider = $_POST['form_provider'];
68 $facility = $_POST['form_facility']; #(CHEMED) facility filter
69 $form_orderby = getComparisonOrder( $_REQUEST['form_orderby'] ) ?
$_REQUEST['form_orderby'] : 'date';
70 if ($_POST["form_patient"])
71 $form_patient = isset($_POST['form_patient']) ?
$_POST['form_patient'] : '';
72 $form_pid = isset($_POST['form_pid']) ?
$_POST['form_pid'] : '';
73 if ($form_patient == '' ) $form_pid = '';
79 <?php
html_header_show();?
>
81 <link rel
="stylesheet" href
="<?php echo $css_header;?>" type
="text/css">
82 <link rel
="stylesheet" href
="<?php echo $GLOBALS['assets_static_relative']; ?>/jquery-datetimepicker-2-5-4/build/jquery.datetimepicker.min.css">
84 <title
><?php
echo xlt('Patient Flow Board Report'); ?
></title
>
86 <script type
="text/javascript" src
="../../library/overlib_mini.js"></script
>
87 <script type
="text/javascript" src
="../../library/textformat.js?v=<?php echo $v_js_includes; ?>"></script
>
88 <script type
="text/javascript" src
="../../library/dialog.js?v=<?php echo $v_js_includes; ?>"></script
>
89 <script type
="text/javascript" src
="<?php echo $GLOBALS['assets_static_relative']; ?>/jquery-min-3-1-1/index.js"></script
>
90 <script type
="text/javascript" src
="<?php echo $GLOBALS['assets_static_relative']; ?>/jquery-datetimepicker-2-5-4/build/jquery.datetimepicker.full.min.js"></script
>
92 <script type
="text/javascript">
94 var mypcc
= '<?php echo $GLOBALS['phone_country_code
'] ?>';
96 $
(document
).ready(function() {
97 var win
= top
.printLogSetup ? top
: opener
.top
;
98 win
.printLogSetup(document
.getElementById('printbutton'));
100 $
('.datepicker').datetimepicker({
101 <?php
$datetimepicker_timepicker = false; ?
>
102 <?php
$datetimepicker_formatInput = false; ?
>
103 <?php
require($GLOBALS['srcdir'] . '/js/xl/jquery-datetimepicker-2-5-4.js.php'); ?
>
104 <?php
// can add any additional javascript settings to datetimepicker here; need to prepend first setting with a comma ?>
108 function dosort(orderby
) {
109 var f
= document
.forms
[0];
110 f
.form_orderby
.value
= orderby
;
115 // CapMinds :: invokes find-patient popup.
116 function sel_patient() {
117 dlgopen('../main/calendar/find_patient_popup.php?pflag=0', '_blank', 500, 400);
120 // CapMinds :: callback by the find-patient popup.
121 function setpatient(pid
, lname
, fname
, dob
) {
122 var f
= document
.theform
;
123 f
.form_patient
.value
= lname +
', ' + fname
;
124 f
.form_pid
.value
= pid
;
130 <style type
="text/css">
131 /* specifically include & exclude from printing */
137 #report_parameters_daterange {
141 #report_results table {
146 /* specifically exclude some from the screen */
148 #report_parameters_daterange {
156 <body
class="body_top">
158 <!-- Required
for the popup date selectors
-->
160 style
="position: absolute; visibility: hidden; z-index: 1000;"></div
>
161 <?php
if ($GLOBALS['drug_screen']) { #setting the title of the page based o if drug screening is enabled ?>
162 <span
class='title'><?php
echo xlt('Patient Flow Board'); ?
> - <?php
echo xlt('Drug Screen Report'); ?
></span
>
164 <span
class='title'><?php
echo xlt('Patient Flow Board Report'); ?
></span
>
168 <div id
="report_parameters_daterange"><?php
echo date("d F Y", strtotime($from_date)) ." to ". date("d F Y", strtotime($to_date)); #sets date range for calendars ?>
171 <form method
='post' name
='theform' id
='theform' action
='patient_flow_board_report.php' onsubmit
='return top.restoreSession()'>
173 <div id
="report_parameters">
178 <div style
='float: left'>
182 <td
class='label'><?php
echo xlt('Facility'); ?
>:</td
>
183 <td
><?php
dropdown_facility($facility, 'form_facility'); ?
>
185 <td
class='label'><?php
echo xlt('Provider'); ?
>:</td
>
188 # Build a drop-down list of providers.
191 $query = "SELECT id, lname, fname FROM users WHERE ".
192 "authorized = 1 ORDER BY lname, fname"; #(CHEMED) facility filter
194 $ures = sqlStatement($query);
196 echo " <select name='form_provider'>\n";
197 echo " <option value=''>-- " . xlt('All') . " --\n";
199 while ($urow = sqlFetchArray($ures)) {
200 $provid = $urow['id'];
201 echo " <option value='" . attr($provid) . "'";
202 if ($provid == $_POST['form_provider']) echo " selected";
203 echo ">" . text($urow['lname']) . ", " . text($urow['fname']) . "\n";
213 <td
class='label'><?php
echo xlt('From'); ?
>:</td
>
214 <td
><input type
='text' name
='form_from_date' id
="form_from_date"
216 size
='10' value
='<?php echo attr($from_date) ?>'
219 <td
class='label'><?php
echo xlt('To'); ?
>:</td
>
220 <td
><input type
='text' name
='form_to_date' id
="form_to_date"
222 size
='10' value
='<?php echo attr($to_date) ?>'
228 <td
class='label'><?php
echo xlt('Status'); # status code drop down creation ?>:</td>
229 <td
><?php
generate_form_field(array('data_type'=>1,'field_id'=>'apptstatus','list_id'=>'apptstat','empty_title'=>'All'),$_POST['form_apptstatus']);?
></td
>
230 <td
><?php
echo xlt('Category') #category drop down creation ?>:</td>
232 <select id
="form_apptcat" name
="form_apptcat">
234 $categories=fetchAppointmentCategories();
235 echo "<option value='ALL'>".xlt("All")."</option>";
236 while($cat=sqlFetchArray($categories))
238 echo "<option value='".attr($cat['id'])."'";
239 if($cat['id']==$_POST['form_apptcat'])
241 echo " selected='true' ";
243 echo ">".text(xl_appt_category($cat['category']))."</option>";
251  
; 
;<span
class='text'><?php
echo xlt('Patient'); ?
>: </span
>
254 <input type
='text' size
='20' name
='form_patient' style
='width:100%;cursor:pointer;cursor:hand' value
='<?php echo attr($form_patient) ? attr($form_patient) : xla('Click To Select
'); ?>' onclick
='sel_patient()' title
='<?php echo xla('Click to select patient
'); ?>' />
255 <input type
='hidden' name
='form_pid' value
='<?php echo attr($form_pid); ?>' />
258 <td colspan
="2"><label
><input type
="checkbox" name
="show_details" id
="show_details" <?php
if($chk_show_details) echo "checked";?
>> 
;<?php
echo xlt('Show Details'); ?
></label
></td
>
263 <?php
if ($GLOBALS['drug_screen']) { ?
>
265 <?php
# these two selects will are for the drug screen entries the Show Selected for Drug Screens will show all
266 # that have a yes for selected. If you just check the Show Status of Drug Screens all drug screens will be displayed
267 # if both are selected then only completed drug screens will be displayed. ?>
268 <td colspan
="2"><label
><input type
="checkbox" name
="show_drug_screens" id
="show_drug_screens" <?php
if($chk_show_drug_screens) echo "checked";?
>> 
;<?php
echo xlt('Show Selected for Drug Screens'); ?
></label
></td
>
269 <td colspan
="2"><label
><input type
="checkbox" name
="show_completed_drug_screens" id
="show_completed_drug_screens" <?php
if($chk_show_completed_drug_screens) echo "checked";?
>> 
;<?php
echo xlt('Show Status of Drug Screens'); ?
></label
></td
>
278 <td align
='left' valign
='middle' height
="100%">
279 <table style
='border-left: 1px solid; width: 100%; height: 100%'>
282 <div style
='margin-left: 15px'>
283 <a href
='#' class='css_button' onclick
='$("#form_refresh").attr("value","true"); $("#theform").submit();'>
284 <span
> <?php
echo xlt('Submit'); ?
> </span
> </a
>
285 <?php
if ($_POST['form_refresh'] ||
$_POST['form_orderby'] ) { ?
>
286 <a href
='#' class='css_button' id
='printbutton'>
287 <span
> <?php
echo xlt('Print'); ?
> </span
> </a
>
292 <tr
> 
; 
;<?php
echo xlt('Most column headers can be clicked to change sort order') ?
></tr
>
299 <!-- end of search parameters
--> <?php
300 if ($_POST['form_refresh'] ||
$_POST['form_orderby']) {
302 <div id
="report_results">
306 <?php
if (!$chk_show_drug_screens && !$chk_show_completed_drug_screens) { # the first part of this block is for the Patient Flow Board report ?>
307 <th
><a href
="nojs.php" onclick
="return dosort('doctor')"
308 <?php
if ($form_orderby == "doctor") echo " style=\"color:#00cc00\"" ?
>><?php
echo xlt('Provider'); ?
>
311 <th
><a href
="nojs.php" onclick
="return dosort('date')"
312 <?php
if ($form_orderby == "date") echo " style=\"color:#00cc00\"" ?
>><?php
echo xlt('Date'); ?
></a
>
315 <th
><a href
="nojs.php" onclick
="return dosort('time')"
316 <?php
if ($form_orderby == "time") echo " style=\"color:#00cc00\"" ?
>><?php
echo xlt('Time'); ?
></a
>
319 <th
><a href
="nojs.php" onclick
="return dosort('patient')"
320 <?php
if ($form_orderby == "patient") echo " style=\"color:#00cc00\"" ?
>> 
; 
; 
;<?php
echo xlt('Patient'); ?
></a
>
323 <th
><a href
="nojs.php" onclick
="return dosort('pubpid')"
324 <?php
if ($form_orderby == "pubpid") echo " style=\"color:#00cc00\"" ?
>> 
;<?php
echo xlt('ID'); ?
></a
>
327 <th
><a href
="nojs.php" onclick
="return dosort('type')"
328 <?php
if ($form_orderby == "type") echo " style=\"color:#00cc00\"" ?
>><?php
echo xlt('Type'); ?
></a
>
331 <?php
if ($chk_show_details) { ?
>
332 <th
><a href
="nojs.php" onclick
="return dosort('trackerstatus')"
333 <?php
if ($form_orderby == "trackerstatus") echo " style=\"color:#00cc00\"" ?
>><?php
echo xlt('Status'); ?
></a
>
336 <th
><a href
="nojs.php" onclick
="return dosort('trackerstatus')"
337 <?php
if ($form_orderby == "trackerstatus") echo " style=\"color:#00cc00\"" ?
>><?php
echo xlt('Final Status'); ?
></a
>
343 if ($chk_show_details) { # not sure if Sorting by Arrive Time is useful
344 echo xlt('Start Time');
348 echo xlt('Arrive Time');
352 if ($chk_show_details) { # not sure if Sorting by Discharge Time is useful
353 echo xlt('End Time');
357 echo xlt('Discharge Time');
360 <th
><?php
echo xlt('Total Time'); # not adding Sorting by Total Time yet but can see that it might be useful ?></th>
362 <?php
} else { # this section is for the drug screen report ?>
364 <th
><a href
="nojs.php" onclick
="return dosort('doctor')"
365 <?php
if ($form_orderby == "doctor") echo " style=\"color:#00cc00\"" ?
>><?php
echo xlt('Provider'); ?
>
368 <th
><a href
="nojs.php" onclick
="return dosort('date')"
369 <?php
if ($form_orderby == "date") echo " style=\"color:#00cc00\"" ?
>><?php
echo xlt('Date'); ?
></a
>
372 <th
><a href
="nojs.php" onclick
="return dosort('time')"
373 <?php
if ($form_orderby == "time") echo " style=\"color:#00cc00\"" ?
>><?php
echo xlt('Time'); ?
></a
>
376 <th
><a href
="nojs.php" onclick
="return dosort('patient')"
377 <?php
if ($form_orderby == "patient") echo " style=\"color:#00cc00\"" ?
>> 
; 
; 
; 
;<?php
echo xlt('Patient'); ?
></a
>
380 <?php
if (!$chk_show_completed_drug_screens) { ?
>
381 <th
><a href
="nojs.php" onclick
="return dosort('pubpid')"
382 <?php
if ($form_orderby == "pubpid") echo " style=\"color:#00cc00\"" ?
>> 
;<?php
echo xlt('ID'); ?
></a
>
385 <th
><a href
="nojs.php" onclick
="return dosort('pubpid')"
386 <?php
if ($form_orderby == "pubpid") echo " style=\"color:#00cc00\"" ?
>> 
;<?php
echo xlt('ID'); ?
></a
>
390 <th
><?php
echo xlt('Drug Screen'); # not sure if Sorting by Drug Screen is useful ?></th>
392 <?php
if (!$chk_show_completed_drug_screens) { ?
>
395 <th
><a href
="nojs.php" onclick
="return dosort('completed')"
396 <?php
if ($form_orderby == "completed") echo " style=\"color:#00cc00\"" ?
>><?php
echo xlt('Completed'); ?
></a
>
400 <th
></th
><th
></th
><th
></th
>
405 <!-- added
for better
print-ability
-->
409 #Appointment Status Checking
410 $form_apptstatus = $_POST['form_apptstatus'];
412 if(isset($_POST['form_apptcat']))
414 if($form_apptcat!="ALL")
416 $form_apptcat=intval($_POST['form_apptcat']);
420 #Without provider and facility data checking
421 $with_out_provider = null;
422 $with_out_facility = null;
424 # get the appointments also set the trackerboard flag to true (last entry in the fetchAppointments call so we get the tracker stuff)
425 $appointments = fetchAppointments( $from_date, $to_date, $patient, $provider, $facility, $form_apptstatus, $with_out_provider, $with_out_facility,$form_apptcat,true );
426 # sort the appointments by the appointment time
427 $appointments = sortAppointments( $appointments, $form_orderby );
428 # $j is used to count the number of patients that match the selected criteria.
430 //print_r2($appointments);
431 foreach ( $appointments as $appointment ) {
432 $patient_id = $appointment['pid'];
433 $tracker_id = $appointment['pt_tracker_id'];
434 $last_seq = $appointment['lastseq'];
435 $docname = $appointment['ulname'] . ', ' . $appointment['ufname'] . ' ' . $appointment['umname'];
436 # only get items with a tracker id.
437 if ($tracker_id == '' ) continue;
438 # only get the drug screens that are set to yes.
439 if ($chk_show_drug_screens ==1 ) {
440 if ($appointment['random_drug_test'] != '1') continue;
442 #if a patient id is entered just get that patient.
443 if (strlen($form_pid) !=0 ) {
444 if ($appointment['pid'] != $form_pid ) continue;
451 # getting arrive time and end time from the elements file.
452 if ($tracker_id != 0) {
453 $newarrive = collect_checkin($tracker_id);
454 $newend = collect_checkout($tracker_id);
457 if ($newend != '' && $newarrive != '') {
460 $tracker_status = $appointment['status'];
461 # get the time interval for the entire visit. to display seconds add last option of true.
462 # get_Tracker_Time_Interval($newarrive, $newend, true)
463 $timecheck2 = get_Tracker_Time_Interval($newarrive, $newend);
464 # Get the tracker elements.
465 $tracker_elements = collect_Tracker_Elements($tracker_id);
466 # $j is incremented for a patient that made it for display.
470 <tr bgcolor
='<?php echo $bgcolor ?>'>
471 <?php
if (!$chk_show_drug_screens && !$chk_show_completed_drug_screens) { # the first part of this block is for the Patient Flow Board report ?>
472 <td
class="detail"> 
;<?php
echo ($docname == $lastdocname) ?
"" : $docname ?
>
475 <td
class="detail"><?php
echo text(oeFormatShortDate($appointment['pc_eventDate'])) ?
>
478 <td
class="detail"><?php
echo text(oeFormatTime($appointment['pc_startTime'])) ?
>
481 <td
class="detail"> 
;<?php
echo text($appointment['fname'] . " " . $appointment['lname']) ?
>
484 <td
class="detail"> 
;<?php
echo text($appointment['pubpid']) ?
>
487 <td
class="detail"> 
;<?php
echo text(xl_appt_category($appointment['pc_catname'])) ?
>
493 if($chk_show_details) {
495 echo xlt('Complete Visit Time');
500 if($tracker_status != ""){
501 $frow['data_type']=1;
502 $frow['list_id']='apptstat';
503 generate_print_field($frow, $tracker_status);
509 <td
class="detail"> 
;<?php
echo text(substr($newarrive,11)) ?
>
512 <td
class="detail"> 
;<?php
echo text(substr($newend,11)) ?
>
515 <?php
if ($no_visit != 1) { ?
>
516 <td
class="detail"> 
;<?php
echo text($timecheck2) ?
></td
>
518 <td
class="detail"> 
;</td
>
520 <?php
if ($chk_show_details) { # lets show the detail lines
523 for ($x = 1; $x <= $last_seq; $x++
) {
525 <tr valign
='top' class="detail" >
526 <td colspan
="6" class="detail" align
='left'>
529 # get the verbiage for the status code
530 $track_stat = $tracker_elements[$i][status
];
531 # Get Interval alert time and status color.
532 $colorevents = (collectApptStatusSettings($track_stat));
534 $alert_color = $colorevents['color'];
535 $alert_time = $colorevents['time_alert'];
536 if (is_checkin($track_stat) ||
is_checkout($track_stat)) { #bold the check in and check out times in this block.
538 <td
class="detail"><b
>
543 echo getListItemTitle("apptstat",$track_stat);
547 if (is_checkin($track_stat) ||
is_checkout($track_stat)) { #bold the check in and check out times in this block.
549 <td
class="detail"><b
> 
;<?php
echo text(substr($tracker_elements[$i][start_datetime
],11)); ?
></b
></td
>
551 <td
class="detail"> 
;<?php
echo text(substr($tracker_elements[$i][start_datetime
],11)); ?
></td
>
552 <?php
# figure out the next time of the status
556 # get the start time of the next status to determine the total time in this status
557 $start_tracker_time = $tracker_elements[$i][start_datetime
];
558 $next_tracker_time = $tracker_elements[$k][start_datetime
];
562 # since this is the last status the start and end are equal
563 $start_tracker_time = $tracker_elements[$i][start_datetime
];
564 $next_tracker_time = $tracker_elements[$i][start_datetime
];
566 if (is_checkin($track_stat) ||
is_checkout($track_stat)) { #bold the check in and check out times in this block.
568 <td
class="detail"><b
> 
;<?php
echo text(substr($next_tracker_time,11)) ?
></b
></td
>
570 <td
class="detail"> 
;<?php
echo text(substr($next_tracker_time,11)) ?
></td
>
571 <?php
# compute the total time of the status
573 $tracker_time = get_Tracker_Time_Interval($start_tracker_time, $next_tracker_time);
574 # add code to alert if over time interval for status
575 $timecheck = round(abs( strtotime($start_tracker_time) - strtotime($next_tracker_time)) / 60,0);
576 if($timecheck > $alert_time && ($alert_time != '0')) {
577 if (is_checkin($track_stat) ||
is_checkout($track_stat)) { #bold the check in and check out times in this block.
579 <td
class="detail" bgcolor
='<?php echo attr($alert_color) ?>'><b
> 
;<?php
echo text($tracker_time); ?
></b
></td
>
581 <td
class="detail" bgcolor
='<?php echo attr($alert_color) ?>'> 
;<?php
echo text($tracker_time); ?
></td
>
583 <?php
} else { if (is_checkin($track_stat) ||
is_checkout($track_stat)) { #bold the check in and check out times in this block. ?>
584 <td
class="detail"><b
> 
;<?php
echo text($tracker_time); ?
></b
></td
>
586 <td
class="detail"> 
;<?php
echo text($tracker_time); ?
></td
>
597 <?php
} else { # this section is for the drug screen report ?>
599 <td
class="detail"> 
;<?php
echo ($docname == $lastdocname) ?
"" : $docname ?
>
602 <td
class="detail"><?php
echo text(oeFormatShortDate($appointment['pc_eventDate'])) ?
>
605 <td
class="detail"><?php
echo text(oeFormatTime($appointment['pc_startTime'])) ?
>
608 <td
class="detail"> 
;<?php
echo text($appointment['fname'] . " " . $appointment['lname']) ?
>
611 <td
class="detail"> 
;<?php
echo text($appointment['pubpid']) ?
></td
>
613 <td
class="detail" align
= > 
; 
; 
; 
; 
; 
;<?php
if ($appointment['random_drug_test'] == '1') { echo xlt('Yes'); } else { echo xlt('No'); }?
></td
>
615 <?php
if ($chk_show_completed_drug_screens) { ?
>
616 <td
class="detail"> 
; 
; 
; 
; 
; 
;<?php
if ($appointment['drug_screen_completed'] == '1') { echo xlt('Yes'); } else { echo xlt('No'); }?
></td
>
618 <td
class="detail"> 
; </td
>
621 <?php
# these last items are used to complete the screen ?>
622 <td
class="detail"> 
;</td
>
624 <td
class="detail"> 
;</td
>
626 <td
class="detail"> 
;</td
>
631 $lastdocname = $docname;
635 <?php
if (!$chk_show_drug_screens && !$chk_show_completed_drug_screens) { # is it Patient Flow Board or Drug screen ?>
636 <td colspan
="10" align
="left"><?php
echo xlt('Total number of Patient Flow Board entries'); ?
> 
;<?php
echo text($j);?
> 
;<?php
echo xlt('Patients'); ?
></td
>
638 <td colspan
="10" align
="left"><?php
echo xlt('Total number of Drug Screen entries'); ?
> 
;<?php
echo text($j);?
> 
;<?php
echo xlt('Patients'); ?
></td
>
644 <!-- end of search results
--> <?php
} else { ?
>
645 <div
class='text'><?php
echo xlt('Please input search criteria above, and click Submit to view results.' ); ?
>
647 <?php
} ?
> <input type
="hidden" name
="form_orderby"
648 value
="<?php echo attr($form_orderby) ?>" /> <input type
="hidden"
649 name
="patient" value
="<?php echo attr($patient) ?>" /> <input type
='hidden'
650 name
='form_refresh' id
='form_refresh' value
='' /></form
>