You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

385 lines
15 KiB

<?php
/**
* stats.php
*
* @package OpenEMR
* @link http://www.open-emr.org
* @author Brady Miller <brady.g.miller@gmail.com>
* @copyright Copyright (c) 2018 Brady Miller <brady.g.miller@gmail.com>
* @license https://github.com/openemr/openemr/blob/master/LICENSE GNU General Public License 3
*/
require_once("../../globals.php");
require_once("$srcdir/lists.inc");
require_once("$srcdir/options.inc.php");
require_once("$srcdir/sql.inc");
use OpenEMR\Common\Acl\AclMain;
use OpenEMR\Common\Csrf\CsrfUtils;
use OpenEMR\Common\Twig\TwigContainer;
if (!CsrfUtils::verifyCsrfToken($_POST["csrf_token_form"])) {
CsrfUtils::csrfNotVerified();
}
$twigContainer = new TwigContainer(null, $kernel);
$t = $twigContainer->getTwig();
/**
* Return an array of list data for a given issue type and patient
*
* @var $pid string Patient ID
* @var $type string Issue Type
* @return
*/
function getListData($pid, $type)
{
$sqlArr = [
"SELECT * FROM lists WHERE pid = ? AND type = ? AND",
dateEmptySql('enddate')
];
if ($GLOBALS['erx_enable'] && $GLOBALS['erx_medication_display'] && $type == 'medication') {
$sqlArr[] = "and erx_uploaded != '1'";
}
if ($GLOBALS['erx_enable'] && $GLOBALS['erx_allergy_display'] && $type == 'allergy') {
$sqlArr[] = "and erx_uploaded != '1'";
}
$sqlArr[] = "ORDER BY begdate";
$sql = implode(" ", $sqlArr);
$res = sqlStatement($sql, [$pid, $type]);
$list = [];
while ($row = sqlFetchArray($res)) {
if (!$row['enddate'] && !$row['returndate']) {
$rowclass = "noend_noreturn";
} elseif (!$row['enddate'] && $row['returndate']) {
$rowclass = "noend";
} elseif ($row['enddate'] && !$row['returndate']) {
$rowclass = "noreturn";
}
if ($type == "allergy") {
$reaction = "";
if (!empty($row['reaction'])) {
$reaction = getListItemTitle("reaction", $row['reaction']);
$row['reactionTitle'] = $reaction;
}
if (!empty($row['severity_al'])) {
$severity = getListItemTitle("severity_ccda", $row['severity_al']);
// Collapse the SNOMED-CT 272141005 List to 3 groups
// Not great to hard code this here, this should be abstracted
// to a better place to handle more comprehensive, centralized class
// @todo Find a better home for this
if (in_array($row['severity_al'], ['severe', 'life_threatening_severity', 'fatal'])) {
$row['critical'] = true;
}
$row['severity'] = $severity;
}
}
$list[] = $row;
}
return $list;
}
function getPrescriptions($pid)
{
$sql = "SELECT * FROM prescriptions WHERE patient_id = ? AND active = '1'";
$res = sqlStatement($sql, [$pid]);
$rx = [];
while ($row = sqlFetchArray($res)) {
$row['unit'] = generate_display_field(['data_type' => '1', 'list_id' => 'drug_units'], $row['unit']);
$row['form'] = generate_display_field(['data_type' => '1', 'list_id' => 'drug_form'], $row['form']);
$row['route'] = generate_display_field(['data_type' => '1', 'list_id' => 'drug_route'], $row['route']);
$row['interval'] = generate_display_field(['data_type' => '1', 'list_id' => 'drug_interval'], $row['interval']);
$rx[] = $row;
}
return $rx;
}
?>
<script>
if(typeof load_location === 'undefined') {
function load_location(location) {
top.restoreSession();
document.location = location;
}
}
</script>
<?php
$erx_upload_complete = 0;
$old_key = "";
$display_current_medications_below = 1;
// Process Medical Problems, Allergies, and Medications
foreach ($ISSUE_TYPES as $key => $arr) {
// Skip if user has no access to this issue type.
if (!AclMain::aclCheckIssue($key)) {
continue;
}
if ($old_key == "medication" && $GLOBALS['erx_enable'] && $erx_upload_complete == 1) {
$display_current_medications_below = 0;
if ($GLOBALS['erx_enable']) {
$res = sqlStatement("SELECT * FROM prescriptions WHERE patient_id=? AND active='1'", [$pid]);
$list = [];
$rxArr = [];
while ($row = sqlFetchArray($res)) {
$row['unit'] = generate_display_field(array('data_type' => '1', 'list_id' => 'drug_units'), $row['unit']);
$row['form'] = generate_display_field(array('data_type' => '1', 'list_id' => 'drug_form'), $row['form']);
$row['route'] = generate_display_field(array('data_type' => '1', 'list_id' => 'drug_route'), $row['route']);
$row['interval'] = generate_display_field(array('data_type' => '1', 'list_id' => 'drug_interval'), $row['interval']);
$unit = ($row['size'] > 0) ? text($row['size']) . " " . $row['unit'] : "";
$row['unit'] = $unit;
$rxArr[] = $row;
}
$id = "current_prescriptions";
$viewArgs = [
'title' => xl('Current Medications'),
'id' => $id,
'initiallyCollapsed' => (getUserSetting($id) == 0) ? false : true,
'auth' => false,
'rxList' => $rxArr,
];
echo $t->render('patient/card/erx.html.twig', $viewArgs);
$old_key = '';
}
}
$issues = getListData($pid, $key);
//
if (count($issues) > 0 || $arr[4] == 1) {
$old_key = $key;
if ($GLOBALS['erx_enable'] && $key = "medication") {
$sqlUploadedArr = [
"SELECT * FROM lists WHERE pid = ? AND type = 'medication' AND",
dateEmptySql('enddate'),
"AND erx_uploaded != '1' ORDER BY begdate",
];
$sqlUploaded = implode(" ", $sqlUploadedArr);
$resUploaded = sqlStatement($sqlUploaded, [$pid]);
if (sqlNumRows($resUploaded) == 0) {
$erx_upload_complete = 1;
continue;
}
}
$listData = getListData($pid, $key);
$id = $key . "_ps_expand";
$viewArgs = [
'title' => xl($arr[0]),
'id' => $id,
'initiallyCollapsed' => (getUserSetting($id) == 0) ? false : true,
'linkMethod' => "javascript",
'list' => $listData,
'auth' => AclMain::aclCheckIssue($key, '', ['write', 'addonly'])
];
$btnLinkBase = "return load_location('{$GLOBALS['webroot']}/interface/__page__')";
if (in_array($key, ["allergy", "medication"]) && $GLOBALS["erx_enable"]) {
$viewArgs['btnLabel'] = "Add";
$btnLinkPage = "eRx.php?page=medentry";
} else {
$viewArgs['btnLabel'] = "Edit";
$btnLinkPage = "patient_file/summary/stats_full.php?active=all&category=" . attr_url($key);
}
$viewArgs['btnLink'] = str_replace("__page__", $btnLinkPage, $btnLinkBase);
if (count($listData) == 0) {
$viewArgs['listTouched'] = (getListTouch($pid, $key)) ? true : false;
}
echo $t->render('patient/card/medical_problems.html.twig', $viewArgs);
}
}
// Render Cards for 2 specific forms
foreach (['treatment_protocols', 'injury_log'] as $formname) {
if (sqlNumRows(sqlStatement("SHOW TABLES LIKE 'form_{$formname}'")) > 0) {
$sql = "SELECT tp.id, tp.value
FROM forms, form_{$formname} AS tp
WHERE forms.pid = ?
AND forms.formdir = ?
AND tp.id = forms.form_id
AND tp.rownbr = -1
AND tp.colnbr = -1
AND tp.value LIKE '0%'
ORDER BY tp.value DESC";
$dres = sqlStatement($sql, [$pid, $formname]);
if (sqlNumRows($dres) > 0 && $need_head) {
$formRows = [];
while ($row = sqlFetchArray($dres)) {
list($completed, $start_date, $template_name) = explode('|', $row['value'], 3);
$formRows['startDate'] = $start_date;
$formRws['templateName'] = $template_name;
$formRows['id'] = $row['id'];
}
$id = "injury_log";
echo $t->render('patient/card/tp_il.html.twig', [
'title' => xl("Injury Log"),
'id' => $id,
'initiallyCollapsed' => (getUserSetting($id) == 0) ? false : true,
'formName' => $formname,
'formRows' => $formRows,
]);
}
}
}
// Render the Immunizations card if turned on
if (!$GLOBALS['disable_immunizations'] && !$GLOBALS['weight_loss_clinic']) :
$sql = "SELECT i1.id AS id, i1.immunization_id AS immunization_id, i1.cvx_code AS cvx_code, c.code_text_short AS cvx_text,
IF(i1.administered_date, concat(i1.administered_date,' - ',c.code_text_short),
IF(i1.note,substring(i1.note,1,20),c.code_text_short)) AS immunization_data
FROM immunizations i1
LEFT JOIN code_types ct ON ct.ct_key = 'CVX'
LEFT JOIN codes c ON c.code_type = ct.ct_id AND i1.cvx_code = c.code
WHERE i1.patient_id = ?
AND i1.added_erroneously = 0
ORDER BY i1.administered_date DESC";
$result = sqlStatement($sql, [$pid]);
$imxList = [];
while ($row = sqlFetchArray($result)) {
$row['immunization_data'] = text($row['immunization_data']);
// Figure out which name to use (ie. from cvx list or from the custom list)
if ($GLOBALS['use_custom_immun_list']) {
$row['field'] = generate_display_field(array('data_type' => '1', 'list_id' => 'immunizations'), $row['immunization_id']);
} else {
if (!(empty($row['cvx_text']))) {
$row['field'] = htmlspecialchars(xl($row['cvx_text']), ENT_NOQUOTES);
} else {
$row['field'] = generate_display_field(array('data_type' => '1', 'list_id' => 'immunizations'), $row['immunization_id']);
}
}
$row['url'] = attr_js("immunizations.php?mode=edit&id=" . urlencode($row['id']) . "&csrf_token_form=" . urlencode(CsrfUtils::collectCsrfToken()));
$imxList[] = $row;
}
$id = "immunizations_ps_expand";
echo $t->render('patient/card/immunizations.html.twig', [
'title' => xl('Immunizations'),
'id' => $id,
'initiallyCollapsed' => (getUserSetting($id) == 0) ? false : true,
'btnLabel' => 'Edit',
'btnLink' => 'immunizations.php',
'linkMethod' => 'html',
'auth' => true,
'imx' => $imxList,
]);
endif; // End immunizations
// Render the Prescriptions card if turned on
if (!$GLOBALS['disable_prescriptions'] && AclMain::aclCheckCore('patients', 'rx')) :
if ($GLOBALS['erx_enable'] && $display_current_medications_below == 1) {
$sql = "SELECT * FROM prescriptions WHERE patient_id = ? AND active = '1'";
$res = sqlStatement($sql, [$pid]);
$rxArr = [];
while ($row = sqlFetchArray($res)) {
$row['unit'] = generate_display_field(array('data_type' => '1', 'list_id' => 'drug_units'), $row['unit']);
$row['form'] = generate_display_field(array('data_type' => '1', 'list_id' => 'drug_form'), $row['form']);
$row['route'] = generate_display_field(array('data_type' => '1', 'list_id' => 'drug_route'), $row['route']);
$row['interval'] = generate_display_field(array('data_type' => '1', 'list_id' => 'drug_interval'), $row['interval']);
$rxArr[] = $row;
}
$id = "current_prescriptions_ps_expand";
$viewArgs = [
'title' => xl('Current Medications'),
'id' => $id,
'initiallyCollapsed' => (getUserSetting($id) == 0) ? false : true,
'auth' => false,
'rxList' => $rxArr,
];
echo $t->render('patient/card/erx.html.twig', $viewArgs);
}
$id = "prescriptions_ps_expand";
$viewArgs = [
'title' => xl("Prescriptions"),
'id' => $id,
'initiallyCollapsed' => (getUserSetting($id) == 0) ? false : true,
'linkMethod' => "html",
'btnLabel' => "Edit",
'auth' => AclMain::aclCheckCore('patients', 'rx', '', ['write', 'addonly']),
];
if ($GLOBALS['erx_enable']) {
$viewArgs['title'] = 'Prescription History';
$viewArgs['btnLabel'] = 'Add';
$viewArgs['btnLink'] = "{$GLOBALS['webroot']}/interface/eRx.php?page=compose";
} elseif ($GLOBALS['weno_rx_enable']) {
// weno plus button which opens their iframe
$viewArgs['weno'] = true;
$viewArgs['title'] = "WENO ComposeRx";
$viewArgs['btnLabel'] = 'Add';
$viewArgs['btnLink'] = "{$GLOBALS['webroot']}/interface/weno/indexrx.php";
$viewArgs['oemrBtnClass'] = "iframe rx_modal";
$viewArgs['oemrLinkMethod'] = "javascript";
$viewArgs['oemrBtnLink'] = "editScripts('{$GLOBALS['webroot']}/controller.php?prescription&list&id=" . attr_url($pid) . "')";
$viewArgs['oemrBtnIcon'] = "fa-pencil-alt";
} else {
$viewArgs['btnLink'] = "editScripts('{$GLOBALS['webroot']}/controller.php?prescription&list&id=" . attr_url($pid) . "')";
$viewArgs['linkMethod'] = "javascript";
$viewArgs['btnClass'] = "iframe rx_modal";
}
$cwd = getcwd();
chdir("../../../");
$c = new Controller();
// This is a hacky way to get a Smarty template from the controller and injecting it into
// a Twig template. This reduces the amount of refactoring that is required but ideally the
// Smarty template should be upgraded to Twig
ob_start();
echo $c->act(['prescription' => '', 'fragment' => '', 'patient_id' => $pid]);
$viewArgs['content'] = ob_get_contents();
ob_end_clean();
echo $t->render('patient/card/rx.html.twig', $viewArgs);
endif;
// Render Old Medications card
if ($erx_upload_complete == 1) {
$sql = [
"SELECT * FROM lists WHERE pid = ? AND type = 'medication' AND",
dateEmptySql('enddate'),
"ORDER BY begdate"
];
$res = sqlStatement(implode(" ", $sql), [$pid]);
$rxList = [];
while ($row = sqlFetchArray($res)) {
$rxList[] = $row;
}
$id = "old_medication_ps_expand";
$viewArgs = [
'title' => xl('Old Medication'),
'label' => $id,
'initiallyCollapsed' => (getUserSetting($id) == 0) ? false : true,
'btnLabel' => 'Edit',
'btnLink' => "return load_location(\"${GLOBALS['webroot']}/interface/patient_file/summary/stats_full.php?active=all&category=medication\")",
'linkMethod' => 'javascript',
'auth' => true,
'list' => $rxList,
];
echo $t->render('patient/card/medical_problems.html.twig', $viewArgs);
}
?>