CCM and QRDA Import (#4667)
[openemr.git] / src / Services / Cda / CdaTemplateParse.php
blobcab54091bb4fe3be4b64178e50c63dad42bd5789
1 <?php
3 /**
4 * QrdaParseService Class
6 * @package OpenEMR
7 * @link https://www.open-emr.org
8 * @author Jerry Padgett <sjpadgett@gmail.com>
9 * @copyright Copyright (c) 2021 Jerry Padgett <sjpadgett@gmail.com>
10 * @license https://github.com/openemr/openemr/blob/master/LICENSE GNU General Public License 3
13 namespace OpenEMR\Services\Cda;
15 use OpenEMR\Services\CodeTypesService;
17 class CdaTemplateParse
19 private $templateData;
20 private $codeService;
21 protected $is_qrda_import;
23 public function __construct()
25 $this->templateData = [];
26 $this->is_qrda_import = false;
27 $this->codeService = new CodeTypesService();
30 public function parseCDAEntryComponents($components): array
33 $components_oids = array(
34 '2.16.840.1.113883.10.20.22.4.7' => 'allergy',
35 '2.16.840.1.113883.10.20.22.2.6.1' => 'allergy',
36 '2.16.840.1.113883.10.20.22.2.1' => 'medication',
37 '2.16.840.1.113883.10.20.22.2.1.1' => 'medication',
38 '2.16.840.1.113883.10.20.22.2.5.1' => 'medical_problem',
39 '2.16.840.1.113883.10.20.22.2.5' => 'medical_problem',
40 '2.16.840.1.113883.10.20.22.2.2' => 'immunization',
41 '2.16.840.1.113883.10.20.22.2.2.1' => 'immunization',
42 '2.16.840.1.113883.3.88.11.83.145' => 'procedure',
43 '2.16.840.1.113883.10.20.22.2.7.1' => 'procedure',
44 '2.16.840.1.113883.10.20.22.2.3.1' => 'labResult',
45 '2.16.840.1.113883.10.20.22.2.3' => 'labResult',
46 '2.16.840.1.113883.10.20.22.2.4.1' => 'VitalSign',
47 '2.16.840.1.113883.10.20.22.2.17' => 'socialHistory',
48 '2.16.840.1.113883.3.88.11.83.127' => 'encounter',
49 '2.16.840.1.113883.10.20.22.2.22.1' => 'encounter',
50 '2.16.840.1.113883.10.20.22.2.10' => 'carePlan',
51 '2.16.840.1.113883.10.20.22.2.14' => 'functionalCognitiveStatus',
52 '1.3.6.1.4.1.19376.1.5.3.1.3.1' => 'referral',
53 '2.16.840.1.113883.10.20.22.2.11.1' => 'dischargeMedications',
54 '2.16.840.1.113883.10.20.22.2.41' => 'dischargeSummary'
57 foreach ($components as $component) {
58 if (!empty($component['section']['templateId']['root'])) {
59 if (!empty($components_oids[$component['section']['templateId']['root']])) {
60 $func_name = $components_oids[$component['section']['templateId']['root']];
61 $this->$func_name($component);
63 } elseif (empty($component['section']['templateId'])) {
64 // uncomment for debugging information.
65 error_log("section and template id empty for " . var_export($component, true));
66 } elseif (count($component['section']['templateId']) > 1) {
67 foreach ($component['section']['templateId'] as $key_1 => $value_1) {
68 if (!empty($components_oids[$component['section']['templateId'][$key_1]['root']])) {
69 $func_name = $components_oids[$component['section']['templateId'][$key_1]['root']];
70 $this->$func_name($component);
71 break;
76 return $this->templateData;
79 /**
80 * parsePatientDataSection
82 * @param $entryComponents //An array of QRDA entry templates
83 * @return array
85 public function parseQRDAPatientDataSection($entryComponents): array
87 $this->is_qrda_import = true;
88 $qrda_oids = array(
89 '2.16.840.1.113883.10.20.24.3.147' => 'fetchAllergyIntoleranceObservation',
90 '2.16.840.1.113883.10.20.24.3.41' => 'fetchMedicationData', // active medication @todo verify status all meds
91 '2.16.840.1.113883.10.20.24.3.42' => 'fetchMedicationData', // Medication Administered Act @todo honor end dates
92 '2.16.840.1.113883.10.20.24.3.139' => 'fetchMedicationData', // Medication Dispensed Act @todo set med type
93 '2.16.840.1.113883.10.20.24.3.105' => 'fetchMedicationData', // Medication Discharge Act
94 '2.16.840.1.113883.10.20.24.3.47' => 'fetchMedicationData', // QDM Datatype: Substance, Order @todo substance water, breast milk
95 '2.16.840.1.113883.10.20.24.3.137' => 'fetchMedicalProblemData',// diagnosis
96 '2.16.840.1.113883.10.20.24.3.140' => 'fetchImmunizationData', // Immunization Administered (V3)
97 '2.16.840.1.113883.10.20.24.3.143' => 'fetchImmunizationData', // Immunization Order (V3) @todo verify status
98 '2.16.840.1.113883.10.20.22.4.14' => 'fetchProcedureActivityData', // procedure activity-performed 2.16.840.1.113883.10.20.24.3.64
99 '2.16.840.1.113883.10.20.24.3.7' => 'fetchProcedureDeviceData', // procedure preformed Device Applied
100 '2.16.840.1.113883.10.20.24.3.32' => 'fetchProcedurePreformedActivity',// procedure activity-intervention
101 '2.16.840.1.113883.10.20.24.3.37' => 'fetchQrdaLabResultData', // lab test ordered
102 '2.16.840.1.113883.10.20.24.3.38' => 'fetchQrdaLabResultData', // lab test preformed
103 '2.16.840.1.113883.10.20.24.3.133' => 'fetchEncounterPerformed',
104 //'' => '',
106 foreach ($entryComponents['section']['entry'] as $entry) {
107 $key = array_keys($entry)[0]; // need the entry template type i.e. observation, activity, substance etc.
108 if (!empty($entry[$key]['templateId']['root'])) {
109 if (!empty($qrda_oids[$entry[$key]['templateId']['root']])) {
110 $func_name = $qrda_oids[$entry[$key]['templateId']['root']] ?? null;
111 if (!empty($func_name)) {
112 $this->$func_name($entry);
114 } else {
115 $text = $entry[$key]['templateId']['root'] . ' ' . ($entry[$key]['text'] ?: $entry[$key]['code']['displayName']);
116 error_log('Root Missing QDM: ' . $text);
118 } elseif (count($entry[$key]['templateId']) > 1) {
119 $key_1 = 1;
120 if (!empty($qrda_oids[$entry[$key]['templateId'][$key_1]['root']])) {
121 $func_name = $qrda_oids[$entry[$key]['templateId'][$key_1]['root']] ?? null;
122 if (!empty($func_name)) {
123 $this->$func_name($entry);
124 } else {
125 $text = $entry[$key]['templateId'][$key_1]['root'] . " Key: $key_1 " . ($entry[$key]['text'] ?: $entry[$key]['code']['displayName']);
126 error_log('Missing QDM: ' . $text);
128 } else {
129 $text = $entry[$key]['templateId'][$key_1]['root'] . ' ' . ($entry[$key]['text'] ?: $entry[$key]['code']['displayName']);
130 error_log('Missing QDM: ' . $text);
134 return $this->templateData;
138 * @param $entry
140 public function fetchEncounterPerformed($entry): void
142 $entry = $entry['act']['entryRelationship'];
143 if ($entry['encounter']['effectiveTime']['value'] != 0 || $entry['encounter']['effectiveTime']['low']['value'] != 0) {
144 $i = 1;
145 if (!empty($this->templateData['field_name_value_array']['encounter'])) {
146 $i += count($this->templateData['field_name_value_array']['encounter']);
149 $this->templateData['field_name_value_array']['encounter'][$i]['extension'] = $entry['encounter']['id']['extension'];
150 $this->templateData['field_name_value_array']['encounter'][$i]['root'] = $entry['encounter']['id']['root'];
151 $this->templateData['field_name_value_array']['encounter'][$i]['date'] = $entry['encounter']['effectiveTime']['value'] ?: $entry['encounter']['effectiveTime']['low']['value'];
153 $code_type = $entry['encounter']['code']['codeSystemName'] ?: $entry['encounter']['code']['codeSystem'] ?? '';
154 $code_text = $entry['encounter']['code']['displayName'] ?? '';
155 $code = $this->codeService->resolveCode($entry['encounter']['code']['code'], $code_type, $code_text);
156 $this->templateData['field_name_value_array']['encounter'][$i]['code'] = $code['formatted_code'];
157 $this->templateData['field_name_value_array']['encounter'][$i]['code_text'] = $code['code_text'];
159 $this->templateData['field_name_value_array']['encounter'][$i]['provider_npi'] = $entry['encounter']['performer']['assignedEntity']['id']['extension'];
160 $this->templateData['field_name_value_array']['encounter'][$i]['provider_name'] = $entry['encounter']['performer']['assignedEntity']['assignedPerson']['name']['given']; // first
161 $this->templateData['field_name_value_array']['encounter'][$i]['provider_family'] = $entry['encounter']['performer']['assignedEntity']['assignedPerson']['name']['family']; // last
162 $this->templateData['field_name_value_array']['encounter'][$i]['provider_address'] = $entry['encounter']['performer']['assignedEntity']['addr']['streetAddressLine'];
163 $this->templateData['field_name_value_array']['encounter'][$i]['provider_city'] = $entry['encounter']['performer']['assignedEntity']['addr']['city'];
164 $this->templateData['field_name_value_array']['encounter'][$i]['provider_state'] = $entry['encounter']['performer']['assignedEntity']['addr']['state'];
165 $this->templateData['field_name_value_array']['encounter'][$i]['provider_postalCode'] = $entry['encounter']['performer']['assignedEntity']['addr']['postalCode'];
166 $this->templateData['field_name_value_array']['encounter'][$i]['provider_country'] = $entry['encounter']['performer']['assignedEntity']['addr']['country'];
167 $this->templateData['field_name_value_array']['encounter'][$i]['represented_organization_name'] = $entry['encounter']['participant']['participantRole']['playingEntity']['name'];
168 $this->templateData['field_name_value_array']['encounter'][$i]['represented_organization_address'] = $entry['encounter']['participant']['participantRole']['addr']['streetAddressLine'];
169 $this->templateData['field_name_value_array']['encounter'][$i]['represented_organization_city'] = $entry['encounter']['participant']['participantRole']['addr']['city'];
170 $this->templateData['field_name_value_array']['encounter'][$i]['represented_organization_state'] = $entry['encounter']['participant']['participantRole']['addr']['state'];
171 $this->templateData['field_name_value_array']['encounter'][$i]['represented_organization_zip'] = $entry['encounter']['participant']['participantRole']['addr']['postalCode'];
172 $this->templateData['field_name_value_array']['encounter'][$i]['represented_organization_country'] = $entry['encounter']['participant']['participantRole']['addr']['country'];
173 $this->templateData['field_name_value_array']['encounter'][$i]['represented_organization_telecom'] = $entry['encounter']['participant']['participantRole']['telecom'];
175 // encounter diagnosis to issues list
176 $code = $this->codeService->resolveCode(
177 $entry['encounter']['entryRelationship'][1]['act']['entryRelationship']['observation']['value']['code'],
178 $entry['encounter']['entryRelationship'][1]['act']['entryRelationship']['observation']['value']['codeSystemName'] ?: $entry['encounter']['entryRelationship'][1]['act']['entryRelationship']['observation']['value']['codeSystem'] ?? '',
179 $entry['encounter']['entryRelationship'][1]['act']['entryRelationship']['observation']['value']['displayName']
181 $this->templateData['field_name_value_array']['encounter'][$i]['encounter_diagnosis_code'] = $code['formatted_code'];
182 $this->templateData['field_name_value_array']['encounter'][$i]['encounter_diagnosis_issue'] = $code['code_text'];
184 $this->templateData['field_name_value_array']['encounter'][$i]['encounter_diagnosis_date'] = $entry['encounter']['entryRelationship'][1]['act']['entryRelationship']['observation']['effectiveTime']['low']['value'];
185 $this->templateData['entry_identification_array']['encounter'][$i] = $i;
190 * @param $entry
192 public function fetchMedicalProblemData($entry): void
194 if (!empty($entry['act']['entryRelationship']['observation']['value']['code'])) {
195 $i = 1;
196 if (!empty($this->templateData['field_name_value_array']['lists1'])) {
197 $i += count($this->templateData['field_name_value_array']['lists1']);
200 $code = $this->codeService->resolveCode(
201 $entry['act']['entryRelationship']['observation']['value']['code'],
202 $entry['act']['entryRelationship']['observation']['value']['codeSystemName'] ?: $entry['act']['entryRelationship']['observation']['value']['codeSystem'] ?? '',
203 $entry['act']['entryRelationship']['observation']['value']['displayName']
205 $this->templateData['field_name_value_array']['lists1'][$i]['list_code'] = $code['formatted_code'];
206 $this->templateData['field_name_value_array']['lists1'][$i]['list_code_text'] = $code['code_text'];
208 $this->templateData['field_name_value_array']['lists1'][$i]['type'] = 'medical_problem';
209 $this->templateData['field_name_value_array']['lists1'][$i]['extension'] = $entry['act']['id']['extension'] ?? null;
210 $this->templateData['field_name_value_array']['lists1'][$i]['root'] = $entry['act']['id']['root'] ?? null;
211 $this->templateData['field_name_value_array']['lists1'][$i]['begdate'] = $entry['act']['effectiveTime']['low']['value'] ?? null;
212 $this->templateData['field_name_value_array']['lists1'][$i]['enddate'] = $entry['act']['effectiveTime']['high']['value'] ?? null;
213 $this->templateData['field_name_value_array']['lists1'][$i]['observation'] = $entry['act']['entryRelationship']['observation']['entryRelationship'][1]['observation']['value']['code'] ?? null;
214 $this->templateData['field_name_value_array']['lists1'][$i]['observation_text'] = $entry['act']['entryRelationship']['observation']['entryRelationship'][1]['observation']['value']['displayName'] ?? null;
215 $this->templateData['field_name_value_array']['lists1'][$i]['status'] = $entry['act']['entryRelationship']['observation']['entryRelationship'][2]['observation']['value']['displayName'] ?: $entry['act']['entryRelationship']['observation']['statusCode'];
216 $this->templateData['field_name_value_array']['lists1'][$i]['modified_time'] = $entry['act']['entryRelationship']['observation']['performer']['assignedEntity']['time']['value'] ?? null;
217 $this->templateData['entry_identification_array']['lists1'][$i] = $i;
222 * @param $entry
224 public function fetchAllergyIntoleranceObservation($entry)
226 if (!empty($entry['observation']['participant']['participantRole']['playingEntity']['code']['code'])) {
227 $i = 1;
228 // if there are already items here we want to add to them.
229 if (!empty($this->templateData['field_name_value_array']['lists2'])) {
230 $i += count($this->templateData['field_name_value_array']['lists2']);
233 $this->templateData['field_name_value_array']['lists2'][$i]['type'] = 'allergy';
234 $this->templateData['field_name_value_array']['lists2'][$i]['extension'] = $entry['id']['extension'] ?? null;
235 $this->templateData['field_name_value_array']['lists2'][$i]['begdate'] = $entry['effectiveTime']['low']['value'] ?? null;
236 $this->templateData['field_name_value_array']['lists2'][$i]['enddate'] = $entry['effectiveTime']['high']['value'] ?? null;
238 $code = $this->codeService->resolveCode(
239 $entry['observation']['participant']['participantRole']['playingEntity']['code']['code'] ?? null,
240 $entry['observation']['participant']['participantRole']['playingEntity']['code']['codeSystemName'] ?? null,
241 $entry['observation']['participant']['participantRole']['playingEntity']['code']['displayName'] ?: $entry['observation']['participant']['participantRole']['playingEntity']['name'] ?? null
243 $this->templateData['field_name_value_array']['lists2'][$i]['list_code'] = $code['formatted_code'];
244 $this->templateData['field_name_value_array']['lists2'][$i]['list_code_text'] = $code['code_text'];
245 $this->templateData['field_name_value_array']['lists2'][$i]['codeSystemName'] = $code['formatted_code_type'];
247 $this->templateData['field_name_value_array']['lists2'][$i]['outcome'] = $entry['observation']['entryRelationship'][1]['observation']['value']['code'] ?? null;
248 $this->templateData['field_name_value_array']['lists2'][$i]['severity_al_code'] = $entry['observation']['entryRelationship'][2]['observation']['value']['code'] ?? null;
249 $this->templateData['field_name_value_array']['lists2'][$i]['severity_al'] = $entry['observation']['entryRelationship'][2]['observation']['value']['code'] ?? null;
250 $this->templateData['field_name_value_array']['lists2'][$i]['status'] = $entry['observation']['entryRelationship'][0]['observation']['value']['displayName'] ?? null;
251 $this->templateData['field_name_value_array']['lists2'][$i]['reaction'] = $entry['observation']['entryRelationship'][1]['observation']['value']['code'] ?? null;
252 $this->templateData['field_name_value_array']['lists2'][$i]['reaction_text'] = $entry['observation']['entryRelationship'][1]['observation']['value']['displayName'] ?? null;
253 $this->templateData['field_name_value_array']['lists2'][$i]['modified_time'] = $entry['observation']['performer']['assignedEntity']['time']['value'] ?? null;
254 $this->templateData['entry_identification_array']['lists2'][$i] = $i;
259 * @param $entry
261 public function fetchMedicationData($entry): void
263 if (!empty($entry['substanceAdministration']['consumable']['manufacturedProduct']['manufacturedMaterial']['code']['code'])) {
264 $i = 1;
265 if (!empty($this->templateData['field_name_value_array']['lists3'])) {
266 $i += count($this->templateData['field_name_value_array']['lists3']);
269 $substanceAdministration_oids = array(
270 '2.16.840.1.113883.10.20.24.3.41' => 'active',
271 '2.16.840.1.113883.10.20.24.3.42' => 'administered',
272 '2.16.840.1.113883.10.20.24.3.139' => 'dispensed',
273 '2.16.840.1.113883.10.20.24.3.105' => 'discharge',
275 $request_type = '';
276 if ($this->is_qrda_import) {
277 if (!empty($entry['substanceAdministration']['templateId']['root'])) {
278 $request_type = $substanceAdministration_oids[$entry['substanceAdministration']['templateId']['root']];
279 } elseif (!empty($entry['substanceAdministration']['templateId'][1]['root'])) {
280 $request_type = $substanceAdministration_oids[$entry['substanceAdministration']['templateId'][1]['root']];
284 $code = $this->codeService->resolveCode(
285 $entry['substanceAdministration']['consumable']['manufacturedProduct']['manufacturedMaterial']['code']['code'],
286 'RXNORM',
287 $entry['substanceAdministration']['consumable']['manufacturedProduct']['manufacturedMaterial']['code']['displayName']
290 $this->templateData['field_name_value_array']['lists3'][$i]['type'] = 'medication';
291 $this->templateData['field_name_value_array']['lists3'][$i]['request_type'] = $request_type;
292 $this->templateData['field_name_value_array']['lists3'][$i]['extension'] = $entry['substanceAdministration']['id']['extension'] ?? null;
293 $this->templateData['field_name_value_array']['lists3'][$i]['root'] = $entry['substanceAdministration']['id']['root'] ?? null;
294 if (empty($entry['substanceAdministration']['effectiveTime'][0]['low']['value'])) {
295 $this->templateData['field_name_value_array']['lists3'][$i]['begdate'] = date('Y-m-d');
296 } else {
297 $this->templateData['field_name_value_array']['lists3'][$i]['begdate'] = $entry['substanceAdministration']['effectiveTime'][0]['low']['value'];
300 if (!empty($entry['substanceAdministration']['effectiveTime'][0]['high']['value'])) {
301 $this->templateData['field_name_value_array']['lists3'][$i]['enddate'] = $entry['substanceAdministration']['effectiveTime'][0]['high']['value'];
304 $this->templateData['field_name_value_array']['lists3'][$i]['route'] = $entry['substanceAdministration']['routeCode']['code'] ?? null;
305 $this->templateData['field_name_value_array']['lists3'][$i]['route_display'] = $entry['substanceAdministration']['routeCode']['displayName'] ?? null;
306 $this->templateData['field_name_value_array']['lists3'][$i]['dose'] = $entry['substanceAdministration']['doseQuantity']['value'] ?? null;
307 $this->templateData['field_name_value_array']['lists3'][$i]['dose_unit'] = $entry['substanceAdministration']['doseQuantity']['unit'] ?? null;
308 $this->templateData['field_name_value_array']['lists3'][$i]['rate'] = $entry['substanceAdministration']['rateQuantity']['value'] ?? null;
309 $this->templateData['field_name_value_array']['lists3'][$i]['rate_unit'] = $entry['substanceAdministration']['rateQuantity']['unit'] ?? null;
310 $this->templateData['field_name_value_array']['lists3'][$i]['drug_code'] = $code['code'];
311 $this->templateData['field_name_value_array']['lists3'][$i]['drug_text'] = $code['code_text'];
312 $this->templateData['field_name_value_array']['lists3'][$i]['note'] = $entry['substanceAdministration']['text']['reference']['value'] ?? null;
313 $this->templateData['field_name_value_array']['lists3'][$i]['indication'] = $entry['substanceAdministration']['entryRelationship'][0]['observation']['value']['displayName'] ?? ($entry['substanceAdministration']['entryRelationship']['observation']['value']['displayName'] ?? null);
314 $this->templateData['field_name_value_array']['lists3'][$i]['prn'] = $entry['substanceAdministration']['precondition']['criterion']['value']['displayName'] ?? null;
315 $this->templateData['field_name_value_array']['lists3'][$i]['modified_time'] = $entry['substanceAdministration']['entryRelationship'][1]['supply']['author']['time']['value'] ?? null;
317 $this->templateData['field_name_value_array']['lists3'][$i]['provider_title'] = $entry['substanceAdministration']['performer']['assignedEntity']['assignedPerson']['name']['prefix'] ?? ($entry['substanceAdministration']['entryRelationship'][1]['supply']['author']['assignedAuthor']['assignedPerson']['name']['prefix'] ?? null);
318 $this->templateData['field_name_value_array']['lists3'][$i]['provider_fname'] = $entry['substanceAdministration']['performer']['assignedEntity']['assignedPerson']['name']['given'] ?? ($entry['substanceAdministration']['entryRelationship'][1]['supply']['author']['assignedAuthor']['assignedPerson']['name']['given'] ?? null);
319 $this->templateData['field_name_value_array']['lists3'][$i]['provider_lname'] = $entry['substanceAdministration']['performer']['assignedEntity']['assignedPerson']['name']['family'] ?? ($entry['substanceAdministration']['entryRelationship'][1]['supply']['author']['assignedAuthor']['assignedPerson']['name']['family'] ?? null);
320 $this->templateData['field_name_value_array']['lists3'][$i]['provider_root'] = $entry['substanceAdministration']['entryRelationship'][1]['supply']['author']['assignedAuthor']['id']['root'] ?? null;
321 $this->templateData['field_name_value_array']['lists3'][$i]['provider_address'] = $entry['substanceAdministration']['performer']['assignedEntity']['addr']['streetAddressLine'] ?? ($entry['substanceAdministration']['entryRelationship'][1]['supply']['performer']['assignedEntity']['addr']['streetAddressLine'] ?? null);
322 $this->templateData['field_name_value_array']['lists3'][$i]['provider_city'] = $entry['substanceAdministration']['performer']['assignedEntity']['addr']['city'] ?? ($entry['substanceAdministration']['entryRelationship'][1]['supply']['performer']['assignedEntity']['addr']['city'] ?? null);
323 $this->templateData['field_name_value_array']['lists3'][$i]['provider_state'] = $entry['substanceAdministration']['performer']['assignedEntity']['addr']['state'] ?? ($entry['substanceAdministration']['entryRelationship'][1]['supply']['performer']['assignedEntity']['addr']['state'] ?? null);
324 $this->templateData['field_name_value_array']['lists3'][$i]['provider_postalCode'] = $entry['substanceAdministration']['performer']['assignedEntity']['addr']['postalCode'] ?? ($entry['substanceAdministration']['entryRelationship'][1]['supply']['performer']['assignedEntity']['addr']['postalCode'] ?? null);
325 $this->templateData['field_name_value_array']['lists3'][$i]['provider_country'] = $entry['substanceAdministration']['performer']['assignedEntity']['addr']['country']['value'] ?? ($entry['substanceAdministration']['entryRelationship'][1]['supply']['performer']['assignedEntity']['addr']['country'] ?? null);
326 $this->templateData['entry_identification_array']['lists3'][$i] = $i;
331 * @param $entry
333 public function fetchImmunizationData($entry): void
335 if (!empty($entry['substanceAdministration']['consumable']['manufacturedProduct']['manufacturedMaterial']['code']['code'])) {
336 $i = 1;
337 if (!empty($this->templateData['field_name_value_array']['immunization'])) {
338 $i += count($this->templateData['field_name_value_array']['immunization']);
340 $this->templateData['field_name_value_array']['immunization'][$i]['extension'] = $entry['substanceAdministration']['id']['extension'] ?? null;
341 $this->templateData['field_name_value_array']['immunization'][$i]['root'] = $entry['substanceAdministration']['id']['root'] ?? null;
342 $this->templateData['field_name_value_array']['immunization'][$i]['administered_date'] = $entry['substanceAdministration']['effectiveTime']['value'] ?? null;
343 $this->templateData['field_name_value_array']['immunization'][$i]['route_code'] = $entry['substanceAdministration']['routeCode']['code'] ?? null;
344 $this->templateData['field_name_value_array']['immunization'][$i]['route_code_text'] = $entry['substanceAdministration']['routeCode']['displayName'] ?? null;
346 $code = $this->codeService->resolveCode(
347 $entry['substanceAdministration']['consumable']['manufacturedProduct']['manufacturedMaterial']['code']['code'] ?? null,
348 $entry['substanceAdministration']['consumable']['manufacturedProduct']['manufacturedMaterial']['code']['codeSystemName'],
349 $entry['substanceAdministration']['consumable']['manufacturedProduct']['manufacturedMaterial']['code']['displayName']
351 $this->templateData['field_name_value_array']['immunization'][$i]['cvx_code'] = $code['code'];
352 $this->templateData['field_name_value_array']['immunization'][$i]['cvx_code_text'] = $code['code_text'];
353 $this->templateData['field_name_value_array']['immunization'][$i]['amount_administered'] = $entry['substanceAdministration']['doseQuantity']['value'] ?? null;
354 $this->templateData['field_name_value_array']['immunization'][$i]['amount_administered_unit'] = $entry['substanceAdministration']['doseQuantity']['unit'] ?? null;
355 $this->templateData['field_name_value_array']['immunization'][$i]['completion_status'] = $entry['substanceAdministration']['statusCode']['code'] ?? null;
356 $this->templateData['field_name_value_array']['immunization'][$i]['manufacturer'] = $entry['substanceAdministration']['consumable']['manufacturedProduct']['manufacturerOrganization']['name'] ?? null;
357 $this->templateData['field_name_value_array']['immunization'][$i]['provider_npi'] = $entry['substanceAdministration']['performer']['assignedEntity']['id']['extension'] ?? null;
358 $this->templateData['field_name_value_array']['immunization'][$i]['provider_name'] = $entry['substanceAdministration']['performer']['assignedEntity']['assignedPerson']['name']['given'] ?? null;
359 $this->templateData['field_name_value_array']['immunization'][$i]['provider_address'] = $entry['substanceAdministration']['performer']['assignedEntity']['addr']['streetAddressLine'] ?? null;
360 $this->templateData['field_name_value_array']['immunization'][$i]['provider_city'] = $entry['substanceAdministration']['performer']['assignedEntity']['addr']['city'] ?? null;
361 $this->templateData['field_name_value_array']['immunization'][$i]['provider_state'] = $entry['substanceAdministration']['performer']['assignedEntity']['addr']['state'] ?? null;
362 $this->templateData['field_name_value_array']['immunization'][$i]['provider_postalCode'] = $entry['substanceAdministration']['performer']['assignedEntity']['addr']['postalCode'] ?? null;
363 $this->templateData['field_name_value_array']['immunization'][$i]['provider_country'] = $entry['substanceAdministration']['performer']['assignedEntity']['addr']['country'] ?? null;
364 $this->templateData['field_name_value_array']['immunization'][$i]['provider_telecom'] = $entry['substanceAdministration']['performer']['assignedEntity']['telecom']['value'] ?? null;
365 $this->templateData['field_name_value_array']['immunization'][$i]['represented_organization'] = $entry['substanceAdministration']['performer']['assignedEntity']['representedOrganization']['name'] ?? null;
366 $this->templateData['field_name_value_array']['immunization'][$i]['represented_organization_tele'] = $entry['substanceAdministration']['performer']['assignedEntity']['representedOrganization']['telecom'] ?? null;
367 $this->templateData['entry_identification_array']['immunization'][$i] = $i;
372 * @param $entry
374 public function fetchProcedureActivityData($entry): void
376 if (!empty($entry['procedure']['code']['code'])) {
377 $i = 1;
378 if (!empty($this->templateData['field_name_value_array']['procedure'])) {
379 $i += count($this->templateData['field_name_value_array']['procedure']);
382 $code = $this->codeService->resolveCode(
383 $entry['procedure']['code']['code'] ?? '',
384 $entry['procedure']['code']['codeSystemName'] ?: $entry['procedure']['code']['codeSystem'] ?? null,
385 $entry['procedure']['code']['displayName'] ?? ''
388 $this->templateData['field_name_value_array']['procedure'][$i]['extension'] = $entry['procedure']['id']['extension'] ?? null;
389 $this->templateData['field_name_value_array']['procedure'][$i]['root'] = $entry['procedure']['id']['root'] ?? null;
391 $this->templateData['field_name_value_array']['procedure'][$i]['code'] = $code['code'];
392 $this->templateData['field_name_value_array']['procedure'][$i]['code_text'] = $code['code_text'];
393 $this->templateData['field_name_value_array']['procedure'][$i]['codeSystemName'] = $code['formatted_code_type'];
395 $this->templateData['field_name_value_array']['procedure'][$i]['procedure_type'] = $procedure_type;
396 $this->templateData['field_name_value_array']['procedure'][$i]['status'] = $entry['procedure']['statusCode']['code'] ?? '';
398 if (!empty($entry['procedure']['effectiveTime']['low']['value'])) {
399 $this->templateData['field_name_value_array']['procedure'][$i]['date'] = $entry['procedure']['effectiveTime']['low']['value'] ?? null;
400 } else {
401 $this->templateData['field_name_value_array']['procedure'][$i]['date'] = $entry['procedure']['effectiveTime']['value'] ?? null;
404 $this->templateData['field_name_value_array']['procedure'][$i]['represented_organization1'] = $entry['procedure']['performer']['assignedEntity']['representedOrganization']['name'] ?? null;
405 $this->templateData['field_name_value_array']['procedure'][$i]['represented_organization_address1'] = $entry['procedure']['performer']['assignedEntity']['addr']['streetAddressLine'] ?? null;
406 $this->templateData['field_name_value_array']['procedure'][$i]['represented_organization_city1'] = $entry['procedure']['performer']['assignedEntity']['addr']['city'] ?? null;
407 $this->templateData['field_name_value_array']['procedure'][$i]['represented_organization_state1'] = $entry['procedure']['performer']['assignedEntity']['addr']['state'] ?? null;
408 $this->templateData['field_name_value_array']['procedure'][$i]['represented_organization_postalcode1'] = $entry['procedure']['performer']['assignedEntity']['addr']['postalCode'] ?? null;
409 $this->templateData['field_name_value_array']['procedure'][$i]['represented_organization_country1'] = $entry['procedure']['performer']['assignedEntity']['addr']['country'] ?? null;
410 $this->templateData['field_name_value_array']['procedure'][$i]['represented_organization_telecom1'] = $entry['procedure']['performer']['assignedEntity']['telecom']['value'] ?? null;
412 $this->templateData['field_name_value_array']['procedure'][$i]['represented_organization2'] = $entry['procedure']['participant']['participantRole']['playingEntity']['name'] ?? null;
413 $this->templateData['field_name_value_array']['procedure'][$i]['represented_organization_address2'] = $entry['procedure']['participant']['participantRole']['addr']['streetAddressLine'] ?? null;
414 $this->templateData['field_name_value_array']['procedure'][$i]['represented_organization_city2'] = $entry['procedure']['participant']['participantRole']['addr']['city'] ?? null;
415 $this->templateData['field_name_value_array']['procedure'][$i]['represented_organization_state2'] = $entry['procedure']['participant']['participantRole']['addr']['state'] ?? null;
416 $this->templateData['field_name_value_array']['procedure'][$i]['represented_organization_postalcode2'] = $entry['procedure']['participant']['participantRole']['addr']['postalCode'] ?? null;
417 $this->templateData['field_name_value_array']['procedure'][$i]['represented_organization_country2'] = $entry['procedure']['participant']['participantRole']['addr']['country'] ?? null;
418 $this->templateData['entry_identification_array']['procedure'][$i] = $i;
423 * @param $entry
425 public function fetchProcedureDeviceData($entry): void
427 if (!empty($entry['procedure']['code']['code'])) {
428 $i = 1;
429 if (!empty($this->templateData['field_name_value_array']['procedure'])) {
430 $i += count($this->templateData['field_name_value_array']['procedure']);
433 // future may need device status code
434 /*$code_proc_type = $this->codeService->resolveCode(
435 $entry['procedure']['code']['code'] ?? '',
436 $entry['procedure']['code']['codeSystemName'] ?: $entry['procedure']['code']['codeSystem'] ?? null,
437 $entry['procedure']['code']['displayName'] ?? ''
438 );*/
440 $code = $this->codeService->resolveCode(
441 $entry['procedure']['participant']['participantRole']['playingDevice']['code']['code'] ?? '',
442 $entry['procedure']['participant']['participantRole']['playingDevice']['code']['codeSystem'] ?? null,
443 $entry['procedure']['participant']['participantRole']['playingDevice']['code']['displayName'] ?? ''
446 $this->templateData['field_name_value_array']['procedure'][$i]['procedure_type'] = 'device';
448 $this->templateData['field_name_value_array']['procedure'][$i]['status'] = $entry['procedure']['statusCode']['code'] ?? '';
450 $this->templateData['field_name_value_array']['procedure'][$i]['extension'] = $entry['procedure']['id']['extension'] ?? null;
451 $this->templateData['field_name_value_array']['procedure'][$i]['root'] = $entry['procedure']['id']['root'] ?? null;
453 $this->templateData['field_name_value_array']['procedure'][$i]['code'] = $code['code'];
454 $this->templateData['field_name_value_array']['procedure'][$i]['code_text'] = $code['code_text'];
455 $this->templateData['field_name_value_array']['procedure'][$i]['codeSystemName'] = $code['formatted_code_type'];
457 if (!empty($entry['procedure']['effectiveTime']['low']['value'])) {
458 $this->templateData['field_name_value_array']['procedure'][$i]['date'] = $entry['procedure']['effectiveTime']['low']['value'] ?? null;
459 } else {
460 $this->templateData['field_name_value_array']['procedure'][$i]['date'] = $entry['procedure']['effectiveTime']['value'] ?? null;
463 $this->templateData['entry_identification_array']['procedure'][$i] = $i;
468 * @param $entry
470 public function fetchProcedurePreformedActivity($entry): void
472 if (!empty($entry['act']['code']['code'])) {
473 $i = 1;
474 if (!empty($this->templateData['field_name_value_array']['procedure'])) {
475 $i += count($this->templateData['field_name_value_array']['procedure']);
478 $procedure_type = 'intervention';
479 if (!empty($entry['act']['templateId'][1]['root']) && $entry['act']['templateId'][1]['root'] == '2.16.840.1.113883.10.20.24.3.32') {
480 $procedure_type = 'intervention';
483 $code = $this->codeService->resolveCode(
484 $entry['act']['code']['code'] ?? '',
485 $entry['act']['code']['codeSystemName'] ?: $entry['act']['code']['codeSystem'] ?? null,
486 $entry['act']['code']['displayName'] ?? $entry['act']['text']
489 $this->templateData['field_name_value_array']['procedure'][$i]['procedure_type'] = $procedure_type;
491 $this->templateData['field_name_value_array']['procedure'][$i]['status'] = $entry['act']['statusCode']['code'] ?? '';
493 $this->templateData['field_name_value_array']['procedure'][$i]['extension'] = $entry['act']['id']['extension'] ?? null;
494 $this->templateData['field_name_value_array']['procedure'][$i]['root'] = $entry['act']['id']['root'] ?? null;
496 $this->templateData['field_name_value_array']['procedure'][$i]['code'] = $code['code'];
497 $this->templateData['field_name_value_array']['procedure'][$i]['code_text'] = $code['code_text'];
498 $this->templateData['field_name_value_array']['procedure'][$i]['codeSystemName'] = $code['formatted_code_type'];
500 if (!empty($entry['act']['effectiveTime']['low']['value'])) {
501 $this->templateData['field_name_value_array']['procedure'][$i]['date'] = $entry['act']['effectiveTime']['low']['value'] ?? null;
502 } else {
503 $this->templateData['field_name_value_array']['procedure'][$i]['date'] = $entry['act']['effectiveTime']['value'] ?? null;
506 $this->templateData['entry_identification_array']['procedure'][$i] = $i;
510 public function allergy($component)
512 if (!empty($component['section']['entry'][0])) {
513 foreach ($component['section']['entry'] as $key => $value) {
514 $this->fetchAllergyIntoleranceObservation($value);
516 } else {
517 $this->fetchAllergyIntoleranceObservation($component['section']['entry'] ?? null);
521 public function medication($component)
523 $component['section']['text'] = '';
524 if (!empty($component['section']['entry'][0])) {
525 foreach ($component['section']['entry'] as $key => $value) {
526 $this->fetchMedicationData($value);
528 } else {
529 $this->fetchMedicationData($component['section']['entry'] ?? null);
533 public function medical_problem($component)
535 $component['section']['text'] = '';
536 if (!empty($component['section']['entry'][0])) {
537 foreach ($component['section']['entry'] as $key => $value) {
538 $this->fetchMedicalProblemData($value);
540 } else {
541 $this->fetchMedicalProblemData($component['section']['entry'] ?? null);
545 public function immunization($component)
547 $component['section']['text'] = '';
548 if (!empty($component['section']['entry'][0])) {
549 foreach ($component['section']['entry'] as $key => $value) {
550 $this->fetchImmunizationData($value);
552 } else {
553 $this->fetchImmunizationData($component['section']['entry']);
557 public function procedure($component)
559 $component['section']['text'] = '';
560 if (!empty($component['section']['entry'][0])) {
561 foreach ($component['section']['entry'] as $key => $value) {
562 if ($key % 3 != 0) {
563 continue; //every third entry section has the procedure details
566 $this->fetchProcedureActivityData($value);
568 } else {
569 $this->fetchProcedureActivityData($component['section']['entry'] ?? null);
573 public function labResult($component)
575 $component['section']['text'] = '';
576 if (!empty($component['section']['entry'][0])) {
577 foreach ($component['section']['entry'] as $key => $value) {
578 $this->fetchLabResultData($value);
580 } else {
581 $this->fetchLabResultData($component['section']['entry'] ?? null);
585 public function fetchLabResultData($lab_result_data)
587 $i = 1;
588 if (!empty($this->templateData['field_name_value_array']['procedure_result'])) {
589 $i += count($this->templateData['field_name_value_array']['procedure_result']);
591 if (!empty($lab_result_data['organizer']['component'])) {
592 foreach ($lab_result_data['organizer']['component'] as $key => $value) {
593 if (!empty($value['observation']['code']['code'])) {
594 $this->templateData['field_name_value_array']['procedure_result'][$i]['extension'] = $lab_result_data['organizer']['id']['extension'] ?? null;
595 $this->templateData['field_name_value_array']['procedure_result'][$i]['root'] = $lab_result_data['organizer']['id']['root'] ?? null;
596 $this->templateData['field_name_value_array']['procedure_result'][$i]['proc_code'] = $lab_result_data['organizer']['code']['code'] ?? null;
597 $this->templateData['field_name_value_array']['procedure_result'][$i]['proc_text'] = $lab_result_data['organizer']['code']['displayName'] ?? null;
598 $this->templateData['field_name_value_array']['procedure_result'][$i]['date'] = $lab_result_data['organizer']['effectiveTime']['value'] ?? null;
599 $this->templateData['field_name_value_array']['procedure_result'][$i]['status'] = $lab_result_data['organizer']['statusCode']['code'] ?? null;
601 $this->templateData['field_name_value_array']['procedure_result'][$i]['results_extension'] = $value['observation']['id']['extension'] ?? null;
602 $this->templateData['field_name_value_array']['procedure_result'][$i]['results_root'] = $value['observation']['id']['root'] ?? null;
603 $this->templateData['field_name_value_array']['procedure_result'][$i]['results_code'] = $value['observation']['code']['code'] ?? null;
604 $this->templateData['field_name_value_array']['procedure_result'][$i]['results_text'] = $value['observation']['code']['displayName'] ?? null;
605 $this->templateData['field_name_value_array']['procedure_result'][$i]['results_date'] = $value['observation']['effectiveTime']['value'] ?? null;
606 $this->templateData['field_name_value_array']['procedure_result'][$i]['results_value'] = $value['observation']['value']['value'] ?? null;
607 $this->templateData['field_name_value_array']['procedure_result'][$i]['results_unit'] = $value['observation']['value']['unit'] ?? null;
608 if (!empty($value['observation']['referenceRange']['observationRange']['text'])) {
609 $this->templateData['field_name_value_array']['procedure_result'][$i]['results_range'] = $value['observation']['referenceRange']['observationRange']['text'];
610 } else {
611 $this->templateData['field_name_value_array']['procedure_result'][$i]['results_range'] = ($value['observation']['referenceRange']['observationRange']['value']['low']['value'] ?? '') . '-' . ($value['observation']['referenceRange']['observationRange']['value']['high']['value'] ?? '') . ' ' . ($value['observation']['referenceRange']['observationRange']['value']['low']['unit'] ?? '');
614 $this->templateData['entry_identification_array']['procedure_result'][$i] = $i;
615 $i++;
621 public function fetchQrdaLabResultData($lab_result_data)
623 $i = 1;
624 if (!empty($this->templateData['field_name_value_array']['procedure_result'])) {
625 $i += count($this->templateData['field_name_value_array']['procedure_result']);
627 if (!empty($lab_result_data['observation']['code']['code'])) {
628 $code = $this->codeService->resolveCode(
629 $lab_result_data['observation']['code']['code'] ?? '',
630 $lab_result_data['observation']['code']['codeSystemName'] ?: $lab_result_data['observation']['code']['codeSystem'] ?? '',
631 $lab_result_data['observation']['code']['displayName'] ?? ''
634 $this->templateData['field_name_value_array']['procedure_result'][$i]['extension'] = $lab_result_data['observation']['id']['extension'] ?? null;
635 $this->templateData['field_name_value_array']['procedure_result'][$i]['root'] = $lab_result_data['observation']['id']['root'] ?? null;
636 $this->templateData['field_name_value_array']['procedure_result'][$i]['proc_code'] = $code['formatted_code'];
637 $this->templateData['field_name_value_array']['procedure_result'][$i]['proc_text'] = $code['code_text'];
639 if (!empty($lab_result_data['observation']['effectiveTime']['low']['value'])) {
640 $this->templateData['field_name_value_array']['procedure_result'][$i]['date'] = $lab_result_data['observation']['effectiveTime']['low']['value'];
641 } else {
642 $this->templateData['field_name_value_array']['procedure_result'][$i]['date'] = $lab_result_data['observation']['effectiveTime']['value'] ?? null;
645 $this->templateData['field_name_value_array']['procedure_result'][$i]['status'] = $lab_result_data['observation']['statusCode']['code'] ?? null;
647 $value = $lab_result_data['observation']['entryRelationship'];
649 $code = $this->codeService->resolveCode(
650 $value['observation']['code']['code'] ?? null,
651 $value['observation']['code']['codeSystemName'] ?? $value['observation']['code']['codeSystem'] ?? '',
652 $value['observation']['code']['displayName'] ?? ''
654 $this->templateData['field_name_value_array']['procedure_result'][$i]['results_code'] = $code['formatted_code'];
655 $this->templateData['field_name_value_array']['procedure_result'][$i]['results_text'] = $code['code_text'];
657 $this->templateData['field_name_value_array']['procedure_result'][$i]['results_extension'] = $value['observation']['id']['extension'] ?? null;
658 $this->templateData['field_name_value_array']['procedure_result'][$i]['results_root'] = $value['observation']['id']['root'] ?? null;
659 $this->templateData['field_name_value_array']['procedure_result'][$i]['results_date'] = $value['observation']['effectiveTime']['value'] ?? null;
660 $this->templateData['field_name_value_array']['procedure_result'][$i]['results_value'] = $value['observation']['value']['value'] ?? null;
661 $this->templateData['field_name_value_array']['procedure_result'][$i]['results_unit'] = $value['observation']['value']['unit'] ?? null;
662 if (!empty($value['observation']['referenceRange']['observationRange']['text'])) {
663 $this->templateData['field_name_value_array']['procedure_result'][$i]['results_range'] = $value['observation']['referenceRange']['observationRange']['text'];
664 } else {
665 $this->templateData['field_name_value_array']['procedure_result'][$i]['results_range'] = ($value['observation']['referenceRange']['observationRange']['value']['low']['value'] ?? '') . '-' . ($value['observation']['referenceRange']['observationRange']['value']['high']['value'] ?? '') . ' ' . ($value['observation']['referenceRange']['observationRange']['value']['low']['unit'] ?? '');
668 $this->templateData['entry_identification_array']['procedure_result'][$i] = $i;
672 public function VitalSign($component)
674 $component['section']['text'] = '';
675 if (!empty($component['section']['entry'][0])) {
676 foreach ($component['section']['entry'] as $key => $value) {
677 $this->fetchVitalSignData($value);
679 } else {
680 $this->fetchVitalSignData($component['section']['entry']);
684 public function fetchVitalSignData($vital_sign_data)
686 if (!empty($vital_sign_data['organizer']['component'][0]['observation']['effectiveTime']['value'])) {
687 $i = 1;
688 if (!empty($this->templateData['field_name_value_array']['vital_sign'])) {
689 $i += count($this->templateData['field_name_value_array']['vital_sign']);
691 $this->templateData['field_name_value_array']['vital_sign'][$i]['extension'] = $vital_sign_data['organizer']['id']['extension'] ?? null;
692 $this->templateData['field_name_value_array']['vital_sign'][$i]['root'] = $vital_sign_data['organizer']['id']['root'] ?? null;
693 $this->templateData['field_name_value_array']['vital_sign'][$i]['date'] = $vital_sign_data['organizer']['component'][0]['observation']['effectiveTime']['value'] ?? null;
694 $vitals_array = array(
695 '8310-5' => 'temperature',
696 '8462-4' => 'bpd',
697 '8480-6' => 'bps',
698 '8287-5' => 'head_circ',
699 '8867-4' => 'pulse',
700 '8302-2' => 'height',
701 '2710-2' => 'oxygen_saturation',
702 '9279-1' => 'respiration',
703 '3141-9' => 'weight'
706 for ($j = 0; $j < 9; $j++) {
707 $code = $vital_sign_data['organizer']['component'][$j]['observation']['code']['code'] ?? null;
708 if (!empty($vital_sign_data['organizer']['component'][$j]['observation']['entryRelationship'])) {
709 $this->templateData['field_name_value_array']['vital_sign'][$i]['bps'] = $vital_sign_data['organizer']['component'][$j]['observation']['entryRelationship'][0]['observation']['value']['value'] ?? null;
710 $this->templateData['field_name_value_array']['vital_sign'][$i]['bpd'] = $vital_sign_data['organizer']['component'][$j]['observation']['entryRelationship'][1]['observation']['value']['value'] ?? null;
711 } else {
712 if (array_key_exists($code, $vitals_array)) {
713 $this->templateData['field_name_value_array']['vital_sign'][$i][$vitals_array[$code]] = $vital_sign_data['organizer']['component'][$j]['observation']['value']['value'] ?? null;
718 $this->templateData['entry_identification_array']['vital_sign'][$i] = $i;
722 public function socialHistory($component)
724 $component['section']['text'] = '';
725 if (!empty($component['section']['entry'][0])) {
726 foreach ($component['section']['entry'] as $key => $value) {
727 $this->fetchSocialHistoryData($value);
729 } else {
730 $this->fetchSocialHistoryData($component['section']['entry'] ?? null);
734 public function fetchSocialHistoryData($social_history_data)
736 if (!empty($social_history_data['observation']['value']['code'])) {
737 $social_history_array = array(
738 '2.16.840.1.113883.10.20.22.4.78' => 'smoking'
740 $i = 0;
741 $code = $social_history_data['observation']['templateId']['root'];
742 if (!empty($this->templateData['field_name_value_array']['social_history'])) {
743 foreach ($this->templateData['field_name_value_array']['social_history'] as $key => $value) {
744 if (!array_key_exists($social_history_array[$code], $value)) {
745 $i = $key;
746 } else {
747 $i = count($this->templateData['field_name_value_array']['social_history']) + 1;
752 $this->templateData['field_name_value_array']['social_history'][$i][$social_history_array[$code]]['extension'] = $social_history_data['observation']['id']['extension'];
753 $this->templateData['field_name_value_array']['social_history'][$i][$social_history_array[$code]]['root'] = $social_history_data['observation']['id']['root'];
754 $this->templateData['field_name_value_array']['social_history'][$i][$social_history_array[$code]]['status'] = $social_history_data['observation']['value']['code'];
755 $this->templateData['field_name_value_array']['social_history'][$i][$social_history_array[$code]]['begdate'] = $social_history_data['observation']['effectiveTime']['low']['value'];
756 $this->templateData['field_name_value_array']['social_history'][$i][$social_history_array[$code]]['enddate'] = $social_history_data['observation']['effectiveTime']['high']['value'];
757 $this->templateData['field_name_value_array']['social_history'][$i][$social_history_array[$code]]['value'] = $social_history_data['observation']['value']['displayName'];
758 $this->templateData['entry_identification_array']['social_history'][$i] = $i;
762 public function encounter($component)
764 $component['section']['text'] = '';
765 if ($component['section']['entry'][0]) {
766 foreach ($component['section']['entry'] as $key => $value) {
767 $this->fetchEncounterPerformed($value);
769 } else {
770 $this->fetchEncounterPerformed($component['section']['entry']);
773 unset($component);
774 return;
777 public function carePlan($component)
779 $component['section']['text'] = '';
780 if (!empty($component['section']['entry'][0])) {
781 foreach ($component['section']['entry'] as $key => $value) {
782 $this->fetchCarePlanData($value);
784 } else {
785 $this->fetchCarePlanData($component['section']['entry'] ?? null);
789 public function fetchCarePlanData($care_plan_data)
791 if (!empty($care_plan_data['act']['code']['code'])) {
792 $i = 1;
793 if (!empty($this->templateData['field_name_value_array']['care_plan'])) {
794 $i += count($this->templateData['field_name_value_array']['care_plan']);
796 $this->templateData['field_name_value_array']['care_plan'][$i]['extension'] = $care_plan_data['act']['templateId']['root'];
797 $this->templateData['field_name_value_array']['care_plan'][$i]['root'] = $care_plan_data['act']['templateId']['root'];
798 $this->templateData['field_name_value_array']['care_plan'][$i]['code'] = $care_plan_data['act']['code']['code'];
799 $this->templateData['field_name_value_array']['care_plan'][$i]['code_text'] = $care_plan_data['act']['code']['displayName'];
800 $this->templateData['field_name_value_array']['care_plan'][$i]['description'] = $care_plan_data['act']['text'];
801 $this->templateData['field_name_value_array']['care_plan'][$i]['date'] = $care_plan_data['act']['effectiveTime']['center']['value'];
802 $this->templateData['entry_identification_array']['care_plan'][$i] = $i;
806 public function functionalCognitiveStatus($component)
808 $component['section']['text'] = '';
809 if ($component['section']['entry'][0]) {
810 foreach ($component['section']['entry'] as $key => $value) {
811 $this->fetchFunctionalCognitiveStatusData($value);
813 } else {
814 $this->fetchFunctionalCognitiveStatusData($component['section']['entry']);
818 public function fetchFunctionalCognitiveStatusData($functional_cognitive_status_data)
820 if ($functional_cognitive_status_data['observation']['value']['code'] != '' && $functional_cognitive_status_data['observation']['value']['code'] != 0) {
821 $i = 1;
822 if (!empty($this->templateData['field_name_value_array']['functional_cognitive_status'])) {
823 $i += count($this->templateData['field_name_value_array']['functional_cognitive_status']);
825 $this->templateData['field_name_value_array']['functional_cognitive_status'][$i]['extension'] = $functional_cognitive_status_data['observation']['id']['extension'];
826 $this->templateData['field_name_value_array']['functional_cognitive_status'][$i]['root'] = $functional_cognitive_status_data['observation']['id']['root'];
827 $this->templateData['field_name_value_array']['functional_cognitive_status'][$i]['date'] = $functional_cognitive_status_data['observation']['effectiveTime']['low']['value'];
828 $this->templateData['field_name_value_array']['functional_cognitive_status'][$i]['code'] = $functional_cognitive_status_data['observation']['value']['code'];
829 $this->templateData['field_name_value_array']['functional_cognitive_status'][$i]['code_text'] = $functional_cognitive_status_data['observation']['code']['displayName'];
830 $this->templateData['field_name_value_array']['functional_cognitive_status'][$i]['description'] = $functional_cognitive_status_data['observation']['value']['displayName'];
831 $this->templateData['entry_identification_array']['functional_cognitive_status'][$i] = $i;
835 public function referral($component)
837 if ($component['section']['entry'][0]) {
838 foreach ($component['section']['entry'] as $key => $value) {
839 $this->fetchReferralData($value);
841 } else {
842 $this->fetchReferralData($component['section']);
846 public function fetchReferralData($referral_data)
848 if (!empty($referral_data['text']['paragraph']) && is_array($referral_data['text']['paragraph'])) {
849 $i = 1;
850 foreach ($referral_data['text']['paragraph'] as $key => $value) {
851 if ($value) {
852 $this->templateData['field_name_value_array']['referral'][$i]['body'] = preg_replace('/\s+/', ' ', $value);
853 $this->templateData['entry_identification_array']['referral'][$i] = $i;
854 $i++;
857 } else {
858 $i = 1;
859 if (!empty($this->templateData['field_name_value_array']['referral'])) {
860 $i += count($this->templateData['field_name_value_array']['referral']);
862 $this->templateData['field_name_value_array']['referral'][$i]['root'] = $referral_data['templateId']['root'];
863 $this->templateData['field_name_value_array']['referral'][$i]['body'] = (!empty($referral_data['text']['paragraph'])) ? preg_replace('/\s+/', ' ', $referral_data['text']['paragraph']) : '';
865 $this->templateData['entry_identification_array']['referral'][$i] = $i;
868 return;
871 public function dischargeMedications($component)
873 $component['section']['text'] = '';
874 if ($component['section']['entry'][0]) {
875 foreach ($component['section']['entry'] as $key => $value) {
876 $this->fetchDischargeMedicationsData($value);
878 } else {
879 $this->fetchDischargeMedicationsData($component['section']['entry']);
883 public function fetchDischargeMedicationsData($discharge_medications_data)
885 $i = 1;
886 if (!empty($this->templateData['field_name_value_array']['discharge_medication'])) {
887 $i += count($this->templateData['field_name_value_array']['discharge_medication']);
889 $this->templateData['field_name_value_array']['discharge_medication'][$i]['extension'] = $discharge_medications_data['act']['id']['extension'];
890 $this->templateData['field_name_value_array']['discharge_medication'][$i]['root'] = $discharge_medications_data['act']['id']['root'];
891 $this->templateData['field_name_value_array']['discharge_medication'][$i]['begdate'] = $discharge_medications_data['act']['effectiveTime']['low']['value'];
892 $this->templateData['field_name_value_array']['discharge_medication'][$i]['enddate'] = $discharge_medications_data['act']['effectiveTime']['high']['value'];
893 $this->templateData['field_name_value_array']['discharge_medication'][$i]['route'] = $discharge_medications_data['act']['entryRelationship']['substanceAdministration']['routeCode']['code'];
894 $this->templateData['field_name_value_array']['discharge_medication'][$i]['route_display'] = $discharge_medications_data['act']['entryRelationship']['substanceAdministration']['routeCode']['displayName'];
895 $this->templateData['field_name_value_array']['discharge_medication'][$i]['dose'] = $discharge_medications_data['act']['entryRelationship']['substanceAdministration']['doseQuantity']['value'];
896 $this->templateData['field_name_value_array']['discharge_medication'][$i]['dose_unit'] = $discharge_medications_data['act']['entryRelationship']['substanceAdministration']['doseQuantity']['unit'];
897 $this->templateData['field_name_value_array']['discharge_medication'][$i]['rate'] = $discharge_medications_data['act']['entryRelationship']['substanceAdministration']['rateQuantity']['value'];
898 $this->templateData['field_name_value_array']['discharge_medication'][$i]['rate_unit'] = $discharge_medications_data['act']['entryRelationship']['substanceAdministration']['rateQuantity']['unit'];
899 $this->templateData['field_name_value_array']['discharge_medication'][$i]['drug_code'] = $discharge_medications_data['act']['entryRelationship']['substanceAdministration']['consumable']['manufacturedProduct']['manufacturedMaterial']['code']['code'];
900 $this->templateData['field_name_value_array']['discharge_medication'][$i]['drug_text'] = $discharge_medications_data['act']['entryRelationship']['substanceAdministration']['consumable']['manufacturedProduct']['manufacturedMaterial']['code']['displayName'];
901 $this->templateData['field_name_value_array']['discharge_medication'][$i]['note'] = $discharge_medications_data['act']['entryRelationship']['substanceAdministration']['text']['reference']['value'];
902 $this->templateData['field_name_value_array']['discharge_medication'][$i]['indication'] = $discharge_medications_data['act']['entryRelationship']['substanceAdministration']['entryRelationship'][0]['observation']['value']['displayName'] ?: $discharge_medications_data['act']['entryRelationship']['substanceAdministration']['entryRelationship']['observation']['value']['displayName'];
903 $this->templateData['field_name_value_array']['discharge_medication'][$i]['prn'] = $discharge_medications_data['act']['entryRelationship']['substanceAdministration']['precondition']['criterion']['value']['displayName'];
905 $this->templateData['field_name_value_array']['discharge_medication'][$i]['provider_title'] = $discharge_medications_data['act']['entryRelationship']['substanceAdministration']['entryRelationship'][1]['supply']['author']['assignedAuthor']['assignedPerson']['name']['prefix'];
906 $this->templateData['field_name_value_array']['discharge_medication'][$i]['provider_fname'] = $discharge_medications_data['act']['entryRelationship']['substanceAdministration']['entryRelationship'][1]['supply']['author']['assignedAuthor']['assignedPerson']['name']['given'];
907 $this->templateData['field_name_value_array']['discharge_medication'][$i]['provider_lname'] = $discharge_medications_data['act']['entryRelationship']['substanceAdministration']['entryRelationship'][1]['supply']['author']['assignedAuthor']['assignedPerson']['name']['family'];
908 $this->templateData['field_name_value_array']['discharge_medication'][$i]['provider_root'] = $discharge_medications_data['act']['entryRelationship']['substanceAdministration']['entryRelationship'][1]['supply']['author']['assignedAuthor']['id']['root'];
909 $this->templateData['field_name_value_array']['discharge_medication'][$i]['provider_address'] = $discharge_medications_data['act']['entryRelationship']['substanceAdministration']['entryRelationship'][1]['supply']['performer']['assignedEntity']['addr']['streetAddressLine'];
910 $this->templateData['field_name_value_array']['discharge_medication'][$i]['provider_city'] = $discharge_medications_data['act']['entryRelationship']['substanceAdministration']['entryRelationship'][1]['supply']['performer']['assignedEntity']['addr']['city'];
911 $this->templateData['field_name_value_array']['discharge_medication'][$i]['provider_state'] = $discharge_medications_data['act']['entryRelationship']['substanceAdministration']['entryRelationship'][1]['supply']['performer']['assignedEntity']['addr']['state'];
912 $this->templateData['field_name_value_array']['discharge_medication'][$i]['provider_postalCode'] = $discharge_medications_data['act']['entryRelationship']['substanceAdministration']['entryRelationship'][1]['supply']['performer']['assignedEntity']['addr']['postalCode'];
913 $this->templateData['field_name_value_array']['discharge_medication'][$i]['provider_country'] = $discharge_medications_data['act']['entryRelationship']['substanceAdministration']['entryRelationship'][1]['supply']['performer']['assignedEntity']['addr']['country'];
914 $this->templateData['entry_identification_array']['discharge_medication'][$i] = $i;
915 unset($discharge_medications_data);
916 return;
919 public function dischargeSummary($component)
921 if ($component['section']['entry'][0]) {
922 foreach ($component['section']['entry'] as $key => $value) {
923 $this->fetchDischargeSummaryData($value);
925 } else {
926 $this->fetchDischargeSummaryData($component['section']);
929 unset($component);
930 return;
933 public function fetchDischargeSummaryData($discharge_summary_data)
935 $i = 1;
936 if (!empty($this->templateData['field_name_value_array']['discharge_summary'])) {
937 $i += count($this->templateData['field_name_value_array']['discharge_summary']);
939 $this->templateData['field_name_value_array']['discharge_summary'][$i]['root'] = $discharge_summary_data['templateId']['root'];
940 $text = preg_replace('/\s+/', ' ', $discharge_summary_data['text']['content']);
941 for ($j = 0, $jMax = count($discharge_summary_data['text']['list']['item']); $j < $jMax; $j++) {
942 if (is_array($discharge_summary_data['text']['list']['item'][$j])) {
943 for ($k = 0, $kMax = count($discharge_summary_data['text']['list']['item'][$j]['list']['item']); $k < $kMax; $k++) {
944 $text .= '#$%' . preg_replace('/\s+/', ' ', $discharge_summary_data['text']['list']['item'][$j]['list']['item'][$k]);
946 } else {
947 $text .= '#$%' . preg_replace('/\s+/', ' ', $discharge_summary_data['text']['list']['item'][$j]);
951 $this->templateData['field_name_value_array']['discharge_summary'][$i]['text'] = $text;
953 $this->templateData['entry_identification_array']['discharge_summary'][$i] = $i;