PageRenderTime 89ms CodeModel.GetById 45ms RepoModel.GetById 0ms app.codeStats 1ms

/interface/modules/zend_modules/module/Carecoordination/src/Carecoordination/Model/EncounterccdadispatchTable.php

https://bitbucket.org/openemr/openemr
PHP | 2574 lines | 2004 code | 262 blank | 308 comment | 132 complexity | dc025a64b99cd19d539b4f84e70f047b MD5 | raw file
Possible License(s): Apache-2.0, AGPL-1.0, GPL-2.0, LGPL-3.0, BSD-3-Clause, Unlicense, MPL-2.0, GPL-3.0, LGPL-2.1

Large files files are truncated, but you can click here to view the full file

  1. <?php
  2. /**
  3. * interface/modules/zend_modules/module/Carecoordination/src/Carecoordination/Model/EncounterccdadispatchTable.php
  4. *
  5. * @package OpenEMR
  6. * @link https://www.open-emr.org
  7. * @author Vinish K <vinish@zhservices.com>
  8. * @author Riju K P <rijukp@zhservices.com>
  9. * @copyright Copyright (c) 2014 Z&H Consultancy Services Private Limited <sam@zhservices.com>
  10. * @license https://github.com/openemr/openemr/blob/master/LICENSE GNU General Public License 3
  11. */
  12. namespace Carecoordination\Model;
  13. use Application\Listener\Listener;
  14. use Application\Model\ApplicationTable;
  15. use Carecoordination\Model\CarecoordinationTable;
  16. use CouchDB;
  17. use Laminas\Db\Adapter\Driver\Pdo\Result;
  18. use Laminas\Db\TableGateway\AbstractTableGateway;
  19. use Matrix\Exception;
  20. use OpenEMR\Common\Crypto\CryptoGen;
  21. use OpenEMR\Common\Uuid\UuidRegistry;
  22. require_once(__DIR__ . "/../../../../../../../../custom/code_types.inc.php");
  23. require_once(__DIR__ . "/../../../../../../../forms/vitals/report.php");
  24. class EncounterccdadispatchTable extends AbstractTableGateway
  25. {
  26. public function __construct()
  27. {
  28. }
  29. /*Fetch Patient data from EMR
  30. * @param $pid
  31. * @param $encounter
  32. * @return $patient_data Patient Data in XML format
  33. */
  34. public function getPatientdata($pid, $encounter)
  35. {
  36. $query = "select patient_data.*, l1.notes AS race_code, l1.title as race_title, l2.notes AS ethnicity_code, l2.title as ethnicity_title, l3.title as religion, l3.notes as religion_code, l4.notes as language_code, l4.title as language_title
  37. from patient_data
  38. left join list_options as l1 on l1.list_id=? AND l1.option_id=race
  39. left join list_options as l2 on l2.list_id=? AND l2.option_id=ethnicity
  40. left join list_options AS l3 ON l3.list_id=? AND l3.option_id=religion
  41. left join list_options AS l4 ON l4.list_id=? AND l4.option_id=language
  42. where pid=?";
  43. $appTable = new ApplicationTable();
  44. $row = $appTable->zQuery($query, array('race', 'ethnicity', 'religious_affiliation', 'language', $pid));
  45. foreach ($row as $result) {
  46. $patient_data = "<patient>
  47. <id>" . xmlEscape($result['pid']) . "</id>
  48. <encounter>" . xmlEscape($encounter) . "</encounter>
  49. <prefix>" . xmlEscape($result['title']) . "</prefix>
  50. <fname>" . xmlEscape($result['fname']) . "</fname>
  51. <mname>" . xmlEscape($result['mname']) . "</mname>
  52. <lname>" . xmlEscape($result['lname']) . "</lname>
  53. <suffix>" . xmlEscape($result['suffix']) . "</suffix>
  54. <birth_fname>" . xmlEscape($result['birth_fname']) . "</birth_fname>
  55. <birth_mname>" . xmlEscape($result['birth_mname']) . "</birth_mname>
  56. <birth_lname>" . xmlEscape($result['birth_lname']) . "</birth_lname>
  57. <street>" . xmlEscape($result['street']) . "</street>
  58. <city>" . xmlEscape($result['city']) . "</city>
  59. <state>" . xmlEscape($result['state']) . "</state>
  60. <postalCode>" . xmlEscape($result['postal_code']) . "</postalCode>
  61. <country>" . xmlEscape($result['country_code']) . "</country>
  62. <ssn>" . xmlEscape($result['ss'] ?: '') . "</ssn>
  63. <dob>" . xmlEscape(str_replace('-', '', $result['DOB'])) . "</dob>
  64. <gender>" . xmlEscape($result['sex']) . "</gender>
  65. <gender_code>" . xmlEscape(strtoupper(substr($result['sex'], 0, 1))) . "</gender_code>
  66. <status>" . xmlEscape($result['status'] ?: "") . "</status>
  67. <status_code>" . xmlEscape($result['status'] ? strtoupper(substr($result['status'], 0, 1)) : 0) . "</status_code>
  68. <phone_home>" . xmlEscape(($result['phone_home'] ?: '')) . "</phone_home>
  69. <phone_mobile>" . xmlEscape(($result['phone_home'] ? $result['phone_cell'] : '')) . "</phone_mobile>
  70. <email>" . xmlEscape(($result['email'] ?: '')) . "</email>
  71. <religion>" . xmlEscape(Listener::z_xlt($result['religion'] ?: "")) . "</religion>
  72. <religion_code>" . xmlEscape($result['religion_code'] ?: '') . "</religion_code>
  73. <race>" . xmlEscape(Listener::z_xlt($result['race_title'])) . "</race>
  74. <race_code>" . xmlEscape($result['race_code']) . "</race_code>
  75. <ethnicity>" . xmlEscape(Listener::z_xlt($result['ethnicity_title'])) . "</ethnicity>
  76. <ethnicity_code>" . xmlEscape($result['ethnicity_code']) . "</ethnicity_code>
  77. <language>" . xmlEscape(Listener::z_xlt($result['language_title'])) . "</language>
  78. <language_code>" . xmlEscape($result['language_code']) . "</language_code>
  79. </patient>
  80. <guardian>
  81. <fname>" . xmlEscape($result['']) . "</fname>
  82. <lname>" . xmlEscape($result['']) . "</lname>
  83. <code>" . xmlEscape($result['']) . "</code>
  84. <relation>" . xmlEscape($result['guardianrelationship']) . "</relation>
  85. <display_name>" . xmlEscape($result['guardiansname']) . "</display_name>
  86. <street>" . xmlEscape($result['guardianaddress']) . "</street>
  87. <city>" . xmlEscape($result['guardiancity']) . "</city>
  88. <state>" . xmlEscape($result['guardianstate']) . "</state>
  89. <postalCode>" . xmlEscape($result['guardianpostalcode']) . "</postalCode>
  90. <country>" . xmlEscape($result['guardiancountry']) . "</country>
  91. <telecom>" . xmlEscape($result['guardianphone']) . "</telecom>
  92. </guardian>";
  93. }
  94. return $patient_data;
  95. }
  96. public function getProviderDetails($pid, $encounter)
  97. {
  98. $provider_details = '';
  99. if (!$encounter) {
  100. $query_enc = "SELECT encounter FROM form_encounter WHERE pid=? ORDER BY date DESC LIMIT 1";
  101. $appTable = new ApplicationTable();
  102. $res_enc = $appTable->zQuery($query_enc, array($pid));
  103. foreach ($res_enc as $row_enc) {
  104. $encounter = $row_enc['encounter'];
  105. }
  106. }
  107. $query = "SELECT * FROM form_encounter as fe
  108. JOIN users AS u ON u.id = fe.provider_id
  109. JOIN facility AS f ON f.id = u.facility_id
  110. WHERE fe.pid = ? AND fe.encounter = ?";
  111. $appTable = new ApplicationTable();
  112. $row = $appTable->zQuery($query, array($pid, $encounter));
  113. foreach ($row as $result) {
  114. $provider_details = "<encounter_provider>
  115. <facility_id>" . xmlEscape($result['id']) . "</facility_id>
  116. <facility_npi>" . xmlEscape($result['facility_npi']) . "</facility_npi>
  117. <facility_oid>" . xmlEscape($result['oid']) . "</facility_oid>
  118. <facility_name>" . xmlEscape($result['name']) . "</facility_name>
  119. <facility_phone>" . xmlEscape(($result['phone'] ? $result['phone'] : 0)) . "</facility_phone>
  120. <facility_fax>" . xmlEscape($result['fax']) . "</facility_fax>
  121. <facility_street>" . xmlEscape($result['street']) . "</facility_street>
  122. <facility_city>" . xmlEscape($result['city']) . "</facility_city>
  123. <facility_state>" . xmlEscape($result['state']) . "</facility_state>
  124. <facility_postal_code>" . xmlEscape($result['postal_code']) . "</facility_postal_code>
  125. <facility_country_code>" . xmlEscape($result['country_code']) . "</facility_country_code>
  126. </encounter_provider>
  127. ";
  128. }
  129. return $provider_details;
  130. }
  131. public function getAuthor($pid, $encounter)
  132. {
  133. $author = '';
  134. $details = $this->getDetails('hie_author_id');
  135. $author = "
  136. <author>
  137. <streetAddressLine>" . xmlEscape($details['street']) . "</streetAddressLine>
  138. <city>" . xmlEscape($details['city']) . "</city>
  139. <state>" . xmlEscape($details['state']) . "</state>
  140. <postalCode>" . xmlEscape($details['zip']) . "</postalCode>
  141. <country>" . xmlEscape($details['']) . "</country>
  142. <telecom>" . xmlEscape(($details['phonew1'] ? $details['phonew1'] : 0)) . "</telecom>
  143. <fname>" . xmlEscape($details['fname']) . "</fname>
  144. <lname>" . xmlEscape($details['lname']) . "</lname>
  145. <npi>" . xmlEscape($details['npi']) . "</npi>
  146. </author>";
  147. return $author;
  148. }
  149. public function getDataEnterer($pid, $encounter)
  150. {
  151. $data_enterer = '';
  152. $details = $this->getDetails('hie_data_enterer_id');
  153. $data_enterer = "
  154. <data_enterer>
  155. <streetAddressLine>" . xmlEscape($details['street']) . "</streetAddressLine>
  156. <city>" . xmlEscape($details['city']) . "</city>
  157. <state>" . xmlEscape($details['state']) . "</state>
  158. <postalCode>" . xmlEscape($details['zip']) . "</postalCode>
  159. <country>" . xmlEscape($details['']) . "</country>
  160. <telecom>" . xmlEscape(($details['phonew1'] ? $details['phonew1'] : 0)) . "</telecom>
  161. <fname>" . xmlEscape($details['fname']) . "</fname>
  162. <lname>" . xmlEscape($details['lname']) . "</lname>
  163. </data_enterer>";
  164. return $data_enterer;
  165. }
  166. public function getInformant($pid, $encounter)
  167. {
  168. $informant = '';
  169. $details = $this->getDetails('hie_informant_id');
  170. $personal_informant = $this->getDetails('hie_personal_informant_id');
  171. $informant = "<informer>
  172. <streetAddressLine>" . xmlEscape($details['street']) . "</streetAddressLine>
  173. <city>" . xmlEscape($details['city']) . "</city>
  174. <state>" . xmlEscape($details['state']) . "</state>
  175. <postalCode>" . xmlEscape($details['zip']) . "</postalCode>
  176. <country>" . xmlEscape($details['']) . "</country>
  177. <telecom>" . xmlEscape(($details['phonew1'] ? $details['phonew1'] : 0)) . "</telecom>
  178. <fname>" . xmlEscape($details['fname']) . "</fname>
  179. <lname>" . xmlEscape($details['lname']) . "</lname>
  180. <personal_informant>" . xmlEscape($this->getSettings('Carecoordination', 'hie_personal_informant_id')) . "</personal_informant>
  181. </informer>";
  182. return $informant;
  183. }
  184. public function getCustodian($pid, $encounter)
  185. {
  186. $custodian = '';
  187. $details = $this->getDetails('hie_custodian_id');
  188. $custodian = "<custodian>
  189. <streetAddressLine>" . xmlEscape($details['street']) . "</streetAddressLine>
  190. <city>" . xmlEscape($details['city']) . "</city>
  191. <state>" . xmlEscape($details['state']) . "</state>
  192. <postalCode>" . xmlEscape($details['zip']) . "</postalCode>
  193. <country>" . xmlEscape($details['']) . "</country>
  194. <telecom>" . xmlEscape(($details['phonew1'] ? $details['phonew1'] : 0)) . "</telecom>
  195. <name>" . xmlEscape($details['organization']) . "</name>
  196. <organization>" . xmlEscape($details['organization']) . "</organization>
  197. </custodian>";
  198. return $custodian;
  199. }
  200. public function getInformationRecipient($pid, $encounter, $recipients, $params)
  201. {
  202. $information_recipient = '';
  203. $field_name = array();
  204. $details = $this->getDetails('hie_recipient_id');
  205. $appTable = new ApplicationTable();
  206. if ($recipients == 'hie') {
  207. $details['fname'] = 'MyHealth';
  208. $details['lname'] = '';
  209. $details['organization'] = '';
  210. } elseif ($recipients == 'emr_direct') {
  211. $query = "select fname, lname, organization, street, city, state, zip, phonew1 from users where email = ?";
  212. $field_name[] = $params;
  213. } elseif ($recipients == 'patient') {
  214. $query = "select fname, lname from patient_data WHERE pid = ?";
  215. $field_name[] = $params;
  216. } else {
  217. if (!$params) {
  218. $params = $_SESSION['authUserID'];
  219. }
  220. $query = "select fname, lname, organization, street, city, state, zip, phonew1 from users where id = ?";
  221. $field_name[] = $params;
  222. }
  223. if ($recipients != 'hie') {
  224. $res = $appTable->zQuery($query, $field_name);
  225. $result = $res->current();
  226. $details['fname'] = $result['fname'];
  227. $details['lname'] = $result['lname'];
  228. $details['organization'] = $result['organization'];
  229. $details['street'] = $result['street'];
  230. $details['city'] = $result['city'];
  231. $details['state'] = $result['state'];
  232. $details['zip'] = $result['zip'];
  233. $details['phonew1'] = $result['phonew1'];
  234. }
  235. $information_recipient = "<information_recipient>
  236. <fname>" . xmlEscape($details['fname']) . "</fname>
  237. <lname>" . xmlEscape($details['lname']) . "</lname>
  238. <organization>" . xmlEscape($details['organization']) . "</organization>
  239. <street>" . xmlEscape($details['street']) . "</street>
  240. <city>" . xmlEscape($details['city']) . "</city>
  241. <state>" . xmlEscape($details['state']) . "</state>
  242. <zip>" . xmlEscape($details['zip']) . "</zip>
  243. <phonew1>" . xmlEscape($details['phonew1']) . "</phonew1>
  244. </information_recipient>";
  245. return $information_recipient;
  246. }
  247. public function getLegalAuthenticator($pid, $encounter)
  248. {
  249. $legal_authenticator = '';
  250. $details = $this->getDetails('hie_legal_authenticator_id');
  251. $legal_authenticator = "<legal_authenticator>
  252. <streetAddressLine>" . xmlEscape($details['street']) . "</streetAddressLine>
  253. <city>" . xmlEscape($details['city']) . "</city>
  254. <state>" . xmlEscape($details['state']) . "</state>
  255. <postalCode>" . xmlEscape($details['zip']) . "</postalCode>
  256. <country>" . xmlEscape($details['']) . "</country>
  257. <telecom>" . xmlEscape(($details['phonew1'] ? $details['phonew1'] : 0)) . "</telecom>
  258. <fname>" . xmlEscape($details['fname']) . "</fname>
  259. <lname>" . xmlEscape($details['lname']) . "</lname>
  260. </legal_authenticator>";
  261. return $legal_authenticator;
  262. }
  263. public function getAuthenticator($pid, $encounter)
  264. {
  265. $authenticator = '';
  266. $details = $this->getDetails('hie_authenticator_id');
  267. $authenticator = "<authenticator>
  268. <streetAddressLine>" . xmlEscape($details['street']) . "</streetAddressLine>
  269. <city>" . xmlEscape($details['city']) . "</city>
  270. <state>" . xmlEscape($details['state']) . "</state>
  271. <postalCode>" . xmlEscape($details['zip']) . "</postalCode>
  272. <country>" . xmlEscape($details['']) . "</country>
  273. <telecom>" . xmlEscape(($details['phonew1'] ? $details['phonew1'] : 0)) . "</telecom>
  274. <fname>" . xmlEscape($details['fname']) . "</fname>
  275. <lname>" . xmlEscape($details['lname']) . "</lname>
  276. </authenticator>";
  277. return $authenticator;
  278. }
  279. public function getPrimaryCareProvider($pid, $encounter)
  280. {
  281. // primary from demo
  282. $getprovider = $this->getProviderId($pid);
  283. if (!empty($getprovider)) { // from patient_data
  284. $details = $this->getUserDetails($getprovider);
  285. } else { // get from CCM setup
  286. $details = $this->getDetails('hie_primary_care_provider_id');
  287. }
  288. // Note for NPI: Many times a care team member may not have an NPI so instead of
  289. // an NPI OID use facility/document unique OID with user table reference for extension.
  290. $get_care_team_provider = explode("|", $this->getCareTeamProviderId($pid));
  291. $primary_care_provider = "
  292. <primary_care_provider>
  293. <provider>
  294. <prefix>" . xmlEscape($details['title']) . "</prefix>
  295. <fname>" . xmlEscape($details['fname']) . "</fname>
  296. <lname>" . xmlEscape($details['lname']) . "</lname>
  297. <speciality>" . xmlEscape($details['specialty']) . "</speciality>
  298. <organization>" . xmlEscape($details['organization']) . "</organization>
  299. <telecom>" . xmlEscape(($details['phonew1'] ? $details['phonew1'] : 0)) . "</telecom>
  300. <addr>" . xmlEscape($details['']) . "</addr>
  301. <table_id>" . xmlEscape("provider-" . $getprovider) . "</table_id>
  302. <npi>" . xmlEscape($details['npi'] ?: '') . "</npi>
  303. <physician_type>" . xmlEscape($details['physician_type']) . "</physician_type>
  304. <physician_type_code>" . xmlEscape($details['physician_type_code']) . "</physician_type_code>
  305. <taxonomy>" . xmlEscape($details['taxonomy']) . "</taxonomy>
  306. <taxonomy_description>" . xmlEscape($details['taxonomy_desc']) . "</taxonomy_description>
  307. </provider>
  308. </primary_care_provider>";
  309. $care_team_provider = "<care_team>";
  310. foreach ($get_care_team_provider as $team_member) {
  311. if ((int)$getprovider === (int)$team_member) {
  312. // primary should be a part of care team but just in case
  313. // I've kept primary separate. So either way, primary gets included.
  314. // in this case, we don't want to duplicate the provider.
  315. continue;
  316. }
  317. $details2 = $this->getUserDetails($team_member);
  318. if (empty($details2)) {
  319. continue;
  320. }
  321. $care_team_provider .= "<provider>
  322. <prefix>" . xmlEscape($details2['title']) . "</prefix>
  323. <fname>" . xmlEscape($details2['fname']) . "</fname>
  324. <lname>" . xmlEscape($details2['lname']) . "</lname>
  325. <speciality>" . xmlEscape($details2['specialty']) . "</speciality>
  326. <organization>" . xmlEscape($details2['organization']) . "</organization>
  327. <telecom>" . xmlEscape(($details2['phonew1'] ?: '')) . "</telecom>
  328. <addr>" . xmlEscape($details2['']) . "</addr>
  329. <table_id>" . xmlEscape("provider-" . $team_member) . "</table_id>
  330. <npi>" . xmlEscape($details2['npi']) . "</npi>
  331. <physician_type>" . xmlEscape($details2['physician_type']) . "</physician_type>
  332. <physician_type_code>" . xmlEscape($details2['physician_type_code']) . "</physician_type_code>
  333. <taxonomy>" . xmlEscape($details2['taxonomy']) . "</taxonomy>
  334. <taxonomy_description>" . xmlEscape($details2['taxonomy_desc']) . "</taxonomy_description>
  335. </provider>
  336. ";
  337. }
  338. $care_team_provider .= "</care_team>
  339. ";
  340. return $primary_care_provider . $care_team_provider;
  341. }
  342. /*
  343. #******************************************************#
  344. # CONTINUITY OF CARE #
  345. #******************************************************#
  346. */
  347. public function getAllergies($pid, $encounter)
  348. {
  349. $allergies = '';
  350. $query = "SELECT l.id, l.title, l.begdate, l.enddate, lo.title AS observation,
  351. SUBSTRING(lo.codes, LOCATE(':',lo.codes)+1, LENGTH(lo.codes)) AS observation_code,
  352. SUBSTRING(l.`diagnosis`,1,LOCATE(':',l.diagnosis)-1) AS code_type_real,
  353. l.reaction, l.diagnosis, l.diagnosis AS code
  354. FROM lists AS l
  355. LEFT JOIN list_options AS lo ON lo.list_id = ? AND lo.option_id = l.severity_al
  356. WHERE l.type = ? AND l.pid = ?";
  357. $appTable = new ApplicationTable();
  358. $res = $appTable->zQuery($query, array('severity_ccda', 'allergy', $pid));
  359. $allergies = "<allergies>";
  360. foreach ($res as $row) {
  361. $split_codes = explode(';', $row['code']);
  362. foreach ($split_codes as $key => $single_code) {
  363. $code = $code_text = $code_rx = $code_text_rx = $code_snomed = $code_text_snomed = $reaction_text = $reaction_code = '';
  364. $get_code_details = explode(':', $single_code);
  365. if ($get_code_details[0] == 'RXNORM' || $get_code_details[0] == 'RXCUI') {
  366. $code_rx = $get_code_details[1];
  367. $code_text_rx = lookup_code_descriptions($single_code);
  368. } elseif ($get_code_details[0] == 'SNOMED' || $get_code_details[0] == 'SNOMED-CT') {
  369. $code_snomed = $get_code_details[1];
  370. $code_text_snomed = lookup_code_descriptions($row['code']);
  371. } else {
  372. $code = $get_code_details[1];
  373. $code_text = lookup_code_descriptions($single_code);
  374. }
  375. $active = $status_table = '';
  376. if ($row['enddate']) {
  377. $active = 'completed';
  378. $allergy_status = 'completed';
  379. $status_table = 'Resolved';
  380. $status_code = '73425007';
  381. } else {
  382. $active = 'completed';
  383. $allergy_status = 'active';
  384. $status_table = 'Active';
  385. $status_code = '55561003';
  386. }
  387. if ($row['reaction']) {
  388. $reaction_text = (new CarecoordinationTable())->getListTitle($row['reaction'], 'reaction', '');
  389. $reaction_code = (new CarecoordinationTable())->getCodes($row['reaction'], 'reaction');
  390. $reaction_code = explode(':', $reaction_code);
  391. }
  392. $allergies .= "<allergy>
  393. <id>" . xmlEscape(base64_encode($_SESSION['site_id'] . $row['id'] . $single_code)) . "</id>
  394. <sha_id>" . xmlEscape("36e3e930-7b14-11db-9fe1-0800200c9a66") . "</sha_id>
  395. <title>" . xmlEscape($row['title']) . ($single_code ? " [" . xmlEscape($single_code) . "]" : '') . "</title>
  396. <diagnosis_code>" . xmlEscape(($code ? $code : 0)) . "</diagnosis_code>
  397. <diagnosis>" . xmlEscape(($code_text ? Listener::z_xlt($code_text) : "")) . "</diagnosis>
  398. <rxnorm_code>" . xmlEscape(($code_rx ? $code_rx : 0)) . "</rxnorm_code>
  399. <rxnorm_code_text>" . xmlEscape(($code_text_rx ? Listener::z_xlt($code_text_rx) : "")) . "</rxnorm_code_text>
  400. <snomed_code>" . xmlEscape(($code_snomed ? $code_snomed : 0)) . "</snomed_code>
  401. <snomed_code_text>" . xmlEscape(($code_text_snomed ? Listener::z_xlt($code_text_snomed) : "")) . "</snomed_code_text>
  402. <status_table>" . ($status_table ? xmlEscape($status_table) : "") . "</status_table>
  403. <status>" . ($active ? xmlEscape($active) : "") . "</status>
  404. <allergy_status>" . ($allergy_status ? xmlEscape($allergy_status) : "") . "</allergy_status>
  405. <status_code>" . ($status_code ? xmlEscape($status_code) : 0) . "</status_code>
  406. <outcome>" . xmlEscape(($row['observation'] ? Listener::z_xlt($row['observation']) : "")) . "</outcome>
  407. <outcome_code>" . xmlEscape(($row['observation_code'] ? $row['observation_code'] : 0)) . "</outcome_code>
  408. <startdate>" . xmlEscape($row['begdate'] ? preg_replace('/-/', '', $row['begdate']) : "00000000") . "</startdate>
  409. <enddate>" . xmlEscape($row['enddate'] ? preg_replace('/-/', '', $row['enddate']) : "00000000") . "</enddate>
  410. <reaction_text>" . xmlEscape($reaction_text ? Listener::z_xlt($reaction_text) : "") . "</reaction_text>
  411. <reaction_code>" . xmlEscape($reaction_code[1] ?: '') . "</reaction_code>
  412. <reaction_code_type>" . xmlEscape(str_replace('-', ' ', $reaction_code[0]) ?: '') . "</reaction_code_type>
  413. <RxNormCode>" . xmlEscape($code_rx) . "</RxNormCode>
  414. <RxNormCode_text>" . xmlEscape(!empty($code_text_rx) ? $code_text_rx : $row['title']) . "</RxNormCode_text>
  415. </allergy>";
  416. }
  417. }
  418. $allergies .= "</allergies>";
  419. return $allergies;
  420. }
  421. public function getMedications($pid, $encounter)
  422. {
  423. $medications = '';
  424. $query = "select l.id, l.date_added, l.start_date, l.drug, l.dosage, l.quantity, l.size, l.substitute, l.drug_info_erx, l.active, SUBSTRING(l3.codes, LOCATE(':',l3.codes)+1, LENGTH(l3.codes)) AS route_code,
  425. l.rxnorm_drugcode, l1.title as unit, l1.codes as unit_code,l2.title as form,SUBSTRING(l2.codes, LOCATE(':',l2.codes)+1, LENGTH(l2.codes)) AS form_code, l3.title as route, l4.title as `interval`,
  426. u.title, u.fname, u.lname, u.mname, u.npi, u.street, u.streetb, u.city, u.state, u.zip, u.phonew1, l.note
  427. from prescriptions as l
  428. left join list_options as l1 on l1.option_id=unit AND l1.list_id = ?
  429. left join list_options as l2 on l2.option_id=form AND l2.list_id = ?
  430. left join list_options as l3 on l3.option_id=route AND l3.list_id = ?
  431. left join list_options as l4 on l4.option_id=`interval` AND l4.list_id = ?
  432. left join users as u on u.id = l.provider_id
  433. where l.patient_id = ? and l.active = 1";
  434. $appTable = new ApplicationTable();
  435. $res = $appTable->zQuery($query, array('drug_units', 'drug_form', 'drug_route', 'drug_interval', $pid));
  436. $medications = "<medications>";
  437. foreach ($res as $row) {
  438. if (!$row['rxnorm_drugcode']) {
  439. $row['rxnorm_drugcode'] = $this->generate_code($row['drug']);
  440. }
  441. $unit = $str = $active = '';
  442. if ($row['size'] > 0) {
  443. $unit = $row['size'] . " " . Listener::z_xlt($row['unit']) . " ";
  444. }
  445. $str = $unit . " " . Listener::z_xlt($row['route']) . " " . $row['dosage'] . " " . Listener::z_xlt($row['form'] . " " . $row['interval']);
  446. if ($row['active'] > 0) {
  447. $active = 'active';
  448. } else {
  449. $active = 'completed';
  450. }
  451. if ($row['start_date']) {
  452. $start_date = str_replace('-', '', $row['start_date']);
  453. $start_date_formatted = \Application\Model\ApplicationTable::fixDate($row['start_date'], $GLOBALS['date_display_format'], 'yyyy-mm-dd');
  454. ;
  455. }
  456. $medications .= "<medication>
  457. <id>" . xmlEscape($row['id']) . "</id>
  458. <extension>" . xmlEscape(base64_encode($_SESSION['site_id'] . $row['id'])) . "</extension>
  459. <sha_extension>" . xmlEscape("cdbd33f0-6cde-11db-9fe1-0800200c9a66") . "</sha_extension>
  460. <performer_name>" . xmlEscape($row['fname'] . " " . $row['mname'] . " " . $row['lname']) . "</performer_name>
  461. <fname>" . xmlEscape($row['fname']) . "</fname>
  462. <mname>" . xmlEscape($row['mname']) . "</mname>
  463. <lname>" . xmlEscape($row['lname']) . "</lname>
  464. <title>" . xmlEscape($row['title']) . "</title>
  465. <npi>" . xmlEscape($row['npi']) . "</npi>
  466. <address>" . xmlEscape($row['street']) . "</address>
  467. <city>" . xmlEscape($row['city']) . "</city>
  468. <state>" . xmlEscape($row['state']) . "</state>
  469. <zip>" . xmlEscape($row['zip']) . "</zip>
  470. <work_phone>" . xmlEscape($row['phonew1']) . "</work_phone>
  471. <drug>" . xmlEscape($row['drug']) . "</drug>
  472. <direction>" . xmlEscape($str) . "</direction>
  473. <dosage>" . xmlEscape($row['dosage']) . "</dosage>
  474. <size>" . xmlEscape(($row['size'] ? $row['size'] : 0)) . "</size>
  475. <unit>" . xmlEscape(($row['unit'] ? preg_replace('/\s*/', '', Listener::z_xlt($row['unit'])) : '')) . "</unit>
  476. <unit_code>" . xmlEscape(($row['unit_code'] ? $row['unit_code'] : 0)) . "</unit_code>
  477. <form>" . xmlEscape(Listener::z_xlt($row['form'])) . "</form>
  478. <form_code>" . xmlEscape(Listener::z_xlt($row['form_code'])) . "</form_code>
  479. <route_code>" . xmlEscape($row['route_code'] ?: $row['route']) . "</route_code>
  480. <route>" . xmlEscape($row['route']) . "</route>
  481. <interval>" . xmlEscape(Listener::z_xlt($row['interval'])) . "</interval>
  482. <start_date>" . xmlEscape($start_date) . "</start_date>
  483. <start_date_formatted>" . xmlEscape($row['start_date']) . "</start_date_formatted>
  484. <end_date>" . xmlEscape('') . "</end_date>
  485. <status>" . xmlEscape($active) . "</status>
  486. <indications>" . xmlEscape(($row['pres_erx_diagnosis_name'] ? $row['pres_erx_diagnosis_name'] : "")) . "</indications>
  487. <indications_code>" . xmlEscape(($row['pres_erx_diagnosis'] ? $row['pres_erx_diagnosis'] : 0)) . "</indications_code>
  488. <instructions>" . xmlEscape($row['note']) . "</instructions>
  489. <rxnorm>" . xmlEscape($row['rxnorm_drugcode']) . "</rxnorm>
  490. <provider_id></provider_id>
  491. <provider_name></provider_name>
  492. </medication>";
  493. }
  494. $medications .= "</medications>";
  495. return $medications;
  496. }
  497. public function getProblemList($pid, $encounter)
  498. {
  499. UuidRegistry::createMissingUuidsForTables(['lists']);
  500. $problem_lists = '';
  501. $query = "select l.*, lo.title as observation, lo.codes as observation_code, l.diagnosis AS code
  502. from lists AS l
  503. left join list_options as lo on lo.option_id = l.outcome AND lo.list_id = ?
  504. where l.type = ? and l.pid = ? AND l.outcome != ?"; // patched out /* AND l.id NOT IN(SELECT list_id FROM issue_encounter WHERE pid = ?)*/
  505. $appTable = new ApplicationTable();
  506. $res = $appTable->zQuery($query, array('outcome', 'medical_problem', $pid, 1));
  507. $problem_lists .= '<problem_lists>';
  508. foreach ($res as $row) {
  509. $row['uuid'] = UuidRegistry::uuidToString($row['uuid']);
  510. $split_codes = explode(';', $row['code']);
  511. foreach ($split_codes as $key => $single_code) {
  512. $get_code_details = explode(':', $single_code);
  513. $code_type = $get_code_details[0];
  514. $code_type = ($code_type == 'SNOMED' || $code_type == 'SNOMED-CT') ? "SNOMED CT" : "ICD-10-CM";
  515. $code = $get_code_details[1];
  516. $code_text = lookup_code_descriptions($single_code);
  517. $age = $this->getAge($pid, $row['begdate']);
  518. $start_date = str_replace('-', '', $row['begdate']);
  519. $end_date = str_replace('-', '', $row['enddate']);
  520. $status = $status_table = '';
  521. $start_date = $start_date ?: '0';
  522. $end_date = $end_date ?: '0';
  523. //Active - 55561003 Completed - 73425007
  524. if ($end_date) {
  525. $status = 'completed';
  526. $status_table = 'Resolved';
  527. $status_code = '73425007';
  528. } else {
  529. $status = 'active';
  530. $status_table = 'Active';
  531. $status_code = '55561003';
  532. }
  533. $observation = $row['observation'];
  534. $observation_code = explode(':', $row['observation_code']);
  535. $observation_code = $observation_code[1];
  536. $problem_lists .= "<problem>
  537. <problem_id>" . ($code ? xmlEscape($row['$id']) : '') . "</problem_id>
  538. <extension>" . xmlEscape(base64_encode($_SESSION['site_id'] . $row['id'])) . "</extension>
  539. <sha_extension>" . xmlEscape($row['uuid']) . "</sha_extension>
  540. <title>" . xmlEscape($row['title']) . ($single_code ? " [" . xmlEscape($single_code) . "]" : '') . "</title>
  541. <code>" . ($code ? xmlEscape($code) : '') . "</code>
  542. <code_type>" . ($code ? xmlEscape($code_type) : '') . "</code_type>
  543. <code_text>" . xmlEscape(($code_text ?: '')) . "</code_text>
  544. <age>" . xmlEscape($age) . "</age>
  545. <start_date_table>" . xmlEscape($row['begdate']) . "</start_date_table>
  546. <start_date>" . xmlEscape($start_date) . "</start_date>
  547. <end_date>" . xmlEscape($end_date) . "</end_date>
  548. <status>" . xmlEscape($status) . "</status>
  549. <status_table>" . xmlEscape($status_table) . "</status_table>
  550. <status_code>" . xmlEscape($status_code) . "</status_code>
  551. <observation>" . xmlEscape(($observation ? Listener::z_xlt($observation) : "")) . "</observation>
  552. <observation_code>" . xmlEscape(($observation_code ?: '')) . "</observation_code>
  553. <diagnosis>" . xmlEscape($code ?: '') . "</diagnosis>
  554. </problem>";
  555. }
  556. }
  557. $problem_lists .= '</problem_lists>';
  558. return $problem_lists;
  559. }
  560. public function getMedicalDeviceList($pid, $encounter)
  561. {
  562. $medical_devices = '';
  563. $query = "select l.*, lo.title as observation, lo.codes as observation_code, l.diagnosis AS code
  564. from lists AS l
  565. left join list_options as lo on lo.option_id = l.outcome AND lo.list_id = ?
  566. where l.type = ? and l.pid = ? AND l.outcome != ? AND l.id NOT IN(SELECT list_id FROM issue_encounter WHERE pid = ?)";
  567. $appTable = new ApplicationTable();
  568. $res = $appTable->zQuery($query, array('outcome', 'medical_device', $pid, 1, $pid));
  569. $medical_devices .= '<medical_devices>';
  570. foreach ($res as $row) {
  571. $split_codes = explode(';', $row['code']);
  572. foreach ($split_codes as $key => $single_code) {
  573. $get_code_details = explode(':', $single_code);
  574. $code_type = $get_code_details[0];
  575. $code_type = ($code_type == 'SNOMED' || $code_type == 'SNOMED-CT') ? "SNOMED CT" : "ICD-10-CM";
  576. $code = $get_code_details[1];
  577. $code_text = lookup_code_descriptions($single_code);
  578. $start_date = str_replace('-', '', $row['begdate']);
  579. $end_date = str_replace('-', '', $row['enddate']);
  580. $status = $status_table = '';
  581. $start_date = $start_date ?: '';
  582. $end_date = $end_date ?: '';
  583. //Active - 55561003 Completed - 73425007
  584. if ($end_date) {
  585. $status = 'completed';
  586. $status_table = 'Resolved';
  587. $status_code = '73425007';
  588. } else {
  589. $status = 'active';
  590. $status_table = 'Active';
  591. $status_code = '55561003';
  592. }
  593. $observation = $row['observation'];
  594. $observation_code = explode(':', $row['observation_code']);
  595. $observation_code = $observation_code[1];
  596. $medical_devices .= "<device>
  597. <extension>" . xmlEscape(base64_encode($_SESSION['site_id'] . $row['id'])) . "</extension>
  598. <sha_extension>" . xmlEscape($this->formatUid($_SESSION['site_id'] . $row['udi'])) . "</sha_extension>
  599. <title>" . xmlEscape($row['title']) . ($single_code ? " [" . xmlEscape($single_code) . "]" : '') . "</title>
  600. <code>" . ($code ? xmlEscape($code) : '') . "</code>
  601. <code_type>" . ($code ? xmlEscape($code_type) : '') . "</code_type>
  602. <code_text>" . xmlEscape(($code_text ?: '')) . "</code_text>
  603. <udi>" . xmlEscape($row['udi']) . "</udi>
  604. <start_date_table>" . xmlEscape($row['begdate']) . "</start_date_table>
  605. <start_date>" . xmlEscape($start_date) . "</start_date>
  606. <end_date>" . xmlEscape($end_date) . "</end_date>
  607. <status>" . xmlEscape($status) . "</status>
  608. <status_table>" . xmlEscape($status_table) . "</status_table>
  609. <status_code>" . xmlEscape($status_code) . "</status_code>
  610. <observation>" . xmlEscape(($observation ? Listener::z_xlt($observation) : "")) . "</observation>
  611. <observation_code>" . xmlEscape(($observation_code ?: '')) . "</observation_code>
  612. <diagnosis>" . xmlEscape($code ?: '') . "</diagnosis>
  613. </device>";
  614. }
  615. }
  616. $medical_devices .= '</medical_devices>';
  617. return $medical_devices;
  618. }
  619. public function getImmunization($pid, $encounter)
  620. {
  621. $immunizations = '';
  622. $query = "SELECT im.*, cd.code_text, DATE(administered_date) AS administered_date,
  623. DATE_FORMAT(administered_date,'%Y%m%d') AS administered_formatted, lo.title as route_of_administration,
  624. u.title, u.fname, u.mname, u.lname, u.npi, u.street, u.streetb, u.city, u.state, u.zip, u.phonew1,
  625. f.name, f.phone, SUBSTRING(lo.codes, LOCATE(':',lo.codes)+1, LENGTH(lo.codes)) AS route_code
  626. FROM immunizations AS im
  627. LEFT JOIN codes AS cd ON cd.code = im.cvx_code
  628. JOIN code_types AS ctype ON ctype.ct_key = 'CVX' AND ctype.ct_id=cd.code_type
  629. LEFT JOIN list_options AS lo ON lo.list_id = 'drug_route' AND lo.option_id = im.route
  630. LEFT JOIN users AS u ON u.id = im.administered_by_id
  631. LEFT JOIN facility AS f ON f.id = u.facility_id
  632. WHERE im.patient_id=? AND added_erroneously = 0";
  633. $appTable = new ApplicationTable();
  634. $res = $appTable->zQuery($query, array($pid));
  635. $immunizations .= '<immunizations>';
  636. foreach ($res as $row) {
  637. $immunizations .= "
  638. <immunization>
  639. <extension>" . xmlEscape(base64_encode($_SESSION['site_id'] . $row['id'])) . "</extension>
  640. <sha_extension>" . xmlEscape("e6f1ba43-c0ed-4b9b-9f12-f435d8ad8f92") . "</sha_extension>
  641. <id>" . xmlEscape($row['id']) . "</id>
  642. <cvx_code>" . xmlEscape($row['cvx_code']) . "</cvx_code>
  643. <code_text>" . xmlEscape($row['code_text']) . "</code_text>
  644. <reaction>" . xmlEscape($row['reaction']) . "</reaction>
  645. <npi>" . xmlEscape($row['npi']) . "</npi>
  646. <administered_by>" . xmlEscape($row['administered_by']) . "</administered_by>
  647. <fname>" . xmlEscape($row['fname']) . "</fname>
  648. <mname>" . xmlEscape($row['mname']) . "</mname>
  649. <lname>" . xmlEscape($row['lname']) . "</lname>
  650. <title>" . xmlEscape($row['title']) . "</title>
  651. <address>" . xmlEscape($row['street']) . "</address>
  652. <city>" . xmlEscape($row['city']) . "</city>
  653. <state>" . xmlEscape($row['state']) . "</state>
  654. <zip>" . xmlEscape($row['zip']) . "</zip>
  655. <work_phone>" . xmlEscape($row['phonew1']) . "</work_phone>
  656. <administered_on>" . xmlEscape($row['administered_date']) . "</administered_on>
  657. <administered_formatted>" . xmlEscape($row['administered_formatted']) . "</administered_formatted>
  658. <note>" . xmlEscape($row['note']) . "</note>
  659. <route_of_administration>" . xmlEscape(Listener::z_xlt($row['route_of_administration'])) . "</route_of_administration>
  660. <route_code>" . xmlEscape($row['route_code']) . "</route_code>
  661. <status>completed</status>
  662. <facility_name>" . xmlEscape($row['name']) . "</facility_name>
  663. <facility_phone>" . xmlEscape($row['phone']) . "</facility_phone>
  664. </immunization>";
  665. }
  666. $immunizations .= '</immunizations>';
  667. return $immunizations;
  668. }
  669. public function getProcedures($pid, $encounter)
  670. {
  671. $wherCon = '';
  672. $sqlBindArray = [];
  673. if ($encounter) {
  674. $wherCon = " b.encounter = ? AND ";
  675. $sqlBindArray[] = $encounter;
  676. }
  677. $procedure = '';
  678. $query = "select b.id, b.date as proc_date, b.code_text, b.code, fe.date,
  679. u.fname, u.lname, u.mname, u.npi, u.street, u.city, u.state, u.zip,
  680. f.id as fid, f.name, f.phone, f.street as fstreet, f.city as fcity, f.state as fstate, f.postal_code as fzip, f.country_code, f.phone as fphone
  681. from billing as b
  682. LEFT join code_types as ct on ct.ct_key
  683. LEFT join codes as c on c.code = b.code AND c.code_type = ct.ct_id
  684. LEFT join form_encounter as fe on fe.pid = b.pid AND fe.encounter = b.encounter
  685. LEFT JOIN users AS u ON u.id = b.provider_id
  686. LEFT JOIN facility AS f ON f.id = fe.facility_id
  687. where $wherCon b.pid = ? and b.activity = ?";
  688. array_push($sqlBindArray, $pid, 1);
  689. $appTable = new ApplicationTable();
  690. $res = $appTable->zQuery($query, $sqlBindArray);
  691. $procedure = '<procedures>';
  692. foreach ($res as $row) {
  693. $procedure .= "<procedure>
  694. <extension>" . xmlEscape(base64_encode($_SESSION['site_id'] . $row['id'])) . "</extension>
  695. <sha_extension>" . xmlEscape("d68b7e32-7810-4f5b-9cc2-acd54b0fd85d") . "</sha_extension>
  696. <description>" . xmlEscape($row['code_text']) . "</description>
  697. <code>" . xmlEscape($row['code']) . "</code>
  698. <date>" . xmlEscape(substr($row['date'], 0, 10)) . "</date>
  699. <npi>" . xmlEscape($row['npi']) . "</npi>
  700. <fname>" . xmlEscape($row['fname']) . "</fname>
  701. <mname>" . xmlEscape($row['mname']) . "</mname>
  702. <lname>" . xmlEscape($row['lname']) . "</lname>
  703. <address>" . xmlEscape($row['street']) . "</address>
  704. <city>" . xmlEscape($row['city']) . "</city>
  705. <state>" . xmlEscape($row['state']) . "</state>
  706. <zip>" . xmlEscape($row['zip']) . "</zip>
  707. <work_phone>" . xmlEscape($row['phonew1']) . "</work_phone>
  708. <facility_extension>" . xmlEscape(base64_encode($_SESSION['site_id'] . $row['fid'])) . "</facility_extension>
  709. <facility_sha_extension>" . xmlEscape("c2ee9ee9-ae31-4628-a919-fec1cbb58686") . "</facility_sha_extension>
  710. <facility_name>" . xmlEscape($row['name']) . "</facility_name>
  711. <facility_address>" . xmlEscape($row['fstreet']) . "</facility_address>
  712. <facility_city>" . xmlEscape($row['fcity']) . "</facility_city>
  713. <facility_state>" . xmlEscape($row['fstate']) . "</facility_state>
  714. <facility_country>" . xmlEscape($row['country_code']) . "</facility_country>
  715. <facility_zip>" . xmlEscape($row['fzip']) . "</facility_zip>
  716. <facility_phone>" . xmlEscape($row['fphone']) . "</facility_phone>
  717. <procedure_date>" . xmlEscape(preg_replace('/-/', '', substr($row['proc_date'], 0, 10))) . "</procedure_date>
  718. </procedure>";
  719. }
  720. $procedure .= '</procedures>';
  721. return $procedure;
  722. }
  723. public function getResults($pid, $encounter)
  724. {
  725. $wherCon = '';
  726. $sqlBindArray = [];
  727. if ($encounter) {
  728. $wherCon = " po.encounter_id = ? AND ";
  729. $sqlBindArray[] = $encounter;
  730. }
  731. $results = '';
  732. $query = "SELECT prs.result AS result_value, prs.units, prs.range, prs.result_text as order_title, prs.result_code, prs.procedure_result_id,
  733. prs.result_text as result_desc, prs.procedure_result_id AS test_code, poc.procedure_code, poc.procedure_name, poc.diagnoses, po.date_ordered, prs.date AS result_time, prs.abnormal AS abnormal_flag,po.order_status AS order_status
  734. FROM procedure_order AS po
  735. JOIN procedure_order_code as poc on poc.procedure_order_id = po.procedure_order_id
  736. JOIN procedure_report AS pr ON pr.procedure_order_id = po.procedure_order_id
  737. JOIN procedure_result AS prs ON prs.procedure_report_id = pr.procedure_report_id
  738. WHERE $wherCon po.patient_id = ? AND prs.result NOT IN ('DNR','TNP')";
  739. array_push($sqlBindArray, $pid);
  740. $appTable = new ApplicationTable();
  741. $res = $appTable->zQuery($query, $sqlBindArray);
  742. $results_list = array();
  743. foreach ($res as $row) {
  744. if (empty($row['result_code']) && empty($row['abnormal_flag'])) {
  745. continue;
  746. }
  747. $results_list[$row['test_code']]['test_code'] = $row['test_code'];
  748. $results_list[$row['test_code']]['order_title'] = $row['order_title'];
  749. $results_list[$row['test_code']]['order_status'] = $row['order_status'];
  750. $results_list[$row['test_code']]['date_ordered'] = substr(str_replace("-", '', $row['date_ordered']), 0, 8);
  751. $results_list[$row['test_code']]['date_ordered_table'] = $row['date_ordered'];
  752. $results_list[$row['test_code']]['procedure_code'] = $row['procedure_code'];
  753. $results_list[$row['test_code']]['procedure_name'] = $row['procedure_name'];
  754. $results_list[$row['test_code']]['subtest'][$row['procedure_result_id']]['result_code'] = ($row['result_code'] ? $row['result_code'] : 0);
  755. $results_list[$row['test_code']]['subtest'][$row['procedure_result_id']]['result_desc'] = $row['result_desc'];
  756. $results_list[$row['test_code']]['subtest'][$row['procedure_result_id']]['units'] = $row['units'];
  757. $results_list[$row['test_code']]['subtest'][$row['procedure_result_id']]['range'] = $row['range'];
  758. $results_list[$row['test_code']]['subtest'][$row['procedure_result_id']]['result_value'] = $row['result_value'];
  759. $results_list[$row['test_code']]['subtest'][$row['procedure_result_id']]['result_time'] = substr(preg_replace('/-/', '', $row['result_time']), 0, 8);
  760. $results_list[$row['test_code']]['subtest'][$row['procedure_result_id']]['abnormal_flag'] = $row['abnormal_flag'];
  761. }
  762. $results = '<results>';
  763. foreach ($results_list as $row) {
  764. $order_status = $order_status_table = '';
  765. if ($row['order_status'] == 'complete') {
  766. $order_status = 'completed';
  767. $order_status_table = 'completed';
  768. } elseif ($row['order_status'] == 'pending') {
  769. $order_status = 'active';
  770. $order_status_table = 'pending';
  771. } else {
  772. $order_status = 'completed';
  773. $order_status_table = '';
  774. }
  775. $results .= '<result>
  776. <extension>' . xmlEscape(base64_encode($_SESSION['site_id'] . $row['test_code'])) . '</extension>
  777. <root>' . xmlEscape("7d5a02b0-67a4-11db-bd13-0800200c9a66") . '</root>
  778. <date_ordered>' . xmlEscape($row['date_ordered']) . '</date_ordered>
  779. <date_ordered_table>' . xmlEscape($row['date_ordered_table']) . '</date_ordered_table>
  780. <title>' . xmlEscape($row['order_title']) . '</title>
  781. <test_code>' . xmlEscape($row['procedure_code']) . '</test_code>
  782. <test_name>' . xmlEscape($row['procedure_name']) . '</test_name>
  783. <order_status_table>' . xmlEscape($order_status_table) . '</order_status_table>
  784. <order_status>' . xmlEscape($order_status) . '</order_status>';
  785. foreach ($row['subtest'] as $row_1) {
  786. $units = $row_1['units'] ?: '';
  787. $highlow = preg_split("/[\s,-\--]+/", $row_1['range']);
  788. $results .= '
  789. <subtest>
  790. <extension>' . xmlEscape(base64_encode($_SESSION['site_id'] . $row['result_code'])) . '</extension>
  791. <root>' . xmlEscape("7d5a02b0-67a4-11db-bd13-0800200c9a66") . '</root>
  792. <range>' . xmlEscape($row_1['range']) . '</range>
  793. <low>' . xmlEscape(trim($highlow[0])) . '</low>
  794. <high>' . xmlEscape(trim($highlow[1])) . '</high>
  795. <unit>' . xmlEscape($units) . '</unit>
  796. <result_code>' . xmlEscape($row_1['result_code']) . '</result_code>
  797. <result_desc>' . xmlEscape($row_1['result_desc']) . '</result_desc>
  798. <result_value>' . xmlEscape(($row_1['result_value'] ? $row_1['result_value'] : 0)) . '</result_value>
  799. <result_time>' . xmlEscape($row_1['result_time']) . '</result_time>
  800. <abnormal_flag>' . xmlEscape($row_1['abnormal_flag']) . '</abnormal_flag>
  801. </subtest>';
  802. }
  803. $results .= '
  804. </result>';
  805. }
  806. $results .= '</results>';
  807. return $results;
  808. }
  809. /*
  810. #**************************************************#
  811. # ENCOUNTER HISTORY #
  812. #**************************************************#
  813. */
  814. public function getEncounterHistory($pid, $encounter)
  815. {
  816. $wherCon = '';
  817. $sqlBindArray = [];
  818. if ($encounter) {
  819. $wherCon = " fe.encounter = ? AND ";
  820. $sqlBindArray[] = $encounter;
  821. }
  822. $results = "";
  823. $query = "SELECT fe.date, fe.encounter,fe.reason,
  824. f.id as fid, f.name, f.phone, f.street as fstreet, f.city as fcity, f.state as fstate, f.postal_code as fzip, f.country_code, f.phone as fphone, f.facility_npi as fnpi,
  825. f.facility_code as foid, u.fname, u.mname, u.lname, u.npi, u.street, u.city, u.state, u.zip, u.phonew1, cat.pc_catname, lo.title AS physician_type, lo.codes AS physician_type_code,
  826. SUBSTRING(ll.diagnosis, LENGTH('SNOMED-CT:')+1, LENGTH(ll.diagnosis)) AS encounter_diagnosis, ll.diagnosis as raw_diagnosis, ll.title, ll.begdate, ll.enddate
  827. FROM form_encounter AS fe
  828. LEFT JOIN facility AS f ON f.id=fe.facility_id
  829. LEFT JOIN users AS u ON u.id=fe.provider_id
  830. LEFT JOIN openemr_postcalendar_categories AS cat ON cat.pc_catid=fe.pc_catid
  831. LEFT JOIN list_options AS lo ON lo.list_id = 'physician_type' AND lo.option_id = u.physician_type
  832. LEFT JOIN issue_encounter AS ie ON ie.encounter=fe.encounter AND ie.pid=fe.pid
  833. LEFT JOIN lists AS ll ON ll.id=ie.list_id AND ll.pid=fe.pid
  834. WHERE $wherCon fe.pid = ? ORDER BY fe.date";
  835. array_push($sqlBindArray, $pid);
  836. $appTable = new ApplicationTable();
  837. $res = $appTable->zQuery($query, $sqlBindArray);
  838. $results = "<encounter_list>";
  839. foreach ($res as $row) {
  840. $tmp = explode(":", $row['physician_type_code']);
  841. $physician_code_type = str_replace('-', ' ', $tmp[0]);
  842. $row['physician_type_code'] = $tmp[1];
  843. $encounter_reason = '';
  844. if ($row['reason'] !== '') {
  845. $encounter_reason = "<encounter_reason>" . xmlEscape($this->date_format(substr($row['date'], 0, 10)) . " - " . $row['reason']) . "</encounter_reason>";
  846. }
  847. $codes = "";
  848. $query_procedures = "SELECT c.code, c.code_text FROM billing AS b
  849. JOIN code_types AS ct ON ct.ct_key = ?
  850. JOIN codes AS c ON c.code = b.code AND c.code_type = ct.ct_id
  851. WHERE b.pid = ? AND b.code_type = ? AND activity = 1 AND b.encounter = ?";
  852. $appTable_procedures = new ApplicationTable();
  853. $res_procedures = $appTable_procedures->zQuery($query_procedures, array('CPT4', $pid, 'CPT4', $row['encounter']));
  854. foreach ($res_procedures as $row_procedures) {

Large files files are truncated, but you can click here to view the full file