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.
1354 lines
44 KiB
1354 lines
44 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
|
||
|
*/
|
||
|
// This program exports report to QRDA Category I 2014 XML format.
|
||
|
|
||
|
|
||
|
function mainQrdaCatOneGenerate($xml, $patient_id, $rule_id, $provider_id)
|
||
|
{
|
||
|
//Open Main Clinical Document
|
||
|
$xml->open_clinicaldocument();
|
||
|
|
||
|
//Header Function
|
||
|
getHeaderQRDA1($xml, $patient_id, $provider_id);
|
||
|
|
||
|
//Component Function
|
||
|
getComponentQRDA1($xml, $patient_id, $rule_id);
|
||
|
|
||
|
//Close Main Clinical Document
|
||
|
$xml->close_clinicaldocument();
|
||
|
|
||
|
//Downloaded XML
|
||
|
$xmlDynFileName = downloadQRDACat1($xml, $patient_id, $rule_id);
|
||
|
|
||
|
return $xmlDynFileName;
|
||
|
}
|
||
|
|
||
|
//Main Header Function
|
||
|
function getHeaderQRDA1($xml, $patient_id, $provider_id)
|
||
|
{
|
||
|
global $mainQrdaRaceCodeArr, $mainEthiCodeArr, $from_date, $to_date;
|
||
|
|
||
|
//Patient Info
|
||
|
if ($patient_id != "") {
|
||
|
$patientRow = getPatData($patient_id);
|
||
|
}
|
||
|
|
||
|
//User Info
|
||
|
$userRow = getUsrDataCheck($provider_id);
|
||
|
$facility_name = $userRow['facility'];
|
||
|
$facility_id = $userRow['facility_id'];
|
||
|
|
||
|
//Facility Info
|
||
|
if ($facility_id != "") {
|
||
|
$facilResRow = getFacilDataChk($facility_id);
|
||
|
}
|
||
|
|
||
|
####################### HEADER ELEMENTS START ##########################################
|
||
|
|
||
|
$xml->self_realmcode();
|
||
|
|
||
|
$xml->self_typeid();
|
||
|
|
||
|
$tempId = '2.16.840.1.113883.10.20.22.1.1';
|
||
|
$xml->self_templateid($tempId);
|
||
|
|
||
|
$tempId = '2.16.840.1.113883.10.20.24.1.1';
|
||
|
$xml->self_templateid($tempId);
|
||
|
|
||
|
$tempId = '2.16.840.1.113883.10.20.24.1.2';
|
||
|
$xml->self_templateid($tempId);
|
||
|
|
||
|
$tempId = '2.16.840.1.113883.10.20.24.1.3';
|
||
|
$xml->self_templateid($tempId);
|
||
|
|
||
|
$xml->unique_id = getUuid();
|
||
|
$xml->self_id();
|
||
|
|
||
|
$arr = array('code' => '55182-0', 'displayName' => 'Quality Measure Report', 'codeSystem' => '2.16.840.1.113883.6.1', 'codeSystemName' => 'LOINC');
|
||
|
$xml->self_codeCustom($arr);
|
||
|
|
||
|
//Main Title Display to XML
|
||
|
$main_title = "QRDA Category-I Report";
|
||
|
$xml->add_title($main_title);
|
||
|
|
||
|
//Effective date and time
|
||
|
$eff_datetime = date('Ymdhis', strtotime($from_date));
|
||
|
$xml->self_efftime($eff_datetime);
|
||
|
|
||
|
$xml->self_confidentcode();
|
||
|
|
||
|
//Language
|
||
|
$xml->self_lang();
|
||
|
|
||
|
//Record Target Elements
|
||
|
$xml->open_recordTarget();
|
||
|
|
||
|
//patientRole Open
|
||
|
$xml->open_customTag('patientRole');
|
||
|
|
||
|
$xml->self_customTag('id', array('root' => '2.16.840.1.113883.4.572', 'extension' => '112233'));
|
||
|
|
||
|
$xml->add_patientAddress($patientRow);
|
||
|
|
||
|
if ($patientRow['phone_home'] != "") {
|
||
|
$xml->self_customTag('telecom', array('value' => $patientRow['phone_home'], 'use' => 'HP'));
|
||
|
} else {
|
||
|
$xml->self_customTag('telecom', array('nullFlavor' => "UNK"));
|
||
|
}
|
||
|
|
||
|
$xml->open_customTag('patient');
|
||
|
|
||
|
$patNameArr = array('fname' => $patientRow['fname'], 'lname' => $patientRow['lname']);
|
||
|
$xml->add_patName($patNameArr);
|
||
|
|
||
|
if ($patientRow['sex'] == "Male") {
|
||
|
$gender = "M";
|
||
|
} elseif ($patientRow['sex'] == "Female") {
|
||
|
$gender = "F";
|
||
|
}
|
||
|
|
||
|
$xml->self_customTag('administrativeGenderCode', array('codeSystem' => '2.16.840.1.113883.18.2', 'code' => $gender));
|
||
|
|
||
|
$xml->self_customTag('birthTime', array('value' => date('Ymd', strtotime($patientRow['DOB']))));
|
||
|
|
||
|
if ($mainQrdaRaceCodeArr[$patientRow['race']] == "") {
|
||
|
$mainQrdaRaceCodeArr[$patientRow['race']] = "2131-1";
|
||
|
}
|
||
|
|
||
|
$xml->self_customTag('raceCode', array('codeSystem' => '2.16.840.1.113883.6.238', 'code' => $mainQrdaRaceCodeArr[$patientRow['race']]));
|
||
|
$xml->self_customTag('ethnicGroupCode', array('codeSystem' => '2.16.840.1.113883.6.238', 'code' => $mainEthiCodeArr[$patientRow['ethnicity']]));
|
||
|
|
||
|
//patient Close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
//patientRole Close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
$xml->close_recordTarget();
|
||
|
|
||
|
############### Author Info Start#######################
|
||
|
$xml->open_author();
|
||
|
|
||
|
//Author time
|
||
|
$auth_dtime = date('Ymdhis');
|
||
|
$xml->self_authorTime($auth_dtime);
|
||
|
|
||
|
//Assigned Author
|
||
|
$xml->open_assignAuthor();
|
||
|
$npi_provider = empty($userRow['npi']) ? "FakeNPI" : $userRow['npi'];
|
||
|
$xml->self_customTag('id', array('root' => '2.16.840.1.113883.4.6', 'extension' => $npi_provider));
|
||
|
$xml->add_patientAddress($facilResRow);
|
||
|
if (!empty($userRow['phone'])) {
|
||
|
$xml->self_customTag('telecom', array('value' => $userRow['phone'], 'use' => 'WP'));
|
||
|
} else {
|
||
|
$xml->self_customTag('telecom', array("nullFlavor" => "UNK"));
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
//assignedAuthoringDevice Start
|
||
|
$xml->open_customTag('assignedAuthoringDevice');
|
||
|
$xml->element('manufacturerModelName', 'DrCloudEMR');
|
||
|
$xml->element('softwareName', 'DrCloudEMR');
|
||
|
//assignedAuthoringDevice Close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
$xml->close_assignAuthor();
|
||
|
################## Author Info End ##########################
|
||
|
|
||
|
$xml->close_author();
|
||
|
############### Author Info End#######################
|
||
|
|
||
|
############### Custodian Info Start #######################
|
||
|
$xml->open_custodian();
|
||
|
$xml->open_assgnCustodian();
|
||
|
$xml->add_represtCustodianOrginisation($facilResRow);
|
||
|
$xml->close_assgnCustodian();
|
||
|
$xml->close_custodian();
|
||
|
############### Custodian Info End #######################
|
||
|
|
||
|
############### Legal Authenticator Start#######################
|
||
|
$xml->open_legalAuthenticator();
|
||
|
$auth_dtime = date('Ymdhis');
|
||
|
$xml->self_authorTime($auth_dtime);
|
||
|
$xml->self_legalSignCode();
|
||
|
|
||
|
$xml->open_assignedEntity();
|
||
|
$assignedEntityId = getUuid();
|
||
|
$xml->self_customId($assignedEntityId);
|
||
|
$xml->add_facilAddress($facilResRow);
|
||
|
if (!empty($facilResRow['phone'])) {
|
||
|
$xml->self_customTag('telecom', array('value' => $facilResRow['phone'], 'use' => 'WP'));
|
||
|
} else {
|
||
|
$xml->self_customTag('telecom', array("nullFlavor" => "UNK"));
|
||
|
}
|
||
|
|
||
|
$xml->open_customTag('assignedPerson');
|
||
|
|
||
|
//Provider Name
|
||
|
$userNameArr = array('fname' => $userRow['fname'], 'lname' => $userRow['lname']);
|
||
|
$xml->add_providerName($userNameArr);
|
||
|
|
||
|
//assignedPerson Close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
//Represent Origination Name
|
||
|
$xml->add_authReprestOrginisation($facilResRow);
|
||
|
$xml->close_assignedEntity();
|
||
|
|
||
|
$xml->close_legalAuthenticator();
|
||
|
############### Legal Authenticator End#######################
|
||
|
|
||
|
############### documentationOf START #######################
|
||
|
$xml->open_customTag('documentationOf');
|
||
|
|
||
|
$xml->open_customTag('serviceEvent', array('classCode' => 'PCPR'));
|
||
|
|
||
|
$timeArr = array('low' => date('Ymdhis', strtotime($from_date)), 'high' => date('Ymdhis', strtotime($to_date)));
|
||
|
$xml->add_entryEffectTime($timeArr);
|
||
|
|
||
|
$xml->open_customTag('performer', array('typeCode' => 'PRF'));
|
||
|
|
||
|
$timeArr = array('low' => date('Ymdhis', strtotime($from_date)), 'high' => date('Ymdhis', strtotime($to_date)));
|
||
|
$xml->add_entryTime($timeArr);
|
||
|
|
||
|
$xml->open_customTag('assignedEntity');
|
||
|
|
||
|
$npi_provider = empty($userRow['npi']) ? "FakeNPI" : $userRow['npi'] ;
|
||
|
$xml->self_customTag('id', array('root' => '2.16.840.1.113883.4.6', 'extension' => $npi_provider));
|
||
|
|
||
|
if ($userRow['phone'] != "") {
|
||
|
$xml->self_customTag('telecom', array('value' => $userRow['phone'], 'use' => 'WP'));
|
||
|
} else {
|
||
|
$xml->self_customTag('telecom', array("nullFlavor" => "UNK"));
|
||
|
}
|
||
|
|
||
|
$xml->open_customTag('assignedPerson');
|
||
|
|
||
|
//Provider Name
|
||
|
$userNameArr = array('fname' => $userRow['fname'], 'lname' => $userRow['lname']);
|
||
|
$xml->add_providerName($userNameArr);
|
||
|
|
||
|
//assignedPerson Close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
$xml->open_customTag('representedOrganization');
|
||
|
|
||
|
$tin_provider = $userRow['federaltaxid'];
|
||
|
if ($tin_provider != "") {
|
||
|
$xml->self_customTag('id', array('root' => '2.16.840.1.113883.4.2', 'extension' => $tin_provider));
|
||
|
}
|
||
|
|
||
|
$xml->add_facilName($facility_name);
|
||
|
|
||
|
$xml->add_facilAddress($facilResRow);
|
||
|
|
||
|
//representedOrganization Close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
//assignedEntity Close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
//performer Close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
//serviceEvent Close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
//documentationOf Close
|
||
|
$xml->close_customTag();
|
||
|
############### documentationOf END #######################
|
||
|
####################### HEADER ELEMENTS END #########################################
|
||
|
}
|
||
|
|
||
|
//Component Function
|
||
|
function getComponentQRDA1($xml, $patient_id, $rule_id)
|
||
|
{
|
||
|
//Component Open
|
||
|
$xml->open_mainComponent();
|
||
|
|
||
|
//structuredBody Open
|
||
|
$xml->open_structuredBody();
|
||
|
|
||
|
//Measure Section
|
||
|
getMeasureSection($xml, $rule_id);
|
||
|
|
||
|
//Reporting Parameters
|
||
|
getReportingParam($xml);
|
||
|
|
||
|
//Patient Data
|
||
|
getQRDACat1PatientData($xml, $patient_id);
|
||
|
|
||
|
//structuredBody Close
|
||
|
$xml->close_structuredBody();
|
||
|
|
||
|
//Component Close
|
||
|
$xml->close_mainComponent();
|
||
|
}
|
||
|
|
||
|
//Patient Data
|
||
|
function getQRDACat1PatientData($xml, $patient_id)
|
||
|
{
|
||
|
$xml->open_loopComponent();
|
||
|
$xml->open_section();
|
||
|
|
||
|
$tempID = '2.16.840.1.113883.10.20.17.2.4';
|
||
|
$xml->self_templateid($tempID);
|
||
|
|
||
|
$tempID = '2.16.840.1.113883.10.20.24.2.1';
|
||
|
$xml->self_templateid($tempID);
|
||
|
|
||
|
$arr = array('code' => '55188-7', 'codeSystem' => '2.16.840.1.113883.6.1');
|
||
|
$xml->self_codeCustom($arr);
|
||
|
|
||
|
$title = "Patient Data";
|
||
|
$xml->add_title($title);
|
||
|
|
||
|
$xml->element('text', "Patient Data");
|
||
|
|
||
|
//Insurance(Payer) Info
|
||
|
payerQRDA($xml, $patient_id);
|
||
|
|
||
|
//Patient History Info
|
||
|
patCharactersticQRDA($xml, $patient_id);
|
||
|
|
||
|
//Encounter Section
|
||
|
getAllPatientEncounters($xml, $patient_id);
|
||
|
|
||
|
//Physical Exams(vitals)
|
||
|
getAllPhysicalExams($xml, $patient_id);
|
||
|
|
||
|
//Diagnosis (Medical Problems)
|
||
|
getAllMedicalProbs($xml, $patient_id);
|
||
|
|
||
|
//Ordered Medications
|
||
|
getAllOrderMedications($xml, $patient_id);
|
||
|
|
||
|
// Active Medications
|
||
|
getAllActiveMedications($xml, $patient_id);
|
||
|
|
||
|
//Immunization
|
||
|
getAllImmunization($xml, $patient_id);
|
||
|
|
||
|
//Procedures
|
||
|
getAllProcedures($xml, $patient_id);
|
||
|
|
||
|
//Lab Tests
|
||
|
getAllLabTests($xml, $patient_id);
|
||
|
|
||
|
//Interventions
|
||
|
getAllInterventionProcedures($xml, $patient_id);
|
||
|
|
||
|
//Risk Category Assessment
|
||
|
getAllRiskCatAssessment($xml, $patient_id);
|
||
|
|
||
|
$xml->close_section();
|
||
|
$xml->close_loopComponent();
|
||
|
}
|
||
|
|
||
|
//Immunization
|
||
|
function getAllImmunization($xml, $patient_id)
|
||
|
{
|
||
|
global $from_date, $to_date;
|
||
|
$medArr = allImmuPat($patient_id, $from_date, $to_date);
|
||
|
|
||
|
foreach ($medArr as $medRow) {
|
||
|
$vset = sqlStatement("select * from valueset where code =? and code_type = 'cvx' and nqf_code =?", array($medRow['cvx_code'], $xml->nqf_code));
|
||
|
foreach ($vset as $v) {
|
||
|
if (!empty($v['valueset'])) {
|
||
|
//Entry open
|
||
|
$xml->open_entry();
|
||
|
|
||
|
//act open
|
||
|
$xml->open_customTag('act', array('classCode' => 'ACT', 'moodCode' => 'EVN'));
|
||
|
|
||
|
$tempID = "2.16.840.1.113883.10.20.24.3.42";
|
||
|
$xml->self_templateid($tempID);
|
||
|
|
||
|
$refID = getUuid();
|
||
|
$xml->self_customId($refID);
|
||
|
|
||
|
$arr = array('code' => '416118004', 'codeSystemName' => 'SNOMED CT', 'codeSystem' => '2.16.840.1.113883.6.96', 'displayName' => 'Administration');
|
||
|
$xml->self_codeCustom($arr);
|
||
|
|
||
|
if ($medRow['status'] == "" || $medRow['status'] == "not_completed") {
|
||
|
$statusChk = "active";
|
||
|
} else {
|
||
|
$statusChk = "completed";
|
||
|
}
|
||
|
|
||
|
$arr = array('code' => "completed");
|
||
|
$xml->self_customTag('statusCode', $arr);
|
||
|
|
||
|
$timeArr = array('low' => date('Ymdhis', strtotime($medRow['administered_date'])), 'high' => date('Ymdhis', strtotime($medRow['administered_date'])));
|
||
|
$xml->add_entryEffectTimeQRDAMed($timeArr);
|
||
|
|
||
|
$xml->open_customTag('entryRelationship', array('typeCode' => 'COMP'));
|
||
|
|
||
|
//substanceAdministration Open
|
||
|
$xml->open_customTag('substanceAdministration', array('classCode' => 'SBADM', 'moodCode' => 'EVN'));
|
||
|
|
||
|
$tempID = "2.16.840.1.113883.10.20.22.4.16";
|
||
|
$xml->self_templateid($tempID);
|
||
|
|
||
|
//$tempID = "2.16.840.1.113883.10.20.24.3.41";
|
||
|
//$xml->self_templateid($tempID);
|
||
|
|
||
|
$refID = getUuid();
|
||
|
$xml->self_customId($refID);
|
||
|
|
||
|
$arr = array('code' => $statusChk);
|
||
|
$xml->self_customTag('statusCode', $arr);
|
||
|
|
||
|
$timeArr = array('low' => date('Ymdhis', strtotime($medRow['administered_date'])), 'high' => date('Ymdhis', strtotime($medRow['administered_date'])));
|
||
|
$xml->add_entryEffectTimeQRDAMed($timeArr);
|
||
|
|
||
|
//consumable open
|
||
|
$xml->open_customTag('consumable');
|
||
|
|
||
|
//manufacturedProduct Open
|
||
|
$xml->open_customTag('manufacturedProduct', array('classCode' => 'MANU'));
|
||
|
|
||
|
$tempID = "2.16.840.1.113883.10.20.22.4.23";
|
||
|
$xml->self_templateid($tempID);
|
||
|
|
||
|
$actId = getUuid();
|
||
|
$xml->self_customId($actId);
|
||
|
|
||
|
//manufacturedMaterial open
|
||
|
$xml->open_customTag('manufacturedMaterial');
|
||
|
|
||
|
$arr = array('code' => $v['code'], 'codeSystem' => $v['code_system'],'sdtc:valueSet' => $v['valueset']);
|
||
|
$xml->self_codeCustom($arr);
|
||
|
|
||
|
//manufacturerOrganization open
|
||
|
/*$xml->open_customTag('manufacturerOrganization');
|
||
|
|
||
|
$xml->element('name', 'Medication, Administered Vaccine');
|
||
|
|
||
|
//manufacturerOrganization Close
|
||
|
$xml->close_customTag();*/
|
||
|
|
||
|
//manufacturedMaterial Close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
//manufacturedProduct Close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
//consumable Close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
//substanceAdministration Close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
//entryRelationship Close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
//act Close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
//Entry close
|
||
|
$xml->close_entry();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function getAllPhysicalExams($xml, $patient_id)
|
||
|
{
|
||
|
global $encCheckUniqId, $from_date, $to_date;
|
||
|
|
||
|
$vitArr = allVitalsPat($patient_id, $from_date, $to_date);
|
||
|
$measures = array('bps' => array('name' => 'Blood Pressure Systolic','category' => 'Blood Pressure','unit' => 'mmHg','code' => '8480-6'),
|
||
|
'bpd' => array('name' => 'Blood Pressure Diastolic','category' => 'Blood Pressure','unit' => 'mmHg','code' => '8462-4'),
|
||
|
'bmi' => array('name' => 'Body Mass Index','category' => 'Body Mass Index', 'unit' => 'kg/m2','code' => '39156-5'));
|
||
|
|
||
|
foreach ($vitArr as $vitRow) {
|
||
|
//Entry open
|
||
|
foreach ($measures as $measure_key => $measure) {
|
||
|
$vset = sqlQuery("select * from valueset where code = ? and nqf_code = ?", array($measure['code'],$xml->nqf_code));
|
||
|
if (!empty($vset['valueset'])) {
|
||
|
$xml->open_entry();
|
||
|
|
||
|
//observation Open
|
||
|
$xml->open_customTag('observation', array('classCode' => 'OBS', 'moodCode' => 'EVN'));
|
||
|
|
||
|
$tempID = "2.16.840.1.113883.10.20.22.4.2";
|
||
|
$xml->self_templateid($tempID);
|
||
|
|
||
|
$tempID = "2.16.840.1.113883.10.20.24.3.57";
|
||
|
$xml->self_templateid($tempID);
|
||
|
|
||
|
//$refID = getUuid();
|
||
|
$refID = $encCheckUniqId[$vitRow['encounter']];
|
||
|
$xml->self_customId($refID);
|
||
|
|
||
|
$arr = array('code' => $measure['code'], 'codeSystem' => $vset['code_system'],'sdtc:valueSet' => $vset['valueset']);
|
||
|
|
||
|
//code Open
|
||
|
$xml->open_customTag('code', $arr);
|
||
|
$xml->element('originalText', "Physical Exam, Finding: " . $measure['measure']);
|
||
|
//code Close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
$xml->element('text', "Physical Exam, Finding: " . $measure['category']);
|
||
|
|
||
|
$arr = array('code' => 'completed');
|
||
|
$xml->self_customTag('statusCode', $arr);
|
||
|
|
||
|
$timeArr = array('low' => date('Ymdhis', strtotime($vitRow['date'])), 'high' => date('Ymdhis', strtotime($vitRow['date'])));
|
||
|
$xml->add_entryEffectTimeQRDA($timeArr);
|
||
|
|
||
|
$xml->self_customTag('value', array('xsi:type' => 'PQ', 'value' => $vitRow[$measure_key], 'unit' => $measure['unit']));
|
||
|
|
||
|
//observation Close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
//Entry close
|
||
|
$xml->close_entry();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function getAllRiskCatAssessment($xml, $patient_id)
|
||
|
{
|
||
|
global $encCheckUniqId, $from_date, $to_date;
|
||
|
$procArr = allProcPat("risk_category", $patient_id, $from_date, $to_date);
|
||
|
foreach ($procArr as $procRow) {
|
||
|
$vset = sqlQuery("select * from valueset where code = ? and nqf_code = ?", array($procRow['procedure_code'],$xml->nqf_code));
|
||
|
if (!empty($vset['valueset'])) {
|
||
|
//Entry open
|
||
|
$xml->open_entry();
|
||
|
|
||
|
//observation Open
|
||
|
$xml->open_customTag('observation', array('classCode' => 'OBS', 'moodCode' => 'EVN'));
|
||
|
|
||
|
$tempID = "2.16.840.1.113883.10.20.22.4.69";
|
||
|
$xml->self_templateid($tempID);
|
||
|
|
||
|
$tempID = "2.16.840.1.113883.10.20.24.3.69";
|
||
|
$xml->self_templateid($tempID);
|
||
|
|
||
|
//$refID = getUuid();
|
||
|
$refID = $encCheckUniqId[$procRow['encounter']];
|
||
|
$xml->self_customId($refID);
|
||
|
|
||
|
$arr = array('code' => $vset['code'], 'codeSystem' => $vset['code_system'],'sdtc:valueSet' => $vset['valueset']);
|
||
|
//code Open
|
||
|
$xml->open_customTag('code', $arr);
|
||
|
$xml->element('originalText', $procRow['procedure_name']);
|
||
|
//code Close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
$xml->element('text', $procRow['procedure_name']);
|
||
|
|
||
|
$arr = array('code' => 'completed');
|
||
|
$xml->self_customTag('statusCode', $arr);
|
||
|
|
||
|
$timeArr = array('low' => date('Ymdhis', strtotime($procRow['date_ordered'])), 'high' => date('Ymdhis', strtotime($procRow['date_ordered'])));
|
||
|
$xml->add_entryEffectTimeQRDA($timeArr);
|
||
|
|
||
|
$xml->self_customTag('value', array('xsi:type' => 'CD', 'nullFlavor' => 'UNK'));
|
||
|
|
||
|
//observation Close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
//Entry close
|
||
|
$xml->close_entry();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function getAllProcedures($xml, $patient_id)
|
||
|
{
|
||
|
global $encCheckUniqId, $from_date, $to_date;
|
||
|
$procArr = allProcPat("Procedure", $patient_id, $from_date, $to_date);
|
||
|
foreach ($procArr as $procRow) {
|
||
|
$vset = sqlQuery("select * from valueset where code = ? and nqf_code = ? ", array($procRow['procedure_code'],$xml->nqf_code));
|
||
|
if (!empty($vset['valueset'])) {
|
||
|
//Entry open
|
||
|
$xml->open_entry();
|
||
|
|
||
|
//procedure Open
|
||
|
$xml->open_customTag('procedure', array('classCode' => 'PROC', 'moodCode' => 'EVN'));
|
||
|
|
||
|
$tempID = "2.16.840.1.113883.10.20.24.3.64";
|
||
|
$xml->self_templateid($tempID);
|
||
|
|
||
|
$tempID = "2.16.840.1.113883.10.20.22.4.14";
|
||
|
$xml->self_templateid($tempID);
|
||
|
|
||
|
$tempID = "2.16.840.1.113883.10.20.24.3.38";
|
||
|
$xml->self_templateid($tempID);
|
||
|
|
||
|
$tempID = "2.16.840.1.113883.10.20.24.3.40";
|
||
|
$xml->self_templateid($tempID);
|
||
|
|
||
|
//$refID = getUuid();
|
||
|
$refID = $encCheckUniqId[$procRow['encounter']];
|
||
|
$xml->self_customId($refID);
|
||
|
|
||
|
|
||
|
$arr = array('code' => $procRow['procedure_code'], 'codeSystem' => $vset['code_system'],'sdtc:valueSet' => $vset['valueset']);
|
||
|
//code Open
|
||
|
$xml->open_customTag('code', $arr);
|
||
|
$xml->element('originalText', $procRow['procedure_name']);
|
||
|
//code Close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
$xml->element('text', $procRow['procedure_name']);
|
||
|
|
||
|
$arr = array('code' => 'completed');
|
||
|
$xml->self_customTag('statusCode', $arr);
|
||
|
|
||
|
$timeArr = array('low' => date('Ymdhis', strtotime($procRow['date_ordered'])), 'high' => date('Ymdhis', strtotime($procRow['date_ordered'])));
|
||
|
$xml->add_entryEffectTimeQRDA($timeArr);
|
||
|
|
||
|
//procedure Close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
//Entry close
|
||
|
$xml->close_entry();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function getAllLabTests($xml, $patient_id)
|
||
|
{
|
||
|
global $encCheckUniqId, $from_date, $to_date;
|
||
|
$procArr = allProcPat("laboratory_test", $patient_id, $from_date, $to_date);
|
||
|
foreach ($procArr as $procRow) {
|
||
|
$vset = sqlQuery("select * from valueset where code = ? and nqf_code = ? ", array($procRow['procedure_code'],$xml->nqf_code));
|
||
|
if (!empty($vset['valueset'])) {
|
||
|
//Entry open
|
||
|
$xml->open_entry();
|
||
|
|
||
|
//procedure Open
|
||
|
$xml->open_customTag('procedure', array('classCode' => 'PROC', 'moodCode' => 'EVN'));
|
||
|
|
||
|
$tempID = "2.16.840.1.113883.10.20.24.3.38";
|
||
|
$xml->self_templateid($tempID);
|
||
|
|
||
|
//$refID = getUuid();
|
||
|
$refID = $encCheckUniqId[$procRow['encounter']];
|
||
|
$xml->self_customId($refID);
|
||
|
|
||
|
|
||
|
$arr = array('code' => $procRow['procedure_code'], 'codeSystem' => $vset['code_system'],'sdtc:valueSet' => $vset['valueset']);
|
||
|
//code Open
|
||
|
$xml->open_customTag('code', $arr);
|
||
|
$xml->element('originalText', $procRow['procedure_name']);
|
||
|
//code Close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
$xml->element('text', $procRow['procedure_name']);
|
||
|
|
||
|
$arr = array('code' => 'completed');
|
||
|
$xml->self_customTag('statusCode', $arr);
|
||
|
|
||
|
$timeArr = array('low' => date('Ymdhis', strtotime($procRow['date_ordered'])), 'high' => date('Ymdhis', strtotime($procRow['date_ordered'])));
|
||
|
$xml->add_entryEffectTimeQRDA($timeArr);
|
||
|
|
||
|
//procedure Close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
//Entry close
|
||
|
$xml->close_entry();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
function getAllInterventionProcedures($xml, $patient_id)
|
||
|
{
|
||
|
global $encCheckUniqId, $from_date, $to_date;
|
||
|
$procArr = allProcPat("intervention", $patient_id, $from_date, $to_date);
|
||
|
foreach ($procArr as $procRow) {
|
||
|
$vset = sqlQuery("select * from valueset where code = ? and nqf_code = ? ", array($procRow['procedure_code'],$xml->nqf_code));
|
||
|
if (!empty($vset['valueset'])) {
|
||
|
//Entry open
|
||
|
$xml->open_entry();
|
||
|
|
||
|
//act Open
|
||
|
$xml->open_customTag('act', array('classCode' => 'ACT', 'moodCode' => 'EVN'));
|
||
|
|
||
|
$tempID = "2.16.840.1.113883.10.20.22.4.12";
|
||
|
$xml->self_templateid($tempID);
|
||
|
|
||
|
$tempID = "2.16.840.1.113883.10.20.24.3.32";
|
||
|
$xml->self_templateid($tempID);
|
||
|
|
||
|
//$refID = getUuid();
|
||
|
$refID = $encCheckUniqId[$procRow['encounter']];
|
||
|
$xml->self_customId($refID);
|
||
|
|
||
|
|
||
|
$arr = array('code' => $procRow['procedure_code'], 'codeSystem' => $vset['code_system'],'sdtc:valueSet' => $vset['valueset']);
|
||
|
//code Open
|
||
|
$xml->open_customTag('code', $arr);
|
||
|
$xml->element('originalText', $procRow['procedure_name']);
|
||
|
//code Close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
$xml->element('text', $procRow['procedure_name']);
|
||
|
|
||
|
$arr = array('code' => 'completed');
|
||
|
$xml->self_customTag('statusCode', $arr);
|
||
|
|
||
|
$timeArr = array('low' => date('Ymdhis', strtotime($procRow['date_ordered'])), 'high' => date('Ymdhis', strtotime($procRow['date_ordered'])));
|
||
|
$xml->add_entryEffectTimeQRDA($timeArr);
|
||
|
|
||
|
//act Close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
//Entry close
|
||
|
$xml->close_entry();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function getAllOrderMedications($xml, $patient_id)
|
||
|
{
|
||
|
global $from_date, $to_date;
|
||
|
$medArr = allOrderMedsPat($patient_id, $from_date, $to_date);
|
||
|
|
||
|
foreach ($medArr as $medRow) {
|
||
|
$vset = sqlQuery("select * from valueset where code = ? and nqf_code = ? ", array($medRow['rxnorm_drugcode'],$xml->nqf_code));
|
||
|
if (!empty($vset['valueset'])) {
|
||
|
//Entry open
|
||
|
$xml->open_entry();
|
||
|
|
||
|
//substanceAdministration Open
|
||
|
$xml->open_customTag('substanceAdministration', array('classCode' => 'SBADM', 'moodCode' => 'RQO'));
|
||
|
|
||
|
$tempID = "2.16.840.1.113883.10.20.22.4.42";
|
||
|
$xml->self_templateid($tempID);
|
||
|
|
||
|
$tempID = "2.16.840.1.113883.10.20.24.3.47";
|
||
|
$xml->self_templateid($tempID);
|
||
|
|
||
|
$refID = getUuid();
|
||
|
$xml->self_customId($refID);
|
||
|
|
||
|
|
||
|
$arr = array('code' => 'new');
|
||
|
$xml->self_customTag('statusCode', $arr);
|
||
|
|
||
|
$timeArr = array('low' => date('Ymdhis', strtotime($medRow['start_date'])), 'high' => date('Ymdhis', strtotime($medRow['end_date'])));
|
||
|
$xml->add_entryEffectTimeQRDAMed($timeArr);
|
||
|
|
||
|
/*if($medRow['enddate'] == ""){
|
||
|
if($medRow['drug_interval'] != "" && $medRow['drug_interval'] != "0")
|
||
|
$xml->emptyelement('repeatNumber', array('value'=>$medRow['drug_interval']));
|
||
|
|
||
|
if($medRow['quantity'] != "")
|
||
|
$xml->emptyelement('doseQuantity', array('value'=>$medRow['quantity']));
|
||
|
|
||
|
if($medRow['units'] != "" && $medRow['size_type'] != "")
|
||
|
$xml->emptyelement('rateQuantity', array('units'=>$medRow['size_type'], 'value'=>$medRow['units']));
|
||
|
}*/
|
||
|
|
||
|
//consumable open
|
||
|
$xml->open_customTag('consumable');
|
||
|
|
||
|
//manufacturedProduct Open
|
||
|
$xml->open_customTag('manufacturedProduct', array('classCode' => 'MANU'));
|
||
|
|
||
|
$tempID = "2.16.840.1.113883.10.20.22.4.23";
|
||
|
$xml->self_templateid($tempID);
|
||
|
|
||
|
$actId = getUuid();
|
||
|
$xml->self_customId($actId);
|
||
|
|
||
|
//manufacturedMaterial open
|
||
|
$xml->open_customTag('manufacturedMaterial');
|
||
|
|
||
|
$arr = array('code' => $vset['code'], 'codeSystem' => $vset['code_system'],'sdtc:valueSet' => $vset['valueset']);
|
||
|
$xml->self_codeCustom($arr);
|
||
|
|
||
|
//manufacturerOrganization open
|
||
|
/*$xml->open_customTag('manufacturerOrganization');
|
||
|
|
||
|
$xml->element('name', 'Medication Factory Inc.');
|
||
|
|
||
|
//manufacturerOrganization Close
|
||
|
$xml->close_customTag();*/
|
||
|
|
||
|
//manufacturedMaterial Close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
//manufacturedProduct Close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
//consumable Close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
//substanceAdministration Close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
//Entry close
|
||
|
$xml->close_entry();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function getAllActiveMedications($xml, $patient_id)
|
||
|
{
|
||
|
global $from_date, $to_date;
|
||
|
$medArr = allActiveMedsPat($patient_id, $from_date, $to_date);
|
||
|
|
||
|
foreach ($medArr as $medRow) {
|
||
|
$vset = sqlQuery("select * from valueset where code = ? and nqf_code = ? ", array($medRow['rxnorm_drugcode'],$xml->nqf_code));
|
||
|
if (!empty($vset['valueset'])) {
|
||
|
//Entry open
|
||
|
$xml->open_entry();
|
||
|
|
||
|
//substanceAdministration Open
|
||
|
$xml->open_customTag('substanceAdministration', array('classCode' => 'SBADM', 'moodCode' => 'EVN'));
|
||
|
|
||
|
$tempID = "2.16.840.1.113883.10.20.22.4.16";
|
||
|
$xml->self_templateid($tempID);
|
||
|
|
||
|
$tempID = "2.16.840.1.113883.10.20.24.3.41";
|
||
|
$xml->self_templateid($tempID);
|
||
|
|
||
|
$refID = getUuid();
|
||
|
$xml->self_customId($refID);
|
||
|
|
||
|
|
||
|
$arr = array('code' => 'active');
|
||
|
$xml->self_customTag('statusCode', $arr);
|
||
|
|
||
|
$timeArr = array('low' => date('Ymdhis', strtotime($medRow['start_date'])), 'high' => date('Ymdhis', strtotime($medRow['end_date'])));
|
||
|
$xml->add_entryEffectTimeQRDAMed($timeArr);
|
||
|
|
||
|
/*if($medRow['enddate'] == ""){
|
||
|
if($medRow['drug_interval'] != "" && $medRow['drug_interval'] != "0")
|
||
|
$xml->emptyelement('repeatNumber', array('value'=>$medRow['drug_interval']));
|
||
|
|
||
|
if($medRow['quantity'] != "")
|
||
|
$xml->emptyelement('doseQuantity', array('value'=>$medRow['quantity']));
|
||
|
|
||
|
if($medRow['units'] != "" && $medRow['size_type'] != "")
|
||
|
$xml->emptyelement('rateQuantity', array('units'=>$medRow['size_type'], 'value'=>$medRow['units']));
|
||
|
}*/
|
||
|
|
||
|
//consumable open
|
||
|
$xml->open_customTag('consumable');
|
||
|
|
||
|
//manufacturedProduct Open
|
||
|
$xml->open_customTag('manufacturedProduct', array('classCode' => 'MANU'));
|
||
|
|
||
|
$tempID = "2.16.840.1.113883.10.20.22.4.23";
|
||
|
$xml->self_templateid($tempID);
|
||
|
|
||
|
$actId = getUuid();
|
||
|
$xml->self_customId($actId);
|
||
|
|
||
|
//manufacturedMaterial open
|
||
|
$xml->open_customTag('manufacturedMaterial');
|
||
|
|
||
|
$arr = array('code' => $vset['code'], 'codeSystem' => $vset['code_system'],'sdtc:valueSet' => $vset['valueset']);
|
||
|
$xml->self_codeCustom($arr);
|
||
|
|
||
|
//manufacturerOrganization open
|
||
|
/*$xml->open_customTag('manufacturerOrganization');
|
||
|
|
||
|
$xml->element('name', 'Medication Factory Inc.');
|
||
|
|
||
|
//manufacturerOrganization Close
|
||
|
$xml->close_customTag();*/
|
||
|
|
||
|
//manufacturedMaterial Close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
//manufacturedProduct Close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
//consumable Close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
//substanceAdministration Close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
//Entry close
|
||
|
$xml->close_entry();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//Medical problems
|
||
|
function getAllMedicalProbs($xml, $patient_id)
|
||
|
{
|
||
|
global $from_date, $to_date;
|
||
|
$diagArr = allListsPat('medical_problem', $patient_id, $from_date, $to_date);
|
||
|
|
||
|
foreach ($diagArr as $diagRow) {
|
||
|
$diagExpArr = explode(";", $diagRow['diagnosis']);
|
||
|
/*foreach($diagExpArr as $diagExpVal){
|
||
|
$diagDisp = explode(":", $diagExpVal);
|
||
|
if($diagDisp[0] == "ICD9" || $diagDisp[0] == "ICD10") continue;
|
||
|
$diagDispCode = $diagDisp[1];
|
||
|
}*/
|
||
|
|
||
|
$diagDisp = explode(":", $diagExpArr[0]);
|
||
|
$diagDispCode = str_replace(".", "", $diagDisp[1]);
|
||
|
|
||
|
$vset = sqlQuery("select * from valueset where code = ? and nqf_code = ?", array($diagDispCode,$xml->nqf_code));
|
||
|
if (!empty($vset['valueset'])) {
|
||
|
//Entry open
|
||
|
$xml->open_entry();
|
||
|
|
||
|
//observation Open
|
||
|
$xml->open_customTag('observation', array('classCode' => 'OBS', 'moodCode' => 'EVN'));
|
||
|
|
||
|
$tempID = "2.16.840.1.113883.10.20.22.4.4";
|
||
|
$xml->self_templateid($tempID);
|
||
|
|
||
|
$tempID = "2.16.840.1.113883.10.20.24.3.11";
|
||
|
$xml->self_templateid($tempID);
|
||
|
|
||
|
$refID = getUuid();
|
||
|
$xml->self_customId($refID);
|
||
|
|
||
|
$arr = array('code' => '282291009', 'codeSystemName' => 'SNOMED-CT', 'codeSystem' => '2.16.840.1.113883.6.96', 'displayName' => 'diagnosis');
|
||
|
$xml->self_codeCustom($arr);
|
||
|
|
||
|
$xml->textDispContent($diagRow['title']);
|
||
|
|
||
|
$activeChk = "active";
|
||
|
$endate = $diagRow['begdate'];
|
||
|
if ($diagRow['enddate'] != "") {
|
||
|
$activeChk = "completed";
|
||
|
$endate = $diagRow['enddate'];
|
||
|
}
|
||
|
|
||
|
//$arr = array('code'=>$activeChk);
|
||
|
$arr = array('code' => "completed");
|
||
|
$xml->self_customTag('statusCode', $arr);
|
||
|
|
||
|
$timeArr = array('low' => date('Ymdhis', strtotime($diagRow['begdate'])), 'high' => date('Ymdhis', strtotime($endate)));
|
||
|
$xml->add_entryEffectTime($timeArr);
|
||
|
|
||
|
|
||
|
$xml->self_customTag('value', array('xsi:type' => 'CD', 'code' => $diagDispCode, 'codeSystem' => '2.16.840.1.113883.6.96', 'sdtc:valueSet' => $vset['valueset']));
|
||
|
|
||
|
//entryRelationship Open
|
||
|
$xml->open_customTag('entryRelationship', array('typeCode' => 'REFR'));
|
||
|
|
||
|
//observation Open
|
||
|
$xml->open_customTag('observation', array('classCode' => 'OBS', 'moodCode' => 'EVN'));
|
||
|
|
||
|
$tempID = "2.16.840.1.113883.10.20.22.4.6";
|
||
|
$xml->self_templateid($tempID);
|
||
|
|
||
|
$tempID = "2.16.840.1.113883.10.20.24.3.94";
|
||
|
$xml->self_templateid($tempID);
|
||
|
|
||
|
$refID = getUuid();
|
||
|
$xml->self_customId($refID);
|
||
|
|
||
|
$arr = array('code' => '33999-4', 'codeSystem' => '2.16.840.1.113883.6.1', 'codeSystemName' => 'LOINC', 'displayName' => 'status');
|
||
|
$xml->self_codeCustom($arr);
|
||
|
|
||
|
//$arr = array('code'=>$activeChk);
|
||
|
$arr = array('code' => "completed");
|
||
|
$xml->self_customTag('statusCode', $arr);
|
||
|
|
||
|
$xml->self_customTag('value', array('xsi:type' => 'CD', 'code' => '55561003', 'displayName' => 'active', 'codeSystem' => '2.16.840.1.113883.6.96', 'codeSystemName' => 'SNOMED CT'));
|
||
|
|
||
|
//observation Close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
//entryRelationship Close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
//observation Close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
//Entry close
|
||
|
$xml->close_entry();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//Encounters function
|
||
|
function getAllPatientEncounters($xml, $patient_id)
|
||
|
{
|
||
|
global $encCheckUniqId, $from_date, $to_date,$EncounterCptCodes;
|
||
|
$encArr = allEncPat($patient_id, $from_date, $to_date);
|
||
|
|
||
|
foreach ($encArr as $encRow) {
|
||
|
$encRow['encounter'];
|
||
|
$cpt_code = $EncounterCptCodes[str_replace(' ', '_', strtolower($encRow['pc_catname']))];
|
||
|
$cpt_code = empty($cpt_code) ? '99201' : $cpt_code;
|
||
|
$vset = sqlStatement("select * from valueset where code = ? and nqf_code = ?", array('99201',$xml->nqf_code));
|
||
|
foreach ($vset as $v) {
|
||
|
//Entry open
|
||
|
$xml->open_entry();
|
||
|
|
||
|
//Encounter Open
|
||
|
$xml->open_customTag('encounter', array('classCode' => 'ENC', 'moodCode' => 'EVN'));
|
||
|
|
||
|
$tempID = "2.16.840.1.113883.10.20.22.4.49";
|
||
|
$xml->self_templateid($tempID);
|
||
|
|
||
|
$tempID = "2.16.840.1.113883.10.20.24.3.23";
|
||
|
$xml->self_templateid($tempID);
|
||
|
|
||
|
$refID = getUuid();
|
||
|
$xml->self_customId($refID);
|
||
|
$encCheckUniqId[$encRow['encounter']] = $refID;
|
||
|
|
||
|
|
||
|
$arr = array('code' => $cpt_code, 'codeSystem' => $v['code_system'],'sdtc:valueSet' => $v['valueset']);
|
||
|
$xml->self_codeCustom($arr);
|
||
|
|
||
|
$arr = array('code' => 'completed');
|
||
|
$xml->self_customTag('statusCode', $arr);
|
||
|
|
||
|
$timeArr = array('low' => date('Ymdhis', strtotime($encRow['date'])), 'high' => date('Ymdhis', strtotime($encRow['date'])));
|
||
|
$xml->add_entryEffectTime($timeArr);
|
||
|
|
||
|
//Encounter Close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
//Entry close
|
||
|
$xml->close_entry();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
$encArr = allProcPat("enc_checkup_procedure", $patient_id, $from_date, $to_date);
|
||
|
foreach ($encArr as $encRow) {
|
||
|
$encRow['encounter'];
|
||
|
$vset = sqlStatement("select * from valueset where code = ? and nqf_code = ?", array($encRow['procedure_code'],$xml->nqf_code));
|
||
|
foreach ($vset as $v) {
|
||
|
//Entry open
|
||
|
$xml->open_entry();
|
||
|
|
||
|
//Encounter Open
|
||
|
$xml->open_customTag('encounter', array('classCode' => 'ENC', 'moodCode' => 'EVN'));
|
||
|
|
||
|
$tempID = "2.16.840.1.113883.10.20.22.4.49";
|
||
|
$xml->self_templateid($tempID);
|
||
|
|
||
|
$tempID = "2.16.840.1.113883.10.20.24.3.23";
|
||
|
$xml->self_templateid($tempID);
|
||
|
|
||
|
$refID = getUuid();
|
||
|
$xml->self_customId($refID);
|
||
|
$encCheckUniqId[$encRow['encounter']] = $refID;
|
||
|
|
||
|
|
||
|
$arr = array('code' => $v['code'], 'codeSystem' => $v['code_system'],'sdtc:valueSet' => $v['valueset']);
|
||
|
$xml->self_codeCustom($arr);
|
||
|
|
||
|
$arr = array('code' => 'completed');
|
||
|
$xml->self_customTag('statusCode', $arr);
|
||
|
|
||
|
$timeArr = array('low' => date('Ymdhis', strtotime($encRow['date'])), 'high' => date('Ymdhis', strtotime($encRow['date'])));
|
||
|
$xml->add_entryEffectTime($timeArr);
|
||
|
|
||
|
//Encounter Close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
//Entry close
|
||
|
$xml->close_entry();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//Patient Data Sub Function for Payer Data
|
||
|
function payerQRDA($xml, $patient_id)
|
||
|
{
|
||
|
global $mainQrdaPayerCodeSendArr, $from_date, $to_date;
|
||
|
|
||
|
//Insurance getting
|
||
|
$payer = payerPatient($patient_id);
|
||
|
|
||
|
//Entry open
|
||
|
$xml->open_entry();
|
||
|
|
||
|
//observation Open
|
||
|
$xml->open_customTag('observation', array('classCode' => 'OBS', 'moodCode' => 'EVN'));
|
||
|
|
||
|
$tempID = "2.16.840.1.113883.10.20.24.3.55";
|
||
|
$xml->self_templateid($tempID);
|
||
|
|
||
|
$actId = getUuid();
|
||
|
$xml->self_customId($actId);
|
||
|
|
||
|
$arr = array('code' => '48768-6', 'displayName' => 'Payment source', 'codeSystem' => '2.16.840.1.113883.6.1', 'codeSystemName' => 'LOINC');
|
||
|
$xml->self_codeCustom($arr);
|
||
|
|
||
|
$arr = array('code' => 'completed');
|
||
|
$xml->self_customTag('statusCode', $arr);
|
||
|
|
||
|
$timeArr = array('low' => date('Ymdhis', strtotime($from_date)), 'high' => date('Ymdhis', strtotime($to_date)));
|
||
|
$xml->add_entryEffectTime($timeArr);
|
||
|
|
||
|
$xml->self_customTag('value', array('xsi:type' => 'CD', 'code' => $mainQrdaPayerCodeSendArr[$payer], 'codeSystem' => '2.16.840.1.113883.3.221.5' , 'codeSystemName' => 'Source of Payment Typology', 'displayName' => $payer));
|
||
|
|
||
|
//observation Close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
//Entry close
|
||
|
$xml->close_entry();
|
||
|
}
|
||
|
|
||
|
//Reporting Parameters function
|
||
|
function getReportingParam($xml)
|
||
|
{
|
||
|
global $from_date, $to_date;
|
||
|
|
||
|
$xml->open_loopComponent();
|
||
|
$xml->open_section();
|
||
|
|
||
|
$tempID = '2.16.840.1.113883.10.20.17.2.1';
|
||
|
$xml->self_templateid($tempID);
|
||
|
|
||
|
$arr = array('code' => '55187-9', 'codeSystem' => '2.16.840.1.113883.6.1');
|
||
|
$xml->self_codeCustom($arr);
|
||
|
|
||
|
$title = "Reporting Parameters";
|
||
|
$xml->add_title($title);
|
||
|
|
||
|
//Main Reporting Parameters display
|
||
|
$xml->open_text();
|
||
|
$xml->open_list();
|
||
|
$item_title = "Reporting period: " . date('d M Y', strtotime($from_date)) . " - " . date('d M Y', strtotime($to_date));
|
||
|
$xml->add_item($item_title);
|
||
|
$xml->close_list();
|
||
|
$xml->close_text();
|
||
|
|
||
|
$typeCode = 'DRIV';
|
||
|
$xml->open_entry($typeCode);
|
||
|
$arr = array('classCode' => 'ACT', 'moodCode' => 'EVN');
|
||
|
$xml->open_act($arr);
|
||
|
|
||
|
$tempID = '2.16.840.1.113883.10.20.17.3.8';
|
||
|
$xml->self_templateid($tempID);
|
||
|
|
||
|
$arr = array('extension' => getUuid());
|
||
|
$xml->self_customTag('id', $arr);
|
||
|
|
||
|
$arr = array('code' => '252116004', 'codeSystem' => '2.16.840.1.113883.6.96', 'displayName' => 'Observation Parameters');
|
||
|
$xml->self_codeCustom($arr);
|
||
|
|
||
|
$timeArr = array('low' => date('Ymdhis', strtotime($from_date)), 'high' => date('Ymdhis', strtotime($to_date)));
|
||
|
$xml->add_entryEffectTime($timeArr);
|
||
|
|
||
|
$xml->close_act();
|
||
|
$xml->close_entry();
|
||
|
|
||
|
$xml->close_section();
|
||
|
$xml->close_loopComponent();
|
||
|
}
|
||
|
|
||
|
//Measure Section
|
||
|
function getMeasureSection($xml, $rule_id)
|
||
|
{
|
||
|
global $preDefinedUniqIDRules;
|
||
|
|
||
|
$xml->open_loopComponent();
|
||
|
$xml->open_section();
|
||
|
|
||
|
$tempID = '2.16.840.1.113883.10.20.24.2.2';
|
||
|
$xml->self_templateid($tempID);
|
||
|
|
||
|
$tempID = '2.16.840.1.113883.10.20.24.2.3';
|
||
|
$xml->self_templateid($tempID);
|
||
|
|
||
|
$arr = array('code' => '55186-1', 'codeSystem' => '2.16.840.1.113883.6.1');
|
||
|
$xml->self_codeCustom($arr);
|
||
|
|
||
|
$title = "Measure Section";
|
||
|
$xml->add_title($title);
|
||
|
|
||
|
//Main Measure display
|
||
|
$xml->open_text();
|
||
|
|
||
|
//Table Start
|
||
|
$xml->open_customTag('table', $tabArr);
|
||
|
//THEAD Start
|
||
|
$xml->open_customTag('thead');
|
||
|
//TR Start
|
||
|
$xml->open_customTag('tr');
|
||
|
|
||
|
$xml->add_trElementsTitles();
|
||
|
|
||
|
//TR close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
//THEAD close
|
||
|
$xml->close_customTag();
|
||
|
//TBOBY START
|
||
|
$xml->open_customTag('tbody');
|
||
|
$xml->open_customTag('tr');
|
||
|
|
||
|
if (!empty($rule_id)) {
|
||
|
$tdTitle = "NQF:" . $rule_id;
|
||
|
}
|
||
|
|
||
|
$tdVersionNeutral = getUuid();
|
||
|
$tdVersionSpecific = $preDefinedUniqIDRules[$rule_id];
|
||
|
$uniqIdArr[] = $tdVersionSpecific;
|
||
|
|
||
|
$dataArr = array(0 => $tdTitle, 1 => $tdVersionNeutral, 2 => $tdVersionSpecific);
|
||
|
$xml->add_trElementsValues($dataArr);
|
||
|
|
||
|
//TR close
|
||
|
$xml->close_customTag();
|
||
|
//TBODY close
|
||
|
$xml->close_customTag();
|
||
|
//Table Close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
$xml->close_text();
|
||
|
|
||
|
//Entry open
|
||
|
$xml->open_entry();
|
||
|
|
||
|
//Organizer Start
|
||
|
$arr = array('classCode' => 'CLUSTER', 'moodCode' => 'EVN');
|
||
|
$xml->open_customTag('organizer', $arr);
|
||
|
|
||
|
$tempID = "2.16.840.1.113883.10.20.24.3.98";
|
||
|
$xml->self_templateid($tempID);
|
||
|
|
||
|
$tempID = "2.16.840.1.113883.10.20.24.3.97";
|
||
|
$xml->self_templateid($tempID);
|
||
|
|
||
|
$arr = array('extension' => $uniqIdArr[0]);
|
||
|
$xml->self_customTag('id', $arr);
|
||
|
|
||
|
$arr = array('code' => 'completed');
|
||
|
$xml->self_customTag('statusCode', $arr);
|
||
|
|
||
|
//reference Start
|
||
|
$arr = array('typeCode' => 'REFR');
|
||
|
$xml->open_customTag('reference', $arr);
|
||
|
|
||
|
//externalDocument Start
|
||
|
$arr = array('classCode' => 'DOC', 'moodCode' => 'EVN');
|
||
|
$xml->open_customTag('externalDocument', $arr);
|
||
|
|
||
|
$exDocID = $uniqIdArr[0];
|
||
|
$xml->self_customTag('id', array('root' => '2.16.840.1.113883.4.738', 'extension' => $exDocID));
|
||
|
|
||
|
$xml->element('text', "NQF# " . $rule_id);
|
||
|
|
||
|
$setidVal = getUuid();
|
||
|
$xml->self_setid($setidVal);
|
||
|
|
||
|
$arr = array('value' => '3');
|
||
|
$xml->self_customTag('versionNumber', $arr);
|
||
|
|
||
|
//externalDocument Close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
//reference Close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
//Organizer Close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
//Entry Close
|
||
|
$xml->close_entry();
|
||
|
|
||
|
$xml->close_section();
|
||
|
$xml->close_loopComponent();
|
||
|
}
|
||
|
|
||
|
//Download QRDA Category I
|
||
|
function downloadQRDACat1($xml, $patient_id, $rule_id)
|
||
|
{
|
||
|
//Patient Info
|
||
|
if ($patient_id != "") {
|
||
|
$patientRow = getPatData($patient_id);
|
||
|
$patFname = $patientRow['fname'];
|
||
|
$patLname = $patientRow['lname'];
|
||
|
}
|
||
|
|
||
|
//QRDA File Download Folder in site/cqm_qrda folder
|
||
|
$qrda_fname = $patFname . "_" . $patLname . "_NQF_" . $rule_id . ".xml";
|
||
|
global $qrda_file_path;
|
||
|
if (!file_exists($qrda_file_path)) {
|
||
|
mkdir($qrda_file_path, 0777, true);
|
||
|
}
|
||
|
|
||
|
$qrda_file_name = $qrda_file_path . $qrda_fname;
|
||
|
$fileQRDAOPen = fopen($qrda_file_name, "w");
|
||
|
fwrite($fileQRDAOPen, trim($xml->getXml()));
|
||
|
fclose($fileQRDAOPen);
|
||
|
return $qrda_fname;
|
||
|
}
|
||
|
|
||
|
//Patient History Info
|
||
|
function patCharactersticQRDA($xml, $patient_id)
|
||
|
{
|
||
|
|
||
|
//Patient History
|
||
|
$patHist = patientQRDAHistory($patient_id);
|
||
|
|
||
|
$tobaccoArr = explode('|', $patHist['tobacco']);
|
||
|
|
||
|
$query = sqlQuery("select codes from list_options where list_id ='smoking_status' and option_id = ?", array($tobaccoArr[3]));
|
||
|
$tobacco = explode(':', $query['codes']);
|
||
|
$tobacco_code = $tobacco[1];
|
||
|
$vset = sqlQuery("select * from valueset where code = ? and nqf_code = ?", array($tobacco_code,$xml->nqf_code));
|
||
|
if (!empty($vset['valueset'])) {
|
||
|
//Entry open
|
||
|
$xml->open_entry();
|
||
|
|
||
|
//observation Open
|
||
|
$xml->open_customTag('observation', array('classCode' => 'OBS', 'moodCode' => 'EVN'));
|
||
|
|
||
|
$tempID = "2.16.840.1.113883.10.20.22.4.85";
|
||
|
$xml->self_templateid($tempID);
|
||
|
|
||
|
$actId = getUuid();
|
||
|
$xml->self_customId($actId);
|
||
|
|
||
|
$arr = array('code' => 'ASSERTION', 'displayName' => 'Assertion', 'codeSystem' => '2.16.840.1.113883.5.4', 'codeSystemName' => 'ActCode');
|
||
|
$xml->self_codeCustom($arr);
|
||
|
|
||
|
$arr = array('code' => 'completed');
|
||
|
$xml->self_customTag('statusCode', $arr);
|
||
|
|
||
|
$timeArr = array('low' => date('Ymdhis', strtotime($patHist['date'])), 'high' => date('Ymdhis', strtotime($patHist['date'])));
|
||
|
$xml->add_entryEffectTime($timeArr);
|
||
|
|
||
|
$xml->self_customTag('value', array('xsi:type' => 'CD', 'code' => $vset['code'], 'codeSystem' => $vset['code_system'],'sdtc:valueSet' => $vset['valueset']));
|
||
|
|
||
|
//observation Close
|
||
|
$xml->close_customTag();
|
||
|
|
||
|
//Entry close
|
||
|
$xml->close_entry();
|
||
|
}
|
||
|
}
|