fix: add missing use statement in facility admin script (#7428)
[openemr.git] / interface / reports / patient_list.php
blob9fb6b2f749a342aea966faf2d8deadb72f5a57b7
1 <?php
3 /**
4 * This report lists patients that were seen within a given date
5 * range, or all patients if no date range is entered.
7 * @package OpenEMR
8 * @link http://www.open-emr.org
9 * @author Rod Roark <rod@sunsetsystems.com>
10 * @author Brady Miller <brady.g.miller@gmail.com>
11 * @copyright Copyright (c) 2006-2016 Rod Roark <rod@sunsetsystems.com>
12 * @copyright Copyright (c) 2017-2018 Brady Miller <brady.g.miller@gmail.com>
13 * @license https://github.com/openemr/openemr/blob/master/LICENSE GNU General Public License 3
16 require_once("../globals.php");
17 require_once("$srcdir/patient.inc.php");
18 require_once("$srcdir/options.inc.php");
20 use OpenEMR\Common\Csrf\CsrfUtils;
21 use OpenEMR\Core\Header;
23 if (!empty($_POST)) {
24 if (!CsrfUtils::verifyCsrfToken($_POST["csrf_token_form"])) {
25 CsrfUtils::csrfNotVerified();
29 $from_date = (!empty($_POST['form_from_date'])) ? DateToYYYYMMDD($_POST['form_from_date']) : date('Y-01-01');
30 $to_date = (!empty($_POST['form_to_date'])) ? DateToYYYYMMDD($_POST['form_to_date']) : date('Y-m-d');
32 $form_provider = empty($_POST['form_provider']) ? 0 : intval($_POST['form_provider']);
34 // In the case of CSV export only, a download will be forced.
35 if (!empty($_POST['form_csvexport'])) {
36 header("Pragma: public");
37 header("Expires: 0");
38 header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
39 header("Content-Type: application/force-download");
40 header("Content-Disposition: attachment; filename=patient_list.csv");
41 header("Content-Description: File Transfer");
42 } else {
44 <html>
45 <head>
47 <title><?php echo xlt('Patient List'); ?></title>
49 <?php Header::setupHeader(['datetime-picker', 'report-helper']); ?>
51 <script>
53 $(function () {
54 oeFixedHeaderSetup(document.getElementById('mymaintable'));
55 top.printLogSetup(document.getElementById('printbutton'));
57 $('.datepicker').datetimepicker({
58 <?php $datetimepicker_timepicker = false; ?>
59 <?php $datetimepicker_showseconds = false; ?>
60 <?php $datetimepicker_formatInput = true; ?>
61 <?php require($GLOBALS['srcdir'] . '/js/xl/jquery-datetimepicker-2-5-4.js.php'); ?>
62 <?php // can add any additional javascript settings to datetimepicker here; need to prepend first setting with a comma ?>
63 });
64 });
66 </script>
68 <style>
70 /* specifically include & exclude from printing */
71 @media print {
72 #report_parameters {
73 visibility: hidden;
74 display: none;
76 #report_parameters_daterange {
77 visibility: visible;
78 display: inline;
79 margin-bottom: 10px;
81 #report_results table {
82 margin-top: 0px;
86 /* specifically exclude some from the screen */
87 @media screen {
88 #report_parameters_daterange {
89 visibility: hidden;
90 display: none;
92 #report_results {
93 width: 100%;
97 </style>
99 </head>
101 <body class="body_top">
103 <!-- Required for the popup date selectors -->
104 <div id="overDiv" style="position: absolute; visibility: hidden; z-index: 1000;"></div>
106 <span class='title'><?php echo xlt('Report'); ?> - <?php echo xlt('Patient List'); ?></span>
108 <div id="report_parameters_daterange">
109 <?php if (!(empty($to_date) && empty($from_date))) { ?>
110 <?php echo text(oeFormatShortDate($from_date)) . " &nbsp; " . xlt('to{{Range}}') . " &nbsp; " . text(oeFormatShortDate($to_date)); ?>
111 <?php } ?>
112 </div>
114 <form name='theform' id='theform' method='post' action='patient_list.php' onsubmit='return top.restoreSession()'>
115 <input type="hidden" name="csrf_token_form" value="<?php echo attr(CsrfUtils::collectCsrfToken()); ?>" />
117 <div id="report_parameters">
119 <input type='hidden' name='form_refresh' id='form_refresh' value=''/>
120 <input type='hidden' name='form_csvexport' id='form_csvexport' value=''/>
122 <table>
123 <tr>
124 <td width='60%'>
125 <div style='float:left'>
127 <table class='text'>
128 <tr>
129 <td class='col-form-label'>
130 <?php echo xlt('Provider'); ?>:
131 </td>
132 <td>
133 <?php
134 generate_form_field(array('data_type' => 10, 'field_id' => 'provider', 'empty_title' => '-- All --'), ($_POST['form_provider'] ?? ''));
136 </td>
137 <td class='col-form-label'>
138 <?php echo xlt('Visits From'); ?>:
139 </td>
140 <td>
141 <input class='datepicker form-control' type='text' name='form_from_date' id="form_from_date" size='10' value='<?php echo attr(oeFormatShortDate($from_date)); ?>'>
142 </td>
143 <td class='col-form-label'>
144 <?php echo xlt('To{{Range}}'); ?>:
145 </td>
146 <td>
147 <input class='datepicker form-control' type='text' name='form_to_date' id="form_to_date" size='10' value='<?php echo attr(oeFormatShortDate($to_date)); ?>'>
148 </td>
149 </tr>
150 </table>
152 </div>
154 </td>
155 <td class="h-100" align='left' valign='middle'>
156 <table class="w-100 h-100" style='border-left: 1px solid;'>
157 <tr>
158 <td>
159 <div class="text-center">
160 <div class="btn-group" role="group">
161 <a href='#' class='btn btn-secondary btn-save' onclick='$("#form_csvexport").val(""); $("#form_refresh").attr("value","true"); $("#theform").submit();'>
162 <?php echo xlt('Submit'); ?>
163 </a>
164 <?php if (!empty($_POST['form_refresh'])) { ?>
165 <a href='#' class='btn btn-secondary btn-transmit' onclick='$("#form_csvexport").attr("value","true"); $("#theform").submit();'>
166 <?php echo xlt('Export to CSV'); ?>
167 </a>
168 <a href='#' id='printbutton' class='btn btn-secondary btn-print'>
169 <?php echo xlt('Print'); ?>
170 </a>
171 <?php } ?>
172 </div>
173 </div>
174 </td>
175 </tr>
176 </table>
177 </td>
178 </tr>
179 </table>
180 </div> <!-- end of parameters -->
182 <?php
183 } // end not form_csvexport
185 if (!empty($_POST['form_refresh']) || !empty($_POST['form_csvexport'])) {
186 if ($_POST['form_csvexport']) {
187 // CSV headers:
188 echo csvEscape(xl('Last Visit')) . ',';
189 echo csvEscape(xl('First{{Name}}')) . ',';
190 echo csvEscape(xl('Last{{Name}}')) . ',';
191 echo csvEscape(xl('Middle{{Name}}')) . ',';
192 echo csvEscape(xl('ID')) . ',';
193 echo csvEscape(xl('Street')) . ',';
194 echo csvEscape(xl('City')) . ',';
195 echo csvEscape(xl('State')) . ',';
196 echo csvEscape(xl('Zip')) . ',';
197 echo csvEscape(xl('Home Phone')) . ',';
198 echo csvEscape(xl('Work Phone')) . "\n";
199 } else {
202 <div id="report_results">
203 <table class='table' id='mymaintable'>
204 <thead class='thead-light'>
205 <th> <?php echo xlt('Last Visit'); ?> </th>
206 <th> <?php echo xlt('Patient'); ?> </th>
207 <th> <?php echo xlt('ID'); ?> </th>
208 <th> <?php echo xlt('Street'); ?> </th>
209 <th> <?php echo xlt('City'); ?> </th>
210 <th> <?php echo xlt('State'); ?> </th>
211 <th> <?php echo xlt('Zip'); ?> </th>
212 <th> <?php echo xlt('Home Phone'); ?> </th>
213 <th> <?php echo xlt('Work Phone'); ?> </th>
214 </thead>
215 <tbody>
216 <?php
217 } // end not export
218 $totalpts = 0;
219 $sqlArrayBind = array();
220 $query = "SELECT " .
221 "p.fname, p.mname, p.lname, p.street, p.city, p.state, " .
222 "p.postal_code, p.phone_home, p.phone_biz, p.pid, p.pubpid, " .
223 "count(e.date) AS ecount, max(e.date) AS edate, " .
224 "i1.date AS idate1, i2.date AS idate2, " .
225 "c1.name AS cname1, c2.name AS cname2 " .
226 "FROM patient_data AS p ";
227 if (!empty($from_date)) {
228 $query .= "JOIN form_encounter AS e ON " .
229 "e.pid = p.pid AND " .
230 "e.date >= ? AND " .
231 "e.date <= ? ";
232 array_push($sqlArrayBind, $from_date . ' 00:00:00', $to_date . ' 23:59:59');
233 if ($form_provider) {
234 $query .= "AND e.provider_id = ? ";
235 array_push($sqlArrayBind, $form_provider);
237 } else {
238 if ($form_provider) {
239 $query .= "JOIN form_encounter AS e ON " .
240 "e.pid = p.pid AND e.provider_id = ? ";
241 array_push($sqlArrayBind, $form_provider);
242 } else {
243 $query .= "LEFT OUTER JOIN form_encounter AS e ON " .
244 "e.pid = p.pid ";
248 $query .=
249 "LEFT OUTER JOIN insurance_data AS i1 ON " .
250 "i1.pid = p.pid AND i1.type = 'primary' " .
251 "LEFT OUTER JOIN insurance_companies AS c1 ON " .
252 "c1.id = i1.provider " .
253 "LEFT OUTER JOIN insurance_data AS i2 ON " .
254 "i2.pid = p.pid AND i2.type = 'secondary' " .
255 "LEFT OUTER JOIN insurance_companies AS c2 ON " .
256 "c2.id = i2.provider " .
257 "GROUP BY p.lname, p.fname, p.mname, p.pid, i1.date, i2.date " .
258 "ORDER BY p.lname, p.fname, p.mname, p.pid, i1.date DESC, i2.date DESC";
259 $res = sqlStatement($query, $sqlArrayBind);
261 $prevpid = 0;
262 while ($row = sqlFetchArray($res)) {
263 if ($row['pid'] == $prevpid) {
264 continue;
267 $prevpid = $row['pid'];
268 $age = '';
269 if (!empty($row['DOB'])) {
270 $dob = $row['DOB'];
271 $tdy = $row['edate'] ? $row['edate'] : date('Y-m-d');
272 $ageInMonths = (substr($tdy, 0, 4) * 12) + substr($tdy, 5, 2) -
273 (substr($dob, 0, 4) * 12) - substr($dob, 5, 2);
274 $dayDiff = substr($tdy, 8, 2) - substr($dob, 8, 2);
275 if ($dayDiff < 0) {
276 --$ageInMonths;
279 $age = intval($ageInMonths / 12);
282 if ($_POST['form_csvexport']) {
283 echo csvEscape(oeFormatShortDate(substr($row['edate'], 0, 10))) . ',';
284 echo csvEscape($row['lname']) . ',';
285 echo csvEscape($row['fname']) . ',';
286 echo csvEscape($row['mname']) . ',';
287 echo csvEscape($row['pubpid']) . ',';
288 echo csvEscape(xl($row['street'])) . ',';
289 echo csvEscape(xl($row['city'])) . ',';
290 echo csvEscape(xl($row['state'])) . ',';
291 echo csvEscape($row['postal_code']) . ',';
292 echo csvEscape($row['phone_home']) . ',';
293 echo csvEscape($row['phone_biz']) . "\n";
294 } else {
296 <tr>
297 <td>
298 <?php echo text(oeFormatShortDate(substr($row['edate'], 0, 10))); ?>
299 </td>
300 <td>
301 <?php echo text($row['lname'] . ', ' . $row['fname'] . ' ' . $row['mname']); ?>
302 </td>
303 <td>
304 <?php echo text($row['pubpid']); ?>
305 </td>
306 <td>
307 <?php echo xlt($row['street']); ?>
308 </td>
309 <td>
310 <?php echo xlt($row['city']); ?>
311 </td>
312 <td>
313 <?php echo xlt($row['state']); ?>
314 </td>
315 <td>
316 <?php echo text($row['postal_code']); ?>
317 </td>
318 <td>
319 <?php echo text($row['phone_home']); ?>
320 </td>
321 <td>
322 <?php echo text($row['phone_biz']); ?>
323 </td>
324 </tr>
325 <?php
326 } // end not export
327 ++$totalpts;
328 } // end while
329 if (!$_POST['form_csvexport']) {
332 <tr class="report_totals">
333 <td colspan='9'>
334 <?php echo xlt('Total Number of Patients'); ?>
336 <?php echo text($totalpts); ?>
337 </td>
338 </tr>
340 </tbody>
341 </table>
342 </div> <!-- end of results -->
343 <?php
344 } // end not export
345 } // end if refresh or export
347 if (empty($_POST['form_refresh']) && empty($_POST['form_csvexport'])) {
349 <div class='text'>
350 <?php echo xlt('Please input search criteria above, and click Submit to view results.'); ?>
351 </div>
352 <?php
355 if (empty($_POST['form_csvexport'])) {
358 </form>
359 </body>
361 </html>
362 <?php
363 } // end not export