ongoing new datepicker project
[openemr.git] / interface / orders / single_order_results.inc.php
blob880a1220fce5902510423c64ad7e102178f2fa00
1 <?php
2 /**
3 * Script to display results for a given procedure order.
5 * Copyright (C) 2013-2016 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($GLOBALS["srcdir"] . "/acl.inc");
23 require_once($GLOBALS["srcdir"] . "/options.inc.php");
25 function getListItem($listid, $value) {
26 $lrow = sqlQuery("SELECT title FROM list_options " .
27 "WHERE list_id = ? AND option_id = ? AND activity = 1",
28 array($listid, $value));
29 $tmp = xl_list_label($lrow['title']);
30 if (empty($tmp)) $tmp = (($value === '') ? '' : "($value)");
31 return $tmp;
34 function myCellText($s) {
35 $s = trim($s);
36 if ($s === '') return '&nbsp;';
37 return text($s);
40 // Check if the given string already exists in the $aNotes array.
41 // If not, stores it as a new entry.
42 // Either way, returns the corresponding key which is a small integer.
43 function storeNote($s) {
44 global $aNotes;
45 $key = array_search($s, $aNotes);
46 if ($key !== FALSE) return $key;
47 $key = count($aNotes);
48 $aNotes[$key] = $s;
49 return $key;
52 // Display a single row of output including order, report and result information.
54 function generate_result_row(&$ctx, &$row, &$rrow, $priors_omitted=false) {
55 $lab_id = empty($row['lab_id' ]) ? 0 : ($row['lab_id' ] + 0);
56 $order_type_id = empty($row['order_type_id' ]) ? 0 : ($row['order_type_id' ] + 0);
57 $order_seq = empty($row['procedure_order_seq']) ? 0 : ($row['procedure_order_seq'] + 0);
58 $report_id = empty($row['procedure_report_id']) ? 0 : ($row['procedure_report_id'] + 0);
59 $procedure_code = empty($row['procedure_code' ]) ? '' : $row['procedure_code'];
60 $procedure_name = empty($row['procedure_name' ]) ? '' : $row['procedure_name'];
61 $date_report = empty($row['date_report' ]) ? '' : substr($row['date_report'], 0, 16);
62 $date_report_suf = empty($row['date_report_tz' ]) ? '' : (' ' . $row['date_report_tz' ]);
63 $date_collected = empty($row['date_collected' ]) ? '' : substr($row['date_collected'], 0, 16);
64 $date_collected_suf = empty($row['date_collected_tz' ]) ? '' : (' ' . $row['date_collected_tz' ]);
65 $specimen_num = empty($row['specimen_num' ]) ? '' : $row['specimen_num'];
66 $report_status = empty($row['report_status' ]) ? '' : $row['report_status'];
67 $review_status = empty($row['review_status' ]) ? 'received' : $row['review_status'];
69 $report_noteid = '';
70 if ($report_id && !isset($ctx['seen_report_ids'][$report_id])) {
71 $ctx['seen_report_ids'][$report_id] = true;
72 if ($review_status != 'reviewed') {
73 if ($ctx['sign_list']) $ctx['sign_list'] .= ',';
74 $ctx['sign_list'] .= $report_id;
76 // Allowing for multiple report notes separated by newlines.
77 if (!empty($row['report_notes'])) {
78 $notes = explode("\n", $row['report_notes']);
79 foreach ($notes as $note) {
80 if ($note === '') continue;
81 if ($report_noteid) $report_noteid .= ', ';
82 $report_noteid .= 1 + storeNote($note);
86 // allow for 0 to be displayed as a result value
87 if($rrow['result'] == '' && $rrow['result'] !== 0 && $rrow['result'] !== '0') {
88 $result_result = '';
89 } else {
90 $result_result = $rrow['result'];
92 $result_code = empty($rrow['result_code' ]) ? '' : $rrow['result_code'];
93 $result_text = empty($rrow['result_text' ]) ? '' : $rrow['result_text'];
94 $result_abnormal = empty($rrow['abnormal' ]) ? '' : $rrow['abnormal'];
95 $result_units = empty($rrow['units' ]) ? '' : $rrow['units'];
96 $result_facility = empty($rrow['facility' ]) ? '' : $rrow['facility'];
97 $result_comments = empty($rrow['comments' ]) ? '' : $rrow['comments'];
98 $result_range = empty($rrow['range' ]) ? '' : $rrow['range'];
99 $result_status = empty($rrow['result_status' ]) ? '' : $rrow['result_status'];
100 $result_document_id = empty($rrow['document_id' ]) ? '' : $rrow['document_id'];
102 // Someone changed the delimiter in result comments from \n to \r.
103 // Have to make sure results are consistent with those before that change.
104 $result_comments = str_replace("\r", "\n", $result_comments);
106 if ($i = strpos($result_comments, "\n")) { // "=" is not a mistake!
107 // If the first line of comments is not empty, then it is actually a long textual
108 // result value with lines delimited by "~" characters.
109 $result_comments = str_replace("~", "\n", substr($result_comments, 0, $i)) .
110 substr($result_comments, $i);
112 $result_comments = trim($result_comments);
114 $result_noteid = '';
115 if (!empty($result_comments)) {
116 $result_noteid = 1 + storeNote($result_comments);
118 if ($priors_omitted) {
119 if ($result_noteid) $result_noteid .= ', ';
120 $result_noteid .= 1 + storeNote(xl('This is the latest of multiple result values.'));
121 $ctx['priors_omitted'] = true;
124 // If a performing organization is provided, make a note for it also.
125 $result_facility = trim(str_replace("\r", "\n", $result_facility));
126 if ($result_facility) {
127 if ($result_noteid) $result_noteid .= ', ';
128 $result_noteid .= 1 + storeNote(xl('Performing organization') . ":\n" . $result_facility);
131 if ($ctx['lastpcid'] != $order_seq) {
132 ++$ctx['encount'];
134 $bgcolor = "#" . (($ctx['encount'] & 1) ? "ddddff" : "ffdddd");
136 echo " <tr class='detail' bgcolor='$bgcolor'>\n";
138 if ($ctx['lastpcid'] != $order_seq) {
139 $ctx['lastprid'] = -1; // force report fields on first line of each procedure
140 $tmp = text("$procedure_code: $procedure_name");
141 // Get the LOINC code if one exists in the compendium for this order type.
142 if (empty($GLOBALS['PATIENT_REPORT_ACTIVE'])) {
143 $trow = sqlQuery("SELECT standard_code FROM procedure_type WHERE " .
144 "lab_id = ? AND procedure_code = ? AND procedure_type = 'ord' " .
145 "ORDER BY procedure_type_id LIMIT 1",
146 array($lab_id, $procedure_code));
147 if (!empty($trow['standard_code'])) {
148 $tmp = "<a href='javascript:educlick(\"LOINC\",\"" . attr($trow['standard_code']) .
149 "\")'>$tmp</a>";
152 echo " <td>$tmp</td>\n";
154 else {
155 echo " <td style='background-color:transparent'>&nbsp;</td>";
158 // If this starts a new report or a new order, generate the report fields.
159 if ($report_id != $ctx['lastprid']) {
160 echo " <td>";
161 echo myCellText(oeFormatShortDate(substr($date_report, 0, 10)) . substr($date_report, 10) . $date_report_suf);
162 echo "</td>\n";
164 echo " <td>";
165 echo myCellText(oeFormatShortDate(substr($date_collected, 0, 10)) . substr($date_collected, 10) . $date_collected_suf);
166 echo "</td>\n";
168 echo " <td>";
169 echo myCellText($specimen_num);
170 echo "</td>\n";
172 echo " <td title='" . xla('Check mark indicates reviewed') . "'>";
173 echo myCellText(getListItem('proc_rep_status', $report_status));
174 if ($row['review_status'] == 'reviewed') {
175 echo " &#x2713;"; // unicode check mark character
177 echo "</td>\n";
179 echo " <td align='center'>";
180 echo myCellText($report_noteid);
181 echo "</td>\n";
183 else {
184 echo " <td colspan='5' style='background-color:transparent'>&nbsp;</td>\n";
187 if ($result_code !== '' || $result_document_id) {
188 $tmp = myCellText($result_code);
189 if (empty($GLOBALS['PATIENT_REPORT_ACTIVE']) && !empty($result_code)) {
190 $tmp = "<a href='javascript:educlick(\"LOINC\",\"" . attr($result_code) .
191 "\")'>$tmp</a>";
193 echo " <td>$tmp</td>\n";
194 echo " <td>";
195 echo myCellText($result_text);
196 echo "</td>\n";
197 echo " <td>";
198 $tmp = myCellText(getListItem('proc_res_abnormal', $result_abnormal));
199 if ($result_abnormal && strtolower($result_abnormal) != 'no') {
200 echo "<b><font color='red'>$tmp</font></b>";
202 else {
203 echo $tmp;
205 echo "</td>\n";
207 if ($result_document_id) {
208 $d = new Document($result_document_id);
209 echo " <td colspan='3'>";
210 if (empty($GLOBALS['PATIENT_REPORT_ACTIVE'])) {
211 echo "<a href='" . $GLOBALS['webroot'] . "/controller.php?document";
212 echo "&retrieve&patient_id=$patient_id&document_id=$result_document_id' ";
213 echo "onclick='top.restoreSession()'>";
215 echo $d->get_url_file();
216 if (empty($GLOBALS['PATIENT_REPORT_ACTIVE'])) {
217 echo "</a>";
219 echo "</td>\n";
220 $narrative_notes = sqlQuery("select group_concat(note SEPARATOR '\n') as notes from notes where foreign_id = ?",array($result_document_id));
221 if(!empty($narrative_notes)){
222 $nnotes = explode("\n",$narrative_notes['notes']);
223 $narrative_note_list = '';
224 foreach($nnotes as $nnote){
225 if($narrative_note_list == '') $narrative_note_list = 'Narrative Notes:';
226 $narrative_note_list .= $nnote;
229 if($narrative_note_list != ''){ if ($result_noteid) $result_noteid .= ', '; $result_noteid .= 1 + storeNote($narrative_note_list);}
233 else {
234 echo " <td>";
235 echo myCellText($result_result);
236 echo "</td>\n";
237 echo " <td>";
238 echo myCellText($result_range);
239 echo "</td>\n";
240 echo " <td>";
241 // Units comes from the lab so might not match anything in the proc_unit list,
242 // but in that case the call will return the same value.
243 echo myCellText(getListItemTitle('proc_unit', $result_units));
244 echo "</td>\n";
246 echo " <td align='center'>";
247 echo myCellText($result_noteid);
248 echo "</td>\n";
250 else {
251 echo " <td colspan='7' style='background-color:transparent'>&nbsp;</td>\n";
254 echo " </tr>\n";
256 $ctx['lastpcid'] = $order_seq;
257 $ctx['lastprid'] = $report_id;
258 ++$ctx['lino'];
261 function generate_order_report($orderid, $input_form=false, $genstyles=true, $finals_only=false) {
262 global $aNotes;
264 // Check authorization.
265 $thisauth = acl_check('patients', 'med');
266 if (!$thisauth) return xl('Not authorized');
268 $orow = sqlQuery("SELECT " .
269 "po.procedure_order_id, po.date_ordered, po.control_id, " .
270 "po.order_status, po.specimen_type, po.patient_id, " .
271 "pd.pubpid, pd.lname, pd.fname, pd.mname, pd.cmsportal_login, pd.language, " .
272 "fe.date, " .
273 "pp.name AS labname, " .
274 "u.lname AS ulname, u.fname AS ufname, u.mname AS umname " .
275 "FROM procedure_order AS po " .
276 "LEFT JOIN patient_data AS pd ON pd.pid = po.patient_id " .
277 "LEFT JOIN procedure_providers AS pp ON pp.ppid = po.lab_id " .
278 "LEFT JOIN users AS u ON u.id = po.provider_id " .
279 "LEFT JOIN form_encounter AS fe ON fe.pid = po.patient_id AND fe.encounter = po.encounter_id " .
280 "WHERE po.procedure_order_id = ?",
281 array($orderid));
283 $patient_id = $orow['patient_id'];
284 $language = $orow['language'];
287 <?php if ($genstyles) { ?>
288 <style>
290 <?php if (empty($_SESSION['language_direction']) || $_SESSION['language_direction'] == 'ltr') { ?>
292 .labres tr.head { font-size:10pt; background-color:#cccccc; text-align:center; }
293 .labres tr.detail { font-size:10pt; }
294 .labres a, .labres a:visited, .labres a:hover { color:#0000cc; }
296 .labres table {
297 border-style: solid;
298 border-width: 1px 0px 0px 1px;
299 border-color: black;
301 .labres td, .labres th {
302 border-style: solid;
303 border-width: 0px 1px 1px 0px;
304 border-color: black;
306 /***** What is this for? Seems ugly to me. --Rod
307 .labres tr{
308 background-color: #cccccc;
310 *****/
312 <?php } else { ?>
314 .labres tr.head { font-size:10pt; text-align:center; }
315 .labres tr.detail { font-size:10pt; }
317 .labres table {
318 border-style: none;
319 border-width: 1px 0px 0px 1px;
320 border-color: black;
322 .labres td, .labres th {
323 border-style: none;
324 border-width: 0px 1px 1px 0px;
325 border-color: black;
326 padding: 4px;
328 .labres table td.td-label{
330 font-weight: bold;
334 <?php } ?>
336 </style>
337 <?php } ?>
339 <?php if ($input_form) { ?>
340 <script type="text/javascript" src="<?php echo $GLOBALS['webroot']; ?>/library/textformat.js"></script>
341 <?php } // end if input form ?>
343 <?php if (empty($GLOBALS['PATIENT_REPORT_ACTIVE'])) { ?>
345 <script type="text/javascript" src="<?php echo $GLOBALS['webroot']; ?>/library/dialog.js?v=<?php echo $v_js_includes; ?>"></script>
346 <script language="JavaScript">
348 var mypcc = '<?php echo $GLOBALS['phone_country_code'] ?>';
350 // Called to show patient notes related to this order in the "other" frame.
351 // This works even if we are in a separate window.
352 function showpnotes(orderid) {
353 // Find the top or bottom frame that contains or opened this page; return if none.
354 var w = window.opener ? window.opener : window;
355 for (; w.name != 'RTop' && w.name != 'RBot'; w = w.parent) {
356 if (w.parent == w) {
357 // This message is not translated because a developer will need to find it.
358 alert('Internal error locating target frame in ' + (window.opener ? 'opener' : 'window'));
359 return false;
362 var othername = (w.name == 'RTop') ? 'RBot' : 'RTop';
363 w.parent.left_nav.forceDual();
364 w.parent.left_nav.loadFrame('pno1', othername, 'patient_file/summary/pnotes_full.php?orderid=' + orderid);
365 return false;
368 // Process click on LOINC code for patient education popup.
369 function educlick(codetype, codevalue) {
370 dlgopen('<?php echo $GLOBALS['webroot']; ?>/interface/patient_file/education.php' +
371 '?type=' + encodeURIComponent(codetype) +
372 '&code=' + encodeURIComponent(codevalue) +
373 '&language=<?php echo urlencode($language); ?>',
374 '_blank', 1024, 750,true); // Force a new window instead of iframe to address cross site scripting potential
377 </script>
379 <?php } // end if not patient report ?>
381 <?php if ($input_form) { ?>
382 <form method='post' action='single_order_results.php?orderid=<?php echo $orderid; ?>'>
383 <?php } // end if input form ?>
385 <div class='labres'>
387 <table width='100%' cellpadding='2' cellspacing='0'>
388 <tr>
389 <td class="td-label" width='5%' nowrap><?php echo xlt('Patient ID'); ?></td>
390 <td width='45%'><?php echo myCellText($orow['pubpid']); ?></td>
391 <td class="td-label" width='5%' nowrap><?php echo xlt('Order ID'); ?></td>
392 <td width='45%'>
393 <?php
394 if (empty($GLOBALS['PATIENT_REPORT_ACTIVE'])) {
395 echo " <a href='" . $GLOBALS['webroot'];
396 echo "/interface/orders/order_manifest.php?orderid=";
397 echo attr($orow['procedure_order_id']);
398 echo "' target='_blank' onclick='top.restoreSession()'>";
400 echo myCellText($orow['procedure_order_id']);
401 if (empty($GLOBALS['PATIENT_REPORT_ACTIVE'])) {
402 echo "</a>\n";
404 if ($orow['control_id']) {
405 echo myCellText(' ' . xl('Lab') . ': ' . $orow['control_id']);
408 </td>
409 </tr>
410 <tr>
411 <td class="td-label" nowrap><?php echo xlt('Patient Name'); ?></td>
412 <td><?php echo myCellText($orow['lname'] . ', ' . $orow['fname'] . ' ' . $orow['mname']); ?></td>
413 <td class="td-label" nowrap><?php echo xlt('Ordered By'); ?></td>
414 <td><?php echo myCellText($orow['ulname'] . ', ' . $orow['ufname'] . ' ' . $orow['umname']); ?></td>
415 </tr>
416 <tr>
417 <td class="td-label" nowrap><?php echo xlt('Order Date'); ?></td>
418 <td><?php echo myCellText(oeFormatShortDate($orow['date_ordered'])); ?></td>
419 <td class="td-label" nowrap><?php echo xlt('Print Date'); ?></td>
420 <td><?php echo oeFormatShortDate(date('Y-m-d')); ?></td>
421 </tr>
422 <tr>
423 <td class="td-label" nowrap><?php echo xlt('Order Status'); ?></td>
424 <td><?php echo myCellText($orow['order_status']); ?></td>
425 <td class="td-label" nowrap><?php echo xlt('Encounter Date'); ?></td>
426 <td><?php echo myCellText(oeFormatShortDate(substr($orow['date'], 0, 10))); ?></td>
427 </tr>
428 <tr>
429 <td class="td-label" nowrap><?php echo xlt('Lab'); ?></td>
430 <td><?php echo myCellText($orow['labname']); ?></td>
431 <td class="td-label" nowrap><?php echo $orow['specimen_type'] ? xlt('Specimen Type') : '&nbsp;'; ?></td>
432 <td><?php echo myCellText($orow['specimen_type']); ?></td>
433 </tr>
434 </table>
436 &nbsp;<br />
438 <table width='100%' cellpadding='2' cellspacing='0'>
440 <tr class='head'>
441 <td class="td-label" rowspan='2' valign='middle'><?php echo xlt('Ordered Procedure'); ?></td>
442 <td class="td-label" colspan='5'><?php echo xlt('Report'); ?></td>
443 <td class="td-label" colspan='7'><?php echo xlt('Results'); ?></td>
444 </tr>
446 <tr class='head'>
447 <td><?php echo xlt('Reported'); ?></td>
448 <td><?php echo xlt('Collected'); ?></td>
449 <td><?php echo xlt('Specimen'); ?></td>
450 <td><?php echo xlt('Status'); ?></td>
451 <td><?php echo xlt('Note'); ?></td>
452 <td><?php echo xlt('Code'); ?></td>
453 <td><?php echo xlt('Name'); ?></td>
454 <td><?php echo xlt('Abn'); ?></td>
455 <td><?php echo xlt('Value'); ?></td>
456 <td><?php echo xlt('Range'); ?></td>
457 <td><?php echo xlt('Units'); ?></td>
458 <td><?php echo xlt('Note'); ?></td>
459 </tr>
461 <?php
462 $query = "SELECT " .
463 "po.lab_id, po.date_ordered, pc.procedure_order_seq, pc.procedure_code, " .
464 "pc.procedure_name, " .
465 "pr.date_report, pr.date_report_tz, pr.date_collected, pr.date_collected_tz, " .
466 "pr.procedure_report_id, pr.specimen_num, pr.report_status, pr.review_status, pr.report_notes " .
467 "FROM procedure_order AS po " .
468 "JOIN procedure_order_code AS pc ON pc.procedure_order_id = po.procedure_order_id " .
469 "LEFT JOIN procedure_report AS pr ON pr.procedure_order_id = po.procedure_order_id AND " .
470 "pr.procedure_order_seq = pc.procedure_order_seq " .
471 "WHERE po.procedure_order_id = ? " .
472 "ORDER BY pc.procedure_order_seq, pr.date_report, pr.procedure_report_id";
474 $res = sqlStatement($query, array($orderid));
475 $aNotes = array();
476 $finals = array();
477 $empty_results = array('result_code' => '');
479 // Context for this call that may be used in other functions.
480 $ctx = array(
481 'lastpcid' => -1,
482 'lastprid' => -1,
483 'encount' => 0,
484 'lino' => 0,
485 'sign_list' => '',
486 'seen_report_ids' => array(),
489 while ($row = sqlFetchArray($res)) {
490 $report_id = empty($row['procedure_report_id']) ? 0 : ($row['procedure_report_id'] + 0);
492 $query = "SELECT " .
493 "ps.result_code, ps.result_text, ps.abnormal, ps.result, ps.range, " .
494 "ps.result_status, ps.facility, ps.units, ps.comments, ps.document_id, ps.date " .
495 "FROM procedure_result AS ps " .
496 "WHERE ps.procedure_report_id = ? " .
497 "ORDER BY ps.procedure_result_id";
499 $rres = sqlStatement($query, array($report_id));
501 if ($finals_only) {
502 // We are consolidating reports.
503 if (sqlNumRows($rres)) {
504 $rrowsets = array();
505 // First pass creates a $rrowsets[$key] for each unique result code in *this* report, with
506 // the value being an array of the corresponding result rows. This caters to multiple
507 // occurrences of the same result code in the same report.
508 while ($rrow = sqlFetchArray($rres)) {
509 $result_code = empty($rrow['result_code']) ? '' : $rrow['result_code'];
510 $key = sprintf('%05d/', $row['procedure_order_seq']) . $result_code;
511 if (!isset($rrowsets[$key])) $rrowsets[$key] = array();
512 $rrowsets[$key][] = $rrow;
514 // Second pass builds onto the array of final results for *all* reports, where each final
515 // result for a given result code is its *array* of result rows from *one* of the reports.
516 foreach ($rrowsets as $key => $rrowset) {
517 // When two reports have the same date, use the result date to decide which is "latest".
518 if (isset($finals[$key]) &&
519 $row['date_report'] == $finals[$key][0]['date_report'] &&
520 !empty($rrow['date']) && !empty($finals[$key][1]['date']) &&
521 $rrow['date'] < $finals[$key][1]['date'])
523 $finals[$key][2] = true; // see comment below
524 continue;
526 // $finals[$key][2] indicates if there are multiple results for this result code.
527 $finals[$key] = array($row, $rrowset, isset($finals[$key]));
530 else {
531 // We have no results for this report.
532 $key = sprintf('%05d/', $row['procedure_order_seq']);
533 $finals[$key] = array($row, array($empty_results), false);
536 else {
537 // We are showing all results for all reports.
538 if (sqlNumRows($rres)) {
539 while ($rrow = sqlFetchArray($rres)) {
540 generate_result_row($ctx, $row, $rrow, false);
543 else {
544 generate_result_row($ctx, $row, $empty_results, false);
549 if ($finals_only) {
550 // The sort here was removed because $finals is already ordered by procedure_result_id
551 // within procedure_order_seq which is probably desirable. Sorting by result code defeats
552 // the sequencing of results chosen by the sender.
553 // ksort($finals);
554 foreach ($finals as $final) {
555 foreach ($final[1] as $rrow) {
556 generate_result_row($ctx, $final[0], $rrow, $final[2]);
563 </table>
565 &nbsp;<br />
566 <table width='100%' style='border-width:0px;'>
567 <tr>
568 <td style='border-width:0px;'>
569 <?php
570 if (!empty($aNotes)) {
571 echo "<table cellpadding='3' cellspacing='0'>\n";
572 echo " <tr bgcolor='#cccccc'>\n";
573 echo " <th align='center' colspan='2'>" . xlt('Notes') . "</th>\n";
574 echo " </tr>\n";
575 foreach ($aNotes as $key => $value) {
576 echo " <tr>\n";
577 echo " <td valign='top'>" . ($key + 1) . "</td>\n";
578 // <pre> tag because white space and a fixed font are often used to line things up.
579 echo " <td><pre style='white-space:pre-wrap;'>" . text($value) . "</pre></td>\n";
580 echo " </tr>\n";
582 echo "</table>\n";
585 </td>
586 <td style='border-width:0px;' align='right' valign='top'>
587 <?php if ($input_form && !empty($ctx['priors_omitted']) /* empty($_POST['form_showall']) */ ) { ?>
588 <input type='submit' name='form_showall' value='<?php echo xla('Show All Results'); ?>'
589 title='<?php echo xla('Include all values reported for each result code'); ?>' />
590 <?php } else if ($input_form && !empty($_POST['form_showall'])) { ?>
591 <input type='submit' name='form_latest' value='<?php echo xla('Latest Results Only'); ?>'
592 title='<?php echo xla('Show only latest values reported for each result code'); ?>' />
593 <?php } ?>
594 <?php if (empty($GLOBALS['PATIENT_REPORT_ACTIVE'])) { ?>
595 &nbsp;
596 <input type='button' value='<?php echo xla('Related Patient Notes'); ?>'
597 onclick='showpnotes(<?php echo $orderid; ?>)' />
598 <?php } ?>
599 <?php if ($input_form && $ctx['sign_list']) { ?>
600 &nbsp;
601 <input type='hidden' name='form_sign_list' value='<?php echo attr($ctx['sign_list']); ?>' />
602 <input type='submit' name='form_sign' value='<?php echo xla('Sign Results'); ?>'
603 title='<?php echo xla('Mark these reports as reviewed'); ?>' />
604 <?php
605 // If this is a portal patient, sending them a copy is an option.
606 if ($GLOBALS['gbl_portal_cms_enable'] && $orow['cmsportal_login'] !== '') {
607 echo "&nbsp;";
608 echo "<input type='checkbox' name='form_send_to_portal' value='" .
609 attr($orow['cmsportal_login']) . "' checked />\n";
610 echo xlt('Send to portal');
613 <?php } ?>
614 <?php if ($input_form) { ?>
615 &nbsp;
616 <input type='button' value='<?php echo xla('Close'); ?>' onclick='window.close()' />
617 <?php } ?>
618 </td>
619 </tr>
620 </table>
622 </div>
624 <?php if ($input_form) { ?>
625 </form>
626 <?php } // end if input form ?>
628 <?php
629 } // end function generate_order_report