Revert "1. add edit event fails when save edited single provider recurring events...
[openemr.git] / interface / reports / encounters_report.php
blob12377e5bdabe65f5c9672e60c28855875d56ec4e
1 <?php
2 /**
3 * Encounters report.
5 * This report shows past encounters with filtering and sorting,
6 * Added filtering to show encounters not e-signed, encounters e-signed and forms e-signed.
8 * @package OpenEMR
9 * @link http://www.open-emr.org
10 * @author Rod Roark <rod@sunsetsystems.com>
11 * @author Terry Hill <terry@lilysystems.com>
12 * @author Brady Miller <brady.g.miller@gmail.com>
13 * @copyright Copyright (c) 2007-2016 Rod Roark <rod@sunsetsystems.com>
14 * @copyright Copyright (c) 2015 Terry Hill <terry@lillysystems.com>
15 * @copyright Copyright (c) 2017 Brady Miller <brady.g.miller@gmail.com>
16 * @license https://github.com/openemr/openemr/blob/master/LICENSE GNU General Public License 3
20 require_once("../globals.php");
21 require_once("$srcdir/forms.inc");
22 require_once("$srcdir/billing.inc");
23 require_once("$srcdir/patient.inc");
24 require_once "$srcdir/options.inc.php";
26 use OpenEMR\Core\Header;
28 $alertmsg = ''; // not used yet but maybe later
30 // For each sorting option, specify the ORDER BY argument.
32 $ORDERHASH = array(
33 'doctor' => 'lower(u.lname), lower(u.fname), fe.date',
34 'patient' => 'lower(p.lname), lower(p.fname), fe.date',
35 'pubpid' => 'lower(p.pubpid), fe.date',
36 'time' => 'fe.date, lower(u.lname), lower(u.fname)',
37 'encounter' => 'fe.encounter, fe.date, lower(u.lname), lower(u.fname)',
40 function bucks($amount)
42 if ($amount) {
43 printf("%.2f", $amount);
47 function show_doc_total($lastdocname, $doc_encounters)
49 if ($lastdocname) {
50 echo " <tr>\n";
51 echo " <td class='detail'>$lastdocname</td>\n";
52 echo " <td class='detail' align='right'>$doc_encounters</td>\n";
53 echo " </tr>\n";
57 $form_from_date = (isset($_POST['form_from_date'])) ? DateToYYYYMMDD($_POST['form_from_date']) : date('Y-m-d');
58 $form_to_date = (isset($_POST['form_to_date'])) ? DateToYYYYMMDD($_POST['form_to_date']) : date('Y-m-d');
59 $form_provider = $_POST['form_provider'];
60 $form_facility = $_POST['form_facility'];
61 $form_details = $_POST['form_details'] ? true : false;
62 $form_new_patients = $_POST['form_new_patients'] ? true : false;
63 $form_esigned = $_POST['form_esigned'] ? true : false;
64 $form_not_esigned = $_POST['form_not_esigned'] ? true : false;
65 $form_encounter_esigned = $_POST['form_encounter_esigned'] ? true : false;
67 $form_orderby = $ORDERHASH[$_REQUEST['form_orderby']] ?
68 $_REQUEST['form_orderby'] : 'doctor';
69 $orderby = $ORDERHASH[$form_orderby];
71 // Get the info.
73 $esign_fields = '';
74 $esign_joins = '';
75 if ($form_encounter_esigned) {
76 $esign_fields = ", es.table, es.tid ";
77 $esign_joins = "LEFT OUTER JOIN esign_signatures AS es ON es.tid = fe.encounter ";
80 if ($form_esigned) {
81 $esign_fields = ", es.table, es.tid ";
82 $esign_joins = "LEFT OUTER JOIN esign_signatures AS es ON es.tid = fe.encounter ";
85 if ($form_not_esigned) {
86 $esign_fields = ", es.table, es.tid ";
87 $esign_joins = "LEFT JOIN esign_signatures AS es on es.tid = fe.encounter ";
90 $sqlBindArray = array();
92 $query = "SELECT " .
93 "fe.encounter, fe.date, fe.reason, " .
94 "f.formdir, f.form_name, " .
95 "p.fname, p.mname, p.lname, p.pid, p.pubpid, " .
96 "u.lname AS ulname, u.fname AS ufname, u.mname AS umname " .
97 "$esign_fields" .
98 "FROM ( form_encounter AS fe, forms AS f ) " .
99 "LEFT OUTER JOIN patient_data AS p ON p.pid = fe.pid " .
100 "LEFT JOIN users AS u ON u.id = fe.provider_id " .
101 "$esign_joins" .
102 "WHERE f.pid = fe.pid AND f.encounter = fe.encounter AND f.formdir = 'newpatient' ";
103 if ($form_to_date) {
104 $query .= "AND fe.date >= ? AND fe.date <= ? ";
105 array_push($sqlBindArray, $form_from_date . ' 00:00:00', $form_to_date . ' 23:59:59');
106 } else {
107 $query .= "AND fe.date >= ? AND fe.date <= ? ";
108 array_push($sqlBindArray, $form_from_date . ' 00:00:00', $form_from_date . ' 23:59:59');
111 if ($form_provider) {
112 $query .= "AND fe.provider_id = ? ";
113 array_push($sqlBindArray, $form_provider);
116 if ($form_facility) {
117 $query .= "AND fe.facility_id = ? ";
118 array_push($sqlBindArray, $form_facility);
121 if ($form_new_patients) {
122 $query .= "AND fe.date = (SELECT MIN(fe2.date) FROM form_encounter AS fe2 WHERE fe2.pid = fe.pid) ";
125 if ($form_encounter_esigned) {
126 $query .= "AND es.tid = fe.encounter AND es.table = 'form_encounter' ";
129 if ($form_esigned) {
130 $query .= "AND es.tid = fe.encounter ";
133 if ($form_not_esigned) {
134 $query .= "AND es.tid IS NULL ";
137 $query .= "ORDER BY $orderby";
139 $res = sqlStatement($query, $sqlBindArray);
141 <html>
142 <head>
143 <title><?php echo xlt('Encounters Report'); ?></title>
145 <?php Header::setupHeader(['datetime-picker', 'report-helper']); ?>
147 <style type="text/css">
148 /* specifically include & exclude from printing */
149 @media print {
150 #report_parameters {
151 visibility: hidden;
152 display: none;
154 #report_parameters_daterange {
155 visibility: visible;
156 display: inline;
158 #report_results table {
159 margin-top: 0px;
163 /* specifically exclude some from the screen */
164 @media screen {
165 #report_parameters_daterange {
166 visibility: hidden;
167 display: none;
170 </style>
172 <script LANGUAGE="JavaScript">
173 $(document).ready(function() {
174 oeFixedHeaderSetup(document.getElementById('mymaintable'));
175 var win = top.printLogSetup ? top : opener.top;
176 win.printLogSetup(document.getElementById('printbutton'));
178 $('.datepicker').datetimepicker({
179 <?php $datetimepicker_timepicker = false; ?>
180 <?php $datetimepicker_showseconds = false; ?>
181 <?php $datetimepicker_formatInput = true; ?>
182 <?php require($GLOBALS['srcdir'] . '/js/xl/jquery-datetimepicker-2-5-4.js.php'); ?>
183 <?php // can add any additional javascript settings to datetimepicker here; need to prepend first setting with a comma ?>
187 function dosort(orderby) {
188 var f = document.forms[0];
189 f.form_orderby.value = orderby;
190 f.submit();
191 return false;
194 function refreshme() {
195 document.forms[0].submit();
197 </script>
198 </head>
199 <body class="body_top">
200 <!-- Required for the popup date selectors -->
201 <div id="overDiv" style="position:absolute; visibility:hidden; z-index:1000;"></div>
203 <span class='title'><?php echo xlt('Report'); ?> - <?php echo xlt('Encounters'); ?></span>
205 <div id="report_parameters_daterange">
206 <?php echo text(oeFormatShortDate($form_from_date)) ." &nbsp; " . xlt('to') . " &nbsp; ". text(oeFormatShortDate($form_to_date)); ?>
207 </div>
209 <form method='post' name='theform' id='theform' action='encounters_report.php' onsubmit='return top.restoreSession()'>
211 <div id="report_parameters">
212 <table>
213 <tr>
214 <td width='550px'>
215 <div style='float:left'>
217 <table class='text'>
218 <tr>
219 <td class='control-label'>
220 <?php echo xlt('Facility'); ?>:
221 </td>
222 <td>
223 <?php dropdown_facility($form_facility, 'form_facility', true); ?>
224 </td>
225 <td class='control-label'>
226 <?php echo xlt('Provider'); ?>:
227 </td>
228 <td>
229 <?php
231 // Build a drop-down list of providers.
234 $query = "SELECT id, lname, fname FROM users WHERE ".
235 "authorized = 1 $provider_facility_filter ORDER BY lname, fname"; //(CHEMED) facility filter
237 $ures = sqlStatement($query);
239 echo " <select name='form_provider' class='form-control'>\n";
240 echo " <option value=''>-- " . xlt('All') . " --\n";
242 while ($urow = sqlFetchArray($ures)) {
243 $provid = $urow['id'];
244 echo " <option value='" . attr($provid) . "'";
245 if ($provid == $_POST['form_provider']) {
246 echo " selected";
249 echo ">" . text($urow['lname']) . ", " . text($urow['fname']) . "\n";
252 echo " </select>\n";
255 </td>
256 </tr>
257 <tr>
258 <td class='control-label'>
259 <?php echo xlt('From'); ?>:
260 </td>
261 <td>
262 <input type='text' class='datepicker form-control' name='form_from_date' id="form_from_date" size='10' value='<?php echo attr(oeFormatShortDate($form_from_date)); ?>'>
263 </td>
264 <td class='control-label'>
265 <?php echo xlt('To'); ?>:
266 </td>
267 <td>
268 <input type='text' class='datepicker form-control' name='form_to_date' id="form_to_date" size='10' value='<?php echo attr(oeFormatShortDate($form_to_date)); ?>'>
269 </td>
270 </tr>
271 <tr>
272 <td></td>
273 <td>
274 <div class="checkbox">
275 <label><input type='checkbox' name='form_details'<?php echo ($form_details) ? ' checked' : ''; ?>>
276 <?php echo xlt('Details'); ?></label>
277 </div>
278 <div class="checkbox">
279 <label><input type='checkbox' name='form_new_patients' title='<?php echo xla('First-time visits only'); ?>'<?php echo ($form_new_patients) ? ' checked' : ''; ?>>
280 <?php echo xlt('New'); ?></label>
281 </div>
282 </td>
283 <td></td>
284 <td>
285 <div class="checkbox">
286 <label><input type='checkbox' name='form_esigned'<?php echo ($form_esigned) ? ' checked' : ''; ?>>
287 <?php echo xlt('Forms Esigned'); ?></label>
288 </div>
289 <div class="checkbox">
290 <label><input type='checkbox' name='form_encounter_esigned'<?php echo ($form_encounter_esigned) ? ' checked' : ''; ?>>
291 <?php echo xlt('Encounter Esigned'); ?></label>
292 </div>
293 <div class="checkbox">
294 <label><input type='checkbox' name='form_not_esigned'<?php echo ($form_not_esigned) ? ' checked' : ''; ?>>
295 <?php echo xlt('Not Esigned'); ?></label>
296 </div>
297 </td>
298 </tr>
299 </table>
301 </div>
303 </td>
304 <td align='left' valign='middle' height="100%">
305 <table style='border-left:1px solid; width:100%; height:100%' >
306 <tr>
307 <td>
308 <div class="text-center">
309 <div class="btn-group" role="group">
310 <a href='#' class='btn btn-default btn-save' onclick='$("#form_refresh").attr("value","true"); $("#theform").submit();'>
311 <?php echo xlt('Submit'); ?>
312 </a>
313 <?php if ($_POST['form_refresh'] || $_POST['form_orderby']) { ?>
314 <a href='#' class='btn btn-default btn-print' id='printbutton'>
315 <?php echo xlt('Print'); ?>
316 </a>
317 <?php } ?>
318 </div>
319 </div>
320 </td>
321 </tr>
322 </table>
323 </td>
324 </tr>
325 </table>
327 </div> <!-- end report_parameters -->
329 <?php
330 if ($_POST['form_refresh'] || $_POST['form_orderby']) {
332 <div id="report_results">
333 <table id='mymaintable'>
334 <thead>
335 <?php if ($form_details) { ?>
336 <th>
337 <a href="nojs.php" onclick="return dosort('doctor')"
338 <?php echo ($form_orderby == "doctor") ? " style=\"color:#00cc00\"" : ""; ?>><?php echo xlt('Provider'); ?> </a>
339 </th>
340 <th>
341 <a href="nojs.php" onclick="return dosort('time')"
342 <?php echo ($form_orderby == "time") ? " style=\"color:#00cc00\"" : ""; ?>><?php echo xlt('Date'); ?></a>
343 </th>
344 <th>
345 <a href="nojs.php" onclick="return dosort('patient')"
346 <?php echo ($form_orderby == "patient") ? " style=\"color:#00cc00\"" : ""; ?>><?php echo xlt('Patient'); ?></a>
347 </th>
348 <th>
349 <a href="nojs.php" onclick="return dosort('pubpid')"
350 <?php echo ($form_orderby == "pubpid") ? " style=\"color:#00cc00\"" : ""; ?>><?php echo xlt('ID'); ?></a>
351 </th>
352 <th>
353 <?php echo xlt('Status'); ?>
354 </th>
355 <th>
356 <?php echo xlt('Encounter'); ?>
357 </th>
358 <th>
359 <a href="nojs.php" onclick="return dosort('encounter')"
360 <?php echo ($form_orderby == "encounter") ? " style=\"color:#00cc00\"" : ""; ?>><?php echo xlt('Encounter Number'); ?></a>
361 </th>
362 <th>
363 <?php echo xlt('Form'); ?>
364 </th>
365 <th>
366 <?php echo xlt('Coding'); ?>
367 </th>
368 <?php } else { ?>
369 <th><?php echo xlt('Provider'); ?></td>
370 <th><?php echo xlt('Encounters'); ?></td>
371 <?php } ?>
372 </thead>
373 <tbody>
374 <?php
375 if ($res) {
376 $lastdocname = "";
377 $doc_encounters = 0;
378 while ($row = sqlFetchArray($res)) {
379 $patient_id = $row['pid'];
381 $docname = '';
382 if (!empty($row['ulname']) || !empty($row['ufname'])) {
383 $docname = $row['ulname'];
384 if (!empty($row['ufname']) || !empty($row['umname'])) {
385 $docname .= ', ' . $row['ufname'] . ' ' . $row['umname'];
389 $errmsg = "";
390 if ($form_details) {
391 // Fetch all other forms for this encounter.
392 $encnames = '';
393 $encarr = getFormByEncounter(
394 $patient_id,
395 $row['encounter'],
396 "formdir, user, form_name, form_id"
398 if ($encarr!='') {
399 foreach ($encarr as $enc) {
400 if ($enc['formdir'] == 'newpatient') {
401 continue;
404 if ($encnames) {
405 $encnames .= '<br />';
408 $encnames .= text($enc['form_name']); // need to html escape it here for output below
412 // Fetch coding and compute billing status.
413 $coded = "";
414 $billed_count = 0;
415 $unbilled_count = 0;
416 if ($billres = getBillingByEncounter(
417 $row['pid'],
418 $row['encounter'],
419 "code_type, code, code_text, billed"
420 )) {
421 foreach ($billres as $billrow) {
422 // $title = addslashes($billrow['code_text']);
423 if ($billrow['code_type'] != 'COPAY' && $billrow['code_type'] != 'TAX') {
424 $coded .= $billrow['code'] . ', ';
425 if ($billrow['billed']) {
426 ++$billed_count;
427 } else {
428 ++$unbilled_count;
433 $coded = substr($coded, 0, strlen($coded) - 2);
436 // Figure product sales into billing status.
437 $sres = sqlStatement("SELECT billed FROM drug_sales " .
438 "WHERE pid = ? AND encounter = ?", array($row['pid'], $row['encounter']));
439 while ($srow = sqlFetchArray($sres)) {
440 if ($srow['billed']) {
441 ++$billed_count;
442 } else {
443 ++$unbilled_count;
447 // Compute billing status.
448 if ($billed_count && $unbilled_count) {
449 $status = xl('Mixed');
450 } else if ($billed_count) {
451 $status = xl('Closed');
452 } else if ($unbilled_count) {
453 $status = xl('Open');
454 } else {
455 $status = xl('Empty');
458 <tr bgcolor='<?php echo $bgcolor ?>'>
459 <td>
460 <?php echo ($docname == $lastdocname) ? "" : text($docname) ?>&nbsp;
461 </td>
462 <td>
463 <?php echo text(oeFormatShortDate(substr($row['date'], 0, 10))) ?>&nbsp;
464 </td>
465 <td>
466 <?php echo text($row['lname'] . ', ' . $row['fname'] . ' ' . $row['mname']); ?>&nbsp;
467 </td>
468 <td>
469 <?php echo text($row['pubpid']); ?>&nbsp;
470 </td>
471 <td>
472 <?php echo text($status); ?>&nbsp;
473 </td>
474 <td>
475 <?php echo text($row['reason']); ?>&nbsp;
476 </td>
477 <td>
478 <?php echo text($row['encounter']); ?>&nbsp;
479 </td>
480 <td>
481 <?php echo $encnames; //since this variable contains html, have already html escaped it above ?>&nbsp;
482 </td>
483 <td>
484 <?php echo text($coded); ?>
485 </td>
486 </tr>
487 <?php
488 } else {
489 if ($docname != $lastdocname) {
490 show_doc_total($lastdocname, $doc_encounters);
491 $doc_encounters = 0;
494 ++$doc_encounters;
497 $lastdocname = $docname;
500 if (!$form_details) {
501 show_doc_total($lastdocname, $doc_encounters);
505 </tbody>
506 </table>
507 </div> <!-- end encresults -->
508 <?php } else { ?>
509 <div class='text'>
510 <?php echo xlt('Please input search criteria above, and click Submit to view results.'); ?>
511 </div>
512 <?php } ?>
514 <input type="hidden" name="form_orderby" value="<?php echo attr($form_orderby) ?>" />
515 <input type='hidden' name='form_refresh' id='form_refresh' value=''/>
517 </form>
518 </body>
520 <script language='JavaScript'>
521 <?php if ($alertmsg) {
522 echo " alert('$alertmsg');\n";
523 } ?>
524 </script>
525 </html>