Implement ONC CareTeam, Fixed PractitionerRole, Fix critical bug in lookup_code_infor...
[openemr.git] / src / Services / FHIR / FhirImmunizationService.php
blobf9b4e594dcd94cb0e8586c2e18ab9fd151b6de3d
1 <?php
3 namespace OpenEMR\Services\FHIR;
5 use OpenEMR\FHIR\R4\FHIRElement\FHIRMeta;
6 use OpenEMR\Services\FHIR\FhirServiceBase;
7 use OpenEMR\Services\ImmunizationService;
8 use OpenEMR\FHIR\R4\FHIRDomainResource\FHIRImmunization;
9 use OpenEMR\FHIR\R4\FHIRElement\FHIRCodeableConcept;
10 use OpenEMR\FHIR\R4\FHIRElement\FHIRCoding;
11 use OpenEMR\FHIR\R4\FHIRElement\FHIRDate;
12 use OpenEMR\FHIR\R4\FHIRElement\FHIRDateTime;
13 use OpenEMR\FHIR\R4\FHIRElement\FHIRId;
14 use OpenEMR\FHIR\R4\FHIRElement\FHIRImmunizationStatusCodes;
15 use OpenEMR\FHIR\R4\FHIRElement\FHIRQuantity;
16 use OpenEMR\FHIR\R4\FHIRElement\FHIRReference;
17 use OpenEMR\FHIR\R4\FHIRResource\FHIRImmunization\FHIRImmunizationEducation;
18 use OpenEMR\Services\Search\FhirSearchParameterDefinition;
19 use OpenEMR\Services\Search\SearchFieldType;
20 use OpenEMR\Services\Search\ServiceField;
22 /**
23 * FHIR Immunization Service
25 * @coversDefaultClass OpenEMR\Services\FHIR\FhirImmunizationService
26 * @package OpenEMR
27 * @link http://www.open-emr.org
28 * @author Yash Bothra <yashrajbothra786gmail.com>
29 * @copyright Copyright (c) 2020 Yash Bothra <yashrajbothra786gmail.com>
30 * @license https://github.com/openemr/openemr/blob/master/LICENSE GNU General Public License 3
32 class FhirImmunizationService extends FhirServiceBase implements IResourceUSCIGProfileService
35 /**
36 * @var ImmunizationService
38 private $immunizationService;
40 const USCGI_PROFILE_URI = 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-immunization';
42 public function __construct()
44 parent::__construct();
45 $this->immunizationService = new ImmunizationService();
48 /**
49 * Returns an array mapping FHIR Immunization Resource search parameters to OpenEMR Immunization search parameters
50 * @return array The search parameters
52 protected function loadSearchParameters()
54 return [
55 'patient' => new FhirSearchParameterDefinition('patient', SearchFieldType::REFERENCE, [new ServiceField('puuid', ServiceField::TYPE_UUID)]),
56 '_id' => new FhirSearchParameterDefinition('uuid', SearchFieldType::TOKEN, [new ServiceField('uuid', ServiceField::TYPE_UUID)]),
60 /**
61 * Parses an OpenEMR immunization record, returning the equivalent FHIR Immunization Resource
63 * @param array $dataRecord The source OpenEMR data record
64 * @param boolean $encode Indicates if the returned resource is encoded into a string. Defaults to false.
65 * @return FHIRImmunization
67 public function parseOpenEMRRecord($dataRecord = array(), $encode = false)
69 $immunizationResource = new FHIRImmunization();
71 $meta = new FHIRMeta();
72 $meta->setVersionId('1');
73 $meta->setLastUpdated(gmdate('c'));
74 $immunizationResource->setMeta($meta);
76 $id = new FHIRId();
77 $id->setValue($dataRecord['uuid']);
78 $immunizationResource->setId($id);
80 $status = new FHIRImmunizationStatusCodes();
81 if ($dataRecord['added_erroneously'] != "0") {
82 $status->setValue("entered-in-error");
83 } elseif ($dataRecord['completion_status'] == "Completed") {
84 $status->setValue("completed");
85 } else {
86 $status->setValue("not-done");
88 $statusReason = new FHIRCodeableConcept();
89 $statusReasonCoding = new FHIRCoding();
90 $statusReasonCoding->setSystem(FhirCodeSystemUris::IMMUNIZATION_OBJECTION_REASON);
91 $statusReasonCoding->setCode("PATOBJ");
92 $statusReasonCoding->setDisplay("patient objection");
93 $statusReason->addCoding($statusReasonCoding);
94 $immunizationResource->setStatusReason($statusReason);
96 $immunizationResource->setStatus($status);
97 $immunizationResource->setPrimarySource($dataRecord['primarySource']);
99 if (!empty($dataRecord['cvx_code'])) {
100 $vaccineCode = new FHIRCodeableConcept();
101 $vaccineCode->addCoding(array(
102 'system' => "http://hl7.org/fhir/sid/cvx",
103 'code' => $dataRecord['cvx_code'],
104 'display' => $dataRecord['cvx_code_text']
106 $immunizationResource->setVaccineCode($vaccineCode);
109 if (!empty($dataRecord['puuid'])) {
110 $patient = new FHIRReference(['reference' => 'Patient/' . $dataRecord['puuid']]);
111 $immunizationResource->setPatient($patient);
114 if (!empty($dataRecord['administered_date'])) {
115 $occurenceDateTime = new FHIRDateTime();
116 $occurenceDateTime->setValue($dataRecord['administered_date']);
117 $immunizationResource->setOccurrenceDateTime($occurenceDateTime);
120 if (!empty($dataRecord['create_date'])) {
121 $recorded = new FHIRDateTime();
122 $recorded->setValue($dataRecord['create_date']);
123 $immunizationResource->setRecorded($recorded);
126 if (!empty($dataRecord['expiration_date'])) {
127 $expirationDate = new FHIRDate();
128 $expirationDate->setValue($dataRecord['expiration_date']);
129 $immunizationResource->setExpirationDate($expirationDate);
132 if (!empty($dataRecord['note'])) {
133 $immunizationResource->addNote(array(
134 'text' => $dataRecord['note']
138 if (!empty($dataRecord['administration_site'])) {
139 $siteCode = new FHIRCodeableConcept();
140 $siteCode->addCoding(array(
141 'system' => "http://terminology.hl7.org/CodeSystem/v3-ActSite",
142 'code' => $dataRecord['site_code'],
143 'display' => $dataRecord['site_display']
145 $immunizationResource->setSite($siteCode);
148 if (!empty($dataRecord['lot_number'])) {
149 $immunizationResource->setLotNumber($dataRecord['lot_number']);
152 if (!empty($dataRecord['administration_site'])) {
153 $doseQuantity = new FHIRQuantity();
154 $doseQuantity->setValue($dataRecord['amount_administered']);
155 $doseQuantity->setSystem(FhirCodeSystemUris::IMMUNIZATION_UNIT_AMOUNT);
156 $doseQuantity->setCode($dataRecord['amount_administered_unit']);
157 $immunizationResource->setDoseQuantity($doseQuantity);
160 // education is failing ONC validation, since we don't need it for ONC we are going to leave it off for now.
161 // if (!empty($dataRecord['education_date'])) {
162 // $education = new FHIRImmunizationEducation();
163 // $educationDateTime = new FHIRDateTime();
164 // $educationDateTime->setValue($dataRecord['education_date']);
165 // $education->setPresentationDate($educationDateTime);
166 // $immunizationResource->addEducation($education);
167 // }
169 if ($encode) {
170 return json_encode($immunizationResource);
171 } else {
172 return $immunizationResource;
177 * Parses a FHIR Immunization Resource, returning the equivalent OpenEMR immunization record.
179 * @param array $fhirResource The source FHIR resource
180 * @return array a mapped OpenEMR data record (array)
182 public function parseFhirResource($fhirResource = array())
187 * Inserts an OpenEMR record into the system.
189 * @param array $openEmrRecord OpenEMR immunization record
190 * @return ProcessingResult
192 public function insertOpenEMRRecord($openEmrRecord)
194 // return $this->immunizationService->insert($openEmrRecord);
199 * Updates an existing OpenEMR record.
201 * @param $fhirResourceId //The OpenEMR record's FHIR Resource ID.
202 * @param $updatedOpenEMRRecord //The "updated" OpenEMR record.
203 * @return ProcessingResult
205 public function updateOpenEMRRecord($fhirResourceId, $updatedOpenEMRRecord)
207 // $processingResult = $this->immunizationService->update($fhirResourceId, $updatedOpenEMRRecord);
208 // return $processingResult;
212 * Searches for OpenEMR records using OpenEMR search parameters
214 * @param array openEMRSearchParameters OpenEMR search fields
215 * @param $puuidBind - Optional variable to only allow visibility of the patient with this puuid.
216 * @return ProcessingResult
218 public function searchForOpenEMRRecords($openEMRSearchParameters, $puuidBind = null)
220 return $this->immunizationService->getAll($openEMRSearchParameters, true, $puuidBind);
222 public function createProvenanceResource($dataRecord = array(), $encode = false)
224 if (!($dataRecord instanceof FHIRImmunization)) {
225 throw new \BadMethodCallException("Data record should be correct instance class");
227 $fhirProvenanceService = new FhirProvenanceService();
228 $fhirProvenance = $fhirProvenanceService->createProvenanceForDomainResource($dataRecord);
229 if ($encode) {
230 return json_encode($fhirProvenance);
231 } else {
232 return $fhirProvenance;
237 * Returns the Canonical URIs for the FHIR resource for each of the US Core Implementation Guide Profiles that the
238 * resource implements. Most resources have only one profile, but several like DiagnosticReport and Observation
239 * has multiple profiles that must be conformed to.
240 * @see https://www.hl7.org/fhir/us/core/CapabilityStatement-us-core-server.html for the list of profiles
241 * @return string[]
243 public function getProfileURIs(): array
245 return [self::USCGI_PROFILE_URI];