Added procedure order manifest report for orders that need review or going out on...
[openemr.git] / interface / orders / single_order_results.inc.php
blobac5a8a2fe9c16c522c8551124b05bdebd1bd34f5
1 <?php
2 /**
3 * Script to display results for a given procedure order.
5 * Copyright (C) 2013 Rod Roark <rod@sunsetsystems.com>
7 * LICENSE: This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://opensource.org/licenses/gpl-license.php>.
18 * @package OpenEMR
19 * @author Rod Roark <rod@sunsetsystems.com>
22 require_once("$srcdir/acl.inc");
23 require_once("$srcdir/formdata.inc.php");
24 require_once("$srcdir/options.inc.php");
25 require_once("$srcdir/formatting.inc.php");
27 function getListItem($listid, $value) {
28 $lrow = sqlQuery("SELECT title FROM list_options " .
29 "WHERE list_id = ? AND option_id = ?",
30 array($listid, $value));
31 $tmp = xl_list_label($lrow['title']);
32 if (empty($tmp)) $tmp = "($report_status)";
33 return $tmp;
36 function myCellText($s) {
37 if ($s === '') return '&nbsp;';
38 return text($s);
41 // Check if the given string already exists in the $aNotes array.
42 // If not, stores it as a new entry.
43 // Either way, returns the corresponding key which is a small integer.
44 function storeNote($s) {
45 global $aNotes;
46 $key = array_search($s, $aNotes);
47 if ($key !== FALSE) return $key;
48 $key = count($aNotes);
49 $aNotes[$key] = $s;
50 return $key;
53 function generate_order_report($orderid, $input_form=false) {
54 // Check authorization.
55 $thisauth = acl_check('patients', 'med');
56 if (!$thisauth) return xl('Not authorized');
58 $orow = sqlQuery("SELECT " .
59 "po.procedure_order_id, po.date_ordered, " .
60 "po.order_status, po.specimen_type, " .
61 "pd.pubpid, pd.lname, pd.fname, pd.mname, " .
62 "fe.date, " .
63 "pp.name AS labname, " .
64 "u.lname AS ulname, u.fname AS ufname, u.mname AS umname " .
65 "FROM procedure_order AS po " .
66 "LEFT JOIN patient_data AS pd ON pd.pid = po.patient_id " .
67 "LEFT JOIN procedure_providers AS pp ON pp.ppid = po.lab_id " .
68 "LEFT JOIN users AS u ON u.id = po.provider_id " .
69 "LEFT JOIN form_encounter AS fe ON fe.pid = po.patient_id AND fe.encounter = po.encounter_id " .
70 "WHERE po.procedure_order_id = ?",
71 array($orderid));
74 <style>
76 .labres tr.head { font-size:10pt; background-color:#cccccc; text-align:center; }
77 .labres tr.detail { font-size:10pt; }
78 .labres a, .labres a:visited, .labres a:hover { color:#0000cc; }
80 .labres table {
81 border-style: solid;
82 border-width: 1px 0px 0px 1px;
83 border-color: black;
86 .labres td, .labres th {
87 border-style: solid;
88 border-width: 0px 1px 1px 0px;
89 border-color: black;
92 </style>
94 <?php if ($input_form) { ?>
95 <script type="text/javascript" src="../../library/dialog.js"></script>
96 <script type="text/javascript" src="../../library/textformat.js"></script>
97 <script language="JavaScript">
98 var mypcc = '<?php echo $GLOBALS['phone_country_code'] ?>';
99 </script>
100 <form method='post' action='single_order_results.php?orderid=<?php echo attr($orderid); ?>'>
101 <?php } // end if input form ?>
103 <div class='labres'>
105 <table width='100%' cellpadding='2' cellspacing='0'>
106 <tr bgcolor='#cccccc'>
107 <td width='5%' nowrap><?php echo xlt('Patient ID'); ?></td>
108 <td width='45%'><?php echo myCellText($orow['pubpid']); ?></td>
109 <td width='5%' nowrap><?php echo xlt('Order ID'); ?></td>
111 <td width='45%'>
112 <?php
113 echo " <a href='" . $GLOBALS['webroot'];
114 echo "/interface/orders/order_manifest.php?orderid=";
115 echo attr($orow['procedure_order_id']);
116 echo "' target='_blank' onclick='top.restoreSession()'>";
117 echo myCellText($orow['procedure_order_id']);
118 echo "</a>\n";
120 </td>
121 </tr>
122 <tr bgcolor='#cccccc'>
123 <td nowrap><?php echo xlt('Patient Name'); ?></td>
124 <td><?php echo myCellText($orow['lname'] . ', ' . $orow['fname'] . ' ' . $orow['mname']); ?></td>
125 <td nowrap><?php echo xlt('Ordered By'); ?></td>
126 <td><?php echo myCellText($orow['ulname'] . ', ' . $orow['ufname'] . ' ' . $orow['umname']); ?></td>
127 </tr>
128 <tr bgcolor='#cccccc'>
129 <td nowrap><?php echo xlt('Order Date'); ?></td>
130 <td><?php echo myCellText(oeFormatShortDate($orow['date_ordered'])); ?></td>
131 <td nowrap><?php echo xlt('Print Date'); ?></td>
132 <td><?php echo oeFormatShortDate(date('Y-m-d')); ?></td>
133 </tr>
134 <tr bgcolor='#cccccc'>
135 <td nowrap><?php echo xlt('Order Status'); ?></td>
136 <td><?php echo myCellText($orow['order_status']); ?></td>
137 <td nowrap><?php echo xlt('Encounter Date'); ?></td>
138 <td><?php echo myCellText(oeFormatShortDate(substr($orow['date'], 0, 10))); ?></td>
139 </tr>
140 <tr bgcolor='#cccccc'>
141 <td nowrap><?php echo xlt('Lab'); ?></td>
142 <td><?php echo myCellText($orow['labname']); ?></td>
143 <td nowrap><?php echo xlt('Specimen Type'); ?></td>
144 <td><?php echo myCellText($orow['specimen_type']); ?></td>
145 </tr>
146 </table>
148 &nbsp;<br />
150 <table width='100%' cellpadding='2' cellspacing='0'>
152 <tr class='head'>
153 <td rowspan='2' valign='middle'><?php echo xlt('Ordered Procedure'); ?></td>
154 <td colspan='4'><?php echo xlt('Report'); ?></td>
155 <td colspan='7'><?php echo xlt('Results'); ?></td>
156 </tr>
158 <tr class='head'>
159 <td><?php echo xlt('Reported'); ?></td>
160 <td><?php echo xlt('Specimen'); ?></td>
161 <td><?php echo xlt('Status'); ?></td>
162 <td><?php echo xlt('Note'); ?></td>
163 <td><?php echo xlt('Code'); ?></td>
164 <td><?php echo xlt('Name'); ?></td>
165 <td><?php echo xlt('Abn'); ?></td>
166 <td><?php echo xlt('Value'); ?></td>
167 <td><?php echo xlt('Range'); ?></td>
168 <td><?php echo xlt('Units'); ?></td>
169 <td><?php echo xlt('Note'); ?></td>
170 </tr>
172 <?php
173 $query = "SELECT " .
174 "po.date_ordered, pc.procedure_order_seq, pc.procedure_code, " .
175 "pc.procedure_name, " .
176 "pr.procedure_report_id, pr.date_report, pr.date_collected, pr.specimen_num, " .
177 "pr.report_status, pr.review_status, pr.report_notes " .
178 "FROM procedure_order AS po " .
179 "JOIN procedure_order_code AS pc ON pc.procedure_order_id = po.procedure_order_id " .
180 "LEFT JOIN procedure_report AS pr ON pr.procedure_order_id = po.procedure_order_id AND " .
181 "pr.procedure_order_seq = pc.procedure_order_seq " .
182 "WHERE po.procedure_order_id = ? " .
183 "ORDER BY pc.procedure_order_seq, pr.procedure_report_id";
185 $res = sqlStatement($query, array($orderid));
187 $lastpoid = -1;
188 $lastpcid = -1;
189 $lastprid = -1;
190 $encount = 0;
191 $lino = 0;
192 $extra_html = '';
193 $aNotes = array();
194 $sign_list = '';
196 while ($row = sqlFetchArray($res)) {
197 $order_type_id = empty($row['order_type_id' ]) ? 0 : ($row['order_type_id' ] + 0);
198 $order_seq = empty($row['procedure_order_seq']) ? 0 : ($row['procedure_order_seq'] + 0);
199 $report_id = empty($row['procedure_report_id']) ? 0 : ($row['procedure_report_id'] + 0);
200 $procedure_code = empty($row['procedure_code' ]) ? '' : $row['procedure_code'];
201 $procedure_name = empty($row['procedure_name' ]) ? '' : $row['procedure_name'];
202 $date_report = empty($row['date_report' ]) ? '' : $row['date_report'];
203 $date_collected = empty($row['date_collected' ]) ? '' : substr($row['date_collected'], 0, 16);
204 $specimen_num = empty($row['specimen_num' ]) ? '' : $row['specimen_num'];
205 $report_status = empty($row['report_status' ]) ? '' : $row['report_status'];
206 $review_status = empty($row['review_status' ]) ? 'received' : $row['review_status'];
208 if ($review_status != 'reviewed' && $report_id) {
209 if ($sign_list) $sign_list .= ',';
210 $sign_list .= $report_id;
213 $report_noteid ='';
214 if (!empty($row['report_notes'])) {
215 $report_noteid = 1 + storeNote($row['report_notes']);
218 $query = "SELECT " .
219 "ps.result_code, ps.result_text, ps.abnormal, ps.result, " .
220 "ps.range, ps.result_status, ps.facility, ps.units, ps.comments " .
221 "FROM procedure_result AS ps " .
222 "WHERE ps.procedure_report_id = ? " .
223 "ORDER BY ps.result_code, ps.procedure_result_id";
225 $rres = sqlStatement($query, array($report_id));
226 $rrows = array();
227 while ($rrow = sqlFetchArray($rres)) {
228 $rrows[] = $rrow;
230 if (empty($rrows)) {
231 $rrows[0] = array('result_code' => '');
234 foreach ($rrows as $rrow) {
235 $result_code = empty($rrow['result_code' ]) ? '' : $rrow['result_code'];
236 $result_text = empty($rrow['result_text' ]) ? '' : $rrow['result_text'];
237 $result_abnormal = empty($rrow['abnormal' ]) ? '' : $rrow['abnormal'];
238 $result_result = empty($rrow['result' ]) ? '' : $rrow['result'];
239 $result_units = empty($rrow['units' ]) ? '' : $rrow['units'];
240 $result_facility = empty($rrow['facility' ]) ? '' : $rrow['facility'];
241 $result_comments = empty($rrow['comments' ]) ? '' : $rrow['comments'];
242 $result_range = empty($rrow['range' ]) ? '' : $rrow['range'];
243 $result_status = empty($rrow['result_status' ]) ? '' : $rrow['result_status'];
245 $result_comments = trim($result_comments);
246 $result_noteid = '';
247 if (!empty($result_comments)) {
248 $result_noteid = 1 + storeNote($result_comments);
251 if ($lastpoid != $order_id || $lastpcid != $order_seq) {
252 ++$encount;
254 $bgcolor = "#" . (($encount & 1) ? "ddddff" : "ffdddd");
256 echo " <tr class='detail' bgcolor='$bgcolor'>\n";
258 if ($lastpcid != $order_seq) {
259 $lastprid = -1; // force report fields on first line of each procedure
260 echo " <td>" . text("$procedure_code: $procedure_name") . "</td>\n";
262 else {
263 echo " <td style='background-color:transparent'>&nbsp;</td>";
266 // If this starts a new report or a new order, generate the report fields.
267 if ($report_id != $lastprid) {
268 echo " <td>";
269 echo myCellText(oeFormatShortDate($date_report));
270 echo "</td>\n";
272 echo " <td>";
273 echo myCellText($specimen_num);
274 echo "</td>\n";
276 echo " <td title='" . xla('Check mark indicates reviewed') . "'>";
277 echo myCellText(getListItem('proc_rep_status', $report_status));
278 if ($row['review_status'] == 'reviewed') {
279 echo " &#x2713;"; // unicode check mark character
281 echo "</td>\n";
283 echo " <td align='center'>";
284 echo myCellText($report_noteid);
285 echo "</td>\n";
287 else {
288 echo " <td colspan='4' style='background-color:transparent'>&nbsp;</td>\n";
291 if ($result_code !== '') {
292 echo " <td>";
293 echo myCellText($result_code);
294 echo "</td>\n";
295 echo " <td>";
296 echo myCellText($result_text);
297 echo "</td>\n";
298 echo " <td>";
299 echo myCellText(getListItem('proc_res_abnormal', $result_abnormal));
300 echo "</td>\n";
301 echo " <td>";
302 echo myCellText($result_result);
303 echo "</td>\n";
304 echo " <td>";
305 echo myCellText($result_range);
306 echo "</td>\n";
307 echo " <td>";
308 echo myCellText($result_units);
309 echo "</td>\n";
310 echo " <td align='center'>";
311 echo myCellText($result_noteid);
312 echo "</td>\n";
314 else {
315 echo " <td colspan='7' style='background-color:transparent'>&nbsp;</td>\n";
318 echo " </tr>\n";
320 $lastpoid = $order_id;
321 $lastpcid = $order_seq;
322 $lastprid = $report_id;
323 ++$lino;
328 </table>
330 &nbsp;<br />
331 <table width='100%' style='border-width:0px;'>
332 <tr>
333 <td style='border-width:0px;'>
334 <?php
335 if (!empty($aNotes)) {
336 echo "<table cellpadding='3' cellspacing='0'>\n";
337 echo " <tr bgcolor='#cccccc'>\n";
338 echo " <th align='center' colspan='2'>" . xlt('Notes') . "</th>\n";
339 echo " </tr>\n";
340 foreach ($aNotes as $key => $value) {
341 echo " <tr>\n";
342 echo " <td valign='top'>" . ($key + 1) . "</td>\n";
343 echo " <td>" . nl2br(text($value)) . "</td>\n";
344 echo " </tr>\n";
346 echo "</table>\n";
349 </td>
350 <td style='border-width:0px;' align='right' valign='top'>
351 <?php if ($input_form && $sign_list) { ?>
352 <input type='hidden' name='form_sign_list' value='<?php echo attr($sign_list); ?>' />
353 <input type='submit' name='form_sign' value='<?php echo xla('Sign Results'); ?>'
354 title='<?php echo xla('Mark these reports as reviewed'); ?>' />
355 <?php } ?>
356 </td>
357 </tr>
358 </table>
360 </div>
362 <?php if ($input_form) { ?>
363 </form>
364 <?php } // end if input form ?>
366 <?php
367 } // end function generate_order_report