Skip to content

Commit

Permalink
Merge pull request #27 from SyaefulKai/feat/bundle
Browse files Browse the repository at this point in the history
fix: Encounter & Condition bundle
  • Loading branch information
ivanwilliammd authored Mar 31, 2024
2 parents ac41667 + d08560c commit abe1060
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 50 deletions.
70 changes: 46 additions & 24 deletions src/FHIR/Bundle.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,58 +3,80 @@
namespace Satusehat\Integration\FHIR;

use Satusehat\Integration\OAuth2Client;
use Satusehat\Integration\FHIR\Exception\FHIRException;

class Bundle extends OAuth2Client {
class Bundle extends OAuth2Client
{

public array $bundle = [
'resourceType' => 'Bundle',
'type' => 'transaction',
'entry' => []
'entry' => [],
];

public $encounter_id;
public $encounter_id, $encounter;

private function uuidV4() {
private function uuidV4()
{
$data = openssl_random_pseudo_bytes(16);
$data[6] = chr(ord($data[6]) & 0x0f | 0x40);
$data[8] = chr(ord($data[8]) & 0x3f | 0x80);
$uuid = bin2hex($data);
$formatted_uuid = sprintf('%s-%s-%s-%s-%s',
$formatted_uuid = sprintf(
'%s-%s-%s-%s-%s',
substr($uuid, 0, 8),
substr($uuid, 8, 4),
substr($uuid, 12, 4),
substr($uuid, 16, 4),
substr($uuid, 20, 12)
);

return $formatted_uuid;
}

public function addEncounter(Encounter $encounter){
public function addEncounter(Encounter $encounter)
{
$this->encounter_id = $this->uuidV4();
$encounter_bundle = [
'fullUrl' => 'urn:uuid:' . $this->encounter_id,
'resource' => json_decode($encounter->json()),
'request' => [
'method' => 'POST',
'url' => 'Encounter',
]
];

$this->bundle['entry'][] = $encounter_bundle;
$this->encounter = $encounter;
}

public function addCondition(Condition $condition){
$condition->setEncounter($this->encounter_id);
$condition_bundle = [
'fullUrl' => 'urn:uuid:' . $this->uuidV4(),
public function addCondition(Condition $condition)
{

if (!isset($this->encounter_id)) {
throw new FHIRException("Please call addEncounter method first before addCondition.");
}

$condition_uuid = $this->uuidV4();

// Membuat referensi condition ke encounter saat ini
$condition->setEncounter($this->encounter_id, '', true);

// Membuat referensi condition di encounter
$this->encounter->addDiagnosis($condition_uuid, $condition->condition['code']['coding'][0]['code'], '', true);

if(!isset($this->bundle['entry'][0])){
$this->bundle['entry'][0] = [
'fullUrl' => 'urn:uuid:' . $this->encounter_id,
'resource' => '',
'request' => [
'method' => 'POST',
'url' => 'Encounter'
]
];
}

$this->bundle['entry'][0]['resource'] = json_decode($this->encounter->json());

$this->bundle['entry'][] = [
'fullUrl' => 'urn:uuid:' . $condition_uuid,
'resource' => json_decode($condition->json()),
'request' => [
'method' => 'POST',
'url' => 'Condition'
],
'url' => 'Condition',
]
];
$this->bundle['entry'][] = $condition_bundle;

}

public function post()
Expand Down
34 changes: 17 additions & 17 deletions src/FHIR/Condition.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

namespace Satusehat\Integration\FHIR;

use Satusehat\Integration\Terminology\Icd10;
use Satusehat\Integration\OAuth2Client;
use Satusehat\Integration\Terminology\Icd10;

class Condition extends OAuth2Client
{
Expand Down Expand Up @@ -78,7 +78,7 @@ public function addCode($code = null, $display = null)
$code_check = Icd10::where('icd10_code', $code)->first();

// Handling if incomplete code / display
if (! $code_check) {
if (!$code_check) {
return 'Kode ICD-10 invalid';
}

Expand All @@ -93,64 +93,64 @@ public function addCode($code = null, $display = null)

public function setSubject($subjectId, $name)
{
$this->condition['subject']['reference'] = 'Patient/'.$subjectId;
$this->condition['subject']['reference'] = 'Patient/' . $subjectId;
$this->condition['subject']['display'] = $name;
}

public function setEncounter($encounterId, $display = null)
public function setEncounter($encounterId, $display = null, $bundle = false)
{
$this->condition['encounter']['reference'] = 'Encounter/'.$encounterId;
$this->condition['encounter']['display'] = $display ? $display : 'Kunjungan '.$encounterId;
$this->condition['encounter']['reference'] = ($bundle ? 'urn:uuid:' : 'Encounter/') . $encounterId;
$this->condition['encounter']['display'] = $display ? $display : 'Kunjungan ' . $encounterId;
}

public function setOnsetDateTime($onset_date_time = null)
{
$this->condition['onsetDateTime'] = $onset_date_time ?
date("Y-m-d\TH:i:sP", strtotime($onset_date_time)) :
date("Y-m-d\TH:i:sP");
date("Y-m-d\TH:i:sP", strtotime($onset_date_time)) :
date("Y-m-d\TH:i:sP");
}

public function setRecordedDate($recorded_date = null)
{
$this->condition['recordedDate'] = $recorded_date ?
date("Y-m-d\TH:i:sP", strtotime($recorded_date)) :
date("Y-m-d\TH:i:sP");
date("Y-m-d\TH:i:sP", strtotime($recorded_date)) :
date("Y-m-d\TH:i:sP");
}

public function json()
{
// Add default clinical status
if (! array_key_exists('clinicalStatus', $this->condition)) {
if (!array_key_exists('clinicalStatus', $this->condition)) {
$this->addClinicalStatus();
}

// Add default category
if (! array_key_exists('category', $this->condition)) {
if (!array_key_exists('category', $this->condition)) {
$this->addCategory();
}

// Add default OnsetDateTime
if (! array_key_exists('onsetDateTime', $this->condition)) {
if (!array_key_exists('onsetDateTime', $this->condition)) {
$this->setOnsetDateTime();
}

// Add default RecordedDate
if (! array_key_exists('recordedDate', $this->condition)) {
if (!array_key_exists('recordedDate', $this->condition)) {
$this->setRecordedDate();
}

// Subject is required
if (! array_key_exists('subject', $this->condition)) {
if (!array_key_exists('subject', $this->condition)) {
return 'Please use condition->setSubject($subjectId, $name) to pass the data';
}

// Encounter is required
if (! array_key_exists('encounter', $this->condition)) {
if (!array_key_exists('encounter', $this->condition)) {
return 'Please use condition->setEncounter($encounterId) to pass the data';
}

// ICD-10 is required
if (! array_key_exists('code', $this->condition)) {
if (!array_key_exists('code', $this->condition)) {
return 'Please use condition->addCode($code, $display) to pass the data';
}

Expand Down
18 changes: 9 additions & 9 deletions src/FHIR/Encounter.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

namespace Satusehat\Integration\FHIR;

use Satusehat\Integration\Terminology\Icd10;
use Satusehat\Integration\OAuth2Client;
use Satusehat\Integration\Terminology\Icd10;

class Encounter extends OAuth2Client
{
Expand All @@ -26,6 +26,7 @@ private function statusHistoryValidate($arr, $status)
return true;
}
}

return false;
}

Expand All @@ -41,7 +42,7 @@ public function setArrived($timestamp)
return;
}

$statusHistory_arrived = [
$statusHistory_arrived = [
'status' => 'arrived',
'period' => [
'start' => date("Y-m-d\TH:i:sP", strtotime($timestamp)),
Expand Down Expand Up @@ -75,11 +76,10 @@ public function setInProgress($timestamp_start, $timestamp_end)
'status' => 'in-progress',
'period' => [
'start' => $atomTimestamp['start'],
'end' => $atomTimestamp['end']
]
'end' => $atomTimestamp['end'],
],
];


$this->encounter['status'] = 'in-progress';
$this->encounter['period']['end'] = $atomTimestamp['end'];
$this->encounter['statusHistory'][0]['period']['end'] = $atomTimestamp['start'];
Expand All @@ -106,7 +106,7 @@ public function setFinished($timestamp)
'period' => [
'start' => $date,
'end' => $date,
]
],
];

$this->encounter['status'] = 'finished';
Expand Down Expand Up @@ -180,7 +180,7 @@ public function setServiceProvider()
$this->encounter['serviceProvider']['reference'] = 'Organization/' . $this->organization_id;
}

public function addDiagnosis($id, $code, $display = null)
public function addDiagnosis($id, $code, $display = null, $bundle = false)
{
// Look in database if display is null
$code_check = Icd10::where('icd10_code', $code)->first();
Expand All @@ -193,8 +193,8 @@ public function addDiagnosis($id, $code, $display = null)
$display = $display ? $display : $code_check->icd10_en;

// Create Encounter.diagnosis content
$diagnosis['condition']['reference'] = 'Condition/' . $id;
$diagnosis['condition']['display'] = 'Condition/' . $display;
$diagnosis['condition']['reference'] = ($bundle ? 'urn:uuid:' : 'Condition/') . $id;
$diagnosis['condition']['display'] = $display;
$diagnosis['use']['coding'][] = [
'system' => 'http://terminology.hl7.org/CodeSystem/diagnosis-role',
'code' => 'DD',
Expand Down

0 comments on commit abe1060

Please sign in to comment.