CCDA and Other (#4382)
[openemr.git] / interface / forms / procedure_order / common.php
blob42b51d20e061e919e5279392f8a05ab6dc8c5c11
1 <?php
3 /**
4 * Encounter form for entering procedure orders.
6 * @package OpenEMR
7 * @link http://www.open-emr.org
8 * @author Rod Roark <rod@sunsetsystems.com>
9 * @author Brady Miller <brady.g.miller@gmail.com>
10 * @author Sherwin Gaddis <sherwingaddis@gmail.com>
11 * @author Jerry Padgett <sjpadgett@gmail.com>
12 * @author Ranganath Pathak <pathak@scrs1.org>
13 * @copyright Copyright (c) 2010-2017 Rod Roark <rod@sunsetsystems.com>
14 * @copyright Copyright (c) 2017-2019 Brady Miller <brady.g.miller@gmail.com>
15 * @copyright Copyright (c) 2019 Ranganath Pathak <pathak@scrs1.org>
16 * @license https://github.com/openemr/openemr/blob/master/LICENSE GNU General Public License 3
19 require_once(__DIR__ . "/../../globals.php");
20 require_once("$srcdir/api.inc");
21 require_once("$srcdir/forms.inc");
22 require_once("$srcdir/options.inc.php");
23 require_once(__DIR__ . "/../../orders/qoe.inc.php");
24 require_once(__DIR__ . "/../../../custom/code_types.inc.php");
26 use OpenEMR\Common\Csrf\CsrfUtils;
27 use OpenEMR\Core\Header;
29 if (!$encounter) { // comes from globals.php
30 die("Internal error: we do not seem to be in an encounter!");
33 // Defaults for new orders.
34 $provider_id = getProviderIdOfEncounter($encounter);
35 $row = array(
36 'provider_id' => $provider_id,
37 'date_ordered' => date('Y-m-d'),
38 //'date_collected' => date('Y-m-d H:i'),
41 if ($_POST['bn_save_ereq']) { //labcorp
42 $_POST['bn_xmit'] = "transmit";
45 $patient = sqlQueryNoLog("SELECT * FROM `patient_data` WHERE `pid` = ?", array($pid));
47 global $gbl_lab, $gbl_lab_title, $gbl_client_acct;
49 function get_lab_name($id): string
51 global $gbl_lab_title, $gbl_lab, $gbl_client_acct;
52 $tmp = sqlQuery("SELECT name, send_fac_id as clientid, npi FROM procedure_providers Where ppid = ?", array($id));
53 $gbl_lab = stripos($tmp['name'], 'quest') !== false ? 'quest' : 'ammon';
54 $gbl_lab = stripos($tmp['name'], 'labcorp') !== false ? 'labcorp' : $gbl_lab;
55 $gbl_lab = stripos($tmp['name'], 'clarity') !== false ? 'clarity' : $gbl_lab;
56 $gbl_lab_title = trim($tmp['name']);
57 $gbl_client_acct = trim($tmp['clientid']);
58 return $gbl_lab;
61 if (!function_exists('ucname')) {
62 function ucname($string): string
64 $string = ucwords(strtolower($string));
65 foreach (array('-', '\'') as $delimiter) {
66 if (strpos($string, $delimiter) !== false) {
67 $string = implode($delimiter, array_map('ucfirst', explode($delimiter, $string)));
70 return $string;
74 function cbvalue($cbname): string
76 return $_POST[$cbname] ? '1' : '0';
79 function cbinput($name, $colname)
81 global $row;
82 $ret = "<input type='checkbox' name='" . attr($name) . "' value='1'";
83 if ($row[$colname]) {
84 $ret .= " checked";
86 $ret .= " />";
87 return $ret;
90 function cbcell($name, $desc, $colname): string
92 return "<td width='25%' nowrap>" . cbinput($name, $colname) . text($desc) . "</td>\n";
95 function QuotedOrNull($fld)
97 if (empty($fld)) {
98 return null;
101 return $fld;
104 function getListOptions($list_id, $fieldnames = array('option_id', 'title', 'seq')): array
106 $output = array();
107 $query = sqlStatement("SELECT " . implode(',', $fieldnames) . " FROM list_options where list_id = ? AND activity = 1 order by seq", array($list_id));
108 while ($ll = sqlFetchArray($query)) {
109 foreach ($fieldnames as $val) {
110 $output[$ll['option_id']][$val] = $ll[$val];
113 return $output;
116 // do not change from $_REQUEST.
117 $formid = (int)($_REQUEST['id'] ?? 0);
119 $reload_url = $rootdir . '/patient_file/encounter/view_form.php?formname=procedure_order&id=' . urlencode($formid);
120 $req_url = $GLOBALS['web_root'] . '/controller.php?document&retrieve&patient_id=' . urlencode($pid) . '&document_id=';
121 $reqStr = "";
123 // If Save or Transmit was clicked, save the info.
125 if ($_POST['bn_save'] || !empty($_POST['bn_xmit']) || !empty($_POST['bn_save_exit'])) {
126 if (!CsrfUtils::verifyCsrfToken($_POST["csrf_token_form"])) {
127 CsrfUtils::csrfNotVerified();
129 $ppid = (int)$_POST['form_lab_id'];
130 if (get_lab_name($ppid) === 'labcorp') {
131 if (!empty($_POST['form_account_facility'])) {
132 $location = sqlQueryNoLog("SELECT f.id, f.facility_code, f.name FROM facility as f " .
133 "WHERE f.id = ?", array($_POST['form_account_facility']));
134 $_POST['form_account'] = $location['facility_code'];
135 } else {
136 $_POST['form_account'] = '';
139 $sets =
140 "date_ordered = ?, " .
141 "provider_id = ?, " .
142 "lab_id = ?, " .
143 "date_collected = ?, " .
144 "order_priority = ?, " .
145 "order_status = ?, " .
146 "billing_type = ?, " .
147 "order_psc = ?, " .
148 "specimen_fasting = ?, " .
149 "specimen_volume = ?, " .
150 "clinical_hx = ?, " .
151 "patient_instructions = ?, " .
152 "patient_id = ?, " .
153 "encounter_id = ?, " .
154 "history_order = ?, " .
155 "order_abn = ?, " .
156 "order_diagnosis = ?, " .
157 "account = ?, " .
158 "account_facility = ?, " .
159 "collector_id = ?, " .
160 "procedure_order_type = ?";
161 $set_array = array(
162 QuotedOrNull($_POST['form_date_ordered']),
163 (int)$_POST['form_provider_id'],
164 $ppid,
165 QuotedOrNull($_POST['form_date_collected']),
166 $_POST['form_order_priority'],
167 $_POST['form_order_status'],
168 $_POST['form_billing_type'],
169 $_POST['form_order_psc'],
170 $_POST['form_specimen_fasting'] ?? '',
171 $_POST['form_specimen_volume'] ?? '',
172 trim($_POST['form_clinical_hx']),
173 trim($_POST['form_patient_instructions']),
174 $pid,
175 $encounter,
176 trim($_POST['form_history_order']),
177 trim($_POST['form_order_abn']),
178 trim($_POST['form_order_diagnosis']),
179 trim($_POST['form_account']),
180 (int)$_POST['form_account_facility'],
181 (int)$_POST['form_collector_id'],
182 trim($_POST['procedure_type_names']),
184 // If updating an existing form...
186 if ($formid) {
187 $query = "UPDATE procedure_order SET $sets WHERE procedure_order_id = ?";
188 $set_array_temp = $set_array;
189 $set_array_temp[] = $formid;
190 sqlStatement($query, $set_array_temp);
191 $gbl_lab = get_lab_name($ppid);
192 $lab_title = $gbl_lab_title . "-$formid";
193 $query = "UPDATE forms SET form_name = ? WHERE encounter = ? AND form_id = ? AND formdir = ?";
194 sqlStatement($query, array($lab_title, $encounter, $formid, 'procedure_order'));
195 } else {
196 $query = "INSERT INTO procedure_order SET $sets";
197 $formid = sqlInsert($query, $set_array);
198 $gbl_lab = get_lab_name($ppid);
199 $lab_title = $gbl_lab_title . "-$formid";
200 addForm($encounter, $lab_title, $formid, "procedure_order", $pid, $userauthorized);
201 $mode = 'update';
202 $viewmode = true;
205 $log_file = $GLOBALS["OE_SITE_DIR"] . "/documents/labs/" . check_file_dir_name(get_lab_name($ppid)) . "/logs/" . check_file_dir_name($formid) . "_order_log.log";
206 $order_log = $_POST['order_log'] ?? '';
207 if ($order_log) {
208 file_put_contents($log_file, $order_log);
210 // Remove any existing procedures and their answers for this order and
211 // replace them from the form.
212 sqlStatement(
213 "DELETE FROM procedure_answers WHERE procedure_order_id = ?",
214 array($formid)
216 sqlStatement(
217 "DELETE FROM procedure_order_code WHERE procedure_order_id = ?",
218 array($formid)
221 for ($i = 0; isset($_POST['form_proc_type'][$i]); ++$i) {
222 $ptid = $_POST['form_proc_type'][$i] + 0;
223 if ($ptid <= 0) {
224 continue;
227 $prefix = "ans$i" . "_";
229 sqlBeginTrans();
230 $procedure_order_seq = sqlQuery("SELECT IFNULL(MAX(procedure_order_seq),0) + 1 AS increment FROM procedure_order_code WHERE procedure_order_id = ? ", array($formid));
231 $poseq = sqlInsert(
232 "INSERT INTO procedure_order_code SET " .
233 "procedure_order_id = ?, " .
234 "diagnoses = ?, " .
235 "procedure_order_title = ?, " .
236 "transport = ?, " .
237 "procedure_code = (SELECT procedure_code FROM procedure_type WHERE procedure_type_id = ?), " .
238 "procedure_name = (SELECT name FROM procedure_type WHERE procedure_type_id = ?)," .
239 "procedure_order_seq = ? ",
240 array(
241 $formid,
242 trim($_POST['form_proc_type_diag'][$i]),
243 trim($_POST['form_proc_order_title'][$i]),
244 trim($_POST['form_transport'][$i]),
245 $ptid,
246 $ptid,
247 $procedure_order_seq['increment']
250 sqlCommitTrans();
252 $poseq = $procedure_order_seq['increment'];
254 $qres = sqlStatement("SELECT " .
255 "q.procedure_code, q.question_code, q.options, q.fldtype " .
256 "FROM procedure_type AS t " .
257 "JOIN procedure_questions AS q ON q.lab_id = t.lab_id " .
258 "AND q.procedure_code = t.procedure_code AND q.activity = 1 " .
259 "WHERE t.procedure_type_id = ? " .
260 "ORDER BY q.seq, q.question_text", array($ptid));
262 while ($qrow = sqlFetchArray($qres)) {
263 $options = trim($qrow['options']);
264 $qcode = trim($qrow['question_code']);
265 $pcode = trim($qrow['procedure_code']);
266 $fldtype = $qrow['fldtype'];
267 $data = '';
268 if ($fldtype == 'G') {
269 if ($_POST["G1_$prefix$qcode"]) {
270 $data = $_POST["G1_$prefix$qcode"] * 7 + $_POST["G2_$prefix$qcode"];
272 } else {
273 $data = $_POST["$prefix$qcode"];
276 if (!isset($data) || $data === '') {
277 continue;
280 if (!is_array($data)) {
281 $data = array($data);
284 foreach ($data as $datum) {
285 // Note this will auto-assign the seq value.
286 sqlBeginTrans();
287 $answer_seq = sqlQuery("SELECT IFNULL(MAX(answer_seq),0) + 1 AS increment FROM procedure_answers WHERE procedure_order_id = ? AND procedure_order_seq = ? AND question_code = ? ", array($formid, $poseq, $qcode));
288 sqlStatement(
289 "INSERT INTO procedure_answers SET " .
290 "procedure_order_id = ?, " .
291 "procedure_order_seq = ?, " .
292 "question_code = ?, " .
293 "answer_seq = ?, " .
294 "answer = ?, " .
295 "procedure_code = ?",
296 array($formid, $poseq, $qcode, $answer_seq['increment'], trim($datum), $pcode)
298 sqlCommitTrans();
303 if (isset($_POST['bn_save_exit'])) {
304 formHeader("Redirecting....");
305 if ($alertmsg) {
306 $msg = xl('Transmit failed') . ': ' . $alertmsg;
307 echo "\n<script>alert(" . js_escape($msg) . ")</script>\n";
309 formJump();
310 formFooter();
311 exit;
314 $alertmsg = '';
315 if (!empty($_POST['bn_xmit'])) {
316 // Validate, log and send order. Sets up documents and requisition buttons
317 $gbl_lab = get_lab_name($ppid);
318 $hl7 = '';
319 $order_data = '';
320 if ($_POST['form_provider_id'] + 0 < 1) {
321 $order_data .= "\n" . xlt("Ordering Provider is required but not selected!");
323 $diag_flag = 0;
324 foreach ($_POST['form_proc_type_diag'] as $diag) {
325 $diag_flag = (!empty($diag) || !empty($_POST['form_order_diagnosis'])) ? (++$diag_flag) : $diag_flag;
327 if ($diag_flag === 0) {
328 $order_data .= "\n" . xlt("At least one diagnosis is required! Please add a diagnosis for this order.");
330 if ($_POST['form_order_abn'] === 'required') {
331 $order_data .= "\n" . xlt("ABN is required but not signed!");
333 if (!$_POST['form_date_collected'] && !$_POST['form_order_psc']) {
334 $order_data .= "\n" . xlt("Specimen Collections date has not been entered and this is not a PSC Hold Order!");
336 if ($order_data) {
337 $alertmsg = date('Y-m-d H:i') . " " . xlt("Prior Validations Errors") . $order_data;
338 $order_data .= "\n<span class='text-danger'>" . "- " .
339 xlt("Please resolve errors and resubmit order.") .
340 "</span>";
341 $order_data = nl2br($order_data);
342 if ($order_log) {
343 $alertmsg = $order_log . "\n" . $alertmsg;
344 $order_log = $alertmsg; // persist log
345 } else {
346 $order_log = $alertmsg;
347 $alertmsg = '';
349 file_put_contents($log_file, $order_log);
350 } else { // drop through if no errors..
351 if ($gbl_lab === 'ammon' || $gbl_lab === 'clarity') {
352 require_once(__DIR__ . "/../../procedure_tools/gen_universal_hl7/gen_hl7_order.inc.php");
353 $alertmsg = gen_hl7_order($formid, $hl7);
354 } elseif ($gbl_lab === 'labcorp') {
355 require_once(__DIR__ . "/../../procedure_tools/labcorp/ereq_form.php");
356 require_once(__DIR__ . "/../../procedure_tools/labcorp/gen_hl7_order.inc.php");
357 $alertmsg = gen_hl7_order($formid, $hl7, $reqStr);
358 } else { // Default lab. Add more labs here.
359 require_once(__DIR__ . "/../../orders/gen_hl7_order.inc.php");
360 $alertmsg = gen_hl7_order($formid, $hl7);
362 if (empty($alertmsg)) {
363 if (empty($_POST['bn_save_ereq'])) {
364 $alertmsg = send_hl7_order($ppid, $hl7);
366 } else {
367 $order_data .= $alertmsg;
369 if (empty($alertmsg)) {
370 $savereq = true;
371 if (empty($_POST['bn_save_ereq'])) {
372 sqlStatement("UPDATE procedure_order SET date_transmitted = NOW() WHERE procedure_order_id = ?", array($formid));
373 $order_log .= "\n" . date('Y-m-d H:i') . " " .
374 xlt("Order Successfully Sent") . "...\n" .
375 xlt("Order HL7 Content") .
376 ":\n" . $hl7 . "\n";
377 if ($_POST['form_order_psc']) {
378 if ($gbl_lab === 'labcorp') {
379 $order_log .= "\n" . date('Y-m-d H:i') . " " .
380 xlt("Generating and charting requisition for PSC Hold Order") . "...\n";
381 ereqForm($pid, $encounter, $formid, $reqStr, $savereq);
384 } else {
385 if (isset($_POST['bn_save_ereq'])) {
386 $savereq = false;
388 if ($gbl_lab === 'labcorp') {
389 // Manual requisition
390 $order_log .= "\n" . date('Y-m-d H:i') . " " .
391 xlt("Generating requisition based on order HL7 content") . "...\n" . $hl7 . "\n";
392 ereqForm($pid, $encounter, $formid, $reqStr, $savereq);
395 file_put_contents($log_file, $order_log);
396 } else {
397 if ($order_log) {
398 $alertmsg = $order_log . "\n" . $alertmsg;
399 $order_log = $alertmsg; // persist log
400 } else {
401 $order_log = $alertmsg;
403 file_put_contents($log_file, $order_log);
406 unset($_POST['bn_xmit']);
408 unset($_POST['bn_save']);
409 $reload_url = $rootdir . '/patient_file/encounter/view_form.php?formname=procedure_order&id=' . attr($formid);
410 if (empty($order_data)) {
411 header('Location:' . $reload_url);
415 if (!empty($formid)) {
416 $row = sqlQuery("SELECT * FROM procedure_order WHERE procedure_order_id = ?", array($formid));
419 $enrow = sqlQuery(
420 "SELECT p.fname, p.mname, p.lname, fe.date FROM " .
421 "form_encounter AS fe, forms AS f, patient_data AS p WHERE " .
422 "p.pid = ? AND f.pid = p.pid AND f.encounter = ? AND " .
423 "f.formdir = 'newpatient' AND f.deleted = 0 AND " .
424 "fe.id = f.form_id LIMIT 1",
425 array($pid, $encounter)
428 $bill_type = $row['billing_type'];
429 $gbl_lab = get_lab_name($row['lab_id']);
431 if ($formid) {
432 $location = sqlQueryNoLog("SELECT f.id, f.facility_code, f.name FROM facility as f " .
433 "WHERE f.id = ?", array($row['account_facility']));
434 } else {
435 $location = sqlQueryNoLog("SELECT f.id, f.facility_code, f.name FROM users as u " .
436 "INNER JOIN facility as f ON u.facility_id = f.id WHERE u.id = ?", array($row['provider_id']));
438 $account = $location['facility_code'];
439 $account_name = $location['name'];
440 $account_facility = $location['id'];
441 if (!empty($row['lab_id'])) {
442 $log_file = $GLOBALS["OE_SITE_DIR"] . "/documents/labs/" . check_file_dir_name(get_lab_name($row['lab_id'])) . "/logs/";
444 if (!is_dir($log_file)) {
445 if (!mkdir($log_file, 0755, true) && !is_dir($log_file)) {
446 throw new \RuntimeException(sprintf('Directory "%s" was not created', $log_file));
449 // filename
450 $log_file .= check_file_dir_name($formid) . '_order_log.log';
451 if (file_exists($log_file)) {
452 $order_log = file_get_contents($log_file);
456 <!DOCTYPE html>
457 <html>
458 <head>
459 <?php Header::setupHeader(['datetime-picker']); ?>
461 <script>
462 // Some JS Globals that will be useful.
463 var gbl_formseq;
464 var currentLabId = <?php echo js_escape($row['lab_id']); ?>;
465 var currentLab = <?php echo js_escape($gbl_lab); ?>;
466 var currentLabTitle = <?php echo js_escape($gbl_lab_title); ?>;
467 var viewmode = <?php echo !empty($viewmode) ? 1 : 0 ?>;
468 var refreshForm = <?php echo js_escape($reload_url); ?>;
470 function processSubmit(od) { // not used yet
471 $("#form_order_abn").val(od.order_abn);
472 $("#bn_save").click();
475 function initCalendars() {
476 var datepicker = {
477 <?php $datetimepicker_timepicker = false; ?>
478 <?php $datetimepicker_showseconds = false; ?>
479 <?php $datetimepicker_formatInput = false; ?>
480 <?php require($GLOBALS['srcdir'] . '/js/xl/jquery-datetimepicker-2-5-4.js.php'); ?>
482 var datetimepicker = {
483 <?php $datetimepicker_timepicker = true; ?>
484 <?php $datetimepicker_showseconds = false; ?>
485 <?php $datetimepicker_formatInput = false; ?>
486 <?php require($GLOBALS['srcdir'] . '/js/xl/jquery-datetimepicker-2-5-4.js.php'); ?>
488 $('.datepicker').datetimepicker(datepicker);
489 $('.datetimepicker').datetimepicker(datetimepicker);
492 function initDeletes() {
493 $(".itemDelete").on("click", function (event) {
494 deleteRow(event);
498 function deleteRow(event) {
499 event.preventDefault();
500 event.stopPropagation();
501 let target = $(event.currentTarget).closest('tr').find("input[name^='form_proc_type_desc']").val();
502 let yn = true;
503 if (target)
504 yn = confirm(<?php echo xlj("Confirm to remove item") ?> + "\n" + target);
505 if (yn)
506 $(event.currentTarget).closest(".proc-table").remove();
509 // This invokes the find-procedure-type popup.
510 // formseq = 0-relative index in the form.
511 function sel_proc_type(formseq) {
512 let f = document.forms[0];
513 gbl_formseq = formseq;
514 let ptvarname = 'form_proc_type[' + formseq + ']';
516 let title = <?php echo xlj("Find Procedure Order"); ?>;
517 // This replaces the previous search for an easier/faster order picker tool.
518 dlgopen('../../orders/find_order_popup.php' +
519 '?labid=' + encodeURIComponent(f.form_lab_id.value) +
520 '&order=' + encodeURIComponent(f[ptvarname].value) +
521 '&formid=' + <?php echo js_url($formid); ?> +
522 '&formseq=' + encodeURIComponent(formseq),
523 '_blank', 850, 500, '', title);
526 // This is for callback by the find-procedure-type popup.
527 // Sets both the selected type ID and its descriptive name.
528 // Also set diagnosis if supplied in configuration and custom test groups.
529 function set_proc_type(typeid, typename, diagcodes = '', temptype, testid, newCnt = 0) {
530 let f = document.forms[0];
531 let ptvarname = 'form_proc_type[' + gbl_formseq + ']';
532 let ptdescname = 'form_proc_type_desc[' + gbl_formseq + ']';
533 let ptcodes = 'form_proc_type_diag[' + gbl_formseq + ']';
534 let pttransport = 'form_transport[' + gbl_formseq + ']';
535 let ptproccode = 'form_proc_code[' + gbl_formseq + ']';
536 let psc = '';
538 f[pttransport].value = temptype;
539 f[ptvarname].value = typeid;
540 f[ptdescname].value = typename;
541 f[ptproccode].value = testid;
542 if (diagcodes)
543 f[ptcodes].value = diagcodes;
544 if (newCnt > 1) {
545 gbl_formseq = addProcLine(true);
549 // This is also for callback by the find-procedure-type popup.
550 // Sets the contents of the table containing the form fields for questions.
551 function set_proc_html(s, js) {
552 document.getElementById('qoetable[' + gbl_formseq + ']').innerHTML = s;
553 initCalendars();
556 // New lab selected so clear all procedures and questions from the form.
557 function lab_id_changed(el) {
558 if (viewmode) {
559 let msg = "Changing Labs will clear this order.\nAre you sure you want to continue?";
560 if (!confirm(msg)) {
561 $("#form_lab_id").val(currentLabId);
562 return false;
565 top.restoreSession();
566 let lab = $("#form_lab_id option:selected").text();
567 if (lab.toLowerCase().indexOf('quest') !== -1) currentLab = 'quest';
568 if (lab.toLowerCase().indexOf('ammon') !== -1) currentLab = 'ammon';
569 if (lab.toLowerCase().indexOf('labcorp') !== -1) currentLab = 'labcorp';
570 if (lab.toLowerCase().indexOf('clarity') !== -1) currentLab = 'clarity';
572 let f = document.forms[0];
573 for (let i = 0; true; ++i) {
574 let ix = '[' + i + ']';
575 if (!f['form_proc_type' + ix]) break;
576 let target = '#procedures_item_' + i;
577 $(target).closest(".proc-table").remove();
580 if (viewmode) {
581 $("#bn_save").click();
582 } else {
583 addProcLine(false);
587 function addProcedure() {
588 $(".procedure-order-container").append($(".procedure-order").clone());
589 let newOrder = $(".procedure-order-container .procedure-order:last");
590 $(newOrder + " label:first").append("1");
593 function addProcLine(flag = false) {
594 let f = document.forms[0];
595 let i = 0;
596 for (; f['form_proc_type[' + i + ']']; ++i) ;
597 // build new item html.. a hidden html block to clone may be better here.
598 let cell = "<table class='table table-sm proc-table'><tr>" +
599 "<input type='hidden' name='form_proc_code[" + i + "]' value= />" +
600 "<td onclick='deleteRow(event)' class='itemDelete'><i class='fa fa-trash'></i></td>" +
601 "<td class='itemTransport quest'><input readonly class='itemTransport form-control' type='text' onclick='getDetails(event, " + i + ")' name='form_transport[" + i + "]' value=''></td>" +
602 "<td class='procedure-div'><input type='hidden' name='form_proc_order_title[" + i + "]' value=procedure>" +
603 "<input type='text' class='form-control c-hand' name='form_proc_type_desc[" + i + "]' onclick='sel_proc_type(" + i + ")' " +
604 "onfocus='this.blur()' title='<?php echo xla('Click to select the desired procedure'); ?>' readonly /> " +
605 "<input type='hidden' name='form_proc_type[" + i + "]' value='-1' /></td>" +
606 "<td class='diagnosis-div input-group'>" +
607 "<div class='input-group-prepend'><span class='btn btn-secondary input-group-text'>" +
608 "<i onclick='current_diagnoses(this)' class='fa fa-search fa-lg' title='<?php echo xla('Click to search past and current diagnoses history'); ?>'></i></span></div>" +
609 "<input type='text' class='form-control c-hand' name='form_proc_type_diag[" + i + "]' onclick='sel_related(this.name)'" +
610 "title='<?php echo xla('Click to add diagnosis for this test'); ?>' onfocus='this.blur()' readonly /></td>" +
611 "<td><div class='table-responsive' id='qoetable[" + i + "]'></div></td></tr></table>";
613 $(".procedure-order-container").append(cell); // add the new item to procedures list
615 initForm();
617 if (!flag) {// flag true indicates add procedure item from custom group callback with current index.
618 sel_proc_type(i);
619 return false;
620 } else {
621 return i;
625 // The name of the form field for find-code popup results.
626 var rcvarname, targetElement, targetProcedure;
628 function current_diagnoses(whereElement) {
629 targetProcedure = whereElement.parentElement.parentElement.parentElement.previousElementSibling;
630 targetElement = whereElement.parentElement.parentElement.nextElementSibling;
631 let title = <?php echo xlj("Diagnosis Codes History"); ?>;
632 dlgopen('find_code_history.php', 'dxDialog', 'modal-mlg', 450, '', title, {
633 buttons: [
634 {text: '<?php echo xla('Save'); ?>', id: 'saveDx', style: 'primary btn-save'},
635 {text: '<?php echo xla('Help'); ?>', id: 'showTips', style: 'primary btn-show'},
636 {text: '<?php echo xla('Cancel'); ?>', close: true, style: 'secondary btn-cancel'},
638 type: 'iframe'
641 // This is for callback by the find-code popup.
642 // Appends to or erases the current list of related codes.
643 function set_related(codetype, code, selector, codedesc) {
644 var f = document.forms[0];
645 var s = f[rcvarname].value;
646 if (code) {
647 if (s.length > 0) s += ';';
648 s += codetype + ':' + code;
649 } else {
650 s = '';
652 f[rcvarname].value = s;
655 // This invokes the find-code popup.
656 function sel_related(varname) {
657 rcvarname = varname;
658 // codetype is just to make things easier and avoid mistakes.
659 // Might be nice to have a lab parameter for acceptable code types.
660 // Also note the controlling script here runs from interface/patient_file/encounter/.
661 let title = '<?php echo xla("Select Diagnosis Codes"); ?>';
662 <?php /*echo attr(collect_codetypes("diagnosis", "csv")); */?>
663 dlgopen(top.webroot_url + '/interface/patient_file/encounter/find_code_dynamic.php?codetype=ICD10', '_blank', 985, 750, '', title);
666 // This is for callback by the find-code popup.
667 // Returns the array of currently selected codes with each element in codetype:code format.
668 function get_related() {
669 return document.forms[0][rcvarname].value.split(';');
672 // This is for callback by the find-code popup.
673 // Deletes the specified codetype:code from the currently selected list.
674 function del_related(s) {
675 my_del_related(s, document.forms[0][rcvarname], false);
678 var transmitting = false;
680 // Issue a Cancel/OK warning if a previously transmitted order is being transmitted again.
681 function validate(f, e) {
682 <?php if (!empty($row['date_transmitted'])) { ?>
683 if (transmitting) {
684 if (!confirm(<?php echo xlj('This order was already transmitted on') ?> + ' ' +
685 <?php echo js_escape($row['date_transmitted']) ?> + '. ' +
686 <?php echo xlj('Are you sure you want to transmit it again?'); ?>)) {
687 return false;
690 <?php } ?>
691 $(".wait").removeClass('d-none');
692 top.restoreSession();
693 return true;
696 $(function () {
697 // calendars need to be available to init dynamically for procedure item adds.
698 initCalendars();
699 initDeletes();
700 initForm();
701 $(function () {
702 $.ajaxSetup({
703 error: function (jqXHR, exception) {
704 if (jqXHR.status === 0) {
705 alert('Not connected to network.');
706 } else if (jqXHR.status == 404) {
707 alert('Requested page not found. [404]');
708 } else if (jqXHR.status == 500) {
709 alert('Internal Server Error [500].');
710 } else if (exception === 'parsererror') {
711 alert('Requested JSON parse failed.');
712 } else if (exception === 'timeout') {
713 alert('Time out error.');
714 } else if (exception === 'abort') {
715 alert('Ajax request aborted.');
716 } else {
717 alert('Uncaught Error.\n' + jqXHR.responseText);
721 return false;
723 <?php if ($row['date_transmitted']) { ?>
724 $("#summary").collapse("toggle");
725 <?php } ?>
728 function getDetails(e, id) {
729 top.restoreSession();
730 let f = document.forms[0];
731 let codeattr = 'form_proc_code[' + id + ']';
732 let codetitle = 'form_proc_type_desc[' + id + ']';
733 let code = f[codeattr].value;
734 let url = top.webroot_url + "/interface/procedure_tools/libs/labs_ajax.php";
735 url += "?action=code_detail)&code=" + encodeURIComponent(code) +
736 "&csrf_token_form=" + <?php echo js_url(CsrfUtils::collectCsrfToken()); ?>;
737 let title = <?php echo xlj("Test") ?> + ": " + code + " " + f[codetitle].value;
738 dlgopen(url, 'details', 'modal-md', 200, '', title, {
739 buttons: [
740 {text: '<?php echo xla('Got It'); ?>', close: true, style: 'secondary btn-sm'}
745 function initForm(reload = false) {
746 if (reload) {
747 location.reload();
749 $(".ammon").hide();
750 $(".quest").hide();
751 $(".labcorp").hide();
752 $(".clarity").hide();
753 $(".defaultProcedure").hide();
755 if (currentLab === 'ammon') {
756 $(".ammon").show();
757 } else if (currentLab === 'quest') {
758 $(".quest").show();
759 } else if (currentLab === 'labcorp') {
760 $(".labcorp").show();
761 } else if (currentLab === 'clarity') {
762 $(".clarity").show();
763 } else if (currentLab === '') {
764 $(".defaultProcedure").show();
768 function createLabels(e) {
769 e.preventDefault();
770 let prmt = <?php echo js_escape(xla("How many sets of specimen labels to create?") .
771 "\n" . xla("Each test in order gets a label.")); ?>;
772 let count = prompt(prmt, '1');
773 if (!count) return false;
774 let tarray = "";
775 let f = document.forms[0];
776 let transport = '';
777 let i = 0;
778 for (; f['form_transport[' + i + ']']; ++i) {
779 transport = f['form_transport[' + i + ']'].value;
780 transport = transport > '' ? transport : 'none';
781 tarray += transport + ";";
783 let printer = 'file';
784 let acctid = <?php echo js_escape($gbl_client_acct); ?>;
785 let order = f.id.value;
786 let patient = <?php echo js_escape($patient['lname'] . ', ' . $patient['fname'] . ' ' . $patient['mname']); ?>;
787 let pid = <?php echo js_escape($patient['pid']); ?>;
788 let url = top.webroot_url + "/interface/procedure_tools/libs/labs_ajax.php";
789 // this escapes above
790 let uri = "?action=print_labels&count=" + encodeURIComponent(count) + "&order=" + encodeURIComponent(order) + "&pid=" + encodeURIComponent(pid) +
791 "&acctid=" + encodeURIComponent(acctid) + "&patient=" + encodeURIComponent(patient) + "&specimen=" + encodeURIComponent(tarray) +
792 "&csrf_token_form=" + <?php echo js_url(CsrfUtils::collectCsrfToken()); ?>;
794 // retrieve the labels
795 dlgopen(url + uri, 'pdf', 'modal-md', 750, '');
798 function doWait(e){
799 $(".wait").removeClass('d-none');
800 return true;
802 </script>
803 <style>
804 @media only screen and (max-width: 768px) {
805 [class*="col-"] {
806 width: 100%;
807 text-align: left !important;
811 .qoe-table {
812 margin-bottom: 0px;
815 .proc-table {
816 margin-bottom: 5px;
819 .proc-table .itemDelete {
820 width: 25px;
821 color: var(--danger);
822 cursor: pointer;
825 .proc-table .itemTransport {
826 width: 45px;
827 margin: 5px 2px;
828 padding: 2px 2px;
829 cursor: hand;
832 .proc-table .procedure-div {
833 min-width: 40%;
836 .proc-table .diagnosis-div {
837 min-width: 20%;
840 .c-hand {
841 cursor: pointer;
843 </style>
844 </head>
845 <?php
846 $name = $enrow['fname'] . ' ';
847 $name .= (!empty($enrow['mname'])) ? $enrow['mname'] . ' ' . $enrow['lname'] : $enrow['lname'];
848 $date = xl('on') . ' ' . oeFormatShortDate(substr($enrow['date'], 0, 10));
849 $title = array(xl('Order for'), $name, $date);
851 <body class="body_top" onsubmit="doWait(event)">
852 <div class="container">
853 <div class="page-header">
854 <h2><?php echo implode(" ", $title); ?></h2>
855 </div>
856 <div class="col-md-12">
857 <form class="form form-horizontal" method="post" action="" onsubmit="return validate(this,event)">
858 <input type="hidden" name="csrf_token_form" value="<?php echo attr(CsrfUtils::collectCsrfToken()); ?>" />
859 <input type='hidden' name='id' value='<?php echo attr($formid) ?>' />
860 <fieldset class="row">
861 <legend data-toggle="collapse" data-target="#orderOptions">
862 <i class="fa fa-plus"></i>
863 <?php echo xlt('Select Options for Current Order Id') . ' ' . (text($formid) ? text($formid) : 'New Order') ?>
864 </legend>
865 <div class="col-md-12 collapse show" id="orderOptions">
866 <div class="form-group form-row">
867 <label for="provider_id" class="col-form-label col-md-2"><?php echo xlt('Ordering Provider'); ?></label>
868 <div class="col-md-2">
869 <?php generate_form_field(array('data_type' => 10, 'field_id' => 'provider_id'), $row['provider_id']); ?>
870 </div>
871 <label for="form_date_ordered" class="col-form-label col-md-2"><?php echo xlt('Order Date'); ?></label>
872 <div class="col-md-2">
873 <input type='text' class='datepicker form-control'
874 name='form_date_ordered'
875 id='form_date_ordered'
876 value="<?php echo attr($row['date_ordered']); ?>"
877 title="<?php echo xla('Date of this order'); ?>" />
878 </div>
879 <label for="lab_id" class="col-form-label col-md-2"><?php echo xlt('Sending To'); ?></label>
880 <div class="col-md-2">
881 <select name='form_lab_id' id='form_lab_id' onchange='lab_id_changed(this)' class='form-control'>
882 <?php
883 $ppres = sqlStatement("SELECT `ppid`, name FROM `procedure_providers` WHERE `active` = 1 ORDER BY name, ppid");
884 while ($pprow = sqlFetchArray($ppres)) {
885 echo "<option value='" . attr($pprow['ppid']) . "'";
886 if ($pprow['ppid'] == $row['lab_id']) {
887 echo " selected";
888 $gbl_lab = get_lab_name($pprow['ppid']);
890 echo ">" . text($pprow['name']) . "</option>";
893 </select>
894 </div>
895 <div class="clearfix"></div>
896 </div>
897 <div class="form-group form-row">
898 <label for="form_order_psc" class="col-form-label col-md-2"><?php echo xlt('PSC Hold Order'); ?></label>
899 <div class="col-md-2">
900 <?php
901 $pscOrderOpts = array(
902 'data_type' => 1,
903 'field_id' => 'order_psc',
904 'list_id' => 'boolean'
906 generate_form_field($pscOrderOpts, $row['order_psc']);
908 </div>
909 <label for="form_date_collected" class="col-form-label col-md-2"><?php echo xlt('Time Collected'); ?></label>
910 <div class="col-md-2">
911 <input class='datetimepicker form-control'
912 type='text'
913 name='form_date_collected'
914 id='form_date_collected'
915 value="<?php echo attr(substr($row['date_collected'], 0, 16)); ?>"
916 title="<?php echo xla('Date and time that the sample was collected'); ?>" />
917 </div>
918 <label for="form_account_facility" class="col-form-label col-md-2 labcorp"><?php echo xlt('Sending From'); ?></label>
919 <div class="col-md-2 labcorp">
920 <select name='form_account_facility' id='form_account_facility' class='form-control'>
921 <option value=""><?php echo xlt('Select Location'); ?></option>
922 <?php
923 $ppres = sqlStatement("SELECT id, name, facility_code FROM facility WHERE facility_code > '' ORDER BY name, id");
924 while ($facrow = sqlFetchArray($ppres)) {
925 echo "<option value='" . attr($facrow['id']) . "'";
926 if ($facrow['id'] == $row['account_facility'] && !$formid) {
927 $account = $facrow['facility_code'];
928 $account_facility = $facrow['account_facility'];
929 $account_name = $facrow['name'];
930 echo " selected";
931 } elseif ($facrow['id'] == $account_facility) {
932 echo " selected";
933 $account = $facrow['facility_code'];
934 $account_facility = $facrow['account_facility'];
935 $account_name = $facrow['name'];
937 echo ">" . text($facrow['name']) . "</option>";
940 </select>
941 <input readonly type='hidden' class="input-sm" name="form_account" value="<?php echo attr($account); ?>">
942 </div>
943 <div class="clearfix"></div>
944 </div>
945 <!--------------------Collections--------------------------->
946 <div class="form-group form-row">
947 <label for="form_specimen_fasting" class="col-form-label col-md-2"><?php echo xlt('Fasting'); ?></label>
948 <div class="col-md-2">
949 <?php
950 generate_form_field(array('data_type' => 1, 'field_id' => 'specimen_fasting',
951 'list_id' => 'yesno'), $row['specimen_fasting']);
953 </div>
954 <label for="collector_id" class="col-form-label col-md-2"><?php echo xlt('Collected By'); ?></label>
955 <div class="col-md-2">
956 <?php generate_form_field(array('data_type' => 10, 'field_id' => 'collector_id'), $row['collector_id']); ?>
957 </div>
958 <label for='form_order_abn' class="col-form-label col-md-2"><?php echo xlt('ABN Status'); ?></label>
959 <div class="col-md-2">
960 <select name='form_order_abn' id='form_order_abn' class='form-control'>
961 <option value="not_required" <?php echo $row['order_abn'] === 'not_required' ? ' selected' : '' ?>><?php echo xlt('Not Required'); ?></option>
962 <option value="required" <?php echo $row['order_abn'] === 'required' ? ' selected' : '' ?>><?php echo xlt('Required'); ?></option>
963 <option value="signed" <?php echo $row['order_abn'] === 'signed' ? ' selected' : '' ?>><?php echo xlt('Signed'); ?></option>
964 </select>
965 </div>
966 <div class="clearfix"></div>
967 </div>
968 <div class="form-group form-row">
969 <label for="form_order_priority"
970 class="col-form-label col-md-2"><?php echo xlt('Priority'); ?></label>
971 <div class="col-md-2">
972 <?php
973 generate_form_field(array('data_type' => 1, 'field_id' => 'order_priority',
974 'list_id' => 'ord_priority'), $row['order_priority']);
976 </div>
977 <label for="form_order_status"
978 class="col-form-label col-md-2"><?php echo xlt('Status'); ?></label>
979 <div class="col-md-2">
980 <?php
981 generate_form_field(array('data_type' => 1, 'field_id' => 'order_status',
982 'list_id' => 'ord_status'), $row['order_status']);
984 </div>
985 <label for="form_billing_type"
986 class="col-form-label col-md-2"><?php echo xlt('Billing'); ?></label>
987 <div class="col-md-2">
988 <?php
989 generate_form_field(array('data_type' => 1, 'field_id' => 'billing_type',
990 'list_id' => 'procedure_billing'), $row['billing_type']);
992 </div>
993 <div class="clearfix"></div>
994 </div>
995 <div class="form-group form-row">
996 <label for="form_history_order"
997 class="col-form-label col-md-2"><?php echo xlt('History Order'); ?></label>
998 <div class="col-md-2">
999 <?php
1000 $historyOrderOpts = array(
1001 'data_type' => 1,
1002 'field_id' => 'history_order',
1003 'list_id' => 'boolean'
1005 generate_form_field($historyOrderOpts, $row['history_order']); ?>
1006 </div>
1007 <div class="clearfix"></div>
1008 </div>
1009 <div class="form-group form-row">
1010 <label for="form_clinical_hx" class="col-form-label col-md-1"><?php echo xlt('Clinical History'); ?></label>
1011 <div class="col-md-5">
1012 <textarea name="form_clinical_hx" id="form_clinical_hx"
1013 class="text" rows="2" cols="60" wrap="hard"><?php echo text($row['clinical_hx']); ?></textarea>
1014 </div>
1015 <label for="form_data_ordered" class="col-form-label col-md-1"><?php echo xlt('Patient Instructions'); ?></label>
1016 <div class="col-md-5">
1017 <textarea rows='2' cols="60" wrap="hard" id='form_patient_instructions'
1018 name='form_patient_instructions' class='text'><?php echo text($row['patient_instructions']) ?></textarea>
1019 </div>
1020 </div>
1021 </div>
1022 </fieldset>
1023 <fieldset class="row">
1024 <legend><?php $t = "<span>" .
1025 ($gbl_lab === "labcorp" ? "Location Account: $account_name $account" : "") . "</span>";
1026 echo xlt('Procedure Order Details') . " " . text($gbl_lab_title) . " " . $t; ?>
1027 </legend>
1028 <?php if ($order_data) { ?>
1029 <div id="errorAlerts" class="alert alert-danger alert-dismissible col-6 offset-3" role="alert">
1030 <button type="button" class="close" data-dismiss="alert"><span class="text-dark">&times;</span></button>
1032 <?php echo $order_data;
1033 unset($order_data); ?>
1034 </p>
1035 </div>
1036 <?php } ?>
1037 <div class="col-md-12 procedure-order-container table-responsive">
1038 <div class="form-group form-row bg-dark text-light my-2 py-1">
1039 <label for="form_order_diagnosis" class="col-form-label col-md-2"><?php echo xlt('Primary Diagnosis'); ?></label>
1040 <div class="col-md-4">
1041 <?php
1042 if (!$formid) {
1043 $diagres = sqlStatement(
1044 "SELECT diagnosis FROM lists " .
1045 "Where activity = 1 And type = ? And pid = ?",
1046 array('medical_problem', $pid)
1048 $problem_diags = '';
1049 while ($probrow = sqlFetchArray($diagres)) {
1050 if (strpos($probrow['diagnosis'], 'ICD') === false) {
1051 continue;
1053 $problem_diags .= $probrow['diagnosis'] . ';';
1055 } ?>
1056 <input class='form-control c-hand' type='text' name='form_order_diagnosis' id='form_order_diagnosis'
1057 value='<?php echo $problem_diags ? attr($problem_diags) : attr($row['order_diagnosis']) ?>'
1058 onclick='sel_related(this.name)'
1059 title='<?php echo xla('Required Primary Diagnosis for Order. This will be automatically added to any missing test order diagnosis.'); ?>'
1060 readonly onfocus='this.blur()' />
1061 </div>
1062 <label for="procedure_type_names col-md-2" class="col-form-label"><?php echo xlt('Procedure Type'); ?></label>
1063 <div class="col-md-4">
1064 <?php $procedure_order_type = getListOptions('order_type', array('option_id', 'title')); ?>
1065 <select name="procedure_type_names" id="procedure_type_names" class='form-control'>
1066 <?php foreach ($procedure_order_type as $ordered_types) { ?>
1067 <option value="<?php echo attr($ordered_types['option_id']); ?>"
1068 <?php echo $ordered_types['option_id'] == $row['procedure_order_type'] ? " selected" : ""; ?>><?php echo text(xl_list_label($ordered_types['title'])); ?>
1069 </option>
1070 <?php } ?>
1071 </select>
1072 </div>
1073 </div>
1074 <?php
1075 // This section merits some explanation. :)
1077 // If any procedures have already been saved for this form, then a top-level table row is
1078 // created for each of them, and includes the relevant questions and any existing answers.
1079 // Otherwise a single empty table row is created for entering the first or only procedure.
1081 // If a new procedure is selected or changed, the questions for it are (re)generated from
1082 // the dialog window from which the procedure is selected, via JavaScript. The sel_proc_type
1083 // function and the types.php script that it invokes collaborate to support this feature.
1085 // The generate_qoe_html function in qoe.inc.php contains logic to generate the HTML for
1086 // the questions, and can be invoked either from this script or from types.php.
1088 // The $i counter that you see below is to resolve the need for unique names for form fields
1089 // that may occur for each of the multiple procedure requests within the same order.
1090 // procedure_order_seq serves a similar need for uniqueness at the database level.
1092 $oparr = array();
1093 if ($formid) {
1094 $opres = sqlStatement(
1095 "SELECT " .
1096 "pc.procedure_order_seq, pc.procedure_code, pc.procedure_name, " .
1097 "pc.diagnoses, pc.procedure_order_title, pc.transport," .
1098 // In case of duplicate procedure codes this gets just one.
1099 "(SELECT pt.procedure_type_id FROM procedure_type AS pt WHERE " .
1100 "(pt.procedure_type LIKE 'ord%' OR pt.procedure_type LIKE 'for%' OR pt.procedure_type LIKE 'pro%') AND pt.lab_id = ? AND " .
1101 "pt.procedure_code = pc.procedure_code ORDER BY " .
1102 "pt.activity DESC, pt.procedure_type_id LIMIT 1) AS procedure_type_id " .
1103 "FROM procedure_order_code AS pc " .
1104 "WHERE pc.procedure_order_id = ? " .
1105 "ORDER BY pc.procedure_order_seq",
1106 array($row['lab_id'], $formid)
1108 while ($oprow = sqlFetchArray($opres)) {
1109 $oparr[] = $oprow;
1111 $reqres = $opres = sqlStatement(
1112 "Select id, url, documentationOf From documents where foreign_id = ? And list_id = ? Order By id",
1113 array($pid, $formid)
1115 while ($oprow = sqlFetchArray($reqres)) {
1116 $doc_type = stripos($oprow['url'], 'ABN') ? 'ABN' : 'REQ';
1117 if ($gbl_lab === "labcorp") {
1118 $doc_type = "eREQ";
1120 $this_req = $req_url . $oprow['id'];
1121 $this_name = $oprow['documentationOf'];
1122 $this_name = $this_name && $this_name !== "ABN" ? ($doc_type . '_' . $this_name) : $doc_type;
1123 $req[] = array('url' => $this_req, 'type' => $doc_type, 'name' => $this_name);
1125 $req_count = count($req);
1127 if (empty($oparr)) {
1128 $oparr[] = array('procedure_name' => '');
1131 <?php
1132 $i = 0;
1133 foreach ($oparr as $oprow) {
1134 $ptid = -1; // -1 means no procedure is selected yet
1135 if (!empty($oprow['procedure_type_id'])) {
1136 $ptid = $oprow['procedure_type_id'];
1139 <table class="table table-sm proc-table" id="procedures_item_<?php echo (string)attr($i) ?>">
1140 <?php if ($i < 1) { ?>
1141 <thead>
1142 <tr>
1143 <th>&nbsp;</th>
1144 <th class="quest">&nbsp;</th>
1145 <th><?php echo xlt('Procedure Test'); ?></th>
1146 <th><?php echo xlt('Diagnosis Codes'); ?></th>
1147 <th><?php echo xlt("Order Questions"); ?></th>
1148 </tr>
1149 </thead>
1150 <?php } ?>
1151 <tbody>
1152 <tr>
1153 <input type='hidden' name='form_proc_code[<?php echo $i; ?>]' value='<?php echo attr($oprow['procedure_code']) ?>' />
1154 <td class="itemDelete"><i class="fa fa-trash fa-lg"></i></td>
1155 <td class="itemTransport quest">
1156 <input class="itemTransport form-control" readonly
1157 name='form_transport[<?php echo $i; ?>]' onclick='getDetails(event, <?php echo $i; ?>)'
1158 placeholder='<?php echo xla('Click to review the Directory of Service for this test'); ?>'
1159 value='<?php echo attr($oprow['transport']) ?>'>
1160 </td>
1161 <td class="procedure-div">
1162 <?php if (empty($formid) || empty($oprow['procedure_order_title'])) : ?>
1163 <input type="hidden" name="form_proc_order_title[<?php echo $i; ?>]"
1164 value="Procedure">
1165 <?php else : ?>
1166 <input type='hidden' name='form_proc_order_title[<?php echo $i; ?>]'
1167 value='<?php echo attr($oprow['procedure_order_title']) ?>'>
1168 <?php endif; ?>
1169 <input type='text' name='form_proc_type_desc[<?php echo $i; ?>]'
1170 value='<?php echo attr($oprow['procedure_name']) ?>'
1171 onclick="sel_proc_type(<?php echo $i; ?>)"
1172 onfocus='this.blur()'
1173 title='<?php echo xla('Click to select the desired procedure'); ?>'
1174 placeholder='<?php echo xla('Click to select the desired procedure'); ?>'
1175 class='form-control c-hand' readonly />
1176 <input type='hidden' name='form_proc_type[<?php echo $i; ?>]' value='<?php echo attr($ptid); ?>' />
1177 </td>
1178 <td class='diagnosis-div input-group'>
1179 <div class='input-group-prepend'>
1180 <span class='btn btn-secondary input-group-text'>
1181 <i onclick='current_diagnoses(this)' class='fa fa-search fa-lg' title='<?php echo xla('Click to search past and current diagnoses history'); ?>'></i>
1182 </span>
1183 </div>
1184 <input class='form-control c-hand' type='text'
1185 name='form_proc_type_diag[<?php echo $i; ?>]'
1186 value='<?php echo attr($oprow['diagnoses']) ?>'
1187 onclick='sel_related(this.name)'
1188 title='<?php echo xla('Click to add diagnosis for this test'); ?>'
1189 onfocus='this.blur()' readonly />
1190 </td>
1191 <td>
1192 <!-- MSIE innerHTML property for a TABLE element is read-only, so using a DIV here. -->
1193 <div class="table-responsive" id='qoetable[<?php echo attr($i); ?>]'>
1194 <?php
1195 $qoe_init_javascript = '';
1196 echo generate_qoe_html($ptid, $formid, ($oprow['procedure_order_seq'] ?? null), $i);
1197 if ($qoe_init_javascript) {
1198 echo "<script>$qoe_init_javascript</script>";
1201 </div>
1202 </td>
1203 </tr>
1204 </tbody>
1205 </table>
1206 <?php
1207 ++$i;
1210 </div>
1211 <div class="ml-4">
1212 <button type="button" class="btn btn-success btn-add" onclick="addProcLine()"><?php echo xlt('Add Procedure'); ?>
1213 </button>
1214 </div>
1215 </fieldset>
1216 <div class="row card clearfix">
1217 <legend class="card-heading collapsed" data-toggle="collapse" data-target="#summary">
1218 <i class="fa fa-plus mr-2"></i><?php echo xlt("Order Documents and Logs"); ?>
1219 <i class="wait fa fa-cog fa-spin ml-2 d-none"></i>
1220 </legend>
1221 <div class="card-body collapse" id="summary">
1222 <div class="form-group"> <!--Order document links-->
1223 <div class="col-md-12 text-left position-override">
1224 <legend class="bg-dark text-light"><?php echo xlt("Order Documents"); ?></legend>
1225 <div class="btn-group" role="group">
1226 <?php
1227 foreach ($req as $reqdoc) {
1228 $title = $reqdoc['name'];
1229 $rpath = $reqdoc['url']; ?>
1230 <a class="btn btn-outline-primary" href="<?php echo attr($rpath); ?>"><?php echo text($title) ?></a>
1231 <?php } ?>
1232 <a class='btn btn-success ml-1' href='#'
1233 onclick="createLabels(event, this)"><?php echo xlt('Labels'); ?></a>
1234 <?php
1235 if ($gbl_lab === "labcorp") { ?>
1236 <button type="submit" class="btn btn-outline-primary btn-save"
1237 name='bn_save_ereq' id='bn_save_ereq' value="save_ereq"
1238 onclick='transmitting = false;'><?php echo xlt('Manual eREQ'); ?>
1239 </button>
1240 <?php } elseif ($gbl_lab === 'clarity') {
1241 echo "<a class='btn btn-outline-primary' target='_blank' href='$rootdir/procedure_tools/clarity/ereq_form.php?debug=1&formid=" . attr_url($formid) . "'>" . xlt("Manual eREQ") . "</a>";
1244 </div>
1245 </div>
1246 </div>
1247 <div class="col-md-12">
1248 <legend class="bg-dark text-light"><?php echo xlt('Order Log'); ?></legend>
1249 <div class="jumbotron m-0 px-2 py-0 overflow-auto" id="processLog" style="max-height:500px;">
1250 <?php
1251 if (!empty($order_log)) {
1252 $alertmsg = $order_log;
1253 } else {
1254 $order_log = $alertmsg;
1256 if (!empty($alertmsg)) {
1257 echo nl2br(text($alertmsg));
1260 <input type="hidden" name="order_log" value="<?php echo text($order_log); ?>">
1261 </div>
1262 </div>
1263 </div>
1264 </div>
1265 <div class="row form-group clearfix">
1266 <div class="float-left position-override mt-2">
1267 <div class="btn-group" role="group">
1268 <button type="submit" class="btn btn-primary btn-save"
1269 name="bn_save" id="bn_save" value="save"
1270 onclick='transmitting = false;'><?php echo xlt('Save Current'); ?>
1271 </button>
1272 <button type="submit" class="btn btn-success btn-save"
1273 name='bn_save_exit' id='bn_save_exit' value="save_exit"
1274 onclick='transmitting = false;'><?php echo xlt('Save'); ?>
1275 </button>
1276 <button type="submit" class="btn btn-primary btn-transmit"
1277 name='bn_xmit' value="transmit"
1278 onclick='transmitting = true;'><?php echo xlt('Transmit Order'); ?>
1279 </button>
1280 <button type="button" class="btn btn-secondary btn-cancel"
1281 onclick="top.restoreSession();location='<?php echo $GLOBALS['form_exit_url']; ?>'"><?php echo xlt('Cancel/Exit'); ?>
1282 </button>
1283 </div>
1284 <span class="wait fa fa-cog fa-spin fa-2x ml-2 d-none"></span>
1285 </div>
1286 </div>
1287 </form>
1288 </div>
1289 </div><!--end of .container -->
1290 </body>
1291 </html>