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.
303 lines
11 KiB
303 lines
11 KiB
2 years ago
|
<?php
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
* QRDA Functions
|
||
|
*
|
||
|
* Copyright (C) 2015 Ensoftek, Inc
|
||
|
*
|
||
|
* LICENSE: This program is free software; you can redistribute it and/or
|
||
|
* modify it under the terms of the GNU General Public License
|
||
|
* as published by the Free Software Foundation; either version 2
|
||
|
* of the License, or (at your option) any later version.
|
||
|
* This program is distributed in the hope that it will be useful,
|
||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
* GNU General Public License for more details.
|
||
|
* You should have received a copy of the GNU General Public License
|
||
|
* along with this program. If not, see <http://opensource.org/licenses/gpl-license.php>;.
|
||
|
*
|
||
|
* @package OpenEMR
|
||
|
* @author Ensoftek
|
||
|
* @link http://www.open-emr.org
|
||
|
*/
|
||
|
|
||
|
use OpenEMR\Services\FacilityService;
|
||
|
|
||
|
$facilityService = new FacilityService();
|
||
|
|
||
|
// Functions for QRDA Category I (or) III 2014 XML format.
|
||
|
|
||
|
//function for Stratification data getting for NQF# 0024 Rule
|
||
|
function getQRDAStratumInfo($patArr, $begin_date)
|
||
|
{
|
||
|
$startumArr = array();
|
||
|
if (count($patArr) > 0) {
|
||
|
//Age Between 3 and 11
|
||
|
$stratumOneQry = "SELECT FLOOR( DATEDIFF( '" . add_escape_custom($begin_date) . "' , DOB ) /365 ) as pt_age FROM patient_data WHERE pid IN (" . add_escape_custom(implode(",", $patArr)) . ") HAVING (pt_age BETWEEN 1 AND 10) ";
|
||
|
$stratumOneRes = sqlStatement($stratumOneQry);
|
||
|
$stratumOneRows = sqlNumRows($stratumOneRes);
|
||
|
|
||
|
//Age Between 12 and 17
|
||
|
$stratumTwoQry = "SELECT FLOOR( DATEDIFF( '" . add_escape_custom($begin_date) . "' , DOB ) /365 ) as pt_age FROM patient_data WHERE pid IN (" . add_escape_custom(implode(",", $patArr)) . ") HAVING (pt_age BETWEEN 11 AND 16) ";
|
||
|
$stratumTwoRes = sqlStatement($stratumTwoQry);
|
||
|
$stratumTwoRows = sqlNumRows($stratumTwoRes);
|
||
|
$startumArr[1] = $stratumOneRows;
|
||
|
$startumArr[2] = $stratumTwoRows;
|
||
|
} else {
|
||
|
$startumArr[1] = 0;
|
||
|
$startumArr[2] = 0;
|
||
|
}
|
||
|
|
||
|
return $startumArr;
|
||
|
}
|
||
|
|
||
|
//function for getting Payer(Insurance Type) Information for Export QRDA
|
||
|
function getQRDAPayerInfo($patArr)
|
||
|
{
|
||
|
$payerCheckArr = array();
|
||
|
$payerCheckArr['Medicare'] = 0;
|
||
|
$payerCheckArr['Medicaid'] = 0;
|
||
|
$payerCheckArr['Private Health Insurance'] = 0;
|
||
|
$payerCheckArr['Other'] = 0;
|
||
|
if (count($patArr) > 0) {
|
||
|
$insQry = "SELECT insd.*, ic.ins_type_code FROM (SELECT pid, provider FROM insurance_data WHERE type = 'primary' ORDER BY id DESC) insd " .
|
||
|
"INNER JOIN insurance_companies ic ON insd.provider = ic.id " .
|
||
|
"WHERE insd.pid IN (" . add_escape_custom(implode(",", $patArr)) . ")";
|
||
|
$insRes = sqlStatement($insQry);
|
||
|
while ($insRow = sqlFetchArray($insRes)) {
|
||
|
if ($insRow['ins_type_code'] == 8) {//Self Pay (Private Insurance)
|
||
|
$payerCheckArr['Private Health Insurance']++;
|
||
|
} elseif ($insRow['ins_type_code'] == 2) {//Medicare
|
||
|
$payerCheckArr['Medicare']++;
|
||
|
} elseif ($insRow['ins_type_code'] == 3) {//Self Pay (Private Insurance)
|
||
|
$payerCheckArr['Medicaid']++;
|
||
|
} else {//Other
|
||
|
$payerCheckArr['Other']++;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return $payerCheckArr;
|
||
|
}
|
||
|
|
||
|
//function for getting Race, Ethnicity and Gender Information for Export QRDA
|
||
|
function getQRDAPatientNeedInfo($patArr)
|
||
|
{
|
||
|
//Defining Array elements
|
||
|
//Gender
|
||
|
$genderArr = array();
|
||
|
$genderArr['Male'] = 0;
|
||
|
$genderArr['Female'] = 0;
|
||
|
$genderArr['Unknown'] = 0;
|
||
|
//Race
|
||
|
$raceArr = array();
|
||
|
$raceArr['American Indian or Alaska Native'] = 0;
|
||
|
$raceArr['Asian'] = 0;
|
||
|
$raceArr['Black or African American'] = 0;
|
||
|
$raceArr['Native Hawaiian or Other Pacific Islander'] = 0;
|
||
|
$raceArr['White'] = 0;
|
||
|
$raceArr['Other'] = 0;
|
||
|
//Ethnicity
|
||
|
$ethincityArr = array();
|
||
|
$ethincityArr['Not Hispanic or Latino'] = 0;
|
||
|
$ethincityArr['Hispanic or Latino'] = 0;
|
||
|
|
||
|
$mainArr = array();
|
||
|
if (count($patArr) > 0) {
|
||
|
$patRes = sqlStatement("SELECT pid, sex, race, ethnicity FROM patient_data WHERE pid IN (" . add_escape_custom(implode(",", $patArr)) . ")");
|
||
|
while ($patRow = sqlFetchArray($patRes)) {
|
||
|
//Gender Collection
|
||
|
if ($patRow['sex'] == "Male") {
|
||
|
$genderArr['Male']++;
|
||
|
} elseif ($patRow['sex'] == "Female") {
|
||
|
$genderArr['Female']++;
|
||
|
} else {
|
||
|
$genderArr['Unknown']++;
|
||
|
}
|
||
|
|
||
|
//Race Section
|
||
|
if ($patRow['race'] == "amer_ind_or_alaska_native") {
|
||
|
$raceArr['American Indian or Alaska Native']++;
|
||
|
} elseif ($patRow['race'] == "Asian") {
|
||
|
$raceArr['Asian']++;
|
||
|
} elseif ($patRow['race'] == "black_or_afri_amer") {
|
||
|
$raceArr['Black or African American']++;
|
||
|
} elseif ($patRow['race'] == "native_hawai_or_pac_island") {
|
||
|
$raceArr['Native Hawaiian or Other Pacific Islander']++;
|
||
|
} elseif ($patRow['race'] == "white") {
|
||
|
$raceArr['White']++;
|
||
|
} elseif ($patRow['race'] == "Asian_Pacific_Island") {
|
||
|
$raceArr['Other']++;
|
||
|
} elseif ($patRow['race'] == "Black_not_of_Hispan") {
|
||
|
$raceArr['Other']++;
|
||
|
} elseif ($patRow['race'] == "Hispanic") {
|
||
|
$raceArr['Other']++;
|
||
|
} elseif ($patRow['race'] == "White_not_of_Hispan") {
|
||
|
$raceArr['Other']++;
|
||
|
} else {
|
||
|
$raceArr['Other']++;
|
||
|
}
|
||
|
|
||
|
if ($patRow['ethnicity'] == "hisp_or_latin") {
|
||
|
$ethincityArr['Hispanic or Latino']++;
|
||
|
} elseif ($patRow['ethnicity'] == "not_hisp_or_latin") {
|
||
|
$ethincityArr['Not Hispanic or Latino']++;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
$mainArr['gender'] = $genderArr;
|
||
|
$mainArr['race'] = $raceArr;
|
||
|
$mainArr['ethnicity'] = $ethincityArr;
|
||
|
|
||
|
return $mainArr;
|
||
|
}
|
||
|
|
||
|
function payerPatient($patient_id)
|
||
|
{
|
||
|
$payer = 'Other';
|
||
|
$insQry = "SELECT insd.*, ic.ins_type_code FROM (SELECT pid, provider FROM insurance_data WHERE type = 'primary' ORDER BY id DESC) insd " .
|
||
|
"INNER JOIN insurance_companies ic ON insd.provider = ic.id " .
|
||
|
"WHERE insd.pid = ?";
|
||
|
$insRes = sqlStatement($insQry, array($patient_id));
|
||
|
while ($insRow = sqlFetchArray($insRes)) {
|
||
|
if ($insRow['ins_type_code'] == 8) {//Self Pay (Private Insurance)
|
||
|
$payer = 'Private Health Insurance';
|
||
|
} elseif ($insRow['ins_type_code'] == 2) {//Medicare
|
||
|
$payer = 'Medicare';
|
||
|
} elseif ($insRow['ins_type_code'] == 3) {//Self Pay (Private Insurance)
|
||
|
$payer = 'Medicaid';
|
||
|
} else {//Other
|
||
|
$payer = 'Other';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return $payer;
|
||
|
}
|
||
|
|
||
|
function allEncPat($patient_id, $from_date, $to_date)
|
||
|
{
|
||
|
$encArr = array();
|
||
|
$patQry = "SELECT fe.encounter, fe.date,fe.pc_catid,opc.pc_catname FROM form_encounter fe inner join openemr_postcalendar_categories opc on opc.pc_catid = fe.pc_catid WHERE fe.pid = ? AND (DATE(fe.date) BETWEEN ? AND ?)";
|
||
|
$patRes = sqlStatement($patQry, array($patient_id, $from_date, $to_date));
|
||
|
while ($patRow = sqlFetchArray($patRes)) {
|
||
|
$encArr[] = $patRow;
|
||
|
}
|
||
|
|
||
|
return $encArr;
|
||
|
}
|
||
|
|
||
|
function allListsPat($type, $patient_id, $from_date, $to_date)
|
||
|
{
|
||
|
$diagArr = array();
|
||
|
$diagQry = "SELECT * FROM lists WHERE TYPE = ? AND pid = ? AND (DATE(date) BETWEEN ? AND ?)";
|
||
|
$diagRes = sqlStatement($diagQry, array($type, $patient_id, $from_date, $to_date));
|
||
|
while ($diagRow = sqlFetchArray($diagRes)) {
|
||
|
$diagArr[] = $diagRow;
|
||
|
}
|
||
|
|
||
|
return $diagArr;
|
||
|
}
|
||
|
|
||
|
function allOrderMedsPat($patient_id, $from_date, $to_date)
|
||
|
{
|
||
|
$medArr = array();
|
||
|
$medQry = "SELECT * FROM prescriptions where patient_id = ? AND active = 0 AND (DATE(date_added) BETWEEN ? AND ?)";
|
||
|
$medRes = sqlStatement($medQry, array($patient_id, $from_date, $to_date));
|
||
|
while ($medRow = sqlFetchArray($medRes)) {
|
||
|
$medArr[] = $medRow;
|
||
|
}
|
||
|
|
||
|
return $medArr;
|
||
|
}
|
||
|
|
||
|
function allActiveMedsPat($patient_id, $from_date, $to_date)
|
||
|
{
|
||
|
$medArr = array();
|
||
|
$medQry = "SELECT * FROM prescriptions where patient_id = ? AND active = 1 AND (DATE(date_added) BETWEEN ? AND ?)";
|
||
|
$medRes = sqlStatement($medQry, array($patient_id, $from_date, $to_date));
|
||
|
while ($medRow = sqlFetchArray($medRes)) {
|
||
|
$medArr[] = $medRow;
|
||
|
}
|
||
|
|
||
|
return $medArr;
|
||
|
}
|
||
|
|
||
|
function allProcPat(string $proc_type = null, $patient_id, $from_date, $to_date)
|
||
|
{
|
||
|
if (!$proc_type) {
|
||
|
$proc_type = "Procedure";
|
||
|
}
|
||
|
$procArr = array();
|
||
|
$procQry = "SELECT poc.procedure_code, poc.procedure_name, po.date_ordered, fe.encounter,fe.date FROM form_encounter fe " .
|
||
|
"INNER JOIN forms f ON f.encounter = fe.encounter AND f.deleted != 1 AND f.formdir = 'procedure_order' " .
|
||
|
"INNER JOIN procedure_order po ON po.encounter_id = f.encounter " .
|
||
|
"INNER JOIN procedure_order_code poc ON poc.procedure_order_id = po.procedure_order_id " .
|
||
|
"WHERE poc.procedure_order_title = ? AND po.patient_id = ? " .
|
||
|
"AND (po.date_ordered BETWEEN ? AND ?)";
|
||
|
$procRes = sqlStatement($procQry, array($proc_type, $patient_id, $from_date, $to_date));
|
||
|
while ($procRow = sqlFetchArray($procRes)) {
|
||
|
$procArr[] = $procRow;
|
||
|
}
|
||
|
|
||
|
return $procArr;
|
||
|
}
|
||
|
|
||
|
function allVitalsPat($patient_id, $from_date, $to_date)
|
||
|
{
|
||
|
$vitArr = array();
|
||
|
$vitQry = "SELECT fe.encounter, v.bps, v.date,v.bpd,v.BMI as bmi FROM form_encounter fe " .
|
||
|
"INNER JOIN forms f ON f.encounter = fe.encounter AND f.deleted != 1 AND f.formdir = 'vitals' " .
|
||
|
"INNER JOIN form_vitals v ON v.id = f.form_id " .
|
||
|
"WHERE v.pid = ? " .
|
||
|
"AND (v.date BETWEEN ? AND ?)";
|
||
|
$vitRes = sqlStatement($vitQry, array($patient_id, $from_date, $to_date));
|
||
|
while ($vitRow = sqlFetchArray($vitRes)) {
|
||
|
$vitArr[] = $vitRow;
|
||
|
}
|
||
|
|
||
|
return $vitArr;
|
||
|
}
|
||
|
|
||
|
function allImmuPat($patient_id, $from_date, $to_date)
|
||
|
{
|
||
|
$immArr = array();
|
||
|
$immQry = "SELECT * FROM immunizations " .
|
||
|
"WHERE patient_id = ? " .
|
||
|
"AND (administered_date BETWEEN ? AND ?)";
|
||
|
$immRes = sqlStatement($immQry, array($patient_id, $from_date, $to_date));
|
||
|
while ($immRow = sqlFetchArray($immRes)) {
|
||
|
$immArr[] = $immRow;
|
||
|
}
|
||
|
|
||
|
return $immArr;
|
||
|
}
|
||
|
function getPatData($patient_id)
|
||
|
{
|
||
|
$patientRow = sqlQuery("SELECT * FROM patient_data WHERE pid= ?", array($patient_id));
|
||
|
return $patientRow;
|
||
|
}
|
||
|
|
||
|
function getUsrDataCheck($provider_id)
|
||
|
{
|
||
|
$userRow = array();
|
||
|
if ($provider_id != "") {
|
||
|
$userRow = sqlQuery("SELECT facility, facility_id, federaltaxid, npi, phone,fname, lname FROM users WHERE id= ?", array($provider_id));
|
||
|
}
|
||
|
|
||
|
return $userRow;
|
||
|
}
|
||
|
|
||
|
function getFacilDataChk($facility_id)
|
||
|
{
|
||
|
global $facilityService;
|
||
|
return $facilityService->getById($facility_id);
|
||
|
}
|
||
|
|
||
|
function patientQRDAHistory($patient_id)
|
||
|
{
|
||
|
$patientHistRow = sqlQuery("SELECT tobacco, date FROM history_data WHERE pid= ? ORDER BY id DESC LIMIT 1", array($patient_id));
|
||
|
return $patientHistRow;
|
||
|
}
|