Skip to content

Commit

Permalink
Adding/Upgrading Organization Resource (openemr#3662)
Browse files Browse the repository at this point in the history
* Changing Function Names

Signed-off-by: Yash Bothra <[email protected]>

* Added UUID to Facility

Signed-off-by: Yash Bothra <[email protected]>

* Upgraded Standard Facility Endpoints

Signed-off-by: Yash Bothra <[email protected]>

* Upgraded FHIR Organization Endpoints with Tests

Signed-off-by: Yash Bothra <[email protected]>

* Some More Upgrades

Signed-off-by: Yash Bothra <[email protected]>

* Some Fixes

Signed-off-by: Yash Bothra <[email protected]>

* Added CLIA and Fax in FHIR

Signed-off-by: Yash Bothra <[email protected]>

* Fixture fix

Signed-off-by: Yash Bothra <[email protected]>
  • Loading branch information
yashrajbothra committed Jun 27, 2020
1 parent c33cc92 commit 87d6093
Show file tree
Hide file tree
Showing 31 changed files with 1,886 additions and 187 deletions.
25 changes: 17 additions & 8 deletions _rest_routes.inc.php
Original file line number Diff line number Diff line change
Expand Up @@ -43,22 +43,21 @@
},
"GET /api/facility" => function () {
RestConfig::authorization_check("admin", "users");
return (new FacilityRestController())->getAll();
return (new FacilityRestController())->getAll($_GET);
},
"GET /api/facility/:fid" => function ($fid) {
"GET /api/facility/:fuuid" => function ($fuuid) {
RestConfig::authorization_check("admin", "users");
return (new FacilityRestController())->getOne($fid);
return (new FacilityRestController())->getOne($fuuid);
},
"POST /api/facility" => function () {
RestConfig::authorization_check("admin", "super");
$data = (array) (json_decode(file_get_contents("php:https://input")));
return (new FacilityRestController())->post($data);
},
"PUT /api/facility/:fid" => function ($fid) {
"PATCH /api/facility/:fuuid" => function ($fuuid) {
RestConfig::authorization_check("admin", "super");
$data = (array) (json_decode(file_get_contents("php:https://input")));
$data["fid"] = $fid;
return (new FacilityRestController())->put($data);
return (new FacilityRestController())->patch($fuuid, $data);
},
"GET /api/patient" => function () {
RestConfig::authorization_check("patients", "demo");
Expand Down Expand Up @@ -417,10 +416,20 @@
return (new FhirPractitionerRestController())->patch($id, $data);
},
"GET /fhir/Organization" => function () {
return (new FhirOrganizationRestController(null))->getAll($_GET);
return (new FhirOrganizationRestController())->getAll($_GET);
},
"GET /fhir/Organization/:id" => function ($id) {
return (new FhirOrganizationRestController(null))->getOne($id);
return (new FhirOrganizationRestController())->getOne($id);
},
"POST /fhir/Organization" => function () {
RestConfig::authorization_check("admin", "super");
$data = (array) (json_decode(file_get_contents("php:https://input"), true));
return (new FhirOrganizationRestController())->post($data);
},
"PATCH /fhir/Organization/:id" => function ($id) {
RestConfig::authorization_check("admin", "super");
$data = (array) (json_decode(file_get_contents("php:https://input"), true));
return (new FhirOrganizationRestController())->patch($id, $data);
},
"GET /fhir/AllergyIntolerance" => function () {
RestConfig::authorization_check("patients", "med");
Expand Down
2 changes: 1 addition & 1 deletion interface/batchcom/batch_phone_notification.php
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,7 @@ function cron_getFacilitiesMap()
$facility_phone_map = array();
//get facilities from the database

$facilities = $facilityService->getAll();
$facilities = $facilityService->getAllFacility();
foreach ($facilities as $prow) {
$facility_msg_map[$prow['id']] = $message_map[$prow['name']];
$facility_phone_map[$prow['id']] = $prow['phone'];
Expand Down
2 changes: 1 addition & 1 deletion interface/login/login.php
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,7 @@ function transmit_form(element) {

if ($GLOBALS['login_into_facility']) {
$facilityService = new FacilityService();
$facilities = $facilityService->getAll();
$facilities = $facilityService->getAllFacility();
$facilitySelected = ($GLOBALS['set_facility_cookie'] && isset($_COOKIE['pc_facility'])) ? $_COOKIE['pc_facility'] : null;
}
?>
Expand Down
2 changes: 1 addition & 1 deletion interface/orders/pending_followup.php
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ function thisLineItem($row, $codetype, $code)
<?php
// Build a drop-down list of facilities.
//
$fres = $facilityService->getAll();
$fres = $facilityService->getAllFacility();
echo " <select name='form_facility'>\n";
echo " <option value=''>-- All Facilities --\n";
foreach ($fres as $frow) {
Expand Down
2 changes: 1 addition & 1 deletion interface/reports/appt_encounter_report.php
Original file line number Diff line number Diff line change
Expand Up @@ -255,7 +255,7 @@ function endDoctor(&$docrow)
<?php
// Build a drop-down list of facilities.
//
$fres = $facilityService->getAll();
$fres = $facilityService->getAllFacility();
echo " <select name='form_facility' class='form-control'>\n";
echo " <option value=''>-- " . xlt('All Facilities') . " --\n";
foreach ($fres as $frow) {
Expand Down
2 changes: 1 addition & 1 deletion interface/reports/daily_summary_report.php
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ class='datepicker form-control'
$whereTotalVisitConditions = $whereTotalPaymentConditions = $wherePaidConditions = $whereNewPatientConditions = '1 = 1 ';

// fetch all facility from the table
$facilityRecords = $facilityService->getAll();
$facilityRecords = $facilityService->getAllFacility();
foreach ($facilityRecords as $facilityList) {
if (1 === $facilitySet && $facilityList['id'] == $selectedFacility) {
$facilities[$facilityList['id']] = $facilityList['name'];
Expand Down
2 changes: 1 addition & 1 deletion interface/reports/ippf_daily.php
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,7 @@ function genNumCell($num, $cnum)
<?php
// Build a drop-down list of facilities.
//
$fres = $facilityService->getAll();
$fres = $facilityService->getAllFacility();
echo " <select name='form_facility'>\n";
echo " <option value=''>-- All Facilities --\n";
foreach ($fres as $frow) {
Expand Down
2 changes: 1 addition & 1 deletion interface/reports/ippf_statistics.php
Original file line number Diff line number Diff line change
Expand Up @@ -1210,7 +1210,7 @@ function selreport() {
<?php
// Build a drop-down list of facilities.
//
$fres = $facilityService->getAll();
$fres = $facilityService->getAllFacility();
echo " <select name='form_facility'>\n";
echo " <option value=''>-- All Facilities --\n";
foreach ($fres as $frow) {
Expand Down
6 changes: 3 additions & 3 deletions interface/usergroup/facilities.php
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@
"info" => trim(isset($_POST["info"]) ? $_POST["info"] : '')
);

$insert_id = $facilityService->insert($newFacility);
$insert_id = $facilityService->insertFacility($newFacility);
exit(); // sjp 12/20/17 for ajax save
}

Expand Down Expand Up @@ -105,7 +105,7 @@
"info" => trim(isset($_POST["info"]) ? $_POST["info"] : '')
);

$facilityService->update($newFacility);
$facilityService->updateFacility($newFacility);

// Update facility name for all users with this facility.
// This is necassary because some provider based code uses facility name for lookups instead of facility id.
Expand Down Expand Up @@ -183,7 +183,7 @@ function refreshme() {
<tbody>
<?php
$fres = 0;
$fres = $facilityService->getAll();
$fres = $facilityService->getAllFacility();
if ($fres) {
$result2 = array();
for ($iter3 = 0; $iter3 < sizeof($fres); $iter3++) {
Expand Down
2 changes: 1 addition & 1 deletion library/options.inc.php
Original file line number Diff line number Diff line change
Expand Up @@ -3657,7 +3657,7 @@ function dropdown_facility(
global $facilityService;

$have_selected = false;
$fres = $facilityService->getAll();
$fres = $facilityService->getAllFacility();

echo " <select class='form-control' name='" . attr($name) . "' id='" . attr($name) . "'";
if ($onchange) {
Expand Down
2 changes: 1 addition & 1 deletion library/patient.inc
Original file line number Diff line number Diff line change
Expand Up @@ -249,7 +249,7 @@ function getFacilities($first = '')
{
global $facilityService;

$fres = $facilityService->getAll();
$fres = $facilityService->getAllFacility();

if ($first == 'first') {
return $fres[0]['id'];
Expand Down
2 changes: 1 addition & 1 deletion modules/sms_email_reminder/batch_phone_notification.php
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ function cron_getFacilitiesMap()
$facility_msg_map = array();
$facility_phone_map = array();
//get facilities from the database
$fres = $facilityService->getAll();
$fres = $facilityService->getAllFacility();
foreach ($fres as $frow) {
$facility_msg_map[$frow['id']] = $message_map[$frow['name']];
$facility_phone_map[$frow['id']] = $frow['phone'];
Expand Down
11 changes: 11 additions & 0 deletions sql/5_0_2-to-6_0_0_upgrade.sql
Original file line number Diff line number Diff line change
Expand Up @@ -750,3 +750,14 @@ ALTER TABLE `facility_user_ids` ADD `uuid` binary(16) DEFAULT NULL;
#IfNotIndex facility_user_ids uuid
CREATE INDEX `uuid` ON `facility_user_ids` (`uuid`);
#EndIf

#IfMissingColumn facility uuid
ALTER TABLE `facility` ADD `uuid` binary(16) DEFAULT NULL;
#EndIf

#IfUuidNeedUpdate facility
#EndIf

#IfNotIndex facility uuid
CREATE UNIQUE INDEX `uuid` ON `facility` (`uuid`);
#EndIf
4 changes: 3 additions & 1 deletion sql/database.sql
Original file line number Diff line number Diff line change
Expand Up @@ -1578,6 +1578,7 @@ CREATE TABLE `standardized_tables_track` (
DROP TABLE IF EXISTS `facility`;
CREATE TABLE `facility` (
`id` int(11) NOT NULL auto_increment,
`uuid` binary(16) DEFAULT NULL,
`name` varchar(255) default NULL,
`phone` varchar(30) default NULL,
`fax` varchar(30) default NULL,
Expand Down Expand Up @@ -1611,14 +1612,15 @@ CREATE TABLE `facility` (
`oid` VARCHAR(255) NOT NULL DEFAULT '' COMMENT 'HIEs CCDA and FHIR an OID is required/wanted',
`iban` varchar(50) default NULL,
`info` TEXT,
UNIQUE KEY `uuid` (`uuid`),
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4;

--
-- Inserting data for table `facility`
--

INSERT INTO `facility` VALUES (3, 'Your Clinic Name Here', '000-000-0000', '000-000-0000', '', '', '', '', '', '', NULL, NULL, 1, 1, 0, NULL, '', '', '', '', '', '','#99FFFF','0', '', '1', '', '', '', '', '', '', '', '');
INSERT INTO `facility` VALUES (3, NULL, 'Your Clinic Name Here', '000-000-0000', '000-000-0000', '', '', '', '', '', '', NULL, NULL, 1, 1, 0, NULL, '', '', '', '', '', '','#99FFFF','0', '', '1', '', '', '', '', '', '', '', '');

-- --------------------------------------------------------

Expand Down
127 changes: 81 additions & 46 deletions src/RestControllers/FHIR/FhirOrganizationRestController.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,70 +7,105 @@
use OpenEMR\Services\FHIR\FhirResourcesService;
use OpenEMR\RestControllers\RestControllerHelper;
use OpenEMR\FHIR\R4\FHIRResource\FHIRBundle\FHIRBundleEntry;
use OpenEMR\Validators\ProcessingResult;

require_once(__DIR__ . '/../../../_rest_config.php');
/**
* FHIR Organization Service
*
* @coversDefaultClass OpenEMR\Services\FHIR\FhirOrganizationService
* @package OpenEMR
* @link http:https://www.open-emr.org
* @author Yash Bothra <[email protected]>
* @copyright Copyright (c) 2020 Yash Bothra <[email protected]>
* @license https://github.com/openemr/openemr/blob/master/LICENSE GNU General Public License 3
*
*/
class FhirOrganizationRestController
{
private $fhirOrganizationService;
private $fhirService;
private $fhirValidationService;

public function __construct($pid)
public function __construct()
{
$this->fhirOrganizationService = new FhirOrganizationService();
$this->fhirOrganizationService->setId($pid);
$this->fhirService = new FhirResourcesService();
$this->fhirOrganizationService = new FhirOrganizationService();
$this->fhirValidationService = new FhirValidationService();
}

public function getAll($search)
/**
* Queries for FHIR organization resources using various search parameters.
* Search parameters include:
* - address (street, postal_code, city, country_code or state)
* - address-city
* - address-postalcode
* - address-state
* - email
* - name
* - phone (work)
* - telecom (email, phone)
* @return FHIR bundle with query results, if found
*/
public function getAll($searchParams)
{
$result = $this->fhirOrganizationService->getAll();
if (!$result) {
$statusCode = 400;
$result = $this->fhirValidationService->operationOutcomeResourceService(
'error',
'invalid',
false,
"Invalid Parameter"
);
} else {
$statusCode = 200;
$entries = array();
foreach ($result as $org) {
$entryResource = $this->fhirOrganizationService->createOrganizationResource(
$org['id'],
$org,
false,
$org['code'],
$org['display']
);
$entry = array(
'fullUrl' => $resourceURL . "/" . $org['id'],
'resource' => $entryResource
);
$entries[] = new FHIRBundleEntry($entry);
}
$result = $this->fhirService->createBundle('Organization', $entries, false);
$processingResult = $this->fhirOrganizationService->getAll($searchParams);
$bundleEntries = array();
foreach ($processingResult->getData() as $index => $searchResult) {
$bundleEntry = [
'fullUrl' => \RestConfig::$REST_FULL_URL . '/' . $searchResult->getId(),
'resource' => $searchResult
];
$fhirBundleEntry = new FHIRBundleEntry($bundleEntry);
array_push($bundleEntries, $fhirBundleEntry);
}
return RestControllerHelper::responseHandler($result, null, $statusCode);
$bundleSearchResult = $this->fhirService->createBundle('Organization', $bundleEntries, false);
$searchResponseBody = RestControllerHelper::responseHandler($bundleSearchResult, null, 200);
return $searchResponseBody;
}


/**
* Queries for a single FHIR organization resource by FHIR id
* @param $fhirId The FHIR organization resource id (uuid)
* @returns 200 if the operation completes successfully
*/
public function getOne($fhirId)
{
$processingResult = $this->fhirOrganizationService->getOne($fhirId, true);
return RestControllerHelper::handleProcessingResult($processingResult, 200);
}

/**
* Creates a new FHIR organization resource
* @param $fhirJson The FHIR organization resource
* @returns 201 if the resource is created, 400 if the resource is invalid
*/
public function post($fhirJson)
{
$fhirValidationService = $this->fhirValidationService->validate($fhirJson);
if (!empty($fhirValidationService)) {
return RestControllerHelper::responseHandler($fhirValidationService, null, 400);
}

$processingResult = $this->fhirOrganizationService->insert($fhirJson);
return RestControllerHelper::handleProcessingResult($processingResult, 201);
}

public function getOne($oid)
/**
* Updates an existing FHIR organization resource
* @param $fhirId The FHIR organization resource id (uuid)
* @param $fhirJson The updated FHIR organization resource (complete resource)
* @returns 200 if the resource is created, 400 if the resource is invalid
*/
public function patch($fhirId, $fhirJson)
{
$result = $this->fhirOrganizationService->getOne($oid);
if ($result) {
$resource = $this->fhirOrganizationService->createOrganizationResource($result['id'], $result, false, $result['code'], $result['display']);
$statusCode = 200;
} else {
$statusCode = 404;
$resource = $this->fhirValidationService->operationOutcomeResourceService(
'error',
'invalid',
false,
"Resource Id $pid does not exist"
);
$fhirValidationService = $this->fhirValidationService->validate($fhirJson);
if (!empty($fhirValidationService)) {
return RestControllerHelper::responseHandler($fhirValidationService, null, 400);
}

return RestControllerHelper::responseHandler($resource, null, $statusCode);
$processingResult = $this->fhirOrganizationService->update($fhirId, $fhirJson);
return RestControllerHelper::handleProcessingResult($processingResult, 200);
}
}
Loading

0 comments on commit 87d6093

Please sign in to comment.