Openemr fhir search (#4349)
[openemr.git] / src / Services / FHIR / FhirConditionService.php
blob7567d9239be588d3169ca32d44b968e63ba2b62e
1 <?php
3 namespace OpenEMR\Services\FHIR;
5 use OpenEMR\FHIR\R4\FHIRElement\FHIRCodeableConcept;
6 use OpenEMR\FHIR\R4\FHIRElement\FHIRCoding;
7 use OpenEMR\FHIR\R4\FHIRElement\FHIRId;
8 use OpenEMR\FHIR\R4\FHIRElement\FHIRReference;
9 use OpenEMR\FHIR\R4\FHIRDomainResource\FHIRCondition;
10 use OpenEMR\Services\FHIR\FhirServiceBase;
11 use OpenEMR\Services\ConditionService;
12 use OpenEMR\Services\Search\FhirSearchParameterDefinition;
13 use OpenEMR\Services\Search\SearchFieldType;
14 use OpenEMR\Validators\ProcessingResult;
16 /**
17 * FHIR Condition Service
19 * @coversDefaultClass OpenEMR\Services\FHIR\FhirConditionService
20 * @package OpenEMR
21 * @link http://www.open-emr.org
22 * @author Yash Bothra <yashrajbothra786gmail.com>
23 * @copyright Copyright (c) 2020 Yash Bothra <yashrajbothra786gmail.com>
24 * @license https://github.com/openemr/openemr/blob/master/LICENSE GNU General Public License 3
26 class FhirConditionService extends FhirServiceBase
28 /**
29 * @var ConditionService
31 private $conditionService;
33 public function __construct()
35 parent::__construct();
36 $this->conditionService = new ConditionService();
39 /**
40 * Returns an array mapping FHIR Condition Resource search parameters to OpenEMR Condition search parameters
42 * @return array The search parameters
44 protected function loadSearchParameters()
46 return [
47 'patient' => new FhirSearchParameterDefinition('patient', SearchFieldType::TOKEN, ['lists.pid']),
48 '_id' => new FhirSearchParameterDefinition('_id', SearchFieldType::TOKEN, ['lists.id']),
52 /**
53 * Parses an OpenEMR condition record, returning the equivalent FHIR Condition Resource
55 * @param array $dataRecord The source OpenEMR data record
56 * @param boolean $encode Indicates if the returned resource is encoded into a string. Defaults to false.
57 * @return FHIRCondition
59 public function parseOpenEMRRecord($dataRecord = array(), $encode = false)
61 $conditionResource = new FHIRCondition();
63 $meta = array('versionId' => '1', 'lastUpdated' => gmdate('c'));
64 $conditionResource->setMeta($meta);
66 $id = new FHIRId();
67 $id->setValue($dataRecord['uuid']);
68 $conditionResource->setId($id);
70 $clinicalStatus = "inactive";
71 $clinicalSysytem = "http://terminology.hl7.org/CodeSystem/condition-clinical";
72 if (
73 (!isset($dataRecord['enddate']) && isset($dataRecord['begdate']))
74 || isset($dataRecord['enddate']) && strtotime($dataRecord['enddate']) >= strtotime("now")
75 ) {
76 // Active if Only Begin Date isset OR End Date isnot expired
77 $clinicalStatus = "active";
78 if ($dataRecord['occurrence'] == 1 || $dataRecord['outcome'] == 1) {
79 $clinicalStatus = "resolved";
80 } elseif ($dataRecord['occurrence'] > 1) {
81 $clinicalStatus = "recurrence";
83 } elseif (isset($dataRecord['enddate']) && strtotime($dataRecord['enddate']) < strtotime("now")) {
84 //Inactive if End Date is expired
85 $clinicalStatus = "inactive";
86 } else {
87 $clinicalSysytem = "http://terminology.hl7.org/CodeSystem/data-absent-reason";
88 $clinicalStatus = "unknown";
90 $clinical_Status = new FHIRCodeableConcept();
91 $clinical_Status->addCoding(
92 array(
93 'system' => $clinicalSysytem,
94 'code' => $clinicalStatus,
95 'display' => ucwords($clinicalStatus),
98 $conditionResource->setClinicalStatus($clinical_Status);
100 $conditionCategory = new FHIRCodeableConcept();
101 $conditionCategory->addCoding(
102 array(
103 'system' => "http://terminology.hl7.org/CodeSystem/condition-category",
104 'code' => 'problem-list-item',
105 'display' => 'Problem List Item'
108 $conditionResource->addCategory($conditionCategory);
110 if (isset($dataRecord['puuid'])) {
111 $patient = new FHIRReference();
112 $patient->setReference('Patient/' . $dataRecord['puuid']);
113 $conditionResource->setSubject($patient);
116 if (isset($dataRecord['encounter_uuid'])) {
117 $encounter = new FHIRReference();
118 $encounter->setReference('Encounter/' . $dataRecord['encounter_uuid']);
119 $conditionResource->setEncounter($encounter);
122 if (!empty($dataRecord['diagnosis'])) {
123 $diagnosisCoding = new FHIRCoding();
124 $diagnosisCode = new FHIRCodeableConcept();
125 foreach ($dataRecord['diagnosis'] as $code => $display) {
126 $diagnosisCoding->setCode($code);
127 $diagnosisCoding->setDisplay($display);
128 $diagnosisCode->addCoding($diagnosisCoding);
130 $conditionResource->setCode($diagnosisCode);
133 $verificationStatus = new FHIRCodeableConcept();
134 $verificationCoding = array(
135 'system' => "http://terminology.hl7.org/CodeSystem/condition-ver-status",
136 'code' => 'unconfirmed',
137 'display' => 'Unconfirmed',
139 if (!empty($dataRecord['verification'])) {
140 $verificationCoding = array(
141 'system' => "http://terminology.hl7.org/CodeSystem/condition-ver-status",
142 'code' => $dataRecord['verification'],
143 'display' => $dataRecord['verification_title']
146 $verificationStatus->addCoding($verificationCoding);
147 $conditionResource->setVerificationStatus($verificationStatus);
149 if ($encode) {
150 return json_encode($conditionResource);
151 } else {
152 return $conditionResource;
158 * Performs a FHIR Condition Resource lookup by FHIR Resource ID
160 * @param $fhirResourceId //The OpenEMR record's FHIR Condition Resource ID.
161 * @param $puuidBind - Optional variable to only allow visibility of the patient with this puuid.
163 public function getOne($fhirResourceId, $puuidBind = null)
165 $processingResult = $this->conditionService->getOne($fhirResourceId, $puuidBind);
166 if (!$processingResult->hasErrors()) {
167 if (count($processingResult->getData()) > 0) {
168 $openEmrRecord = $processingResult->getData()[0];
169 $fhirRecord = $this->parseOpenEMRRecord($openEmrRecord);
170 $processingResult->setData([]);
171 $processingResult->addData($fhirRecord);
174 return $processingResult;
178 * Searches for OpenEMR records using OpenEMR search parameters
180 * @param array openEMRSearchParameters OpenEMR search fields
181 * @param $puuidBind - Optional variable to only allow visibility of the patient with this puuid.
182 * @return ProcessingResult
184 public function searchForOpenEMRRecords($openEMRSearchParameters, $puuidBind = null)
186 return $this->conditionService->getAll($openEMRSearchParameters, false, $puuidBind);
189 public function parseFhirResource($fhirResource = array())
191 // TODO: If Required in Future
194 public function insertOpenEMRRecord($openEmrRecord)
196 // TODO: If Required in Future
199 public function updateOpenEMRRecord($fhirResourceId, $updatedOpenEMRRecord)
201 // TODO: If Required in Future
204 public function createProvenanceResource($dataRecord = array(), $encode = false)
206 // TODO: If Required in Future