From 9b9654e4c82a4a6b8b73be8c15d6d3c487742608 Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Mon, 28 Aug 2023 08:10:34 +0100 Subject: [PATCH 01/67] Now querying Onto server for valuesets --- .../nhs/england/fhirvalidator/provider/ValueSetProvider.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/ValueSetProvider.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/ValueSetProvider.kt index fd19101..ecc227f 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/ValueSetProvider.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/ValueSetProvider.kt @@ -192,7 +192,10 @@ class ValueSetProvider (@Qualifier("R4") private val fhirContext: FhirContext, @Operation(name = "\$expand", idempotent = true) fun expand(@ResourceParam valueSet: ValueSet?, @OperationParam(name = ValueSet.SP_URL) url: TokenParam?, - @OperationParam(name = "filter") filter: StringParam?): ValueSet? { + @OperationParam(name = "filter") filter: StringParam?, + @OperationParam(name = "includeDesignations") includeDesignations: BooleanType?, + @OperationParam(name = "elements") elements: StringOrListParam?, + @OperationParam(name = "property") property: StringOrListParam?): ValueSet? { if (url == null && valueSet == null) throw UnprocessableEntityException("Both resource and url can not be null") var valueSetR4: ValueSet? = null; if (url != null) { @@ -207,6 +210,7 @@ class ValueSetProvider (@Qualifier("R4") private val fhirContext: FhirContext, } if (valueSetR4 != null) { var valueSetExpansionOptions = ValueSetExpansionOptions(); + valueSetR4.expansion = null; // remove any previous expansion if (filter != null) valueSetExpansionOptions.filter = filter.value var expansion: ValueSetExpansionOutcome? = From 7005cc53ed8e2e8ba90f51f195b70b8e8dd559b9 Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Mon, 28 Aug 2023 08:10:49 +0100 Subject: [PATCH 02/67] Onto ValueSet queries --- .../provider/ValueSetProvider.kt | 47 ++++++++++++++++--- ...teTerminologyServiceValidationSupport.java | 8 ++++ 2 files changed, 49 insertions(+), 6 deletions(-) diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/ValueSetProvider.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/ValueSetProvider.kt index ecc227f..b320c37 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/ValueSetProvider.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/ValueSetProvider.kt @@ -10,6 +10,7 @@ import ca.uhn.fhir.context.support.ValueSetExpansionOptions import ca.uhn.fhir.rest.annotation.* import ca.uhn.fhir.rest.api.MethodOutcome import ca.uhn.fhir.rest.api.server.RequestDetails +import ca.uhn.fhir.rest.client.api.IGenericClient import ca.uhn.fhir.rest.param.DateParam import ca.uhn.fhir.rest.param.StringOrListParam import ca.uhn.fhir.rest.param.StringParam @@ -17,19 +18,20 @@ import ca.uhn.fhir.rest.param.TokenParam import ca.uhn.fhir.rest.server.IResourceProvider import ca.uhn.fhir.rest.server.exceptions.UnprocessableEntityException import mu.KLogging -import org.apache.commons.lang3.StringUtils import org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain +import org.hl7.fhir.instance.model.api.IBaseBundle import org.hl7.fhir.r4.model.* -import org.hl7.fhir.utilities.npm.NpmPackage import org.springframework.beans.factory.annotation.Qualifier +import org.springframework.security.oauth2.client.OAuth2AuthorizedClientManager import org.springframework.stereotype.Component import uk.nhs.england.fhirvalidator.awsProvider.AWSValueSet +import uk.nhs.england.fhirvalidator.configuration.TerminologyValidationProperties import uk.nhs.england.fhirvalidator.interceptor.CognitoAuthInterceptor import uk.nhs.england.fhirvalidator.service.CodingSupport -import uk.nhs.england.fhirvalidator.service.ImplementationGuideParser +import uk.nhs.england.fhirvalidator.util.AccessTokenInterceptor import uk.nhs.england.fhirvalidator.util.FhirSystems import java.nio.charset.StandardCharsets -import java.util.UUID +import java.util.* import javax.servlet.http.HttpServletRequest @Component @@ -37,7 +39,9 @@ class ValueSetProvider (@Qualifier("R4") private val fhirContext: FhirContext, private val supportChain: ValidationSupportChain, private val codingSupport: CodingSupport, private val awsValueSet: AWSValueSet, - private val cognitoAuthInterceptor: CognitoAuthInterceptor + private val cognitoAuthInterceptor: CognitoAuthInterceptor, + private val optionalAuthorizedClientManager: Optional, + private val terminologyValidationProperties: TerminologyValidationProperties ) : IResourceProvider { /** * The getResourceType method comes from IResourceProvider, and must @@ -49,8 +53,24 @@ class ValueSetProvider (@Qualifier("R4") private val fhirContext: FhirContext, } private val validationSupportContext = ValidationSupportContext(supportChain) + init { + if (optionalAuthorizedClientManager.isPresent) { + val authorizedClientManager = optionalAuthorizedClientManager.get() + val accessTokenInterceptor = AccessTokenInterceptor(authorizedClientManager) + provideClient(accessTokenInterceptor) + } + } + + private fun provideClient(accessTokenInterceptor : AccessTokenInterceptor) { + val retVal: IGenericClient = fhirContext.newRestfulGenericClient(terminologyValidationProperties.url) + retVal.registerInterceptor(accessTokenInterceptor) + terminologyClient = retVal + } + companion object : KLogging() + private var terminologyClient : IGenericClient? = null; + @Update fun update( theRequest: HttpServletRequest, @@ -117,7 +137,21 @@ class ValueSetProvider (@Qualifier("R4") private val fhirContext: FhirContext, if (resource != null) { list.add(resource) } else { val resources = awsValueSet.search(url) - if (resources.size>0) list.addAll(resources) + if (resources.size > 0) { + list.addAll(resources) + } else { + if (terminologyClient !== null) { + val results = terminologyClient!!.search().forResource("ValueSet") + .where(CodeSystem.URL.matches().value(url.value)).execute() + if (results !== null && results.hasEntry()) { + if (results.entry.size>0 && results.entry[0].hasResource() && results.entry[0].resource is ValueSet) { + val summaryValueset = results.entry[0].resource as ValueSet + val fullValueSet = terminologyClient!!.read().resource("ValueSet").withId(summaryValueset.id).execute() + if (fullValueSet is ValueSet) list.add(fullValueSet) + } + } + } + } } return list } @@ -229,4 +263,5 @@ class ValueSetProvider (@Qualifier("R4") private val fhirContext: FhirContext, } } + } diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/shared/RemoteTerminologyServiceValidationSupport.java b/src/main/kotlin/uk/nhs/england/fhirvalidator/shared/RemoteTerminologyServiceValidationSupport.java index 3e3c37d..be863ff 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/shared/RemoteTerminologyServiceValidationSupport.java +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/shared/RemoteTerminologyServiceValidationSupport.java @@ -248,4 +248,12 @@ else if (parametersParameterComponent.getValue() instanceof StringType) { } return new LookupCodeResult(); } + + @Nullable + @Override + public T fetchResource(@Nullable Class theClass, String theUri) { + System.out.println("Fetch "+theUri); + return null; + } + } From f7401832d0a650afe4d355ba1ce04f803fb525bd Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Mon, 28 Aug 2023 08:12:47 +0100 Subject: [PATCH 03/67] Version updats --- aws-repo-notes.txt | 4 ++-- pom.xml | 2 +- src/main/resources/application.yaml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/aws-repo-notes.txt b/aws-repo-notes.txt index 40c0ad7..c1b82b7 100644 --- a/aws-repo-notes.txt +++ b/aws-repo-notes.txt @@ -23,11 +23,11 @@ mvn clean install docker build -t fhir-validator-r4 . docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest -docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.8.0 +docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.8.1 docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest -docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.8.0 +docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.8.1 diff --git a/pom.xml b/pom.xml index fdc3579..fd323ba 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ uk.nhs.england IOPS-FHIR-Validation-Service - 6.8.0 + 6.8.1 IOPS-FHIR-Validation-Service HAPI FHIR Validator using Spring Boot diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 0a3ffe4..8e58dc7 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -17,7 +17,7 @@ fhir: server: name: IOPS FHIR Testing baseUrl: https://3cdzg7kbj4.execute-api.eu-west-2.amazonaws.com/poc/Conformance - version: 6.8.0 + version: 6.8.1 From a41a4dac9510b7f5d16aabf87641178673efbd00 Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Tue, 29 Aug 2023 15:26:27 +0100 Subject: [PATCH 04/67] CORS support for LOINC Terminology --- aws-repo-notes.txt | 4 +- pom.xml | 2 +- .../england/fhirvalidator/FHIRLOINCServer.kt | 48 +++ .../configuration/ApplicationConfiguration.kt | 6 + .../configuration/MessageProperties.kt | 4 + .../interceptor/BasicAuthInterceptor.kt | 375 ++++++++++++++++++ .../providerLOINC/QuestionnaireProvider.kt | 49 +++ src/main/resources/application.yaml | 2 +- src/main/resources/message.properties | 1 + 9 files changed, 487 insertions(+), 4 deletions(-) create mode 100644 src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRLOINCServer.kt create mode 100644 src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/BasicAuthInterceptor.kt create mode 100644 src/main/kotlin/uk/nhs/england/fhirvalidator/providerLOINC/QuestionnaireProvider.kt diff --git a/aws-repo-notes.txt b/aws-repo-notes.txt index c1b82b7..cdd457b 100644 --- a/aws-repo-notes.txt +++ b/aws-repo-notes.txt @@ -23,11 +23,11 @@ mvn clean install docker build -t fhir-validator-r4 . docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest -docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.8.1 +docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.8.2 docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest -docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.8.1 +docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.8.2 diff --git a/pom.xml b/pom.xml index fd323ba..d1b9b83 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ uk.nhs.england IOPS-FHIR-Validation-Service - 6.8.1 + 6.8.2 IOPS-FHIR-Validation-Service HAPI FHIR Validator using Spring Boot diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRLOINCServer.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRLOINCServer.kt new file mode 100644 index 0000000..1f7af39 --- /dev/null +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRLOINCServer.kt @@ -0,0 +1,48 @@ +package uk.nhs.england.fhirvalidator + +import ca.uhn.fhir.context.FhirContext +import ca.uhn.fhir.rest.api.EncodingEnum +import ca.uhn.fhir.rest.server.RestfulServer +import com.amazonaws.services.sqs.AmazonSQS +import com.fasterxml.jackson.databind.ObjectMapper +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.beans.factory.annotation.Qualifier +import uk.nhs.england.fhirvalidator.configuration.FHIRServerProperties +import uk.nhs.england.fhirvalidator.configuration.MessageProperties +import uk.nhs.england.fhirvalidator.interceptor.AWSAuditEventLoggingInterceptor +import uk.nhs.england.fhirvalidator.interceptor.ValidationInterceptor +import uk.nhs.england.fhirvalidator.providerLOINC.QuestionnaireProvider +import java.util.* +import javax.servlet.annotation.WebServlet + +@WebServlet("/LOINC/R4/*", loadOnStartup = 1) +class FHIRLOINCServer( + @Qualifier("R4") fhirContext: FhirContext, + @Autowired(required = false) val sqs : AmazonSQS?, + val questionnaireProvider: QuestionnaireProvider, + val fhirServerProperties: FHIRServerProperties, + private val messageProperties: MessageProperties +) : RestfulServer(fhirContext) { + + override fun initialize() { + super.initialize() + + TimeZone.setDefault(TimeZone.getTimeZone("UTC")) + registerProvider(questionnaireProvider) + + val awsAuditEventLoggingInterceptor = + AWSAuditEventLoggingInterceptor( + this.fhirContext, + fhirServerProperties, + messageProperties, + sqs + ) + interceptorService.registerInterceptor(awsAuditEventLoggingInterceptor) + + val validationInterceptor = ValidationInterceptor(fhirContext,messageProperties) + interceptorService.registerInterceptor(validationInterceptor) + + isDefaultPrettyPrint = true + defaultResponseEncoding = EncodingEnum.JSON + } +} diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/ApplicationConfiguration.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/ApplicationConfiguration.kt index cee3857..868acda 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/ApplicationConfiguration.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/ApplicationConfiguration.kt @@ -15,6 +15,7 @@ import org.springframework.context.annotation.Configuration import org.springframework.web.client.RestTemplate import org.springframework.web.cors.CorsConfiguration import org.springframework.web.cors.UrlBasedCorsConfigurationSource +import uk.nhs.england.fhirvalidator.interceptor.BasicAuthInterceptor import uk.nhs.england.fhirvalidator.interceptor.CognitoAuthInterceptor import uk.nhs.england.fhirvalidator.util.CorsFilter import javax.servlet.Filter @@ -72,6 +73,11 @@ open class ApplicationConfiguration( return client } + @Bean + fun getBasicAuth(messageProperties: MessageProperties, fhirServerProperties: FHIRServerProperties,@Qualifier("R4") ctx : FhirContext) : BasicAuthInterceptor { + return BasicAuthInterceptor(messageProperties, fhirServerProperties , ctx) + } + @Bean fun getSQS(): AmazonSQS? { diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/MessageProperties.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/MessageProperties.kt index 55067e7..2b79e90 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/MessageProperties.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/MessageProperties.kt @@ -34,6 +34,7 @@ open class MessageProperties { val AWS_QUEUE_ENABLED = "aws.queueEnabled" val AWS_VALIDATION_SUPPORT = "aws.validationSupport" val CDR_FHIR_SERVER = "cdr.fhirServer" + val LOINC_FHIR_SERVER = "loinc.fhirServer" val NPM_FHIR_SERVER = "npm.fhirServer" val VALIDATION_FHIR_SERVER = "validation.fhirServer" @@ -241,6 +242,9 @@ open class MessageProperties { fun getCdrFhirServer(): String? { return getProperty(CDR_FHIR_SERVER) } + fun getLOINCFhirServer(): String? { + return getProperty(LOINC_FHIR_SERVER) + } fun getNPMFhirServer(): String? { return getProperty(NPM_FHIR_SERVER) } diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/BasicAuthInterceptor.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/BasicAuthInterceptor.kt new file mode 100644 index 0000000..3302b72 --- /dev/null +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/BasicAuthInterceptor.kt @@ -0,0 +1,375 @@ +package uk.nhs.england.fhirvalidator.interceptor + +import ca.uhn.fhir.context.FhirContext + +import ca.uhn.fhir.rest.api.MethodOutcome +import ca.uhn.fhir.rest.client.api.IClientInterceptor +import ca.uhn.fhir.rest.client.api.IHttpRequest +import ca.uhn.fhir.rest.client.api.IHttpResponse +import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException +import ca.uhn.fhir.rest.server.exceptions.UnprocessableEntityException +import com.amazonaws.services.cognitoidp.model.AuthenticationResultType +import org.apache.commons.io.IOUtils +import org.hl7.fhir.dstu3.model.OperationOutcome +import org.hl7.fhir.r4.model.Binary +import org.hl7.fhir.r4.model.Bundle +import org.hl7.fhir.r4.model.Resource +import org.json.JSONObject +import org.json.JSONTokener +import org.springframework.beans.factory.annotation.Qualifier +import uk.nhs.england.fhirvalidator.configuration.FHIRServerProperties +import uk.nhs.england.fhirvalidator.configuration.MessageProperties +import uk.nhs.england.fhirvalidator.model.ResponseObject +import java.io.BufferedReader +import java.io.FileNotFoundException +import java.io.IOException +import java.io.InputStreamReader +import java.net.HttpURLConnection +import java.net.URL +import javax.servlet.http.HttpServletRequest + + +class BasicAuthInterceptor(val messageProperties: MessageProperties, + val fhirServerProperties: FHIRServerProperties, + @Qualifier("R4") val ctx : FhirContext +) : IClientInterceptor { + + var authenticationToken = "a2V2aW5tYXlmaWVsZDpxd2VydHk0OSY=" + + + + override fun interceptRequest(iHttpRequest: IHttpRequest) { + // 10th Oct 2022 use id token instead of access token + iHttpRequest.addHeader("Authorization", "Basic " + authenticationToken) + + } + + override fun interceptResponse(p0: IHttpResponse?) { + + } + + + @Throws(Exception::class) + fun readFromUrl(path: String, queryParams: String?, resourceName: String?): Resource? { + val url = messageProperties.getLOINCFhirServer() + return readFromUrl(url,path, queryParams, resourceName) + } + + @Throws(Exception::class) + fun readFromUrl(url: String?, path: String, queryParams: String?, resourceName: String?): Resource? { + val responseObject = ResponseObject() + var myUrl: URL? = null + myUrl = if (queryParams != null) { + URL("$url$path?$queryParams") + } else { + URL(url + path) + } + var retry = 2 + while (retry > 0) { + val conn = myUrl.openConnection() as HttpURLConnection + + val basicAuth = "Basic "+authenticationToken + conn.setRequestProperty("Authorization", basicAuth) + conn.setRequestProperty("Content-Type", "application/fhir+json") + conn.setRequestProperty("Accept", "application/fhir+json") + + conn.requestMethod = "GET" + + try { + conn.connect() + val `is` = InputStreamReader(conn.inputStream) + try { + val rd = BufferedReader(`is`) + responseObject.responseCode = 200 + var res = IOUtils.toString(rd) + val resource = ctx.newJsonParser().parseResource(res) as Resource + + if (resource is Bundle) { + for (entry in resource.entry) { + entry.fullUrl = fhirServerProperties.server.baseUrl + "/FHIR/R4/"+entry.resource.javaClass.simpleName + "/"+entry.resource.idElement.idPart + } + for (link in resource.link) { + if (link.hasUrl() && resourceName!=null) { + var str : MutableList = link.url.split(resourceName).toMutableList() + if (str.size>1) { + str.removeAt(0) + link.url = fhirServerProperties.server.baseUrl + "/FHIR/R4/" + resourceName + str.joinToString(resourceName) + } else { + link.url = fhirServerProperties.server.baseUrl + "/FHIR/R4/" + resourceName + } + } + } + } + return resource + } finally { + `is`.close() + } + } catch (ex: FileNotFoundException) { + throw ResourceNotFoundException(getErrorStreamMessage(conn, ex)) + } catch (ex: Exception) { + retry-- + if (ex.message != null) { + if (ex.message!!.contains("401") || ex.message!!.contains("403")) { + + + } + } + if (retry == 0) { + throw ResourceNotFoundException(getErrorStreamMessage(conn, ex)) + } + } + } + throw UnprocessableEntityException("Number of retries exhausted") + } + + + @Throws(Exception::class) + fun updatePost(httpRequest : HttpServletRequest, resource : Resource): MethodOutcome { + + val method = MethodOutcome() + method.created = true + val opOutcome = OperationOutcome() + + method.operationOutcome = opOutcome + + val url = messageProperties.getCdrFhirServer() + var myUrl: URL? = null + val queryParams = httpRequest.queryString + val path = httpRequest.pathInfo + myUrl = if (queryParams != null) { + URL("$url$path?$queryParams") + } else { + URL(url + path) + } + var retry = 2 + while (retry > 0) { + val conn = myUrl.openConnection() as HttpURLConnection + + val basicAuth = "Basic " + authenticationToken + conn.setRequestProperty("Authorization", basicAuth) + conn.setRequestProperty("x-api-key", messageProperties.getAwsApiKey()) + conn.setRequestProperty("Content-Type", "application/fhir+json") + conn.setRequestProperty("Accept", "application/fhir+json") + conn.requestMethod = httpRequest.method + conn.setDoOutput(true) + val jsonInputString = ctx.newJsonParser().encodeResourceToString(resource) + try { + conn.getOutputStream().use { os -> + val input = jsonInputString.toByteArray(charset("utf-8")) + os.write(input, 0, input.size) + } + //conn.connect() + val `is` = InputStreamReader(conn.inputStream) + try { + val rd = BufferedReader(`is`) + val postedResource = ctx.newJsonParser().parseResource(IOUtils.toString(rd)) as Resource + if (postedResource != null && postedResource is Resource) { + method.resource = postedResource + } + return method + } finally { + `is`.close() + } + } catch (ex: FileNotFoundException) { + throw ResourceNotFoundException(ex.message) + } catch (ex: Exception) { + retry-- + if (ex.message != null) { + if (ex.message!!.contains("401") || ex.message!!.contains("403")) { + + + } + } + if (retry == 0) { + throw ResourceNotFoundException(getErrorStreamMessage(conn, ex)) + } + } + } + throw UnprocessableEntityException("Number of retries exhausted") + } + + @Throws(Exception::class) + fun postBinaryLocation(resource : Binary): JSONObject { + + var myUrl: URL? = URL(messageProperties.getCdrFhirServer() + "/Binary") + + var retry = 2 + while (retry > 0) { + + val conn = myUrl?.openConnection() as HttpURLConnection + + val basicAuth = "Basic "+authenticationToken + conn.setRequestProperty("Authorization", basicAuth) + conn.setRequestProperty("x-api-key",messageProperties.getAwsApiKey()) + conn.setRequestProperty("Content-Type", "application/fhir+json") + conn.setRequestProperty("Accept", "application/fhir+json") + conn.requestMethod = "POST" + conn.setDoOutput(true) + val jsonInputString = ctx.newJsonParser().encodeResourceToString(resource) + + try { + conn.getOutputStream().use { os -> + val input = jsonInputString.toByteArray(charset("utf-8")) + os.write(input, 0, input.size) + } + //conn.connect() + val `is` = InputStreamReader(conn.inputStream) + try { + val rd = BufferedReader(`is`) + val tokener = JSONTokener(rd) + return JSONObject(tokener) + // json.getString("presignedPutUrl") + } finally { + `is`.close() + } + } catch (ex: Exception) { + retry-- + if (ex.message != null) { + if (ex.message!!.contains("401") || ex.message!!.contains("403")) { + + + } + } + if (retry == 0) { + throw ResourceNotFoundException(getErrorStreamMessage(conn, ex)) + } + } + } + throw UnprocessableEntityException("Number of retries exhausted") + } + + @Throws(Exception::class) + fun getBinaryLocation(path: String): JSONObject { + + val url = messageProperties.getCdrFhirServer() + var myUrl: URL= URL(url + path) + var retry = 2 + while (retry > 0) { + val conn = myUrl.openConnection() as HttpURLConnection + + val basicAuth = "Basic "+authenticationToken + conn.setRequestProperty("Authorization", basicAuth) + conn.setRequestProperty("x-api-key",messageProperties.getAwsApiKey()) + conn.setRequestProperty("Content-Type", "application/fhir+json") + conn.setRequestProperty("Accept", "application/fhir+json") + conn.requestMethod = "GET" + conn.setDoOutput(true) + try { + conn.connect() + val `is` = InputStreamReader(conn.inputStream) + try { + val rd = BufferedReader(`is`) + val tokener = JSONTokener(rd) + return JSONObject(tokener) + } finally { + `is`.close() + } + } catch (ex: Exception) { + retry-- + if (ex.message != null) { + if (ex.message!!.contains("401") || ex.message!!.contains("403")) { + + + } + } + if (retry == 0) { + throw ResourceNotFoundException(getErrorStreamMessage(conn, ex)) + } + } + } + throw UnprocessableEntityException("Number of retries exhausted") + } + + @Throws(Exception::class) + fun postBinary(presignedUrl : String,fileArray : ByteArray) { + + var myUrl: URL? = URL(presignedUrl) + + val conn = myUrl?.openConnection() as HttpURLConnection + + conn.requestMethod = "PUT" + conn.setDoOutput(true) + + return try { + conn.getOutputStream().use { os -> + os.write(fileArray, 0, fileArray.size) + } + //conn.connect() + val `is` = InputStreamReader(conn.inputStream) + try { + val rd = BufferedReader(`is`) + return + } finally { + `is`.close() + } + } catch (ex: FileNotFoundException) { + throw UnprocessableEntityException(ex.message) + } catch (ex: IOException) { + throw UnprocessableEntityException(ex.message) + } + } + + @Throws(Exception::class) + fun getBinary(presignedUrl : String) : HttpURLConnection { + + var myUrl: URL? = URL(presignedUrl) + + val conn = myUrl?.openConnection() as HttpURLConnection + + conn.requestMethod = "GET" + conn.setDoOutput(true) + + return try { + conn.connect() + conn + /* + val inputStream = InputStreamReader(conn.inputStream, "utf-8") + try { + val binary = Binary() + BufferedReader( + inputStream + ).use { br -> + val response = StringBuilder() + var responseLine: String? = null + while (br.readLine().also { responseLine = it } != null) { + response.append(responseLine!!.trim { it <= ' ' }) + } + binary.setData(response.toString().toByteArray()) + } + binary.contentType = conn.getHeaderField("Content-Type"); + return binary + + } finally { + + inputStream.close() + } + */ + } catch (ex: FileNotFoundException) { + throw UnprocessableEntityException(ex.message) + } catch (ex: IOException) { + throw UnprocessableEntityException(ex.message) + } + } + + private fun getErrorStreamMessage(conn: HttpURLConnection, ex: Exception) : String? { + if (conn.errorStream == null) { + if (ex.message == null) return "Unknown Error" + return ex.message + } + val `is` = InputStreamReader(conn.errorStream) + try { + val rd = BufferedReader(`is`) + val resource: Resource = ctx.newJsonParser().parseResource(IOUtils.toString(rd)) as Resource + if (resource != null && resource is org.hl7.fhir.r4.model.OperationOutcome) { + return resource.issueFirstRep.diagnostics + } + } + catch (exOther: Exception) { + throw ex + } finally { + `is`.close() + } + return ex.message + } + +} diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/providerLOINC/QuestionnaireProvider.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/providerLOINC/QuestionnaireProvider.kt new file mode 100644 index 0000000..075f2bc --- /dev/null +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/providerLOINC/QuestionnaireProvider.kt @@ -0,0 +1,49 @@ +package uk.nhs.england.fhirvalidator.providerLOINC + +import ca.uhn.fhir.context.FhirContext +import ca.uhn.fhir.rest.annotation.* +import ca.uhn.fhir.rest.param.StringParam +import ca.uhn.fhir.rest.param.TokenParam +import ca.uhn.fhir.rest.server.IResourceProvider +import mu.KLogging +import org.hl7.fhir.r4.model.* +import org.springframework.beans.factory.annotation.Qualifier +import org.springframework.stereotype.Component +import uk.nhs.england.fhirvalidator.interceptor.BasicAuthInterceptor +import javax.servlet.http.HttpServletRequest + +@Component +class QuestionnaireProvider (@Qualifier("R4") private val fhirContext: FhirContext, + private val basicAuthInterceptor: BasicAuthInterceptor +) : IResourceProvider { + /** + * The getResourceType method comes from IResourceProvider, and must + * be overridden to indicate what type of resource this provider + * supplies. + */ + override fun getResourceType(): Class { + return Questionnaire::class.java + } + + + companion object : KLogging() + + + + @Search + fun search( + httpRequest : HttpServletRequest, + @OptionalParam(name = Questionnaire.SP_URL) url: TokenParam?, + @OptionalParam(name = Questionnaire.SP_TITLE) title: StringParam?, + @OptionalParam(name = "_content") content: StringParam?, + @OptionalParam(name = "_count") count: StringParam? + ): Bundle? { + val resource: Resource? = + basicAuthInterceptor.readFromUrl(httpRequest.pathInfo, httpRequest.queryString, "Patient") + if (resource != null && resource is Bundle) { + return resource + } + return null + } + +} diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 8e58dc7..04e620a 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -17,7 +17,7 @@ fhir: server: name: IOPS FHIR Testing baseUrl: https://3cdzg7kbj4.execute-api.eu-west-2.amazonaws.com/poc/Conformance - version: 6.8.1 + version: 6.8.2 diff --git a/src/main/resources/message.properties b/src/main/resources/message.properties index aad2847..23fe31c 100644 --- a/src/main/resources/message.properties +++ b/src/main/resources/message.properties @@ -35,6 +35,7 @@ aws.queueEnabled=false aws.validationSupport=false cdr.fhirServer=https://cnuc9zdola.execute-api.eu-west-2.amazonaws.com/dev npm.fhirServer=https://3cdzg7kbj4.execute-api.eu-west-2.amazonaws.com/poc/utility +loinc.fhirServer=https://fhir.loinc.org validation.fhirServer=http://localhost:9001 ################################################## From d294003891b54855a9126ef45af272f855419159 Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Tue, 29 Aug 2023 16:21:36 +0100 Subject: [PATCH 05/67] CORS support for LOINC Terminology, added READ --- aws-repo-notes.txt | 4 ++-- pom.xml | 2 +- .../fhirvalidator/providerLOINC/QuestionnaireProvider.kt | 7 ++++++- src/main/resources/application.yaml | 2 +- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/aws-repo-notes.txt b/aws-repo-notes.txt index cdd457b..b8059a6 100644 --- a/aws-repo-notes.txt +++ b/aws-repo-notes.txt @@ -23,11 +23,11 @@ mvn clean install docker build -t fhir-validator-r4 . docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest -docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.8.2 +docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.8.3 docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest -docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.8.2 +docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.8.3 diff --git a/pom.xml b/pom.xml index d1b9b83..5faad60 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ uk.nhs.england IOPS-FHIR-Validation-Service - 6.8.2 + 6.8.3 IOPS-FHIR-Validation-Service HAPI FHIR Validator using Spring Boot diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/providerLOINC/QuestionnaireProvider.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/providerLOINC/QuestionnaireProvider.kt index 075f2bc..78b8d2a 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/providerLOINC/QuestionnaireProvider.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/providerLOINC/QuestionnaireProvider.kt @@ -28,13 +28,18 @@ class QuestionnaireProvider (@Qualifier("R4") private val fhirContext: FhirConte companion object : KLogging() - + @Read + fun read( httpRequest : HttpServletRequest,@IdParam internalId: IdType): Questionnaire? { + val resource: Resource? = basicAuthInterceptor.readFromUrl(httpRequest.pathInfo, null, null) + return if (resource is Questionnaire) resource else null + } @Search fun search( httpRequest : HttpServletRequest, @OptionalParam(name = Questionnaire.SP_URL) url: TokenParam?, @OptionalParam(name = Questionnaire.SP_TITLE) title: StringParam?, + @OptionalParam(name = Questionnaire.SP_CODE) code: TokenParam?, @OptionalParam(name = "_content") content: StringParam?, @OptionalParam(name = "_count") count: StringParam? ): Bundle? { diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 04e620a..82c2565 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -17,7 +17,7 @@ fhir: server: name: IOPS FHIR Testing baseUrl: https://3cdzg7kbj4.execute-api.eu-west-2.amazonaws.com/poc/Conformance - version: 6.8.2 + version: 6.8.3 From 140a41891912b6ef275f0426ec1b68cf5a22603e Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Wed, 30 Aug 2023 07:32:12 +0100 Subject: [PATCH 06/67] UCUM units support for LOINC Panels --- aws-repo-notes.txt | 4 +- pom.xml | 2 +- .../england/fhirvalidator/FHIRLOINCServer.kt | 6 ++ .../provider/CodeSystemProvider.kt | 2 +- .../providerLOINC/CodeSystemLOINCProvider.kt | 87 +++++++++++++++++++ .../providerLOINC/QuestionnaireProvider.kt | 37 +++++++- .../providerLOINC/ValueSetLOINCProvider.kt | 81 +++++++++++++++++ src/main/resources/application.yaml | 2 +- 8 files changed, 214 insertions(+), 7 deletions(-) create mode 100644 src/main/kotlin/uk/nhs/england/fhirvalidator/providerLOINC/CodeSystemLOINCProvider.kt create mode 100644 src/main/kotlin/uk/nhs/england/fhirvalidator/providerLOINC/ValueSetLOINCProvider.kt diff --git a/aws-repo-notes.txt b/aws-repo-notes.txt index b8059a6..c673690 100644 --- a/aws-repo-notes.txt +++ b/aws-repo-notes.txt @@ -23,11 +23,11 @@ mvn clean install docker build -t fhir-validator-r4 . docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest -docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.8.3 +docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.8.4 docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest -docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.8.3 +docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.8.4 diff --git a/pom.xml b/pom.xml index 5faad60..9e68277 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ uk.nhs.england IOPS-FHIR-Validation-Service - 6.8.3 + 6.8.4 IOPS-FHIR-Validation-Service HAPI FHIR Validator using Spring Boot diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRLOINCServer.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRLOINCServer.kt index 1f7af39..9bfd615 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRLOINCServer.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRLOINCServer.kt @@ -11,7 +11,9 @@ import uk.nhs.england.fhirvalidator.configuration.FHIRServerProperties import uk.nhs.england.fhirvalidator.configuration.MessageProperties import uk.nhs.england.fhirvalidator.interceptor.AWSAuditEventLoggingInterceptor import uk.nhs.england.fhirvalidator.interceptor.ValidationInterceptor +import uk.nhs.england.fhirvalidator.providerLOINC.CodeSystemLOINCProvider import uk.nhs.england.fhirvalidator.providerLOINC.QuestionnaireProvider +import uk.nhs.england.fhirvalidator.providerLOINC.ValueSetLOINCProvider import java.util.* import javax.servlet.annotation.WebServlet @@ -20,6 +22,8 @@ class FHIRLOINCServer( @Qualifier("R4") fhirContext: FhirContext, @Autowired(required = false) val sqs : AmazonSQS?, val questionnaireProvider: QuestionnaireProvider, + val codeSystemLOINCProvider: CodeSystemLOINCProvider, + val valueSetLOINCProvider: ValueSetLOINCProvider, val fhirServerProperties: FHIRServerProperties, private val messageProperties: MessageProperties ) : RestfulServer(fhirContext) { @@ -29,6 +33,8 @@ class FHIRLOINCServer( TimeZone.setDefault(TimeZone.getTimeZone("UTC")) registerProvider(questionnaireProvider) + registerProvider(codeSystemLOINCProvider) + registerProvider(valueSetLOINCProvider) val awsAuditEventLoggingInterceptor = AWSAuditEventLoggingInterceptor( diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/CodeSystemProvider.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/CodeSystemProvider.kt index 801fdbe..58f0d35 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/CodeSystemProvider.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/CodeSystemProvider.kt @@ -88,7 +88,7 @@ class CodeSystemProvider (@Qualifier("R4") private val fhirContext: FhirContext, @Operation(name = "\$lookup", idempotent = true) - fun validateCode ( + fun lookup ( @OperationParam(name = "code") code: String?, @OperationParam(name = "system") system: String?, diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/providerLOINC/CodeSystemLOINCProvider.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/providerLOINC/CodeSystemLOINCProvider.kt new file mode 100644 index 0000000..8f967e5 --- /dev/null +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/providerLOINC/CodeSystemLOINCProvider.kt @@ -0,0 +1,87 @@ +package uk.nhs.england.fhirvalidator.providerLOINC + +import ca.uhn.fhir.context.FhirContext +import ca.uhn.fhir.context.support.IValidationSupport +import ca.uhn.fhir.context.support.ValidationSupportContext +import ca.uhn.fhir.rest.annotation.* +import ca.uhn.fhir.rest.api.MethodOutcome +import ca.uhn.fhir.rest.api.server.RequestDetails +import ca.uhn.fhir.rest.param.DateParam +import ca.uhn.fhir.rest.param.TokenParam +import ca.uhn.fhir.rest.server.IResourceProvider +import org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain +import org.hl7.fhir.r4.model.* +import org.hl7.fhir.utilities.npm.NpmPackage +import org.springframework.beans.factory.annotation.Qualifier +import org.springframework.stereotype.Component +import uk.nhs.england.fhirvalidator.awsProvider.AWSCodeSystem +import uk.nhs.england.fhirvalidator.interceptor.BasicAuthInterceptor +import uk.nhs.england.fhirvalidator.interceptor.CognitoAuthInterceptor +import uk.nhs.england.fhirvalidator.service.CodingSupport +import uk.nhs.england.fhirvalidator.service.ImplementationGuideParser +import uk.nhs.england.fhirvalidator.shared.LookupCodeResultUK +import java.nio.charset.StandardCharsets +import javax.servlet.http.HttpServletRequest + +@Component +class CodeSystemLOINCProvider (@Qualifier("R4") private val fhirContext: FhirContext, + private val basicAuthInterceptor: BasicAuthInterceptor +) : IResourceProvider { + /** + * The getResourceType method comes from IResourceProvider, and must + * be overridden to indicate what type of resource this provider + * supplies. + */ + override fun getResourceType(): Class { + return CodeSystem::class.java + } + @Operation(name = "\$lookup", idempotent = true) + fun lookup ( + httpRequest : HttpServletRequest, + @OperationParam(name = "code") code: String?, + @OperationParam(name = "system") system: String? + ) : Parameters? { + val resource: Resource? = basicAuthInterceptor.readFromUrl(httpRequest.pathInfo, httpRequest.queryString, null) + return if (resource is Parameters) resource else null + } + + + @Operation(name = "\$units", idempotent = true) + open fun getUnits(@OperationParam(name = "code") code: String): Parameters { + val coding = Parameters() + val resource: Resource? = basicAuthInterceptor.readFromUrl("/CodeSystem/\$lookup", "system=http://loinc.org&code="+code, null) + if (resource is Parameters) { + val parameters = resource + for ( param in parameters.parameter) { + if (param.hasName() && param.name.equals("property")) { + if (param.hasPart()) { + var isUCUM = false + var unit = "" + for (part in param.part) { + if (part.hasValue()) { + if ((part.value is CodeType) && (part.value as CodeType).code.equals("EXAMPLE_UCUM_UNITS")) { + isUCUM = + true + } + if ((part.value is StringType)) { + unit = + (part.value as StringType).value + } + } + } + if (isUCUM) { + val units = unit.split(";") + for (ut in units) { + coding.parameter.add( + Parameters.ParametersParameterComponent().setValue(StringType().setValue(ut)) + ) + } + } + } + } + } + } + return coding + } + +} diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/providerLOINC/QuestionnaireProvider.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/providerLOINC/QuestionnaireProvider.kt index 78b8d2a..e7599b0 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/providerLOINC/QuestionnaireProvider.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/providerLOINC/QuestionnaireProvider.kt @@ -14,7 +14,8 @@ import javax.servlet.http.HttpServletRequest @Component class QuestionnaireProvider (@Qualifier("R4") private val fhirContext: FhirContext, - private val basicAuthInterceptor: BasicAuthInterceptor + private val basicAuthInterceptor: BasicAuthInterceptor, + private val codeSystemLOINCProvider: CodeSystemLOINCProvider ) : IResourceProvider { /** * The getResourceType method comes from IResourceProvider, and must @@ -31,7 +32,39 @@ class QuestionnaireProvider (@Qualifier("R4") private val fhirContext: FhirConte @Read fun read( httpRequest : HttpServletRequest,@IdParam internalId: IdType): Questionnaire? { val resource: Resource? = basicAuthInterceptor.readFromUrl(httpRequest.pathInfo, null, null) - return if (resource is Questionnaire) resource else null + + if (resource is Questionnaire) { + var questionnaire = resource as Questionnaire + if (questionnaire.hasItem()) getUnits(questionnaire.item) + return questionnaire + } + + return null + } + + private fun getUnits(items: List) { + for (item in items) { + if (item.hasCode() && item.code.size > 0 && item.codeFirstRep.hasSystem() && item.codeFirstRep.system.equals("http://loinc.org")) { + val units = codeSystemLOINCProvider.getUnits(item.codeFirstRep.code) + if (units !== null && units.hasParameter()) { + for (unit in units.parameter) { + if (unit.hasValue() && unit.value is StringType) { + item.initial.add( + Questionnaire.QuestionnaireItemInitialComponent() + .setValue( + Coding().setSystem("http://unitsofmeasure.org").setCode((unit.value as StringType).value)) + ) + item.extension.add( + Extension() + .setUrl("http://hl7.org/fhir/StructureDefinition/questionnaire-unitOption") + .setValue( + Coding().setSystem("http://unitsofmeasure.org").setCode((unit.value as StringType).value)) + ) + } + } + } + } + } } @Search diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/providerLOINC/ValueSetLOINCProvider.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/providerLOINC/ValueSetLOINCProvider.kt new file mode 100644 index 0000000..94686c3 --- /dev/null +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/providerLOINC/ValueSetLOINCProvider.kt @@ -0,0 +1,81 @@ +package uk.nhs.england.fhirvalidator.providerLOINC + +import ca.uhn.fhir.context.FhirContext +import ca.uhn.fhir.context.support.ConceptValidationOptions +import ca.uhn.fhir.context.support.IValidationSupport +import ca.uhn.fhir.context.support.IValidationSupport.CodeValidationResult +import ca.uhn.fhir.context.support.IValidationSupport.ValueSetExpansionOutcome +import ca.uhn.fhir.context.support.ValidationSupportContext +import ca.uhn.fhir.context.support.ValueSetExpansionOptions +import ca.uhn.fhir.rest.annotation.* +import ca.uhn.fhir.rest.api.MethodOutcome +import ca.uhn.fhir.rest.api.server.RequestDetails +import ca.uhn.fhir.rest.client.api.IGenericClient +import ca.uhn.fhir.rest.param.DateParam +import ca.uhn.fhir.rest.param.StringOrListParam +import ca.uhn.fhir.rest.param.StringParam +import ca.uhn.fhir.rest.param.TokenParam +import ca.uhn.fhir.rest.server.IResourceProvider +import ca.uhn.fhir.rest.server.exceptions.UnprocessableEntityException +import mu.KLogging +import org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain +import org.hl7.fhir.instance.model.api.IBaseBundle +import org.hl7.fhir.r4.model.* +import org.springframework.beans.factory.annotation.Qualifier +import org.springframework.security.oauth2.client.OAuth2AuthorizedClientManager +import org.springframework.stereotype.Component +import uk.nhs.england.fhirvalidator.awsProvider.AWSValueSet +import uk.nhs.england.fhirvalidator.configuration.TerminologyValidationProperties +import uk.nhs.england.fhirvalidator.interceptor.BasicAuthInterceptor +import uk.nhs.england.fhirvalidator.interceptor.CognitoAuthInterceptor +import uk.nhs.england.fhirvalidator.service.CodingSupport +import uk.nhs.england.fhirvalidator.util.AccessTokenInterceptor +import uk.nhs.england.fhirvalidator.util.FhirSystems +import java.nio.charset.StandardCharsets +import java.util.* +import javax.servlet.http.HttpServletRequest + +@Component +class ValueSetLOINCProvider( @Qualifier("R4") private val fhirContext: FhirContext, +private val basicAuthInterceptor: BasicAuthInterceptor +) : IResourceProvider { + /** + * The getResourceType method comes from IResourceProvider, and must + * be overridden to indicate what type of resource this provider + * supplies. + */ + override fun getResourceType(): Class { + return ValueSet::class.java + } + companion object : KLogging() + + + + @Read + fun read(httpRequest : HttpServletRequest, @IdParam internalId: IdType): ValueSet? { + val resource: Resource? = basicAuthInterceptor.readFromUrl(httpRequest.pathInfo, null,"ValueSet") + return if (resource is ValueSet) resource else null + } + @Search + fun search(httpRequest : HttpServletRequest, + @OptionalParam(name = ValueSet.SP_URL) url: TokenParam?): Bundle? { + val resource: Resource? = basicAuthInterceptor.readFromUrl(httpRequest.pathInfo, httpRequest.queryString,null) + return if (resource is Bundle) resource else null + } + + + + @Operation(name = "\$expand", idempotent = true) + fun expand( + httpRequest : HttpServletRequest, + @ResourceParam valueSet: ValueSet?, + @OperationParam(name = ValueSet.SP_URL) url: TokenParam?, + @OperationParam(name = "filter") filter: StringParam?, + @OperationParam(name = "includeDesignations") includeDesignations: BooleanType?, + @OperationParam(name = "elements") elements: StringOrListParam?, + @OperationParam(name = "property") property: StringOrListParam?): ValueSet? { + val resource: Resource? = basicAuthInterceptor.readFromUrl(httpRequest.pathInfo, httpRequest.queryString,null) + return if (resource is ValueSet) resource else null + } + +} diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 82c2565..497423e 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -17,7 +17,7 @@ fhir: server: name: IOPS FHIR Testing baseUrl: https://3cdzg7kbj4.execute-api.eu-west-2.amazonaws.com/poc/Conformance - version: 6.8.3 + version: 6.8.4 From 771a7bb5d333188bc4fdceff16e0067168145cf3 Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Wed, 30 Aug 2023 08:14:53 +0100 Subject: [PATCH 07/67] Issue with decimal instead of quantity --- aws-repo-notes.txt | 4 ++-- pom.xml | 2 +- .../fhirvalidator/providerLOINC/QuestionnaireProvider.kt | 4 ++++ src/main/resources/application.yaml | 2 +- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/aws-repo-notes.txt b/aws-repo-notes.txt index c673690..2c6ff47 100644 --- a/aws-repo-notes.txt +++ b/aws-repo-notes.txt @@ -23,11 +23,11 @@ mvn clean install docker build -t fhir-validator-r4 . docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest -docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.8.4 +docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.8.5 docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest -docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.8.4 +docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.8.5 diff --git a/pom.xml b/pom.xml index 9e68277..171b818 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ uk.nhs.england IOPS-FHIR-Validation-Service - 6.8.4 + 6.8.5 IOPS-FHIR-Validation-Service HAPI FHIR Validator using Spring Boot diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/providerLOINC/QuestionnaireProvider.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/providerLOINC/QuestionnaireProvider.kt index e7599b0..b90c45e 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/providerLOINC/QuestionnaireProvider.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/providerLOINC/QuestionnaireProvider.kt @@ -47,6 +47,10 @@ class QuestionnaireProvider (@Qualifier("R4") private val fhirContext: FhirConte if (item.hasCode() && item.code.size > 0 && item.codeFirstRep.hasSystem() && item.codeFirstRep.system.equals("http://loinc.org")) { val units = codeSystemLOINCProvider.getUnits(item.codeFirstRep.code) if (units !== null && units.hasParameter()) { + if (item.type.equals(Questionnaire.QuestionnaireItemType.DECIMAL)) { + // if it has units it is not a decimal + item.type = Questionnaire.QuestionnaireItemType.QUANTITY + } for (unit in units.parameter) { if (unit.hasValue() && unit.value is StringType) { item.initial.add( diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 497423e..2c3aac8 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -17,7 +17,7 @@ fhir: server: name: IOPS FHIR Testing baseUrl: https://3cdzg7kbj4.execute-api.eu-west-2.amazonaws.com/poc/Conformance - version: 6.8.4 + version: 6.8.5 From 71541f64e0bf7745bd090a998753f5e97d97a22f Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Mon, 18 Dec 2023 11:29:54 +0000 Subject: [PATCH 08/67] Fixed issue with PDS OAS conversion and verification. Removed non FHIR Server OAS Controller --- pom.xml | 2 +- .../configuration/OpenApiConfig.kt | 2 +- .../controller/VerifyController.kt | 71 ----------------- .../fhirvalidator/provider/OpenAPIProvider.kt | 76 ++++++++++++++++++- .../fhirvalidator/service/VerifyOAS.kt | 32 ++++++-- ...chedTerminologyServiceValidationSupport.kt | 9 ++- 6 files changed, 108 insertions(+), 84 deletions(-) delete mode 100644 src/main/kotlin/uk/nhs/england/fhirvalidator/controller/VerifyController.kt diff --git a/pom.xml b/pom.xml index 112daec..e257a3e 100644 --- a/pom.xml +++ b/pom.xml @@ -17,7 +17,7 @@ 1.8 1.6.21 - 6.8.0 + 6.10.0 2.1.12 2.0.30 2.15.2 diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt index 6854cdb..36c2447 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt @@ -633,7 +633,7 @@ open class OpenApiConfig(@Qualifier("R4") val ctx : FhirContext) { .addMediaType("application/x-yaml",MediaType().schema(StringSchema())) .addMediaType("application/json",MediaType().schema(StringSchema())))) ) - oas.path("/\$verifyOAS",verifyOASItem) + oas.path("/FHIR/R4/\$verifyOAS",verifyOASItem) val convertToTextItem = PathItem() .post( diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/controller/VerifyController.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/controller/VerifyController.kt deleted file mode 100644 index ec91978..0000000 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/controller/VerifyController.kt +++ /dev/null @@ -1,71 +0,0 @@ -package uk.nhs.england.fhirvalidator.controller - -import ca.uhn.fhir.context.FhirContext -import io.swagger.v3.core.util.Json -import io.swagger.v3.oas.annotations.Hidden -import uk.nhs.england.fhirvalidator.service.VerifyOAS -import uk.nhs.england.fhirvalidator.util.createOperationOutcome -import io.swagger.v3.oas.models.OpenAPI -import io.swagger.v3.parser.OpenAPIV3Parser -import io.swagger.v3.parser.core.models.ParseOptions -import mu.KLogging -import org.hl7.fhir.r4.model.OperationOutcome -import org.springframework.beans.factory.annotation.Qualifier -import org.springframework.web.bind.annotation.* -import uk.nhs.england.fhirvalidator.service.OpenAPIParser -import java.util.* - - -@RestController -@Hidden -class VerifyController( - @Qualifier("R4") private val fhirContext: FhirContext, - private val verifyOAS:VerifyOAS, - private val oasParser : OpenAPIParser - -) { - companion object : KLogging() - - - @PostMapping("convertOAS",produces = ["application/json"]) - fun convert( - @RequestBody input: Optional, - @RequestParam(required = false) url: String? - ): String { - var openAPI : OpenAPI? = null - openAPI = OpenAPIV3Parser().readContents(input.get()).openAPI - return Json.pretty(openAPI) - } - @PostMapping("/\$verifyOAS", produces = ["application/json", "application/x-yaml"]) - fun validate( - @RequestBody input: Optional, - @RequestParam(required = false) url: String? - ): String { - var openAPI : OpenAPI? = null - if (url != null) { - val parseOptions = ParseOptions() - parseOptions.isResolve = true // implicit - // parseOptions.isResolveFully = true - openAPI = OpenAPIV3Parser().readLocation(url,null,parseOptions).openAPI - } - else { - if (input.isPresent) { - openAPI = OpenAPIV3Parser().readContents(input.get()).openAPI - } else { - return fhirContext.newJsonParser().encodeResourceToString(OperationOutcome() - .addIssue(OperationOutcome.OperationOutcomeIssueComponent() - .setSeverity(OperationOutcome.IssueSeverity.FATAL) - .setDiagnostics("If url is not provided, the OAS must be present in the payload"))) - } - } - - if (openAPI !=null) { - val results = verifyOAS.validate(openAPI) - return fhirContext.newJsonParser().encodeResourceToString(createOperationOutcome(results)) - } - - return fhirContext.newJsonParser().encodeResourceToString(OperationOutcome().addIssue(OperationOutcome.OperationOutcomeIssueComponent() - .setSeverity(OperationOutcome.IssueSeverity.FATAL).setDiagnostics("Unable to process OAS"))) - } - -} diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/OpenAPIProvider.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/OpenAPIProvider.kt index c41a0c0..6ba2631 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/OpenAPIProvider.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/OpenAPIProvider.kt @@ -4,20 +4,94 @@ import ca.uhn.fhir.context.FhirContext import ca.uhn.fhir.rest.annotation.Operation import io.swagger.util.Yaml import io.swagger.v3.core.util.Json +import io.swagger.v3.oas.models.OpenAPI +import io.swagger.v3.parser.OpenAPIV3Parser +import io.swagger.v3.parser.core.models.ParseOptions +import io.swagger.v3.parser.core.models.SwaggerParseResult import org.apache.commons.io.IOUtils import org.hl7.fhir.instance.model.api.IBaseResource import org.hl7.fhir.r4.model.CapabilityStatement +import org.hl7.fhir.r4.model.OperationOutcome import org.springframework.beans.factory.annotation.Qualifier import org.springframework.stereotype.Component import uk.nhs.england.fhirvalidator.service.OpenAPIParser +import uk.nhs.england.fhirvalidator.service.VerifyOAS +import uk.nhs.england.fhirvalidator.util.createOperationOutcome import javax.servlet.http.HttpServletRequest import javax.servlet.http.HttpServletResponse @Component class OpenAPIProvider(@Qualifier("R4") private val fhirContext: FhirContext, - private val oasParser : OpenAPIParser + private val oasParser : OpenAPIParser, + private val verifyOAS: VerifyOAS ) { + + @Operation(name = "convertOAS", idempotent = true,manualResponse=true, manualRequest=true) + fun convertOAS( + servletRequest: HttpServletRequest, + servletResponse: HttpServletResponse + ) { + var input = IOUtils.toString(servletRequest.getReader()); + var openAPI : OpenAPI? = null + openAPI = OpenAPIV3Parser().readContents(input).openAPI + servletResponse.writer.write(Json.pretty(openAPI)) + servletResponse.writer.flush() + return + } + + @Operation(name = "verifyOAS", idempotent = true,manualResponse=true, manualRequest=true) + fun verifyOAS( + servletRequest: HttpServletRequest, + servletResponse: HttpServletResponse + ) { + var openAPI : OpenAPI? = null + val parseOptions = ParseOptions() + parseOptions.isResolve = false // implicit + var input = IOUtils.toString(servletRequest.getReader()); + /* + if (url != null) { + + + // parseOptions.isResolveFully = true + openAPI = OpenAPIV3Parser().readLocation(url,null,parseOptions).openAPI + } + else { + + */ + if (input !== null && !input.isEmpty()) { + val result: SwaggerParseResult = + io.swagger.parser.OpenAPIParser().readContents(input, null, parseOptions) + if (result.getMessages() != null) result.getMessages().forEach(System.err::println); // validation errors and warnings + + openAPI = result.openAPI + } else { + servletResponse.writer.write(fhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString( + OperationOutcome() + .addIssue( + OperationOutcome.OperationOutcomeIssueComponent() + .setSeverity(OperationOutcome.IssueSeverity.FATAL) + .setDiagnostics("If url is not provided, the OAS must be present in the payload")))) + servletResponse.writer.flush() + return + } + + + if (openAPI !=null) { + val results = verifyOAS.validate(openAPI) + servletResponse.writer.write(fhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(createOperationOutcome(results))) + servletResponse.writer.flush() + return + } + + servletResponse.writer.write(fhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString( + OperationOutcome().addIssue( + OperationOutcome.OperationOutcomeIssueComponent() + .setSeverity(OperationOutcome.IssueSeverity.FATAL).setDiagnostics("Unable to process OAS")))) + servletResponse.writer.flush() + return + } + @Operation(name = "openapi", idempotent = true,manualResponse=true, manualRequest=true) fun convertOpenAPI( servletRequest: HttpServletRequest, diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/VerifyOAS.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/VerifyOAS.kt index e1a3500..52e443b 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/VerifyOAS.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/VerifyOAS.kt @@ -148,13 +148,31 @@ class VerifyOAS(@Qualifier("R4") private val ctx: FhirContext?, operationIssue.location.add(StringType("OAS: "+apiPaths.key + "/get/" + apiParameter.name+"/schema/type")) } - if (apiParameter.schema is ArraySchema && apiParameter.schema.format.equals("token") && apiParameter.explode) { - val operationIssue = addOperationIssue(outcomes,OperationOutcome.IssueType.CODEINVALID, OperationOutcome.IssueSeverity.ERROR,"For array of format = token, explode should be set to false") - operationIssue.location.add(StringType("OAS: "+apiPaths.key + "/get/" + apiParameter.name+"/schema/type")) - } - if (apiParameter.schema is ArraySchema && apiParameter.schema.format.equals("date") && !apiParameter.explode) { - val operationIssue = addOperationIssue(outcomes,OperationOutcome.IssueType.CODEINVALID, OperationOutcome.IssueSeverity.ERROR,"For array of format = date, explode should be set to true") - operationIssue.location.add(StringType("OAS: "+apiPaths.key + "/get/" + apiParameter.name+"/schema/type")) + if (apiParameter.schema is ArraySchema && apiParameter.schema.format !== null) { + if (apiParameter.schema.format.equals( + "token" + ) && apiParameter.explode + ) { + val operationIssue = addOperationIssue( + outcomes, + OperationOutcome.IssueType.CODEINVALID, + OperationOutcome.IssueSeverity.ERROR, + "For array of format = token, explode should be set to false" + ) + operationIssue.location.add(StringType("OAS: " + apiPaths.key + "/get/" + apiParameter.name + "/schema/type")) + } + if (apiParameter.schema.format.equals( + "date" + ) && !apiParameter.explode + ) { + val operationIssue = addOperationIssue( + outcomes, + OperationOutcome.IssueType.CODEINVALID, + OperationOutcome.IssueSeverity.ERROR, + "For array of format = date, explode should be set to true" + ) + operationIssue.location.add(StringType("OAS: " + apiPaths.key + "/get/" + apiParameter.name + "/schema/type")) + } } } Enumerations.SearchParamType.NUMBER -> { diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/validationSupport/SwitchedTerminologyServiceValidationSupport.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/validationSupport/SwitchedTerminologyServiceValidationSupport.kt index a1e78db..c2a5080 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/validationSupport/SwitchedTerminologyServiceValidationSupport.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/validationSupport/SwitchedTerminologyServiceValidationSupport.kt @@ -5,8 +5,8 @@ import ca.uhn.fhir.context.support.ConceptValidationOptions import ca.uhn.fhir.context.support.IValidationSupport import ca.uhn.fhir.context.support.ValidationSupportContext import ca.uhn.fhir.context.support.ValueSetExpansionOptions +import mu.KLogging import org.hl7.fhir.instance.model.api.IBaseResource -import uk.nhs.england.fhirvalidator.controller.VerifyController import java.util.function.Predicate class SwitchedTerminologyServiceValidationSupport( @@ -15,6 +15,9 @@ class SwitchedTerminologyServiceValidationSupport( private val override: IValidationSupport, private val codeSystemPredicate: Predicate ) : IValidationSupport { + + companion object : KLogging() + override fun getFhirContext(): FhirContext { return fhirContext } @@ -80,11 +83,11 @@ class SwitchedTerminologyServiceValidationSupport( theExpansionOptions: ValueSetExpansionOptions?, theValueSetToExpand: IBaseResource ): IValidationSupport.ValueSetExpansionOutcome? { - VerifyController.logger.info("Switched validation expansion called") + logger.info("Switched validation expansion called") val outcome = default.expandValueSet(theValidationSupportContext, theExpansionOptions, theValueSetToExpand) if (outcome != null && outcome.error == null) return outcome if (outcome != null && outcome.error !== null) { - VerifyController.logger.info(outcome.error) + logger.info(outcome.error) } return override.expandValueSet(theValidationSupportContext, theExpansionOptions, theValueSetToExpand) } From 9672a0a118594a05a271a345a0c77eda495715d3 Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Mon, 18 Dec 2023 11:55:08 +0000 Subject: [PATCH 09/67] Fixed issue with PDS OAS conversion and verification. Removed non FHIR Server OAS Controller --- .../fhirvalidator/provider/OpenAPIProvider.kt | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/OpenAPIProvider.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/OpenAPIProvider.kt index 6ba2631..e96eabc 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/OpenAPIProvider.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/OpenAPIProvider.kt @@ -59,12 +59,11 @@ class OpenAPIProvider(@Qualifier("R4") private val fhirContext: FhirContext, else { */ + val oasResult: SwaggerParseResult; if (input !== null && !input.isEmpty()) { - val result: SwaggerParseResult = - io.swagger.parser.OpenAPIParser().readContents(input, null, parseOptions) - if (result.getMessages() != null) result.getMessages().forEach(System.err::println); // validation errors and warnings + oasResult = io.swagger.parser.OpenAPIParser().readContents(input, null, parseOptions) - openAPI = result.openAPI + openAPI = oasResult.openAPI } else { servletResponse.writer.write(fhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString( OperationOutcome() @@ -79,7 +78,19 @@ class OpenAPIProvider(@Qualifier("R4") private val fhirContext: FhirContext, if (openAPI !=null) { val results = verifyOAS.validate(openAPI) - servletResponse.writer.write(fhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(createOperationOutcome(results))) + var outcome = createOperationOutcome(results) + if (oasResult !== null && oasResult.getMessages() != null) { + oasResult.getMessages().forEach({ + var issue = outcome.addIssue() + issue.setSeverity(OperationOutcome.IssueSeverity.WARNING) + .setDiagnostics("OAS Issues: "+it) + issue.code = OperationOutcome.IssueType.CODEINVALID + } + ) + }; // validation errors and warnings + + + servletResponse.writer.write(fhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(outcome)) servletResponse.writer.flush() return } From 29867e39a0c56c39d6f784da8d58f2f2389bb8a5 Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Mon, 18 Dec 2023 13:38:21 +0000 Subject: [PATCH 10/67] Merged in previous 6.8.5 version --- pom.xml | 2 +- src/main/resources/application.yaml | 2 +- src/main/resources/manifest.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index b841a73..b7d5db9 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ uk.nhs.england IOPS-FHIR-Validation-Service - 6.8.5 + 6.10.0 IOPS-FHIR-Validation-Service HAPI FHIR Validator using Spring Boot diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 2c3aac8..d24bce5 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -17,7 +17,7 @@ fhir: server: name: IOPS FHIR Testing baseUrl: https://3cdzg7kbj4.execute-api.eu-west-2.amazonaws.com/poc/Conformance - version: 6.8.5 + version: 6.10.0 diff --git a/src/main/resources/manifest.json b/src/main/resources/manifest.json index eac6fe6..d971969 100644 --- a/src/main/resources/manifest.json +++ b/src/main/resources/manifest.json @@ -1,7 +1,7 @@ [ { "packageName": "fhir.r4.ukcore.stu3.currentbuild", - "version": "0.0.6-pre-release" + "version": "0.0.7-sprint-7-review" }, { "packageName": "uk.nhsdigital.r4.test", From 5f84561760c4a75ea079172a3b801485e9cbf4e5 Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Mon, 18 Dec 2023 14:03:02 +0000 Subject: [PATCH 11/67] 6.10.0 AWS deployment changes --- aws-repo-notes.txt | 4 ++-- pom.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/aws-repo-notes.txt b/aws-repo-notes.txt index 2c6ff47..32dc678 100644 --- a/aws-repo-notes.txt +++ b/aws-repo-notes.txt @@ -23,11 +23,11 @@ mvn clean install docker build -t fhir-validator-r4 . docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest -docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.8.5 +docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.0 docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest -docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.8.5 +docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.0 diff --git a/pom.xml b/pom.xml index b7d5db9..ee1ca44 100644 --- a/pom.xml +++ b/pom.xml @@ -20,7 +20,7 @@ 6.10.0 2.1.12 2.0.30 - 2.15.2 + 2.15.3 From ca79b80a7e13b0bd43477ff016e048eca33ae55f Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Mon, 18 Dec 2023 14:12:47 +0000 Subject: [PATCH 12/67] 6.10.0 AWS deployment changes --- aws-repo-notes.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/aws-repo-notes.txt b/aws-repo-notes.txt index 32dc678..64adca4 100644 --- a/aws-repo-notes.txt +++ b/aws-repo-notes.txt @@ -25,9 +25,8 @@ docker build -t fhir-validator-r4 . docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.0 -docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest - docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.0 +docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest From 778076f709f992c63995cc43576769fc0d31a141 Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Wed, 20 Dec 2023 06:30:45 +0000 Subject: [PATCH 13/67] Update OpenAPIProvider.kt missing headers --- .../uk/nhs/england/fhirvalidator/provider/OpenAPIProvider.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/OpenAPIProvider.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/OpenAPIProvider.kt index e96eabc..fa28bf6 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/OpenAPIProvider.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/OpenAPIProvider.kt @@ -59,6 +59,8 @@ class OpenAPIProvider(@Qualifier("R4") private val fhirContext: FhirContext, else { */ + servletResponse.setContentType("application/json") + servletResponse.setCharacterEncoding("UTF-8") val oasResult: SwaggerParseResult; if (input !== null && !input.isEmpty()) { oasResult = io.swagger.parser.OpenAPIParser().readContents(input, null, parseOptions) From 86df7d0e42933d229540fee1dbc3c4bff3902c79 Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Fri, 22 Dec 2023 14:55:19 +0000 Subject: [PATCH 14/67] Updated packages. Moved to openjdk23, java 21 and kotlin 1.9 --- Dockerfile | 2 +- aws-repo-notes.txt | 4 ++-- pom.xml | 9 ++++----- src/main/resources/application.yaml | 2 +- src/main/resources/manifest.json | 4 ++-- 5 files changed, 10 insertions(+), 11 deletions(-) diff --git a/Dockerfile b/Dockerfile index 9bf125c..c4822e6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM openjdk:11.0.8 +FROM openjdk:23 VOLUME /tmp diff --git a/aws-repo-notes.txt b/aws-repo-notes.txt index 64adca4..3145ff2 100644 --- a/aws-repo-notes.txt +++ b/aws-repo-notes.txt @@ -23,9 +23,9 @@ mvn clean install docker build -t fhir-validator-r4 . docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest -docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.0 +docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.1 -docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.0 +docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.1 docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest diff --git a/pom.xml b/pom.xml index ee1ca44..4df94af 100644 --- a/pom.xml +++ b/pom.xml @@ -10,13 +10,13 @@ uk.nhs.england IOPS-FHIR-Validation-Service - 6.10.0 + 6.10.1 IOPS-FHIR-Validation-Service HAPI FHIR Validator using Spring Boot - 1.8 - 1.6.21 + 21 + 1.9.22 6.10.0 2.1.12 2.0.30 @@ -219,8 +219,7 @@ org.apache.maven.plugins maven-compiler-plugin - 9 - 9 + ${java.version} diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index d24bce5..28717bb 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -17,7 +17,7 @@ fhir: server: name: IOPS FHIR Testing baseUrl: https://3cdzg7kbj4.execute-api.eu-west-2.amazonaws.com/poc/Conformance - version: 6.10.0 + version: 6.10.1 diff --git a/src/main/resources/manifest.json b/src/main/resources/manifest.json index d971969..9ba4f6c 100644 --- a/src/main/resources/manifest.json +++ b/src/main/resources/manifest.json @@ -4,8 +4,8 @@ "version": "0.0.7-sprint-7-review" }, { - "packageName": "uk.nhsdigital.r4.test", - "version": "2.8.15-prerelease" + "packageName": "fhir.r4.nhsengland.stu1", + "version": "1.1.0" }, { "packageName": "hl7.fhir.uv.sdc", From 9d8165ecf4fe8a930bb3822a12c88aa5704075f7 Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Fri, 22 Dec 2023 14:59:57 +0000 Subject: [PATCH 15/67] Updated packages. Moved to openjdk23, java 21 and kotlin 1.9 --- .../england/fhirvalidator/configuration/MessageProperties.kt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/MessageProperties.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/MessageProperties.kt index 2b79e90..cba6e66 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/MessageProperties.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/MessageProperties.kt @@ -134,10 +134,6 @@ open class MessageProperties { } else value.toInt() } - private fun ?> getPropertyEnum(thePropertyName: String, theEnumType: Class, theDefaultValue: T): T { - val value = getProperty(thePropertyName, theDefaultValue!!.name) - return java.lang.Enum.valueOf(theEnumType, value) as T - } fun getEmailEnabled(): Boolean? { From fd01c0adbc06a541714946b55a3123fba7450241 Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Wed, 3 Jan 2024 12:40:35 +0000 Subject: [PATCH 16/67] Updated packages. Moved to openjdk23, java 21 and kotlin 1.9 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 4df94af..a29fb53 100644 --- a/pom.xml +++ b/pom.xml @@ -15,9 +15,9 @@ HAPI FHIR Validator using Spring Boot - 21 + 20 1.9.22 - 6.10.0 + 6.10.2 2.1.12 2.0.30 2.15.3 From 1082da0f7fa66792cc2403fd428869b0d42f2e4d Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Tue, 9 Jan 2024 12:19:33 +0000 Subject: [PATCH 17/67] Latest HAPI and a demo of NHS England Pathology validation --- aws-repo-notes.txt | 4 +- pom.xml | 2 +- .../configuration/OpenApiConfig.kt | 22 +- .../fhirvalidator/service/VerifyOAS.kt | 2 +- .../util/{FHIRExamples.kt => OASExamples.kt} | 16 +- src/main/resources/OAS/Imaging.json | 560 ++++++++++++++++++ src/main/resources/OAS/PDS.json | 1 + src/main/resources/application.yaml | 2 +- src/main/resources/manifest.json | 17 +- .../uk.pathology.r4-0.0.0-prerelease.tgz | Bin 0 -> 5290 bytes 10 files changed, 599 insertions(+), 27 deletions(-) rename src/main/kotlin/uk/nhs/england/fhirvalidator/util/{FHIRExamples.kt => OASExamples.kt} (51%) create mode 100644 src/main/resources/OAS/Imaging.json create mode 100644 src/main/resources/OAS/PDS.json create mode 100644 src/main/resources/uk.pathology.r4-0.0.0-prerelease.tgz diff --git a/aws-repo-notes.txt b/aws-repo-notes.txt index 3145ff2..e3c95db 100644 --- a/aws-repo-notes.txt +++ b/aws-repo-notes.txt @@ -23,9 +23,9 @@ mvn clean install docker build -t fhir-validator-r4 . docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest -docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.1 +docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.2 -docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.1 +docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.2 docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest diff --git a/pom.xml b/pom.xml index a29fb53..7e1ac1f 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ uk.nhs.england IOPS-FHIR-Validation-Service - 6.10.1 + 6.10.2 IOPS-FHIR-Validation-Service HAPI FHIR Validator using Spring Boot diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt index 36c2447..c641adf 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt @@ -2,7 +2,6 @@ package uk.nhs.england.fhirvalidator.configuration import ca.uhn.fhir.context.FhirContext -import io.swagger.v3.oas.models.ExternalDocumentation import io.swagger.v3.oas.models.OpenAPI import io.swagger.v3.oas.models.Operation import io.swagger.v3.oas.models.PathItem @@ -22,7 +21,7 @@ import io.swagger.v3.oas.models.servers.Server import org.springframework.beans.factory.annotation.Qualifier import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration -import uk.nhs.england.fhirvalidator.util.FHIRExamples +import uk.nhs.england.fhirvalidator.util.OASExamples @Configuration @@ -83,13 +82,13 @@ open class OpenApiConfig(@Qualifier("R4") val ctx : FhirContext) { val examples = LinkedHashMap() examples.put("Patient PDS", - Example().value(FHIRExamples().loadExample("Patient-PDS.json",ctx)) + Example().value(OASExamples().loadFHIRExample("Patient-PDS.json",ctx)) ) examples.put("Encounter converted from HL7 v2", - Example().value(FHIRExamples().loadExample("Encounter-ADTA03.json",ctx)) + Example().value(OASExamples().loadFHIRExample("Encounter-ADTA03.json",ctx)) ) examples.put("Bundle - FHIR Messge example", - Example().value(FHIRExamples().loadExample("Bundle-message.json",ctx)) + Example().value(OASExamples().loadFHIRExample("Bundle-message.json",ctx)) ) val validateItem = PathItem() .post( @@ -622,6 +621,13 @@ open class OpenApiConfig(@Qualifier("R4") val ctx : FhirContext) { oas.path("/FHIR/R4/StructureMap",getPathItem(CONFORMANCE, "StructureMap", "Structure Map", "url" , "http://fhir.nhs.uk/StructureMap/MedicationRepeatInformation-Extension-3to4", "")) + val examplesOAS = LinkedHashMap() + examplesOAS.put("Imaging API", + Example().value(OASExamples().loadOASExample("Imaging.json",ctx)) + ) + examplesOAS.put("PDS API", + Example().value(OASExamples().loadOASExample("PDS.json",ctx)) + ) val verifyOASItem = PathItem() .post( Operation() @@ -630,8 +636,10 @@ open class OpenApiConfig(@Qualifier("R4") val ctx : FhirContext) { .description("This is a proof of concept.") .responses(getApiResponsesRAWJSON()) .requestBody(RequestBody().content(Content() - .addMediaType("application/x-yaml",MediaType().schema(StringSchema())) - .addMediaType("application/json",MediaType().schema(StringSchema())))) + .addMediaType("application/json",MediaType().examples(examplesOAS) + .schema(StringSchema())) + .addMediaType("application/x-yaml",MediaType().schema(StringSchema()))) + ) ) oas.path("/FHIR/R4/\$verifyOAS",verifyOASItem) diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/VerifyOAS.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/VerifyOAS.kt index 52e443b..cb79f85 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/VerifyOAS.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/VerifyOAS.kt @@ -37,7 +37,7 @@ class VerifyOAS(@Qualifier("R4") private val ctx: FhirContext?, val outcomes = mutableListOf() if (openAPI.info.extensions == null || openAPI.info.extensions.get("x-HL7-FHIR-NpmPackages") == null) { - addOperationIssue(outcomes,OperationOutcome.IssueType.BUSINESSRULE, OperationOutcome.IssueSeverity.WARNING, "No FHIR package extension found") + addOperationIssue(outcomes,OperationOutcome.IssueType.BUSINESSRULE, OperationOutcome.IssueSeverity.INFORMATION, "No FHIR package extension found in the OAS specification. This a comment, not an error") .location.add(StringType("OAS: info.extensions.x-HL7-FHIR-NpmPackages")) } for (apiPaths in openAPI.paths) { diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/util/FHIRExamples.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/util/OASExamples.kt similarity index 51% rename from src/main/kotlin/uk/nhs/england/fhirvalidator/util/FHIRExamples.kt rename to src/main/kotlin/uk/nhs/england/fhirvalidator/util/OASExamples.kt index 5c833d5..6c6a0a8 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/util/FHIRExamples.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/util/OASExamples.kt @@ -6,8 +6,8 @@ import com.fasterxml.jackson.databind.ObjectMapper import java.lang.StringBuilder -class FHIRExamples { - public fun loadExample(fileName :String, ctx : FhirContext): JsonNode { +class OASExamples { + public fun loadFHIRExample(fileName :String, ctx : FhirContext): JsonNode { val classLoader = javaClass.classLoader val inputStream = classLoader.getResourceAsStream("Examples/"+fileName) @@ -19,4 +19,16 @@ class FHIRExamples { } + public fun loadOASExample(fileName :String, ctx : FhirContext): JsonNode { + + val classLoader = javaClass.classLoader + val inputStream = classLoader.getResourceAsStream("OAS/"+fileName) + + val jsonStrings = inputStream.bufferedReader().readLines() + var sb = StringBuilder() + for (str in jsonStrings) sb.append(str) + return ObjectMapper().readTree(sb.toString()) + + } + } diff --git a/src/main/resources/OAS/Imaging.json b/src/main/resources/OAS/Imaging.json new file mode 100644 index 0000000..58e284e --- /dev/null +++ b/src/main/resources/OAS/Imaging.json @@ -0,0 +1,560 @@ +{ + "openapi": "3.0.3", + "info": { + "title": "Diagnostic Imaging Report FHIR - FHIR API", + "version": "0.3.0", + "description": "## Overview\n\nThe Diagnostic Imaging Report FHIR API enables you to access a patient's diagnostic imaging reports held within hospital trusts systems in England. \nThis API is part of the wider National Imaging Registry solution in which a national registry of a patient's diagnostic imaging and associated reports \nis held in the [National Record Locator V3.0 API](https://digital.nhs.uk/developer/api-catalogue/national-record-locator-fhir).\n\nIt works like this:\n\n1. Query the [National Record Locator V3.0 Consumer API](https://digital.nhs.uk/developer/api-catalogue/national-record-locator-fhir/v3/consumer) to discover the patient's medical imaging history across England.\n2. Use the URLs from the NRL results to retrieve a diagnostic report (using this API).\n\nThis API can only be used in conjunction with the National Record Locator V3.0. You will first use the [National Record Locator V3.0 Consumer API](https://digital.nhs.uk/developer/api-catalogue/national-record-locator-consumer-fhir) \nto search for pointers to a patient's imaging study reports, then use the information in the search results to retrieve the report from this API. \nThis removes the need for organisations to create duplicate copies of radiology reports across systems and organisations by enabling access to diagnostic imaging report \ninformation directly from the source system in a hospital trust.\n\nThe API provides only the means to retrieve a single radiology report - it does not provide a search interface as you will search for diagnostic imaging studies using the [National Record Locator V3.0 Consumer API](https://digital.nhs.uk/developer/api-catalogue/national-record-locator-fhir/v3/consumer)\n\n### Data availability, timing and quality\n\nNormally, the system which is responsible for publishing details of imaging study reports to the NRL will also be the system which will provide this FHIR API.\nWhen a pointer is published to the NRL, all NRL consumers who have onboarded to consume these pointers will be able to retrieve them immediately. The expectation therefore is that when publishing a pointer, \nthe report will immediately be available for consumption by a consumer. \n\nDuring the Alpha phase, only synthetic data will be conveyed by this API. In live use, data quality will rely upon the data quality of the responsible system.\n\n## Who can use this API\n\nThis API can only be used where there is a legal basis to do so. Make sure you have a valid use case before you go too far with your development. You must demonstrate you have a valid use case as part of digital onboarding.\n\nClient systems must first verify NHS Numbers used in queries. This can be done either directly by\nthe client system, or by taking a feed from an upstream system which has this responsibility. In either case\nNHS Numbers used in queries must be have been verified by one of the following mechanisms:\n\n * The [PDS FHIR API](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-fhir) or the [PDS HL7 V3 API](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-hl7-v3)\n * A Spine Mini Service PDS (SMSP) Provider\n * The [Demographics Batch Service](https://digital.nhs.uk/developer/api-catalogue/demographics-batch-service)\n\nConnecting parties must have an appointed Clinical Safety Officer and undertake a Clinical Safety Assessment to use this API in Beta and beyond.\n\n## API status and roadmap\n\nThis API is [in development](https://digital.nhs.uk/developer/guides-and-documentation/reference-guide#statuses) and will be tested in an Alpha phase before progressing into a Beta phase involving live patient data.\n\nTo see our roadmap, or to suggest, comment or vote on features for this API, see our\n[interactive product backlog](https://nhs-digital-api-management.featureupvote.com/suggestions/483146/diagnostic-imaging-report-api).\n\nIf you have any other queries, [contact us](https://digital.nhs.uk/developer/help-and-support).\n\n## Service level\n\nThis API is a Bronze service, meaning it is operational and supported only during business hours (8am to 6pm),\nMonday to Friday, excluding bank holidays.\n\nFor more details, see [service levels](https://digital.nhs.uk/developer/guides-and-documentation/reference-guide#service-levels).\n\n## Technology\n\nThis API is [RESTful](https://digital.nhs.uk/developer/guides-and-documentation/our-api-technologies#basic-rest).\n\nIt conforms to the [FHIR](https://digital.nhs.uk/developer/guides-and-documentation/our-api-technologies#fhir)\nglobal standard for health care data exchange, specifically to [FHIR R4 (v4.0.1)](https://hl7.org/fhir/r4/), except\nthat it does not support the [capabilities](http://hl7.org/fhir/R4/http.html#capabilities) interaction.\n\nIt includes some country-specific FHIR extensions, which conform to\n[FHIR UK Core](https://digital.nhs.uk/services/fhir-uk-core), specifically\n[fhir.r4.ukcore.stu1 0.5.1](https://simplifier.net/packages/fhir.r4.ukcore.stu1/0.5.1).\n\nYou do not need to know much about FHIR to use this API - FHIR APIs are just RESTful APIs that follow specific rules.\n\nIn particular, resource names are capitalised in camel case and are singular - in this API only the `DiagnosticReport` resource is used. \n\nThere are [libraries and SDKs available](https://digital.nhs.uk/developer/guides-and-documentation/api-technologies-at-nhs-digital#fhir-libraries-and-sdks) to help with FHIR API integration.\n\nWe also have some request and response examples below which you could use as templates for your solution.\n\n## Network access\nThis API is available on the internet.\n\nFor more details see [Network access for APIs](https://digital.nhs.uk/developer/guides-and-documentation/network-access-for-apis).\n\n## Security and authorisation\n\nThis API uses the following access modes:\n\n* [Application-restricted RESTful API - signed JWT authentication](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation/application-restricted-restful-apis-signed-jwt-authentication) (for Integration and Live environments)\n\n## Environments and testing\n\n| Environment | Base URL |\n| ----------------- | ---------------------------------------------------------------------- |\n| Sandbox | `https://sandbox.api.service.nhs.uk/diagnostic-imaging-report/FHIR/R4/` |\n| Integration test | `https://int.api.service.nhs.uk/diagnostic-imaging-report/FHIR/R4/` |\n\n\n### Sandbox testing\n\nOur [sandbox environment](https://digital.nhs.uk/developer/guides-and-documentation/testing#sandbox-testing):\n* is for early developer testing\n* only covers a limited set of scenarios\n* is open access, so does not allow you to test authorisation\n\nFor details of sandbox test scenarios, or to try out the sandbox using our 'Try this API' feature, see the\ndocumentation for each endpoint.\n\nAlternatively, you can try out the sandbox using our Postman collection:\n\n[![Run in Postman](https://run.pstmn.io/button.svg)](https://app.getpostman.com/run-collection/TBC)\n\n### Integration testing\n\nOur [integration test environment](https://digital.nhs.uk/developer/guides-and-documentation/testing#integration-testing):\n\n* is for formal integration testing\n* includes authorisation\n\nIt also includes ready-to-use test data and scenarios. For details [contact us](https://digital.nhs.uk/developer/help-and-support).\n\nFor more details see [integration testing with our RESTful APIs](https://digital.nhs.uk/developer/guides-and-documentation/testing#integration-testing-with-our-restful-apis).\n\n## Onboarding\n\nWhen used beyond the Alpha, you need to get your software approved by us before it can go live with this API. We call this onboarding. The onboarding process can sometimes be quite long, so it is worth planning well ahead.\n\nAs part of this process, you need to demonstrate that you can manage risks and that your software conforms technically with the requirements for this API.\n\nInformation on this page might impact the design of your software. For details, see [Onboarding support information](https://digital.nhs.uk/developer/api-catalogue/diagnostic-imaging-report/onboarding-support-information).\n\nTo understand how our online digital onboarding process works, see [digital onboarding](https://digital.nhs.uk/developer/guides-and-documentation/digital-onboarding#using-the-digital-onboarding-portal).\n\nParticipants in the Alpha will not need to onboard software. The above is provided for information to inform planning beyond Alpha.\n\n## Errors\n\nWe use standard HTTP status codes to show whether an API request succeeded or not. They are usually in the range:\n\n* 200 to 299 if it succeeded, including code 202 if it was accepted by an API that needs to wait for further action\n* 400 to 499 if it failed because of a client error by your application\n* 500 to 599 if it failed because of an error on our server\n\nErrors specific to each API are shown in the Endpoints section, under Response. See our [reference guide](https://digital.nhs.uk/developer/guides-and-documentation/reference-guide#http-status-codes) for more on errors.\n", + "license": { + "name": "MIT License details", + "url": "https://opensource.org/license/mit/" + }, + "contact": { + "name": "NHS Digital API Management", + "url": "https://digital.nhs.uk/developer/help-and-support", + "email": "api.management@nhs.net" + } + }, + "servers": [ + { + "url": "https://sandbox.api.service.nhs.uk/diagnostic-imaging-report/FHIR/R4", + "description": "Sandbox environment." + }, + { + "url": "https://int.api.service.nhs.uk/diagnostic-imaging-report/FHIR/R4", + "description": "Integration test environment." + } + ], + "security": [ + { + "APIKeyAuth": [] + }, + { + "OAuth2": [] + } + ], + "paths": { + "/DiagnosticReport": { + "get": { + "summary": "Get a single diagnostic imaging report", + "operationId": "readDiagnosticReport", + "description": "# Get a single diagnostic imaging report\n\nThis endpoint will return a single [DiagnosticReport](https://simplifier.net/guide/uk-core-implementation-guide-stu2/Home/ProfilesandExtensions/Profile-UKCore-DiagnosticReport?version=1.1.3) FHIR UKCore resource.\n\n## Input \n\n Specify the unique identifier for the report in the URL Path. This URL will normally have been retrieved from the National Record Locator\n\n## Response (Success)\n\nA successful response will contain a single [DiagnosticReport](https://simplifier.net/guide/uk-core-implementation-guide-stu2/Home/ProfilesandExtensions/Profile-UKCore-DiagnosticReport?version=1.1.3).\n\nOnly the following response attributes will be present:\n\n| Attribute | Description |\n| --------- | ----------- |\n| id | The unique identifier for the report as held in the local system |\n| subject | The NHS number of the patient. |\n| identifier | The accession number of the study prefixed with the ODS code of the organisation responsible for the report. Specified in the format {ODS Code}.{Accession Number}. This avoids duplicate identifiers for patient studies. |\n| identifier | The report version identifier. |\n| code | Fixed value of 371525003 taken from the [UKCoreReportCode](https://simplifier.net/packages/fhir.r4.ukcore.stu2/1.1.3/files/2047341/~overview) ValueSet. \n| performer | The organization responsible for issuing the report. Specified as an ODS code. |\n| resultsInterpreter | The GMC number and name of the practitioner responsible for the report’s conclusions and interpretations. |\n| issued | The date/time when the report was issued |\n| conclusion | Free text report contents as stored in the reporting system. |\n\n## Response (Error)\n\nClient (4XX) errors will be returned as a single OperationOutcome resource in the following specific scenarios:\n\n| HTTP Status | Error Code | Description |\n| ----------- | ---------------- | ----------- |\n| 400 | VALIDATION_ERROR | A parameter or value has resulted in a validation error. This may be caused by a missing or invalid header or `id` path parameter |\n| 401 | ACCESS_DENIED | Access Denied |\n| 404 | RESOURCE_NOT_FOUND | The radiology report specified by the `id` path parameter was not found on the server |\n\nThe OperationOutcome resource will contain the following attributes:\n\n| Attribute | Description |\n| --------------------- | ----------- |\n| issue.severity | The severity of the issue taken from the possible values listed at https://hl7.org/fhir/codesystem-issue-severity.html |\n| issue.code | Describes the type of the issue. The system that creates an OperationOutcome SHALL choose the most applicable code from the IssueType value set defined at https://hl7.org/fhir/codesystem-issue-type.html |\n| details.coding.system | Fixed value of https://fhir.hl7.org.uk/CodeSystem/UKCore-SpineErrorOrWarningCode |\n| details.coding.value | A code taken from the set of values defined at https://fhir.hl7.org.uk/CodeSystem/UKCore-SpineErrorOrWarningCode |\n| details.coding.display | The display value associated with the code defined at https://fhir.hl7.org.uk/CodeSystem/UKCore-SpineErrorOrWarningCode |\n| issue.diagnostics | More detailed diagnostic information available to the system at the time of the error. |\n\nThe specific details of the error can be found in the `issue.diagnostics` attribute of the response\n", + "parameters": [ + { + "$ref": "#/components/parameters/id" + }, + { + "$ref": "#/components/parameters/requestId" + }, + { + "$ref": "#/components/parameters/correlationId" + }, + { + "$ref": "#/components/parameters/odsCode" + }, + { + "$ref": "#/components/parameters/reportURL" + } + ], + "responses": { + "200": { + "description": "Successful retrieval of a single diagnostic imaging report", + "content": { + "application/fhir+json": { + "schema": { + "$ref": "#/components/schemas/DiagnosticReport" + }, + "example": { + "resourceType": "DiagnosticReport", + "id": "80d50a66-748e-4328-922f-17fce9d0fc77", + "status": "final", + "identifier": [ + { + "system": "https://example.com/accessionnumber", + "value": "HospitalID.AccessionNumber" + }, + { + "system": "https://example.com/radiologyreportversion", + "value": "1.0" + } + ], + "subject": { + "identifier": { + "system": "https://fhir.nhs.uk/Id/nhs-number", + "value": "1234567892" + }, + "display": "SMITH, John" + }, + "code": { + "coding": [ + { + "system": "http://snomed.info/sct" + }, + { + "code": "371525003" + }, + { + "display": "Clinical procedure report (record artifact)" + } + ] + }, + "performer": { + "identifier": { + "system": "https://fhir.nhs.uk/Id/ods-organisation-code", + "value": "ZZ123456" + }, + "display": "King Charles University Hospital, Testham" + }, + "resultsInterpreter": { + "identifier": { + "system": "https://fhir.hl7.org.uk/Id/gmc-number", + "value": "1234567" + }, + "display": "FICTITIOUS, Ralph" + }, + "issued": "2023-09-07T11:45:41+11:00", + "conclusion": "Normal - no action" + } + } + }, + "headers": { + "X-Correlation-Id": { + "$ref": "#/components/headers/CorrelationId" + }, + "X-Request-Id": { + "$ref": "#/components/headers/RequestId" + } + } + }, + "4XX": { + "description": "A client error as described above", + "content": { + "application/fhir+json": { + "schema": { + "$ref": "#/components/schemas/OperationOutcome" + }, + "example": { + "resourceType": "OperationOutcome", + "issue": [ + { + "severity": "error", + "code": "required", + "details": { + "coding": [ + { + "system": "https://fhir.hl7.org.uk/CodeSystem/UKCore-SpineErrorOrWarningCode" + }, + { + "code": "VALIDATION_ERROR" + }, + { + "display": "A parameter or value has resulted in a validation error" + } + ] + }, + "diagnostics": "The id path parameter was missing from the request." + } + ] + } + } + }, + "headers": { + "X-Correlation-Id": { + "$ref": "#/components/headers/CorrelationId" + }, + "X-Request-Id": { + "$ref": "#/components/headers/RequestId" + } + } + } + } + } + } + }, + "components": { + "schemas": { + "DiagnosticReport": { + "type": "object", + "properties": { + "resourceType": { + "type": "string", + "enum": [ + "DiagnosticReport" + ] + }, + "id": { + "type": "string", + "pattern": "[A-Za-z0-9\\-\\.]{1,64}", + "description": "The logical id of the resource, as used in the URL for the resource. Once assigned, this value never changes." + }, + "identifier": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Identifier" + } + }, + "status": { + "type": "string", + "pattern": "[A-Za-z0-9\\-\\.]{1,64}", + "description": "A value from https://hl7.org/fhir/r4/valueset-diagnostic-report-status.html" + }, + "subject": { + "$ref": "#/components/schemas/NHSNumberReference" + }, + "code": { + "$ref": "#/components/schemas/DiagnosticReportCodeableConcept" + }, + "issued": { + "type": "string", + "pattern": "([0-9]([0-9]([0-9][1-9]|[1-9]0)|[1-9]00)|[1-9]000)-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])T([01][0-9]|2[0-3]):[0-5][0-9]:([0-5][0-9]|60)(\\.[0-9]+)?(Z|(\\+|-)((0[0-9]|1[0-3]):[0-5][0-9]|14:00))", + "description": "Date and time when this version of the report was made in the format YYYY-MM-DDThh:mm:ss.sss+zz:zz (e.g. 2015-02-07T13:28:17.239+02:00 or 2017-01-01T00:00:00Z)." + }, + "performer": { + "$ref": "#/components/schemas/PerformerReference" + }, + "resultsInterpreter": { + "$ref": "#/components/schemas/ResultsInterpreterReference" + }, + "conclusion": { + "type": "string", + "pattern": "[^\\s]+(\\s[^\\s]+)*", + "description": "Clinical conclusion (interpretation) of test results. For radiology domain reports, this will be the free-text report." + } + } + }, + "OperationOutcome": { + "type": "object", + "properties": { + "resourceType": { + "type": "string", + "description": "FHIR Resource Type.", + "default": "OperationOutcome" + }, + "issue": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OperationOutcomeIssue" + }, + "minItems": 1 + } + }, + "required": [ + "resourceType", + "issue" + ] + }, + "OperationOutcomeIssue": { + "type": "object", + "properties": { + "severity": { + "type": "string", + "pattern": "[^\\s]+(\\s[^\\s]+)*", + "description": "Indicates whether the issue indicates a variation from successful processing. The system that creates an OperationOutcome SHALL choose the most applicable code from the IssueSeverity value set defined at https://hl7.org/fhir/codesystem-issue-severity.html" + }, + "code": { + "type": "string", + "pattern": "[^\\s]+(\\s[^\\s]+)*", + "description": "Describes the type of the issue. The system that creates an OperationOutcome SHALL choose the most applicable code from the IssueType value set defined at https://hl7.org/fhir/codesystem-issue-type.html, and may additional provide its own code for the error in the details element." + }, + "details": { + "$ref": "#/components/schemas/OperationOutcomeCodeableConcept" + }, + "diagnostics": { + "type": "string", + "pattern": "[ \\r\\n\\t\\S]+", + "description": "Additional diagnostic information about the issue." + } + }, + "required": [ + "severity", + "code" + ] + }, + "OperationOutcomeCodeableConcept": { + "type": "object", + "properties": { + "coding": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OperationOutcomeCoding" + } + } + } + }, + "OperationOutcomeCoding": { + "type": "object", + "properties": { + "system": { + "type": "string", + "description": "Fixed value of `https://fhir.hl7.org.uk/CodeSystem/UKCore-SpineErrorOrWarningCode`" + }, + "code": { + "type": "string", + "description": "Value from ValueSet listed at https://simplifier.net/packages/fhir.r4.ukcore.stu2/1.1.3/files/2047077" + }, + "display": { + "type": "string", + "description": "Definition assocatiated with the value https://simplifier.net/packages/fhir.r4.ukcore.stu2/1.1.3/files/2047077" + } + } + }, + "DiagnosticReportCodeableConcept": { + "type": "object", + "properties": { + "coding": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DiagnosticReportCoding" + } + } + } + }, + "DiagnosticReportCoding": { + "type": "object", + "properties": { + "system": { + "type": "string", + "description": "Fixed value of `http://snomed.info/sct`" + }, + "code": { + "type": "string", + "description": "Fixed value of `371525003`" + }, + "display": { + "type": "string", + "description": "Fixed value of `Clinical procedure report (record artifact)`" + } + } + }, + "Identifier": { + "type": "object", + "properties": { + "system": { + "type": "string", + "pattern": "\\S*", + "description": "Establishes the namespace for the value – that is, a URL that describes a set values that are unique." + }, + "value": { + "type": "string", + "pattern": "[ \\r\\n\\t\\S]+", + "description": "Accession number identifier values are prefixed with the ODS Code of the organisation responsible for the production of the report. They are specified in the format {ODS Code}.{Accession Number}'" + } + } + }, + "NHSNumberIdentifier": { + "type": "object", + "properties": { + "system": { + "type": "string", + "pattern": "\\S*", + "description": "Fixed value of `https://fhir.nhs.uk/Id/nhs-number`" + }, + "value": { + "type": "string", + "pattern": "[ \\r\\n\\t\\S]+", + "description": "The NHS Number" + } + } + }, + "ResultsInterpreterIdentifier": { + "type": "object", + "properties": { + "system": { + "type": "string", + "pattern": "\\S*", + "description": "Fixed value of `https://fhir.hl7.org.uk/Id/gmc-number`." + }, + "value": { + "type": "string", + "description": "The GMC number of the reporting practitioner" + } + } + }, + "OrganisationIdentifier": { + "type": "object", + "properties": { + "system": { + "type": "string", + "pattern": "\\S*", + "description": "Fixed value of `https://fhir.nhs.uk/Id/ods-organisation-code`." + }, + "value": { + "type": "string", + "pattern": "[ \\r\\n\\t\\S]+", + "description": "The ODS Code" + } + } + }, + "ResultsInterpreterReference": { + "type": "object", + "properties": { + "identifier": { + "$ref": "#/components/schemas/ResultsInterpreterIdentifier" + }, + "display": { + "type": "string", + "pattern": "[ \\r\\n\\t\\S]+", + "description": "The name of the practitioner in the format `SURNAME, forenames`." + } + } + }, + "PerformerReference": { + "type": "object", + "properties": { + "identifier": { + "$ref": "#/components/schemas/OrganisationIdentifier" + }, + "display": { + "type": "string", + "pattern": "[ \\r\\n\\t\\S]+", + "description": "The name of the organisation." + } + } + }, + "NHSNumberReference": { + "type": "object", + "properties": { + "identifier": { + "$ref": "#/components/schemas/NHSNumberIdentifier" + }, + "display": { + "type": "string", + "pattern": "[ \\r\\n\\t\\S]+", + "description": "Name of the patient for display purposes, in the format `SURNAME, forenames`" + } + } + }, + "DiagnosticReportId": { + "type": "string", + "pattern": "[A-Za-z0-9\\-\\.]{1,64}" + }, + "BackEndURL": { + "type": "string", + "pattern": "(http(s)?:\\/\\/.)?(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%_\\+.~#?&=]*)" + }, + "RequestHeaderOdsCode": { + "type": "string" + }, + "RequestHeaderRequestId": { + "type": "string", + "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + "example": "60E0B220-8136-4CA5-AE46-1D97EF59D068" + }, + "RequestHeaderCorrelationId": { + "type": "string", + "example": "11C46F5F-CDEF-4865-94B2-0EE0EDCC26DA" + } + }, + "securitySchemes": { + "APIKeyAuth": { + "type": "apiKey", + "name": "API Key (for sandbox only)", + "in": "query" + }, + "OAuth2": { + "type": "oauth2", + "description": "For Integration and Live environments. OAuth2 client credentials flow with signed JWT for authentication. For more information, see: https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation/application-restricted-restful-apis-signed-jwt-authentication", + "flows": { + "clientCredentials": { + "tokenUrl": "https://example.com/token", + "refreshUrl": "https://example.com/token", + "scopes": {} + } + } + } + }, + "parameters": { + "id": { + "name": "id", + "in": "query", + "required": true, + "description": "logical identifier of the diagnostic report", + "schema": { + "$ref": "#/components/schemas/DiagnosticReportId" + }, + "examples": { + "valid": { + "summary": "Valid", + "value": "ea83fd3f-d71e-421f-9a9f-5b69127a77b7" + }, + "invalid": { + "summary": "Invalid as empty", + "value": null + } + } + }, + "odsCode": { + "name": "NHSD-End-User-Organisation-ODS", + "description": "ODS Code for Organisation as defined at https://www.datadictionary.nhs.uk/attributes/organisation_identifier.html", + "in": "header", + "schema": { + "$ref": "#/components/schemas/RequestHeaderOdsCode" + }, + "required": true, + "examples": { + "valid": { + "summary": "Valid", + "value": "Y05868" + }, + "invalid": { + "summary": "Invalid ODS code (should be minimum of 3 and maximum of 8 characters)", + "value": "XY" + } + } + }, + "reportURL": { + "name": "NHSE-NRL-Pointer-URL", + "description": "The URL of the report at the local report API. This is the URL which the national report API proxy will call. The client will have previously queried the NRL V3.0 Consumer API for a patient's imaging report history and will have extracte this URL from the results.", + "in": "header", + "schema": { + "$ref": "#/components/schemas/BackEndURL" + }, + "required": true, + "examples": { + "valid": { + "summary": "Valid", + "value": "https://an-ris-system.org.nhs.uk/some-path/FHIR/R4/DiagnosticReport?id=c9d0e5e3-ac48-4285-8f9c-af9b30d235f1" + }, + "invalid": { + "summary": "Invalid as URL is not resolvable", + "value": "some-path/FHIR/R4/DiagnosticReport?id=c9d0e5e3-ac48-4285-8f9c-af9b30d235f1" + } + } + }, + "requestId": { + "name": "X-Request-ID", + "description": "A globally unique identifier (GUID) for the request, which can be used to trace the request if you contact our helpdesk.\n\nMust be a universally unique identifier (UUID) (ideally version 4).\n\nMirrored back in a response header.\n", + "in": "header", + "required": false, + "schema": { + "$ref": "#/components/schemas/RequestHeaderRequestId" + } + }, + "correlationId": { + "name": "X-Correlation-ID", + "description": "An optional ID which you can use to track transactions across multiple systems, and we use to de-duplicate repeated requests and to trace the request if you contact our helpdesk.\n\nIf you re-send a failed request please re-send this ID in the header.\n\nIt can take any value, but we recommend avoiding `.` characters.\n\nMirrored back in a response header.\n", + "in": "header", + "required": false, + "schema": { + "$ref": "#/components/schemas/RequestHeaderCorrelationId" + } + } + }, + "headers": { + "CorrelationId": { + "schema": { + "type": "string", + "example": "11C46F5F-CDEF-4865-94B2-0EE0EDCC26DA", + "description": "The X-Correlation-ID from the request header, if supplied, mirrored back.\n" + } + }, + "RequestId": { + "schema": { + "type": "string", + "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + "example": "60E0B220-8136-4CA5-AE46-1D97EF59D068", + "description": "The X-Request-ID from the request header, if supplied, mirrored back.\n" + } + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/OAS/PDS.json b/src/main/resources/OAS/PDS.json new file mode 100644 index 0000000..bc33d34 --- /dev/null +++ b/src/main/resources/OAS/PDS.json @@ -0,0 +1 @@ +{"openapi":"3.0.0","info":{"version":"v1.2.2156-beta","title":"Personal Demographics Service (FHIR) API","description":"## Overview \nUse this API to access the [Personal Demographics Service (PDS)](https://digital.nhs.uk/services/demographics) - the national electronic database of NHS patient details such as name, address, date of birth, related people, registered GP and NHS number.\n\nYou can:\n* search for patients\n* get patient details\n* update patient details\n* verify an NHS number for a patient\n\nYou cannot currently use this API to:\n* create a new record for a birth - use [PDS HL7 V3 API](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-hl7-v3)\n* receive birth notifications - use [PDS HL7 V3 API](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-hl7-v3) or [PDS Notifications FHIR API](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-notifications-fhir) \n* create a record for a new patient - use [PDS HL7 V3 API](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-hl7-v3)\n* register a new patient at a GP Practice - use [NHAIS GP Links API](https://digital.nhs.uk/developer/api-catalogue/nhais-gp-links)\n* receive patient death notifications - use [PDS Notifications FHIR API](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-notifications-fhir) \n* receive notifications about a patient's change of address - use [PDS Notifications FHIR API](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-notifications-fhir) \n* receive notifications about a patient's change of GP - use [PDS Notifications FHIR API](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-notifications-fhir) \n* receive notifications about any PDS record change - use [PDS Notifications FHIR API](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-notifications-fhir) \n\nYou can read and update the following data:\n* NHS number (read only)\n* name\n* gender\n* addresses and contact details\n* birth information\n* death information\n* registered GP\n* nominated pharmacy\n* dispensing doctor pharmacy\n* medical appliance supplier pharmacy\n* related people, such as next of kin (read only - update coming soon)\n\n### Patients included in PDS\nRegardless of nationality, or where they live now, PDS includes all patients who have ever been registered with a GP practice, or treated by a health or care organisation (even as a visitor or migrant) in England, Wales, the Isle of Man, or in a UK Defence Medical Services unit anywhere in the world. \n\nAll patients in PDS have an NHS number which is unique. The 10-digit NHS number is used in England, Wales, the Isle of Man, Scotland and Northern Ireland, but not the Channel Islands. Scotland and Northern Ireland have their own distinct number ranges.\n\n### Access modes\nThis API has three access modes:\n\n| Access mode | Functions | Availability |\n| ------------------------------ | ------------------ | ------------ |\n| [Application-restricted access](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation#application-restricted-apis) |Search for a patient (single result).
Get patient details. | Available in production ([stable](https://digital.nhs.uk/developer/guides-and-documentation/reference-guide#api-status)) |\n| [Healthcare worker access](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation#user-restricted-apis) |Search for patients (multiple results).
Get patient details.
Update patient details. | Available in production ([beta](https://digital.nhs.uk/developer/guides-and-documentation/reference-guide#api-status)) |\n| [Patient access](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation#user-restricted-apis) |Get own details.
Update own details (limited). | Available in production ([beta](https://digital.nhs.uk/developer/guides-and-documentation/reference-guide#api-status)) |\n\nFor further details about the access modes for this API, see [Security and authorisation](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-fhir#api-description__security-and-authorisation) below.\n\n## Who can use this API\nThis API can only be used where there is a [legal basis](http://digital.nhs.uk/services/demographics/access-data-on-the-personal-demographics-service) to do so. Make sure you have a valid use case before you go too far with your development. You must demonstrate you have a [valid use case](https://digital.nhs.uk/services/demographics/access-data-on-the-personal-demographics-service) as part of digital onboarding. \n\nYou must do this before you can go live (see ‘Onboarding’ below).\n\n### Who can access PDS records\nHealth and care organisations in England and the Isle of Man can access PDS records. Legitimate direct care examples include NHS organisations delivering healthcare, local authorities delivering care, third sector and private sector health and care organisations, and developers delivering systems to health and care organisations. \n\nHealth and care organisations in Wales access their own version of PDS called the Welsh Demographics Service (WDS) which is connected to PDS behind the scenes. \n\nHealth and care organisations in Scotland, Northern Ireland and the Channel Islands access their own equivalents of PDS.\n\nPatients who receive health and social care or make use of NHS services in England, Wales, the Isle of Man, Scotland, Northern Ireland and the Channel Islands.\n\n### Existing API users\nTo find out which healthcare software development organisations and products are already using this API, see [PDS FHIR API - integrated products](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-fhir/integrated-products).\n\n## Related APIs\nThe following APIs also give access to the Personal Demographics Service:\n- [Personal Demographics Service (SMSP) API](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-smsp) - this API is now deprecated.\n- [Personal Demographics Service (HL7 V3) API](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-hl7-v3) - use this if you want to use functions that are not yet available on the FHIR API, such as creating a new record for a birth, receiving birth notifications, or creating a record for a new patient (except when registering a new patient at a GP Practice, use [NHAIS](https://digital.nhs.uk/services/nhais)). For birth notifications, another option is [PDS Notifications - FHIR API](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-notifications-fhir).\n\nOnce our roadmap is complete, the above APIs will become redundant.\n\nThe following APIs are also related to this API:\n- [Personal Demographics Service Notifications - FHIR API](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-notifications-fhir) - use this to subscribe to be notified of a set of patient record changes, including any record update, birth, death, change of address and change of GP.\n- [Organisation Data Service FHIR API](https://developer.nhs.uk/apis/ods/) - use this to get full details for the organisations related to the patient, such as their registered GP or nominated pharmacy.\n- [Ordnance Survey (OS Places) API](https://digital.nhs.uk/developer/api-catalogue/ordnance-survey-places-api) - use this to identify, look up and verify addresses prior to a PDS update.\n\n## API status and roadmap\n### Application-restricted access\nThis access mode is [in production](https://digital.nhs.uk/developer/guides-and-documentation/reference-guide#statuses):\n* you should strongly consider it as the primary choice for PDS integration\n* we do not make routine breaking changes, if it cannot be avoided, for example, for security reasons, we will give advance notice\n \n### Healthcare worker access\nThis access mode is [in production, beta](https://digital.nhs.uk/developer/guides-and-documentation/reference-guide#statuses), meaning:\n- we might make breaking changes, but only if we cannot avoid it, and we will give advance notice\n\nIf you would like to be involved in our beta programme, [contact us](https://digital.nhs.uk/developer/help-and-support).\n \n### Patient access\nThis access mode is [in production, beta](https://digital.nhs.uk/developer/guides-and-documentation/reference-guide#statuses), meaning:\n- we might make breaking changes, but only if we cannot avoid it, and we will give advance notice\n\nIf you would like to be involved in our beta programme, [contact us](https://digital.nhs.uk/developer/help-and-support).\n\n### Roadmap\nTo see our roadmap, or to suggest, comment or vote on features for this API, see our [interactive product backlog](https://nhs-digital-api-management.featureupvote.com/?order=popular&filter=allexceptdone&tag=pds-fhir-api).\n\nIf you have any other queries, please [contact us](https://digital.nhs.uk/developer/help-and-support).\n\n## Service level\n\nThis API is a platinum service, meaning it is operational and supported 24 hours a day, 365 days a year.\n\nFor more details, see [service levels](https://digital.nhs.uk/developer/guides-and-documentation/reference-guide#service-levels).\n\n## Technology\nThis API is [RESTful](https://digital.nhs.uk/developer/guides-and-documentation/our-api-technologies#basic-rest).\n\nIt conforms to the [FHIR](https://digital.nhs.uk/developer/guides-and-documentation/our-api-technologies#fhir) global standard for health care data exchange, specifically to [FHIR R4 (v4.0.1)](https://hl7.org/fhir/r4/), except that it does not support the [capabilities](http://hl7.org/fhir/R4/http.html#capabilities) interaction.\n\nIt includes some country-specific FHIR extensions, which are built against [FHIR UK Core](https://digital.nhs.uk/services/fhir-uk-core), specifically [UK.core.r4 1.0.0](https://simplifier.net/packages/uk.core.r4/1.0.0).\n\nYou do not need to know much about FHIR to use this API - FHIR APIs are just RESTful APIs that follow specific rules.\nIn particular:\n- resource names are capitalised and singular, for example `/Patient` not `/patients`\n- array names are singular, for example `line` not `lines` for address lines\n- data items that are country-specific and thus not included in the FHIR global base resources are usually wrapped in an `extension` object\n\nThere are [libraries and SDKs available](https://digital.nhs.uk/developer/guides-and-documentation/api-technologies-at-nhs-digital#fhir-libraries-and-sdks) to help with FHIR API integration.\n\n## Network access\nThis API is available on the internet and, indirectly, on the [Health and Social Care Network (HSCN)](https://digital.nhs.uk/services/health-and-social-care-network).\n\nTo use this API with [NHS smartcards](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation/nhs-smartcards-for-developers), the end user needs an HSCN connection, although internet-facing alternatives to smartcards are available.\n\nFor more details see [Network access for APIs](https://digital.nhs.uk/developer/guides-and-documentation/network-access-for-apis).\n\n## Security and authorisation\n\nThis API has three access modes:\n- application-restricted access\n- healthcare worker access\n- patient access\n\n### Application-restricted access\nUse this access mode if you need to:\n* search for a patient – and only get a result if there is a unique match\n* get a single patient's details\n\nThis access mode is [application-restricted](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation#application-restricted-apis), meaning we authenticate the calling application but not the end user.\n\nThe end user could be:\n* a healthcare worker - in which case you must ensure they are authenticated and suitably authorised locally\n* a patient - in which case you must ensure they are authenticated locally\n* not present at all - for example as part of a back end process to check NHS numbers for data flowing from one system to another\n\nTo use this access mode, use the following security pattern:\n* [Application-restricted RESTful API - signed JWT authentication](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation/application-restricted-restful-apis-signed-jwt-authentication)\n\n### Healthcare worker access\nUse this access mode if the end user is a healthcare worker and you need to: \n* search for patients – and be able to present a list of matches for the user to choose from \n* get patient details \n* update patient details \n\nThis access mode is [user-restricted](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation#user-restricted-apis), meaning an end user must be present, authenticated and authorised.\n\nThe end user must be:\n* a healthcare worker\n* strongly authenticated, using either an [NHS smartcard or a modern alternative](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation/nhs-smartcards-for-developers)\n* authorised, using [national role-based access control (RBAC)](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation/national-rbac-for-developers)\n\nTo use this access mode, use one of the following security patterns:\n\n|\tSecurity pattern\t\t |\tTechnical details\t |\tAdvantages | Disadvantages |\n|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ---------------------------------------------------------| -------------------------------------------------------------------------|---------------------------------------------------------------------------|\n|[NHS CIS2 - combined authentication and authorisation](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation/user-restricted-restful-apis-nhs-cis2-combined-authentication-and-authorisation) |OAuth 2.0 authorisation code flow with API key and secret |No need to integrate and onboard separately with NHS CIS2. |No access to user information.
Not recommended for use in GP software. |\n|[NHS CIS2 - separate authentication and authorisation](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation/user-restricted-restful-apis-nhs-cis2-separate-authentication-and-authorisation) |OAuth 2.0 token exchange with signed JWT |Gives access to user information.
Recommended for use in GP software. |Need to integrate and onboard separately with NHS CIS2. |\n\n### Patient access\nUse this access mode if the end user is a patient and you need to: \n* get the patient’s own details\n* update the patient’s own details\n\nThis access mode is [user-restricted](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation#user-restricted-apis), meaning an end user must be present, authenticated and authorised.\n\nThe end user must be:\n* a patient who receives health and social care or makes use of NHS services\n* strongly authenticated, using [NHS login](https://digital.nhs.uk/services/nhs-login)\n\nTo use this access mode, use one of the following security patterns:\n\n|\tSecurity pattern\t\t |\tTechnical details\t |\tAdvantages\t | Disadvantages |\n|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ----------------------------------------------------| ------------------------------------------------------------|---------------------------------------------------------|\n|[NHS login - combined authentication and authorisation](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation/user-restricted-restful-apis-nhs-login-combined-authentication-and-authorisation) |OAuth 2.0 authorisation code with API key and secret |No need to integrate and onboard separately with NHS login. |No access to user information. |\n|[NHS login - separate authentication and authorisation](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation/user-restricted-restful-apis-nhs-login-separate-authentication-and-authorisation) |OAuth 2.0 token exchange with signed JWT |Gives access to user information. |Need to integrate and onboard separately with NHS login. |\n\n## Errors\nWe use standard HTTP status codes to show whether an API request succeeded or not. They are usually in the range:\n\n* 200 to 299 if it succeeded, including code 202 if it was accepted by an API that needs to wait for further action\n* 400 to 499 if it failed because of a client error by your application\n* 500 to 599 if it failed because of an error on our server\n\nErrors specific to each API are shown in the Endpoints section, under Response. See our [reference guide](https://digital.nhs.uk/developer/guides-and-documentation/reference-guide#http-status-codes) for more on errors.\n\n## Open source\nYou might find the following [open source](https://digital.nhs.uk/developer/guides-and-documentation/reference-guide#open-source) resources useful:\n\n| Resource | Description | Links |\n|---------------------------|----------------------------------------------------------------------|--------------------------------------------------------------------------------|\n| PDS FHIR API | Source code for the API proxy, sandbox and specification. | [GitHub repo](https://github.com/NHSDigital/personal-demographics-service-api) |\n| FHIR libraries and SDKs | Various open source libraries for integrating with FHIR APIs. | [FHIR libraries and SDKs](https://digital.nhs.uk/developer/guides-and-documentation/api-technologies-at-nhs-digital#fhir-libraries-and-sdks) |\n| nhs-number | Python package containing utilities for NHS numbers including validity checks, normalisation and generation. | [GitHub repo](https://github.com/uk-fci/nhs-number) \\| [Python Package index](https://pypi.org/project/nhs-number/) \\| [Docs](https://nhs-number.uk-fci.tech/) |\n\nWe currently don't have any open source client libraries or sample code for this API. If you think this would be useful, you can [upvote the suggestion on our Interactive Product Backlog](https://nhs-digital-api-management.featureupvote.com/suggestions/107439/client-libraries-and-reference-implementations).\n\nThe source code for the PDS FHIR back end (the Core Spine source code) is not currently in the open. If you think this would be useful, you can [upvote the suggestion on our Interactive Product Backlog](https://nhs-digital-api-management.featureupvote.com/suggestions/466692/open-source-core-spine-including-pds-eps-scr-and-more).\n\n## Environments and testing\n\n| Environment | Base URL |\n| ----------------- | ---------------------------------------------------------------------- |\n| Sandbox | `https://sandbox.api.service.nhs.uk/personal-demographics/FHIR/R4/` |\n| Integration test | `https://int.api.service.nhs.uk/personal-demographics/FHIR/R4/` |\n| Production | `https://api.service.nhs.uk/personal-demographics/FHIR/R4/` |\n\n### Sandbox testing\nOur [sandbox environment](https://digital.nhs.uk/developer/guides-and-documentation/testing#sandbox-testing):\n* is for early developer testing\n* only covers a limited set of scenarios\n* is stateless, so does not actually persist any updates\n* is open access, so does not allow you to test authorisation\n\nFor details of sandbox test scenarios, or to try out the sandbox using our 'Try this API' feature, see the documentation for each endpoint.\n\nAlternatively, you can try out the sandbox using our Postman collection:\n\n[![Run in Postman](https://run.pstmn.io/button.svg)](https://app.getpostman.com/run-collection/14719036-953f067f-30b9-4552-8252-7cc10b21dad3)\n\n### Integration testing\nOur [integration test environment](https://digital.nhs.uk/developer/guides-and-documentation/testing#integration-testing):\n* is for formal integration testing\n* is stateful, so persists updates\n* includes authorisation, with options for user-restricted access (with or without [smartcards](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation/nhs-smartcards-for-developers) and application-restricted access\n \nFor read-only testing, you can either use our [PDS FHIR API test data packs](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-fhir/pds-fhir-api-test-data) or set up your own test data.\n\nTo test updating patient details, you must set up your own test data.\n\nFor more details see [integration testing with our RESTful APIs](https://digital.nhs.uk/developer/guides-and-documentation/testing#integration-testing-with-our-restful-apis).\n\n### Production smoke testing\nYou must not use real patient data for smoke testing in the production environment.\n\nRather, use our [production test patient](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-fhir/pds-fhir-api-test-data#production-smoke-testing).\n\n## Onboarding\nYou need to get your software approved by us before it can go live with this API. We call this onboarding. The onboarding process can sometimes be quite long, so it’s worth planning well ahead.\n\nAs part of this process, you need to demonstrate your technical conformance to the requirements for this API. For more details according to your access mode, see:\n* [PDS FHIR API technical conformance - application-restricted access mode](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-fhir/pds-fhir-technical-conformance---application-restricted-access-mode)\n* [PDS FHIR API technical conformance - healthcare worker access mode](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-fhir/pds-fhir-technical-conformance---healthcare-worker-access-mode)\n\nYou also need to demonstrate that you can manage risks. This might impact the design of your software. For details, see [Onboarding support information](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-fhir/onboarding-support-information).\n\nTo understand how our online digital onboarding process works, see [digital onboarding](https://digital.nhs.uk/developer/guides-and-documentation/digital-onboarding). \n\n
\n
\n
\n
\n \n \"\"\n \n
\n
\n
\n

To get started, sign in or create a developer account, then select 'product onboarding'.

\n
\n
\n
\n","contact":{"name":"Personal Demographics Service FHIR API Support","url":"https://digital.nhs.uk/developer/help-and-support","email":"ssd.nationalservicedesk@nhs.net"}},"servers":[{"url":"https://sandbox.api.service.nhs.uk/personal-demographics/FHIR/R4","description":"Sandbox environment."},{"url":"https://int.api.service.nhs.uk/personal-demographics/FHIR/R4","description":"Integration test environment."},{"url":"https://api.service.nhs.uk/personal-demographics/FHIR/R4","description":"Production environment."}],"paths":{"/Patient":{"parameters":[{"in":"header","name":"Authorization","description":"An [OAuth 2.0 bearer token](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation#user-restricted-apis).\n\nRequired in all environments except sandbox.\n","required":false,"schema":{"type":"string","format":"^Bearer\\ [[:ascii:]]+$","example":"Bearer g1112R_ccQ1Ebbb4gtHBP1aaaNM"}},{"in":"header","name":"NHSD-Session-URID","description":"\nThe user role ID (URID) for the current session. Also known as a user role profile ID (URPID).\n\nThis header is optional.\n\nIn Application-restricted access mode this header is ignored.\n\nIn Healthcare worker access mode if you send this header it must be valid for the logged-in user. See [determine the user's role](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation/user-restricted-restful-apis-nhs-cis2-separate-authentication-and-authorisation#step-9-determine-the-user-s-role) for guidance.\n","required":false,"schema":{"type":"string","pattern":"^[0-9]+$","example":"555254240100"}},{"in":"header","name":"X-Request-ID","required":false,"description":"A globally unique identifier (GUID) for the request, which we use to de-duplicate repeated requests and to trace the request if you contact our helpdesk.\n\nMust be a universally unique identifier (UUID) (ideally version 4).\n\nMirrored back in a response header.\n\nIf you re-send a failed request, use the same value in this header.\n","schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","example":"60E0B220-8136-4CA5-AE46-1D97EF59D068"}},{"in":"header","name":"X-Correlation-ID","required":false,"description":"An optional ID which you can use to track transactions across multiple systems. It can take any value, but we recommend avoiding `.` characters.\n\nMirrored back in a response header.\n","schema":{"type":"string","example":"11C46F5F-CDEF-4865-94B2-0EE0EDCC26DA"}},{"in":"header","name":"NHSD-End-User-Organisation-ODS","required":false,"description":"The ODS code of the user.\n\nMandatory for client applications which service multiple end user organisations (EUO). This will allow the calls to be attributed to the correct EUO.\n","schema":{"type":"string","example":"Y12345"}}],"get":{"summary":"Search for a patient","operationId":"search-patient","externalDocs":{"description":"ODS codes and documentation.","url":"https://fhir.nhs.uk/Id/ods-organization-code"},"description":"## Overview\nUse this endpoint to search for a patient in PDS.\n\nYou can search using various combinations of:\n * given name\n * family name\n * gender\n * postcode\n * date of birth - which can be a range\n * date of death - which can be a range\n * registered GP practice\n * email address\n * phone number\n\n \nThere are various search options, such as fuzzy search, exact match, history and wildcards.\n\nThe behaviour of this endpoint depends on which access mode you are using:\n\n| Access mode | Behaviour |\n| ------------------------------ | ------------------------------------------ |\n| Application-restricted access | Only a single unique match returned |\n| Healthcare worker access | Up to 50 matching patient records returned |\n| Patient access | Not yet available |\n\n## Search options\nThe following sections explain the various search options.\nWhich options you choose depends very much on your use case, and getting it right is really important.\nIf you need help, [contact us](https://digital.nhs.uk/developer/help-and-support).\n\n### Application-restricted access mode\nIn this access mode, you only get a single matching patient record, and only if it's a unique match.\n\nUse search options that are likely to find a unique match. In our experience, the following is a good starting point:\n * search on given name, family name, postcode and date of birth - this combination should uniquely identify a patient\n * for given name, use the first three characters and a wildcard, for example to search for `Annabel`, use `Ann*` - this caters for different name spellings and abbreviations\n * for postcode, use the first two characters and a wildcard, for example to search for `LS11 6AD`, use `LS*` - this caters for people who have moved locally but not updated PDS\n * use a non-fuzzy search - this reduces the chance of multiple matches\n * use a non-exact match - an exact match does not work with wildcards\n * include history - this increases the chance of a match\n\nFor more details, see the following sections.\n\n### Healthcare worker access mode\nIn this access mode - where the end user is a strongly authenticated healthcare worker - you can get up to 50 matching patient records.\nThis allows the end user to choose the best match.\n\nUse search parameters that are relevant to your use case - for example date of death is not always appropriate.\n\nTo protect patient privacy, design your search to minimise the number of matching patients.\nFor example, you could:\n * encourage users to enter as many search parameters as they can\n * force users to try a non-fuzzy search first and then only offer a fuzzy search if they cannot find the patient\n\nFor more details, see the following sections.\n\n### Non-fuzzy search\nA non-fuzzy search:\n * allows wildcards in names and postcodes\n * does not match homophones or transposed names\n * can optionally search history, such as previous names and addresses\n\nIt is less likely to return multiple matches than a fuzzy search, so is more suitable for finding a unique match.\n\nThe minimum search parameters are:\n * family name - which can include wildcards\n * date of birth - which can be a range\n\n \n### Fuzzy search\nA fuzzy search:\n * matches common homophones, such as `Smith` and `Smythe`, using the [Soundex](https://en.wikipedia.org/wiki/Soundex) algorithm\n * checks for transposed names, such as `Adam Thomas` and `Thomas Adam`\n * always searches history, such as previous names and addresses\n\nIt is more likely to include multiple matches than a non-fuzzy search, so is not ideal for finding a unique match.\n\nIt is also more likely to include false positives - other patients that match the search criteria.\nTherefore, for privacy reasons, it is better to use it only if a non-fuzzy match has failed.\n\nYou must use one of the following search parameter combinations:\n * given name, family name and date of birth\n * family name, date of birth, gender and postcode\n * given name, date of birth, gender and postcode\n\nIf you include the date of death or registered GP practice query parameters, they are not used in the search. However they do affect the patient's matching score - a mismatch reduces the returned score.\n\n### History\nPDS holds historic information, including previous names and addresses.\n\nA fuzzy search always includes history. For a non-fuzzy search, you can request to include history.\n\nSearching history can match patients when only a previous name or address is known, or if a patient provides a previous name or address on the assumption that their record hasn’t been updated. When a search done on historic data results in a match, the patient's current data will be returned in the response message, not the historic data used to identify the match.\n\n### Exact match\nYou can request an exact match.\nThis might be useful if you are verifying an NHS number against details you already believe to be correct.\nIt is unlikely to work well with wildcards or fuzzy search.\n\n### Names\nMatching names can be difficult due to:\n * multiple given names, such as in `Jane Anne Smith`\n * [compound given names](https://en.wikipedia.org/wiki/Given_name#Compound), such as in `John Paul Smith`\n * multiple or double-barrelled surnames, such as in `Michael Smith-Jones`\n * homophones, such as `Smith` and `Smythe` or `Ann` and `Anne`\n * abbreviated names, such as `Bob` instead of `Robert`\n * transposed names, such as `Adam Thomas` instead of `Thomas Adam`\n * previous names, such as maiden names\n * special characters such as in `O'Reilly`, `Jones-Smith` or `Kociński`\n * spelling mistakes, either in the search criteria or in PDS\n\nTo deal with some of these issues:\n * we search across all types of name - usual, nickname and temporary\n * a fuzzy search matches homophones, transposed names and previous names\n * for a non fuzzy search, you can optionally search previous names and use wildcards. Wildcards will match against the start of the name string, for example the start of a compound name.\n\n### Gender\nPDS has four options for gender - `male`, `female`, `other` and `unknown`.\nFor some people, the gender held in PDS might not match the gender they identify with.\n\nIn these cases, searching by gender might not find the patient.\nThese are edge cases but are important to consider because gender can be a sensitive issue for the people in question.\n\nIn general, we recommend not including gender as a search parameter.\n \n### Date of birth and death\nSometimes, the exact date of birth or death is not known when doing a search.\nSometimes, the date of birth or death is not accurate in PDS.\nFor example, if only the year of birth is known, the day and month of birth might be recorded as the first of January - for example, `01/01/1932`.\n\nIn such cases, searching a range of dates can help. This can result in multiple matches, so might not work well when searching for a unique match.\n\n### Postcode\nPeople sometimes move locally, meaning the postcode in PDS is out of date, but does at least match on the first two characters.\n\nSearching for the first two characters of the postcode and a wildcard can work well. For example, to search for `LS11 6AD`, use `LS*`.\nThis is only possible for a non-fuzzy search.\n\nThis can result in multiple matches, but it has been known to work well in some cases - even for unique matches.\n\n### General practitioner\nThis is an ODS code. If you use it, it must match exactly.\n\n### Phone number and email address\nIf you use phone number and/or email address, only exact matches will be returned.\n * Wildcards are not supported\n * Only current data will be searched, unless a history search is also requested in which case the match will take into account both current and historic data\n * Email addresses are not case-sensitive.\n\n## Patient data returned\nThe patient data returned on a search is not the full set of data that is returned on a retrieval by NHS number. The following data is included:\n* NHS number\n* names - usual, nickname and temporary\n* gender\n* birth information, apart from place of birth\n* death information\n* address - home address\n* contact details\n* registered GP\n* restricted patient flag\n\nThe following data is excluded:\n* place of birth\n* names, apart from usual, nickname and temporary \n* addresses, apart from home address\n* pharmacy details\n* communication details\n* contact preferences\n\n### Restricted patients\nSome patients are tagged as [restricted](https://digital.nhs.uk/services/demographics/restricting-access-to-a-patients-demographic-record) and are sometimes known as sensitive patients. When performing a search, restricted patients can be returned; however, location sensitive fields such as `address`, `telecom`, `contact` and `generalPractitioner` are removed.\n\nIf `address-postalcode`, `address-postcode`, or `general-practitioner` are included in the search parameters, no restricted patients are returned even if a match is identified.\n\nThe restricted flag can be found in the data under `meta/security` on the patient resource.\n\n### Invalidated patients\nSome patients are marked as invalidated in PDS - also known as `redacted` in FHIR terminology. Invalidated patient records are not returned in search results.\nIf an invalidated patient record has been superseded, the superseding record is returned.\n\n## Scoring\nEvery matched patient in the result list includes a score to indicate how closely the patient matched the search parameters.\n\nA score of 1.0 indicates an exact match. A score of less than 1.0 indicates a partial match.\n\nThe result list is sorted in descending score order - best match first.\n\nUse the `_exact-match` query parameter to return exact matches only - where the score is 1.0.\n\n## Clinical safety and privacy\nThis endpoint can return multiple matching patients for a given search, including partial matches.\n\nEnsure that you design your software to minimise the following risks:\n* an end user selects the wrong patient from the results presented, so there is a risk of clinical harm; for example due to retrieval of the wrong clinical data\n* the end user has access to patients’ personal data, so there is a risk to patient privacy\n\nNote that:\n* we record an access request in our audit trail for all patients matched in a PDS search\n* it is almost certainly a good idea to display search results in descending score order - best match first\n\nPlease consider the information your application returns to users. For example a patient's temporary address can be used to perform a successful search. The home address will be included in the response. For citizen facing services please be aware of this behaviour and do not present a different address to the patient, unless they are logged in at a sufficiently high proof point.\n\n## Sandbox testing\nYou can test the following scenarios in our sandbox environment:\n\n| Scenario | Request | Response |\n| ----------------------------------------| ----------------------------------------------------------------------------------------------------------------------------------------------------------------| ------------------------------------------------------------------------|\n| Basic search with phone & email positive| `family`=`Smith`, `gender`=`female`, `birthdate`=`eq2010-10-22`, `email`=`jane.smith@example.com`, `phone`=`01632960587` | HTTP Status 200 with single search result. |\n| Basic search with phone & email negative| `family`=`Smith`, `gender`=`female`, `birthdate`=`eq2010-10-22`, `email`=`deb.trotter@example.com`, `phone`=`0121111111` | HTTP Status 200 with no search results\n| Wildcard search without phone/email | `family`=`Sm*`, `gender`=`female`, `birthdate`=`eq2010-10-22` | HTTP Status 200 with search result of two. |\n| Wildcard search with email and phone | `family`=`Sm*`, `gender`=`female`, `birthdate`=`eq2010-10-22`, `email`=`jane.smith@example.com`, `phone`=`01632960587` | HTTP Status 200 with single search result. |\n| Search with limited results | `family`=`Sm*`, `gender`=`female`, `birthdate`=`eq2010-10-22`, `email`=`jane.smith@example.com`, `phone`=`01632960587`, `_max-results`=`1` | HTTP Status 200 with single search result. |\n| Search with date range | `family`=`Smith`, `gender`=`female`, `birthdate`=`ge2010-10-21`, `birthdate`=`le2010-10-23`, `email`=`jane.smith@example.com`, `phone`=`01632960587` | HTTP Status 200 with single search result. |\n| Fuzzy search with phone and email | `family`=`Smith`, `given`=`Jane`, `gender`=`female`, `birthdate`=`eq2010-10-22`, `email`=`jane.smith@example.com`, `phone`=`01632960587`, `_fuzzy-match`=`true` | HTTP Status 200 with single search result. |\n| Fuzzy search without phone or email | `family`=`Smith`, `given`=`Jane`, `gender`=`female`, `birthdate`=`eq2010-10-22` | HTTP Status 200 with search result of two.\n| Restricted patient search | `family`=`Smythe`, `given`=`Janet`, `gender`=`female`, `birthdate`=`eq2005-06-16`, `email`=`janet.smythe@example.com`, `phone`=`01632960587` | HTTP Status 200 with single search result with restricted data omitted. |\n| Compound name search | `family`=`Smith`, `given`=`John Paul`, `given`=`James`, `gender`=`female`, `birthdate`=`eq2010-10-22`, `email`=`johnp.smith@example.com`, `phone`=`01632960587` | HTTP Status 200 with single search result. |\n| Unsuccessful search | Any other valid search query parameters | HTTP Status 200 with no search results |\n| Valid/invalid search criteria | `family`=`Sm*`, `gender`=`female`, 'invalidParam'='123', `birthdate`=`eq2010-10-22`, `email`=`j.smith@example.com`, `phone`=`0163` | HTTP Status 400 with problem description |\n| Unsuccessful search on email/phone only | `email`=`j.smith@example.com`, `phone`=`0163` | HTTP Status 400 with problem description |\n| Invalid date format | `birthdate` or `death-date` query parameters with values not in format `YYYY-MM-DD` | HTTP Status 400 with problem description |\n| Too few search parameters | Any invalid combination of query parameters | HTTP Status 400 with problem description |\n| Missing X-Request-ID | `id`=`9000000009` (or any other valid NHS number) | HTTP Status 412 with problem description |\n\nYou can try out the sandbox using the 'Try this API' feature on this page.\n\nAlternatively, you can try out the sandbox using our Postman collection:\n\n\n[![Run in Postman](https://run.pstmn.io/button.svg)](https://app.getpostman.com/run-collection/a1ce1b055839caa384a8?action=collection%2Fimport)\n","parameters":[{"name":"_fuzzy-match","description":"A fuzzy search is performed, including checks for homophones, transposed names and historic information.\n\nYou cannot use wildcards with a fuzzy search.\n","example":false,"in":"query","required":false,"schema":{"type":"boolean","default":false}},{"name":"_exact-match","description":"The search only returns results where the `score` field is 1.0. Use this with care - it is unlikely to work with fuzzy search or wildcards.","example":false,"in":"query","required":false,"schema":{"type":"boolean","default":false}},{"name":"_history","description":"The search looks for matches in historic information such as previous names and addresses.\n\nThis parameter has no effect for a fuzzy search, which always includes historic information.\n","example":true,"in":"query","required":false,"schema":{"type":"boolean","default":false}},{"name":"_max-results","description":"The maximum number of matching patients to return. For healthcare worker access, this must be between 1 and 50, and the default is 50.\nFor application-restricted access, this must be 1, and the default is 1.\nIf too many patients match the search criteria, we return a `TOO_MANY_MATCHES` error.\n","example":1,"in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"family","description":"The patient's family name (surname).\n\nNot case sensitive. Max 35 characters.\nUse `*` as a wildcard but not in the first two characters and not in fuzzy search mode.\nMust be [URL encoded](https://en.wikipedia.org/wiki/Percent-encoding), for example a space must be represented by either `%20` or `+` and a wildcard must be encoded as `%2A`.\n","examples":{"simple":{"value":"Smith","summary":"Matches Smythe if `_fuzzy-match` is specified."},"wildcarded":{"value":"Sm*t*","summary":"Wildcards must contain at least two characters, this matches Smith, Smythe"}},"in":"query","required":false,"schema":{"type":"string"}},{"name":"given","description":"The patient's given names.\n\nNot case sensitive. Max 35 characters.\nUse `*` as a wildcard but not in the first two characters and not in fuzzy search mode.\nWildcard searches will match the start of the first given name and not subsequent given names, for example the given names \"Alan Michael\" can be searched with \"Ala*\" but not \"Mic*\".\nMust be [URL encoded](https://en.wikipedia.org/wiki/Percent-encoding), for example a space must be represented by either `%20` or `+` and a wildcard must be encoded as `%2A`.\n\nA patient may have more than one given name. Subsequent given names are commonly referred to as 'middle names'.\nSpecify multiple given names by repeating this parameter.\nTo search for `Jane Anne Smith` use `given=Jane&given=Anne&family=Smith`.\n\nThe first given name may be a [compound name](https://en.wikipedia.org/wiki/Given_name#Compound), for example `John Paul`.\nTo search for `John Paul James Smith` (where `John Paul` is the first given name, `James` is the second given name, and `Smith` the family name) use `given=John%20Paul&given=James&family=Smith`.\n\nNote that it is not necessary to specify subsequent given (middle) names, and that doing so may impact your search results in the case they are not recorded in the demographics system.\n","example":"Jane","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"}}},{"name":"gender","description":"Gender with which the patient most strongly identifies.","example":"female","in":"query","required":false,"schema":{"type":"string","enum":["male","female","other","unknown"],"example":"female"}},{"name":"birthdate","in":"query","description":"Date of birth in the format `yyyy-mm-dd`. To specify a range, use `birthdate=geyyyy-mm-dd&birthdate=leyyyy-mm-dd`.","examples":{"simple":{"value":["eq2010-10-22"],"description":"Exact match date"},"rangege":{"value":["ge2010-10-22"],"description":"Greater than or equals match, which matches 2010-10-22 or 2010-10-23"},"rangele":{"value":["le2010-10-22"],"description":"Less than or equals match, which matches 2010-10-22 or 2010-10-21"}},"required":false,"schema":{"type":"array","items":{"type":"string"}}},{"name":"death-date","in":"query","description":"Date of death in the format `yyyy-mm-dd`. To specify a range, use `death-date=geyyyy-mm-dd&death-date=leyyyy-mm-dd`.\n\nFor a fuzzy search, this is ignored for matching but included in the score calculation.\n","examples":{"simple":{"value":"eq2010-10-22","description":"Exact match date"},"rangege":{"value":"ge2010-10-22","description":"Greater than or equals match which matches 2010-10-22 or 2010-10-23"},"rangele":{"value":"le2010-10-22","description":"Less than or equals match, which matches 2010-10-22 or 2010-10-21"}},"required":false,"schema":{"type":"string","format":"date"}},{"name":"address-postalcode","description":"The postcode of any of the patient’s known addresses.\n\nNot case sensitive.\nSpaces are ignored, for example `LS16AE` and `LS1 6AE` both match `LS1 6AE`.\nUse `*` as a wildcard but not in the first two characters and not in fuzzy search mode.\nMust be [URL encoded](https://en.wikipedia.org/wiki/Percent-encoding), for example a space must be represented by either `%20` or `+` and a wildcard must be encoded as `%2A`.\n","examples":{"simple":{"value":"LS1 6AE","summary":"Spaces ignored, would match LS16AE"},"wildcarded":{"value":"LS1*","summary":"Matches 'LS16AE', 'LS1 6AE' and 'LS1 6AB'"}},"in":"query","required":false,"schema":{"type":"string"}},{"name":"address-postcode","description":"**N.B. that address-postcode will be deprecated in the future, address-postalcode should be used instead. \nIf both address-postcode and address-postalcode are provided, an INVALID_SEARCH_DATA error will be returned.**\nThe postcode of any of the patient’s known addresses.\n\nNot case sensitive.\nSpaces are ignored, for example `LS16AE` and `LS1 6AE` both match `LS1 6AE`.\nUse `*` as a wildcard but not in the first two characters and not in fuzzy search mode.\nMust be [URL encoded](https://en.wikipedia.org/wiki/Percent-encoding), for example a space must be represented by either `%20` or `+` and a wildcard must be encoded as `%2A`.\n","examples":{"simple":{"value":"LS1 6AE","summary":"Spaces ignored, would match LS16AE"},"wildcarded":{"value":"LS1*","summary":"Matches 'LS16AE', 'LS1 6AE' and 'LS1 6AB'"}},"in":"query","required":false,"schema":{"type":"string"}},{"name":"general-practitioner","description":"The Organisation Data Service (ODS) code of the patient's registered GP practice.\n\nNot case sensitive.\nFor a fuzzy search, this is ignored for matching but included in the score calculation.\n","example":"Y12345","in":"query","required":false,"schema":{"type":"string"}},{"name":"email","description":"Email address\n","example":"jane.smith@example.com","in":"query","required":false,"schema":{"type":"string"}},{"name":"phone","description":"Phone number\n","example":"01632960587","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"A completed search. This might contain zero, one or many matching patients, or it might contain a 'TOO_MANY_MATCHES' error.\n","headers":{"X-Correlation-Id":{"schema":{"type":"string","example":"11C46F5F-CDEF-4865-94B2-0EE0EDCC26DA"},"description":"The X-Correlation-ID from the request header, if supplied, mirrored back.\n"},"X-Request-Id":{"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","example":"60E0B220-8136-4CA5-AE46-1D97EF59D068"},"description":"The X-Request-ID from the request header, if supplied, mirrored back.\n"}},"content":{"application/fhir+json":{"schema":{"type":"object","properties":{"resourceType":{"type":"string","description":"FHIR Resource Type.","default":"Bundle"},"type":{"type":"string","description":"FHIR Bundle Type.","default":"searchset"},"timestamp":{"type":"string","description":"Time the search was performed.","format":"datetime","example":"2019-12-25T12:00:00+00:00"},"total":{"type":"integer","description":"Number of resources returned in search.","example":1},"entry":{"type":"array","description":"A list of matched patients. Empty if none found. The patients are ordered by match score, best first. A maximum of 50 patients are returned.\n","items":{"type":"object","properties":{"fullUrl":{"type":"string","description":"Absolute URL of the resource described in this item.","example":"https://api.service.nhs.uk/personal-demographics/FHIR/R4/Patient/9000000009"},"search":{"type":"object","properties":{"score":{"description":"Search score from 0.0 to 1.0.","type":"number","minimum":0,"maximum":1,"example":0.75}}},"resource":{"type":"object","additionalProperties":false,"properties":{"resourceType":{"type":"string","description":"FHIR resource type.","default":"Patient"},"id":{"description":"The patient's NHS number. The primary identifier of a patient, unique within NHS England and Wales. Always 10 digits and must be a [valid NHS number](https://www.datadictionary.nhs.uk/attributes/nhs_number.html).","type":"string","pattern":"^\\d{10}$","example":"9000000009"},"identifier":{"type":"array","description":"Identifier and system of identification used for this Patient.","items":{"type":"object","maxItems":1,"required":["value"],"properties":{"system":{"type":"string","format":"url","description":"System identifier belongs to.","default":"https://fhir.nhs.uk/Id/nhs-number"},"value":{"description":"The patient's NHS number. The primary identifier of a patient, unique within NHS England and Wales. Always 10 digits and must be a [valid NHS number](https://www.datadictionary.nhs.uk/attributes/nhs_number.html).","type":"string","pattern":"^\\d{10}$","example":"9000000009"},"extension":{"type":"array","description":"FHIR extensions.","items":{"type":"object","description":"Status indicating if NHS number is present and verified.","properties":{"url":{"type":"string","description":"URL of the extension definition.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSNumberVerificationStatus","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSNumberVerificationStatus"]},"valueCodeableConcept":{"type":"object","description":"NHS Number Verification Status Indicator.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URI of the coding system specification.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-NHSNumberVerificationStatus"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1.0.0"},"code":{"type":"string","description":"Symbol in syntax defined by the system.","example":"01"},"display":{"type":"string","description":"Representation defined by the system.","example":"Number present and verified"}}}}}}}}}}}},"meta":{"type":"object","description":"Metadata about this resource.","properties":{"versionId":{"type":"string","description":"The NHS Digital assigned version of the patient resource.","example":"2"},"security":{"type":"array","description":"The level of security on the patients record, which affects which fields are populated on retrieval. The possible responses are:\n* U - unrestricted. All available data is returned.\n* R - restricted. Any sensitive data around the patient's location, so `address`, `generalPractitioner` and `telecom`, are removed from the response.\n* REDACTED - redacted. The patient record has been marked as invalid, so the data should not be used. This code is never returned; you receive a 404, and appropriate error response, if an invalidated patient retrieval is attempted.\n","maxItems":1,"items":{"type":"object","properties":{"system":{"type":"string","description":"URI of the value set specification.","example":"http://terminology.hl7.org/CodeSystem/v3-Confidentiality"},"code":{"type":"string","description":"Code defined by the system value set.","enum":["U","R","V","REDACTED"],"example":"U"},"display":{"type":"string","description":"Representation defined by the system.","enum":["unrestricted","restricted","redacted"],"example":"unrestricted"}}}}}},"name":{"type":"array","description":"List of names associated with the patient.\nThis is only fully populated on a retrieval or a successful update, only the `usual`, `nickname` and `temp` names are returned on a search. \n","minItems":1,"items":{"type":"object","required":["use","family"],"additionalProperties":false,"properties":{"id":{"type":"string","description":"Unique object identifier for this name.","example":"123"},"use":{"type":"string","description":"How this name should be used.\n* usual - Known as, conventional or the one patient normally uses. A patient always has a usual name.\n* temp - An alias or temporary name. This may also be used for temporary names assigned at birth or in emergency situations.\n* nickname - A name that the patient prefers to be addressed by, but is not part of their usual name.\n* old - This name is no longer in use (or was never correct, but retained for records).\n* maiden - Name changed for Marriage. A name used prior to changing name because of marriage. This term is not gender specific. The use of this term does not imply any particular history for a person's name.\n\nThe following use codes are included in the [name-use](https://www.hl7.org/fhir/valueset-name-use.html) value set, but should not be used and is not be returned as part of a retrieval.\n* official - The formal name as registered in an official (government) registry, but which name might not be commonly used. May be called \"legal name\".\n* anonymous - Anonymous assigned name, alias, or pseudonym (used to protect a person's identity for privacy reasons).\n","enum":["usual","temp","nickname","old","maiden"],"example":"usual"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"given":{"type":"array","maxItems":5,"description":"Given names, including any middle names.\n\nEach name(s) should be a separate item in the list. The first given name may include multiple names, separated by a space.\nSubsequent names must be broken down into list items. For example, the input `[Jane Marie Anne, Jo Adele]` returns `[Jane Marie Anne, Jo, Adele]`.\n","example":["Jane Marie Anne","Jo","Adele"],"items":{"type":"string","maxLength":35,"example":"Jane"}},"family":{"type":"string","maxLength":35,"description":"Family name (often called Surname).","example":"Smith"},"prefix":{"type":"array","description":"Name prefixes, titles, and prenominals.","example":["Mrs"],"items":{"type":"string","example":"Mrs"}},"suffix":{"type":"array","description":"Name suffices and postnominals.","example":["MBE","PhD"],"items":{"type":"string","example":"MBE"}}}}},"gender":{"type":"string","description":"Classification of the gender of a patient. The classification is phenotypical rather than genotypical, i.e. it does not provide codes for medical or scientific purposes.\nIt is the administrative gender that the patient wishes to be known as. In some cases, this may not be the same as the patient’s registered birth gender, or their current clinical gender.\n","enum":["male","female","other","unknown"],"example":"female"},"birthDate":{"description":"The date on which the patient was born or is officially deemed to have been born.\n\nIt is a date in the format `yyyy-mm-dd`. Due to data quality issues on a small number of patients `yyyy-mm` and `yyyy` format may also be returned. \n","example":"2010-10-22","type":"string","format":"date"},"multipleBirthInteger":{"type":"integer","minimum":1,"maximum":9,"description":"The order in which the patient was born, with 1 indicating the first or only birth in the sequence, 2 indicating the second birth in the sequence, 3 indicating the third, and so on up to 7.\n\nThere are two other valid values; `8` meaning `Not applicable` and `9` meaning `Not known`.\n","example":1},"deceasedDateTime":{"description":"The date and time on which a person died or is officially deemed to have died, if applicable and known.\n\nIt is a datetime in the format `yyyy-mm-ddTHH:MM:SS+HH:MM` or `yyyy-mm-dd`. Due to data quality issues on a small number of patients `yyyy-mm` and `yyyy` format may also be returned.\n","example":"2010-10-22T00:00:00+00:00","type":"string","format":"date-time","pattern":"^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2}\\+\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2}\\+\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01]))$"},"address":{"type":"array","description":"List of addresses associated with the patient.\n\nThis is only fully populated on a retrieval or a successful update, only the `home` address is returned on a search.\nWhen a patient tagged as `restricted` is retrieved, all addresses are removed from the response.\n","items":{"type":"object","description":"An address associated with the patient.","required":["use"],"properties":{"id":{"type":"string","description":"Unique system identifier for this address.","example":"456"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"use":{"type":"string","description":"Purpose of this address:\n * `home` - the home address is the patient's normal residence. Home address is also known as usual, main, registered, current or permanent address\n * `temp` - a temporary address is an address used for a set period of time, but where the patient's home, permanent address remains unchanged\n * `billing` - an address used for correspondence purposes only\n * `work` - an office address. This can be returned due to legacy data but cannot be added or replaced on update\n\n A patient should have no more than one current `temp` and/or `billing` address.\n However, historically this was constrained only by the integration requirements and was not enforced so theoretically more than one can exist for a patient when retrieving.\n Where multiple instances already exist for the patient it is not expected that local systems should manage those, but should choose the most appropriate one to maintain (e.g. by examining period dates).\n\n A `home` address is the patient's main residential address and should normally be used for all clinical and demographic purposes, including clinical and appointment correspondence.\n However additionally, `temp` and `billing` addresses may be provided by a patient when there is a requirement to record an alternative location for the purposes of unbroken care.\n When sending correspondence to a patient:\n *\ta present and valid `billing` address may take precedence over `home` and `temp` addresses. A patient should have only a single current `billing` address. An address is considered 'valid' according to its period start and end dates.\n *\tif no current `billing` address is provided, a `temp` address may take precedence over the `home` address, again if it is valid according to its period start and end dates.\n * if there is no valid, current `billing` and/or `temp` address, the `home` address must be used.\n","enum":["home","work","temp","billing"],"example":"home"},"text":{"type":"string","description":"Where a `temp` address is provided a descriptor text must be sent.\nThe list of possible values are:\n* `Second Home` - a patient's second home\n* `Student Accommodation` - a patient's place of residence while at university\n* `Respite Care Address` - where the patient resides during respite care\n* `Temporary Residence Address` - where the patient resides for a specific period of time\n* `Convalescence Home` - the address for a patient during a period of recovery\n* `Mobile Home` - the address of a patient's mobile home, parked for a specific period of time, e.g. the address of a caravan park\n* `Holiday Home` - the address for a patient during a holiday\n\nA patient can also register temporarily at a GP practice using a temporary address. Temporary GP registration information does not appear on the PDS, but the address used for it may.\n","enum":["Second Home","Student Accommodation","Respite Care Address","Temporary Residence Address","Convalescence Home","Mobile Home","Holiday Home"],"example":"Student Accommodation"},"line":{"type":"array","description":"All lines of the address except the postal code.\n\nSystems must apply the following formatting convention when adding or replacing addresses lines:\n*\tline 1 - premises ID and/or house name, e.g. `Flat 1` or `The Old Schoolhouse`\n*\tline 2 - house number, dependent thoroughfare name and descriptor (if present), thoroughfare name and descriptor, e.g. `23 Mill Lane`\n*\tline 3 - dependent locality/village, locality (if present), e.g. `Boxgrove`\n*\tline 4 - post town, e.g. `Leeds`\n*\tline 5 - county (if present), e.g. `West Yorkshire`\n\nIf any of the lines are blank, they are not returned due to FHIR conformance constraints.\n","maxItems":5,"items":{"type":"string"},"example":["1 Trevelyan Square","Boar Lane","City Centre","Leeds","West Yorkshire"]},"postalCode":{"type":"string","description":"Postal code of the address.","example":"LS1 6AE"},"extension":{"type":"array","description":"List of address keys formatted as a FHIR extension. This can include up to one Unique Property Reference Number (UPRN), and up to one Postal Address File (PAF) key. If no keys for the address are known, the array will be empty. Otherwise it will be a list of objects which specify the value of the address key and the code system for it","items":{"anyOf":[{"type":"object","description":"Unique identifier for an address.","properties":{"url":{"type":"string","description":"URL of specification of the AddressKey extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey"]},"extension":{"type":"array","description":"Specification of address key system and address key value. Contains exactly two items: one describing the code system the Address Key uses, and the other specifying the value of the Address Key.","minItems":2,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Coding system of the address key.","required":["url","valueCoding"],"properties":{"url":{"type":"string","description":"Always 'type'.","default":"type"},"valueCoding":{"type":"object","description":"URL of specification of address key format.","required":["system","code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available Address Key formats.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType"},"code":{"type":"string","description":"Address Key system. Always 'PAF'.","enum":["PAF"],"example":"PAF"}}}}},{"type":"object","description":"Value of the address key.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Always 'value'.","default":"value","example":"value"},"valueString":{"type":"string","description":"Address key in PAF format. An 8 digit number including leading zeroes, formatted as a string.","minLength":8,"maxLength":8,"pattern":"^[0-9]{8}$","example":"12345678"}}}]}}}},{"type":"object","description":"Unique identifier for an address.","properties":{"url":{"type":"string","description":"URL of specification of the AddressKey extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey"]},"extension":{"type":"array","description":"Specification of address key system and address key value. Contains exactly two items: one describing the code system the Address Key uses, and the other specifying the value of the Address Key.","minItems":2,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Coding system of the address key.","required":["url","valueCoding"],"properties":{"url":{"type":"string","description":"Always 'type'.","default":"type"},"valueCoding":{"type":"object","description":"URL of specification of address key format.","required":["system","code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available Address Key formats.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType"},"code":{"type":"string","description":"Address Key system. Always 'UPRN'.","enum":["UPRN"],"example":"UPRN"}}}}},{"type":"object","description":"Value of the address key.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Always 'value'.","default":"value","example":"value"},"valueString":{"type":"string","description":"Address key in UPRN format. A number containing from 1 up to 12 digits.","minLength":1,"maxLength":12,"pattern":"^[0-9]{1,12}$","example":"123456789012"}}}]}}}}]}}}}},"telecom":{"type":"array","description":"List of contact points for the patient; for example, phone numbers or email addresses.\nWhen a patient tagged as `restricted` is retrieved, all contact points are removed from the response.\n","items":{"description":"A contact point, such as a phone number or email address","type":"object","required":["system","value"],"properties":{"id":{"type":"string","description":"Unique object identifier for this contact point.","example":"789"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"system":{"description":"Means of communication, such as phone or email.","type":"string","enum":["phone","fax","email","other"],"example":"phone"},"value":{"description":"Phone number, email address, or other identifier for use with contact system.","type":"string","example":"01632960587"},"use":{"type":"string","description":"Location associated with communication system.","enum":["home","work","temp","mobile"],"example":"home"},"extension":{"type":"array","maxItems":1,"description":"Extension that is returned when the communication type is `textphone`. The only code returned is `textphone`, which means `Minicom (Textphone)`.\n\nThe `system` is `other` when the extension is included.\n","items":{"type":"object","description":"Wrapped object for other contact system details.","properties":{"url":{"type":"string","description":"Definition of other contact system extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem"]},"valueCoding":{"type":"object","description":"URL of specification of other contact systems.","properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem"},"code":{"type":"string","description":"Coded value for the other contact system in place.","example":"textphone"},"display":{"description":"Display-friendly representation of the other contact system code.","type":"string","example":"Minicom (Textphone)"}}}}}}}}},"contact":{"type":"array","description":"A list of patient contacts. Only emergency contacts are returned. Any other contacts are returned on the patients `Related Person`.\nWhen a patient tagged as `restricted` is retrieved, all contacts are removed from the response.\n","items":{"title":"Schema for a patient contact.","type":"object","additionalProperties":false,"required":["relationship","telecom"],"properties":{"id":{"type":"string","example":"C123"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"relationship":{"type":"array","description":"The contact relationship wrapper object that holds the details of the relationship to the patient.\n\nThis is only returned when an Emergency Contact number has been set on `telecom`. The only valid code is `C`, which means `Emergency Contact`.\n","minItems":1,"maxItems":1,"items":{"type":"object","required":["coding"],"properties":{"coding":{"type":"array","description":"Exactly one contact relationship.","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","format":"url","default":"http://terminology.hl7.org/CodeSystem/v2-0131"},"code":{"type":"string","description":"Coded value for contact relationship.","example":"C"},"display":{"type":"string","description":"Display-friendly representation of the contact relationship code.","example":"Emergency Contact"}}}}}}},"telecom":{"type":"array","description":"List of Telecom objects on the contact only contains `system` and `value`.\n","items":{"description":"A contact point, such as a phone number or email address","type":"object","required":["system","value"],"properties":{"id":{"type":"string","description":"Unique object identifier for this contact point.","example":"789"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"system":{"description":"Means of communication, such as phone or email.","type":"string","enum":["phone","fax","email","other"],"example":"phone"},"value":{"description":"Phone number, email address, or other identifier for use with contact system.","type":"string","example":"01632960587"},"use":{"type":"string","description":"Location associated with communication system.","enum":["home","work","temp","mobile"],"example":"home"},"extension":{"type":"array","maxItems":1,"description":"Extension that is returned when the communication type is `textphone`. The only code returned is `textphone`, which means `Minicom (Textphone)`.\n\nThe `system` is `other` when the extension is included.\n","items":{"type":"object","description":"Wrapped object for other contact system details.","properties":{"url":{"type":"string","description":"Definition of other contact system extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem"]},"valueCoding":{"type":"object","description":"URL of specification of other contact systems.","properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem"},"code":{"type":"string","description":"Coded value for the other contact system in place.","example":"textphone"},"display":{"description":"Display-friendly representation of the other contact system code.","type":"string","example":"Minicom (Textphone)"}}}}}}}}}}}},"generalPractitioner":{"type":"array","maxItems":1,"description":"General Practice (not practitioner) with which the patient is, or was, registered. Always contains zero or one general practitioner object.\nWhen a patient tagged as `restricted` is retrieved, the General Practice is removed from the response.\n","items":{"description":"General practice (not practitioner) with which the patient is or was registered.","type":"object","required":["identifier"],"properties":{"id":{"description":"Object identifier (OID) specific to the returned details - this should be return exactly the same in any update.","type":"string","example":"254406A3"},"type":{"description":"Type of Reference being returned.","type":"string","example":"Organization"},"identifier":{"description":"Identifier and system of identification used for this Organisation.","type":"object","required":["value"],"properties":{"system":{"description":"URL for the Organisation Data Service - who are responsible for publishing codes that identify organisations and individuals across health and social care.","type":"string","example":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"description":"Organisation code for the registered general practice, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","type":"string","pattern":"^[0-9A-Z]+$","example":"Y12345"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}}}}}}},"extension":{"type":"array","description":"Wrapper array for the patient's death notification status; this is a FHIR extension. Always contains zero or one death notification status object.\n","items":{"anyOf":[{"type":"object","description":"Wrapper object for death notification details.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of death notification extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus"]},"extension":{"type":"array","description":"Array containing exactly one death notification status code object and exactly one effective date object.","minItems":1,"maxItems":2,"items":{"oneOf":[{"type":"object","description":"Wrapper object for death notification status code.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `deathNotificationStatus`.","default":"deathNotificationStatus","enum":["deathNotificationStatus"]},"valueCodeableConcept":{"type":"object","description":"Death Notification Status.","properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["system","code"],"properties":{"system":{"type":"string","description":"URI of the coding system specification.","example":"https://fhir.hl7.org.uk/CodeSystem/UKCore-DeathNotificationStatus"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1.0.0"},"code":{"type":"string","description":"Symbol, in syntax, defined by the system:\n* `1` - Informal - death notice received via an update from a local NHS Organisation such as GP or Trust\n* `2` - Formal - death notice received from Registrar of Deaths. Only these endpoints are allowed to add a Formal death:\n - National Back Office using the Demographic Spine Application (DSA)\n - Office of National Statistics (ONS)\n - Maternity sites\n* `U` - Removed. This is a possible response, but it cannot be used on an update because Spine will reject it\n","example":"2","enum":["1","2","U"]},"display":{"type":"string","description":"Representation defined by the system.","example":"Formal - death notice received from Registrar of Deaths","enum":["Informal - death notice received via an update from a local NHS Organisation such as GP or Trust","Formal - death notice received from Registrar of Deaths","Removed"]}}}}}}}},{"type":"object","description":"Wrapper object for death notification effective date.","required":["url","valueDateTime"],"properties":{"url":{"type":"string","description":"Key of this object. Always `systemEffectiveDate`.","default":"systemEffectiveDate","enum":["systemEffectiveDate"]},"valueDateTime":{"type":"string","description":"Date and time at which death notification status took effect.","format":"date-time","example":"2010-10-22T00:00:00+00:00"}}}]}}}}]}}}}}}}}},"example":{"resourceType":"Bundle","type":"searchset","timestamp":"2019-12-25T12:00:00+00:00","total":1,"entry":[{"fullUrl":"https://api.service.nhs.uk/personal-demographics/FHIR/R4/Patient/9000000009","search":{"score":0.75},"resource":{"resourceType":"Patient","id":"9000000009","identifier":[{"system":"https://fhir.nhs.uk/Id/nhs-number","value":"9000000009","extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSNumberVerificationStatus","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-NHSNumberVerificationStatus","version":"1.0.0","code":"01","display":"Number present and verified"}]}}]}],"meta":{"versionId":"2","security":[{"system":"http://terminology.hl7.org/CodeSystem/v3-Confidentiality","code":"U","display":"unrestricted"}]},"name":[{"id":"123","use":"usual","period":{"start":"2020-01-01","end":"2021-12-31"},"given":["Jane"],"family":"Smith","prefix":["Mrs"],"suffix":["MBE"]}],"gender":"female","birthDate":"2010-10-22","multipleBirthInteger":1,"deceasedDateTime":"2010-10-22T00:00:00+00:00","address":[{"id":"456","period":{"start":"2020-01-01","end":"2021-12-31"},"use":"home","line":["1 Trevelyan Square","Boar Lane","City Centre","Leeds","West Yorkshire"],"postalCode":"LS1 6AE","extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","extension":[{"url":"type","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType","code":"PAF"}},{"url":"value","valueString":"12345678"}]},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","extension":[{"url":"type","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType","code":"UPRN"}},{"url":"value","valueString":"123456789012"}]}]}],"telecom":[{"id":"789","period":{"start":"2020-01-01","end":"2021-12-31"},"system":"phone","value":"01632960587","use":"home"},{"id":"790","period":{"start":"2019-01-01","end":"2022-12-31"},"system":"email","value":"jane.smith@example.com","use":"home"},{"id":"OC789","period":{"start":"2020-01-01","end":"2021-12-31"},"system":"other","value":"01632960587","use":"home","extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem","code":"textphone","display":"Minicom (Textphone)"}}]}],"contact":[{"id":"C123","period":{"start":"2020-01-01","end":"2021-12-31"},"relationship":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0131","code":"C","display":"Emergency Contact"}]}],"telecom":[{"system":"phone","value":"01632960587"}]}],"generalPractitioner":[{"id":"254406A3","type":"Organization","identifier":{"system":"https://fhir.nhs.uk/Id/ods-organization-code","value":"Y12345","period":{"start":"2020-01-01","end":"2021-12-31"}}}],"extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus","extension":[{"url":"deathNotificationStatus","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-DeathNotificationStatus","version":"1.0.0","code":"2","display":"Formal - death notice received from Registrar of Deaths"}]}},{"url":"systemEffectiveDate","valueDateTime":"2010-10-22T00:00:00+00:00"}]}]}}]}}}},"4XX":{"description":"An error occurred as follows:\n\n| HTTP status | Error code | Description |\n| ----------- | -------------------------- | --------------------------------------------- |\n| 200 | TOO_MANY_MATCHES | Too many matches were found - user should be told to refine their search parameters.\t|\n| 400 | INVALID_SEARCH_DATA\t | Invalid combination of search parameters. For details, see the `diagnostics` field. |\n| 400 | UNSUPPORTED_SERVICE | No search parameters provided. |\n| 400 | MISSING_VALUE | Missing header or query parameter. For details, see the `diagnostics` field. |\n| 400 | INVALID_VALUE | Invalid header or query parameter. For details, see the `diagnostics` field. |\n| 400 | ADDITIONAL_PROPERTIES | Unrecognised query parameter. For details, see the `diagnostics` field. |\n| 401 | ACCESS_DENIED | Access token missing, invalid or expired, or calling application not configured for this operation. |\n| 403 | INVALID_VALUE | Multiple results requested when using the API in application-restricted mode. |\n| 408 | UNABLE_TO_CALL_SERVICE | The downstream domain processing has not completed within the configured timeout period. |\n| 429 | TOO_MANY_REQUESTS | You have exceeded your application's [rate limit](https://digital.nhs.uk/developer/guides-and-documentation/reference-guide#rate-limits). |\n","content":{"application/fhir+json":{"schema":{"type":"object","description":"Outcome of an operation that does not result in a resource or bundle being returned, for example an error or an async/batch submission.\nThere are a number of possible error codes that can be returned along with a more detailed description in the `display` field.\n","properties":{"resourceType":{"type":"string","description":"FHIR Resource Type.","default":"OperationOutcome"},"issue":{"type":"array","description":"List of issues that have occurred.","minItems":1,"items":{"type":"object","required":["severity","code"],"properties":{"severity":{"type":"string","enum":["fatal","error","warning","information"],"description":"Severity of the error.","example":"error"},"code":{"type":"string","description":"FHIR error code.","example":"invalid","enum":["invalid","structure","required","value","invariant","security","login","unknown","expired","forbidden","suppressed","processing","not-supported","duplicate","multiple-matches","not-found","deleted","too-long","code-invalid","extension","too-costly","business-rule","conflict","transient","lock-error","no-store","exception","timeout","incomplete","throttled","informational"]},"details":{"type":"object","description":"Internal error code.","properties":{"coding":{"type":"array","items":{"type":"object","properties":{"system":{"type":"string","description":"URI of the coding system specification.","example":"https://fhir.nhs.uk/R4/CodeSystem/Spine-ErrorOrWarningCode"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1"},"code":{"type":"string","description":"Symbol in syntax defined by the system.","example":"INVALID_VALUE"},"display":{"type":"string","description":"Representation defined by the system.","example":"Provided value is invalid"}}}}}},"diagnostics":{"type":"string","description":"Additional diagnostic information about the issue. This information is subject to change.","example":"Invalid value - 2019-01 in field 'birthDate'"},"expression":{"type":"string","description":"FHIRPath of element(s) related to the error.","example":"Patient.name.given"}}}}}},"example":{"resourceType":"OperationOutcome","issue":[{"severity":"error","code":"value","details":{"coding":[{"system":"https://fhir.nhs.uk/R4/CodeSystem/Spine-ErrorOrWarningCode","version":"1","code":"INVALID_VALUE","display":"Provided value is invalid"}]},"diagnostics":"Invalid value - 'mal' in field 'gender'"}]}}}}}}},"/Patient/{id}":{"parameters":[{"name":"id","in":"path","description":"The patient's NHS number. The primary identifier of a patient, unique within NHS England and Wales. Always 10 digits and must be a [valid NHS number](https://www.datadictionary.nhs.uk/attributes/nhs_number.html).","required":true,"schema":{"type":"string","example":"9000000009"}},{"in":"header","name":"Authorization","description":"An [OAuth 2.0 bearer token](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation#user-restricted-apis).\n\nRequired in all environments except sandbox.\n","required":false,"schema":{"type":"string","format":"^Bearer\\ [[:ascii:]]+$","example":"Bearer g1112R_ccQ1Ebbb4gtHBP1aaaNM"}},{"in":"header","name":"NHSD-Session-URID","description":"\nThe user role ID (URID) for the current session. Also known as a user role profile ID (URPID).\n\nThis header is optional.\n\nIn Application-restricted access mode this header is ignored.\n\nIn Healthcare worker access mode if you send this header it must be valid for the logged-in user. See [determine the user's role](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation/user-restricted-restful-apis-nhs-cis2-separate-authentication-and-authorisation#step-9-determine-the-user-s-role) for guidance.\n","required":false,"schema":{"type":"string","pattern":"^[0-9]+$","example":"555254240100"}},{"in":"header","name":"X-Request-ID","required":false,"description":"A globally unique identifier (GUID) for the request, which we use to de-duplicate repeated requests and to trace the request if you contact our helpdesk.\n\nMust be a universally unique identifier (UUID) (ideally version 4).\n\nMirrored back in a response header.\n\nIf you re-send a failed request, use the same value in this header.\n","schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","example":"60E0B220-8136-4CA5-AE46-1D97EF59D068"}},{"in":"header","name":"X-Correlation-ID","required":false,"description":"An optional ID which you can use to track transactions across multiple systems. It can take any value, but we recommend avoiding `.` characters.\n\nMirrored back in a response header.\n","schema":{"type":"string","example":"11C46F5F-CDEF-4865-94B2-0EE0EDCC26DA"}},{"in":"header","name":"NHSD-End-User-Organisation-ODS","required":false,"description":"The ODS code of the user.\n\nMandatory for client applications which service multiple end user organisations (EUO). This will allow the calls to be attributed to the correct EUO.\n","schema":{"type":"string","example":"Y12345"}}],"get":{"description":"## Overview\nUse this endpoint to get patient details from PDS for a given NHS number.\n\nYou cannot get a patient's related people details, use the RelatedPerson endpoint instead.\n\n## Superseded patients\nSome patients are marked as superseded, this means that for some reason the original resource is no longer valid and has been replaced with a different resource.\n\nOn retrieval of a superseded resource, the new resource is automatically returned in place of the requested resource. You can spot a superseded resource when the `id` is not the same as the one requested.\n\nWhen retrieving a superseding resource you must update your system with the new resource and remove the superseded resource, ensuring that the same `id` does not exist against another resource in your system.\n\n## Restricted patients\nSome patients are tagged as [restricted](https://digital.nhs.uk/services/demographics/restricting-access-to-a-patients-demographic-record) and are sometimes known as sensitive patients. Restricted patients can be retrieved; however, location sensitive fields such as `address`, `telecom` and `generalPractitioner` are removed.\n\nThe restricted flag can be found in the data under `meta/security` on the patient resource.\n\n## Sandbox test scenarios\nYou can test the following scenarios in our sandbox environment:\n\n| Scenario | Request | Response |\n| -------------------------------- | ------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |\n| Patient exists | `id`=`9000000009` | HTTP Status 200 with patient data in response |\n| Sensitive patient exists | `id`=`9000000025` | HTTP Status 200 with patient data in response with the restricted data removed |\n| Patient exists with minimal data | `id`=`9000000033` | HTTP Status 200 with patient data in response, there will be very little data so can be used as an example of a patient with bad data quality |\n| Patient does not exist | `id`=`9111231130` (or any other valid NHS number) | HTTP Status 404 with problem description |\n| Invalid NHS number | `id`=`9000000000` (or any invalid NHS number) | HTTP Status 400 with problem description |\n| Missing X-Request-ID | `id`=`9000000009` (or any other valid NHS number) | HTTP Status 412 with problem description |\n\nYou can try out the sandbox using the 'Try this API' feature on this page.\n\nAlternatively, you can try out the sandbox using our Postman collection:\n\n[![Run in Postman](https://run.pstmn.io/button.svg)](https://app.getpostman.com/run-collection/14719036-953f067f-30b9-4552-8252-7cc10b21dad3)\n","summary":"Get patient details","operationId":"get-patient","responses":{"200":{"description":"Information successfully returned.","headers":{"ETag":{"schema":{"type":"string","pattern":"^W/\"[0-9]+\"$","example":"W/\"2\""},"description":"Record version identifier enclosed in quotes and preceded by 'W/'. For example, `W/\"2\"`.\n\nCorresponds to `meta.versionId` attribute in the patient resource body.\n\nWhen you retrieve a patient resource, you get a version number for the resource (in the `ETag` response header and in the `versionId` field in the response).\nYou must then pass the resource's version number in any update request (in the `If-Match` response header) made for the patient.\n"},"X-Correlation-Id":{"schema":{"type":"string","example":"11C46F5F-CDEF-4865-94B2-0EE0EDCC26DA"},"description":"The X-Correlation-ID from the request header, if supplied, mirrored back.\n"},"X-Request-Id":{"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","example":"60E0B220-8136-4CA5-AE46-1D97EF59D068"},"description":"The X-Request-ID from the request header, if supplied, mirrored back.\n"}},"content":{"application/fhir+json":{"schema":{"type":"object","required":["id"],"additionalProperties":false,"properties":{"resourceType":{"type":"string","description":"FHIR resource type.","default":"Patient"},"id":{"description":"The patient's NHS number. The primary identifier of a patient, unique within NHS England and Wales. Always 10 digits and must be a [valid NHS number](https://www.datadictionary.nhs.uk/attributes/nhs_number.html).","type":"string","pattern":"^\\d{10}$","example":"9000000009"},"identifier":{"type":"array","description":"Identifier and system of identification used for this Patient.","items":{"type":"object","maxItems":1,"required":["value"],"properties":{"system":{"type":"string","format":"url","description":"System identifier belongs to.","default":"https://fhir.nhs.uk/Id/nhs-number"},"value":{"description":"The patient's NHS number. The primary identifier of a patient, unique within NHS England and Wales. Always 10 digits and must be a [valid NHS number](https://www.datadictionary.nhs.uk/attributes/nhs_number.html).","type":"string","pattern":"^\\d{10}$","example":"9000000009"},"extension":{"type":"array","description":"FHIR extensions.","items":{"type":"object","description":"Status indicating if NHS number is present and verified.","properties":{"url":{"type":"string","description":"URL of the extension definition.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSNumberVerificationStatus","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSNumberVerificationStatus"]},"valueCodeableConcept":{"type":"object","description":"NHS Number Verification Status Indicator.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URI of the coding system specification.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-NHSNumberVerificationStatus"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1.0.0"},"code":{"type":"string","description":"Symbol in syntax defined by the system.","example":"01"},"display":{"type":"string","description":"Representation defined by the system.","example":"Number present and verified"}}}}}}}}}}}},"meta":{"type":"object","description":"Metadata about this resource.","properties":{"versionId":{"type":"string","description":"The NHS Digital assigned version of the patient resource.","example":"2"},"security":{"type":"array","description":"The level of security on the patients record, which affects which fields are populated on retrieval. The possible responses are:\n* U - unrestricted. All available data is returned.\n* R - restricted. Any sensitive data around the patient's location, so `address`, `generalPractitioner` and `telecom`, are removed from the response.\n* REDACTED - redacted. The patient record has been marked as invalid, so the data should not be used. This code is never returned; you receive a 404, and appropriate error response, if an invalidated patient retrieval is attempted.\n","maxItems":1,"items":{"type":"object","properties":{"system":{"type":"string","description":"URI of the value set specification.","example":"http://terminology.hl7.org/CodeSystem/v3-Confidentiality"},"code":{"type":"string","description":"Code defined by the system value set.","enum":["U","R","V","REDACTED"],"example":"U"},"display":{"type":"string","description":"Representation defined by the system.","enum":["unrestricted","restricted","redacted"],"example":"unrestricted"}}}}}},"name":{"type":"array","description":"List of names associated with the patient. \n","minItems":1,"items":{"type":"object","required":["use","family"],"additionalProperties":false,"properties":{"id":{"type":"string","description":"Unique object identifier for this name.","example":"123"},"use":{"type":"string","description":"How this name should be used.\n* usual - Known as, conventional or the one patient normally uses. A patient always has a usual name.\n* temp - An alias or temporary name. This may also be used for temporary names assigned at birth or in emergency situations.\n* nickname - A name that the patient prefers to be addressed by, but is not part of their usual name.\n* old - This name is no longer in use (or was never correct, but retained for records).\n* maiden - Name changed for Marriage. A name used prior to changing name because of marriage. This term is not gender specific. The use of this term does not imply any particular history for a person's name.\n\nThe following use codes are included in the [name-use](https://www.hl7.org/fhir/valueset-name-use.html) value set, but should not be used and is not be returned as part of a retrieval.\n* official - The formal name as registered in an official (government) registry, but which name might not be commonly used. May be called \"legal name\".\n* anonymous - Anonymous assigned name, alias, or pseudonym (used to protect a person's identity for privacy reasons).\n","enum":["usual","temp","nickname","old","maiden"],"example":"usual"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"given":{"type":"array","maxItems":5,"description":"Given names, including any middle names.\n\nEach name(s) should be a separate item in the list. The first given name may include multiple names, separated by a space.\nSubsequent names must be broken down into list items. For example, the input `[Jane Marie Anne, Jo Adele]` returns `[Jane Marie Anne, Jo, Adele]`.\n","example":["Jane Marie Anne","Jo","Adele"],"items":{"type":"string","maxLength":35,"example":"Jane"}},"family":{"type":"string","maxLength":35,"description":"Family name (often called Surname).","example":"Smith"},"prefix":{"type":"array","description":"Name prefixes, titles, and prenominals.","example":["Mrs"],"items":{"type":"string","example":"Mrs"}},"suffix":{"type":"array","description":"Name suffices and postnominals.","example":["MBE","PhD"],"items":{"type":"string","example":"MBE"}}}}},"gender":{"type":"string","description":"Classification of the gender of a patient. The classification is phenotypical rather than genotypical, i.e. it does not provide codes for medical or scientific purposes.\nIt is the administrative gender that the patient wishes to be known as. In some cases, this may not be the same as the patient’s registered birth gender, or their current clinical gender.\n","enum":["male","female","other","unknown"],"example":"female"},"birthDate":{"description":"The date on which the patient was born or is officially deemed to have been born.\n\nIt is a date in the format `yyyy-mm-dd`. Due to data quality issues on a small number of patients `yyyy-mm` and `yyyy` format may also be returned. \n","example":"2010-10-22","type":"string","format":"date"},"multipleBirthInteger":{"type":"integer","minimum":1,"maximum":9,"description":"The order in which the patient was born, with 1 indicating the first or only birth in the sequence, 2 indicating the second birth in the sequence, 3 indicating the third, and so on up to 7.\n\nThere are two other valid values; `8` meaning `Not applicable` and `9` meaning `Not known`.\n","example":1},"deceasedDateTime":{"description":"The date and time on which a person died or is officially deemed to have died, if applicable and known.\n\nIt is a datetime in the format `yyyy-mm-ddTHH:MM:SS+HH:MM` or `yyyy-mm-dd`. Due to data quality issues on a small number of patients `yyyy-mm` and `yyyy` format may also be returned.\n","example":"2010-10-22T00:00:00+00:00","type":"string","format":"date-time","pattern":"^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2}\\+\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2}\\+\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01]))$"},"address":{"type":"array","description":"List of addresses associated with the patient.\n\nThese are fully populated on a retrieval or a successful update, only the `home` address is returned on a search.\nWhen a patient tagged as `restricted` is retrieved, all addresses are removed from the response.\n","items":{"type":"object","description":"An address associated with the patient.","required":["use"],"properties":{"id":{"type":"string","description":"Unique system identifier for this address.","example":"456"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"use":{"type":"string","description":"Purpose of this address:\n * `home` - the home address is the patient's normal residence. Home address is also known as usual, main, registered, current or permanent address\n * `temp` - a temporary address is an address used for a set period of time, but where the patient's home, permanent address remains unchanged\n * `billing` - an address used for correspondence purposes only\n * `work` - an office address. This can be returned due to legacy data but cannot be added or replaced on update\n\n A patient should have no more than one current `temp` and/or `billing` address.\n However, historically this was constrained only by the integration requirements and was not enforced so theoretically more than one can exist for a patient when retrieving.\n Where multiple instances already exist for the patient it is not expected that local systems should manage those, but should choose the most appropriate one to maintain (e.g. by examining period dates).\n\n A `home` address is the patient's main residential address and should normally be used for all clinical and demographic purposes, including clinical and appointment correspondence.\n However additionally, `temp` and `billing` addresses may be provided by a patient when there is a requirement to record an alternative location for the purposes of unbroken care.\n When sending correspondence to a patient:\n *\ta present and valid `billing` address may take precedence over `home` and `temp` addresses. A patient should have only a single current `billing` address. An address is considered 'valid' according to its period start and end dates.\n *\tif no current `billing` address is provided, a `temp` address may take precedence over the `home` address, again if it is valid according to its period start and end dates.\n * if there is no valid, current `billing` and/or `temp` address, the `home` address must be used.\n","enum":["home","work","temp","billing"],"example":"home"},"text":{"type":"string","description":"Where a `temp` address is provided a descriptor text must be sent.\nThe list of possible values are:\n* `Second Home` - a patient's second home\n* `Student Accommodation` - a patient's place of residence while at university\n* `Respite Care Address` - where the patient resides during respite care\n* `Temporary Residence Address` - where the patient resides for a specific period of time\n* `Convalescence Home` - the address for a patient during a period of recovery\n* `Mobile Home` - the address of a patient's mobile home, parked for a specific period of time, e.g. the address of a caravan park\n* `Holiday Home` - the address for a patient during a holiday\n\nA patient can also register temporarily at a GP practice using a temporary address. Temporary GP registration information does not appear on the PDS, but the address used for it may.\n","enum":["Second Home","Student Accommodation","Respite Care Address","Temporary Residence Address","Convalescence Home","Mobile Home","Holiday Home"],"example":"Student Accommodation"},"line":{"type":"array","description":"All lines of the address except the postal code.\n\nSystems must apply the following formatting convention when adding or replacing addresses lines:\n*\tline 1 - premises ID and/or house name, e.g. `Flat 1` or `The Old Schoolhouse`\n*\tline 2 - house number, dependent thoroughfare name and descriptor (if present), thoroughfare name and descriptor, e.g. `23 Mill Lane`\n*\tline 3 - dependent locality/village, locality (if present), e.g. `Boxgrove`\n*\tline 4 - post town, e.g. `Leeds`\n*\tline 5 - county (if present), e.g. `West Yorkshire`\n\nIf any of the lines are blank, they are not returned due to FHIR conformance constraints.\n","maxItems":5,"items":{"type":"string"},"example":["1 Trevelyan Square","Boar Lane","City Centre","Leeds","West Yorkshire"]},"postalCode":{"type":"string","description":"Postal code of the address.","example":"LS1 6AE"},"extension":{"type":"array","description":"List of address keys formatted as a FHIR extension. This can include up to one Unique Property Reference Number (UPRN), and up to one Postal Address File (PAF) key. If no keys for the address are known, the array will be empty. Otherwise it will be a list of objects which specify the value of the address key and the code system for it","items":{"anyOf":[{"type":"object","description":"Unique identifier for an address.","properties":{"url":{"type":"string","description":"URL of specification of the AddressKey extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey"]},"extension":{"type":"array","description":"Specification of address key system and address key value. Contains exactly two items: one describing the code system the Address Key uses, and the other specifying the value of the Address Key.","minItems":2,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Coding system of the address key.","required":["url","valueCoding"],"properties":{"url":{"type":"string","description":"Always 'type'.","default":"type"},"valueCoding":{"type":"object","description":"URL of specification of address key format.","required":["system","code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available Address Key formats.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType"},"code":{"type":"string","description":"Address Key system. Always 'PAF'.","enum":["PAF"],"example":"PAF"}}}}},{"type":"object","description":"Value of the address key.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Always 'value'.","default":"value","example":"value"},"valueString":{"type":"string","description":"Address key in PAF format. An 8 digit number including leading zeroes, formatted as a string.","minLength":8,"maxLength":8,"pattern":"^[0-9]{8}$","example":"12345678"}}}]}}}},{"type":"object","description":"Unique identifier for an address.","properties":{"url":{"type":"string","description":"URL of specification of the AddressKey extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey"]},"extension":{"type":"array","description":"Specification of address key system and address key value. Contains exactly two items: one describing the code system the Address Key uses, and the other specifying the value of the Address Key.","minItems":2,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Coding system of the address key.","required":["url","valueCoding"],"properties":{"url":{"type":"string","description":"Always 'type'.","default":"type"},"valueCoding":{"type":"object","description":"URL of specification of address key format.","required":["system","code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available Address Key formats.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType"},"code":{"type":"string","description":"Address Key system. Always 'UPRN'.","enum":["UPRN"],"example":"UPRN"}}}}},{"type":"object","description":"Value of the address key.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Always 'value'.","default":"value","example":"value"},"valueString":{"type":"string","description":"Address key in UPRN format. A number containing from 1 up to 12 digits.","minLength":1,"maxLength":12,"pattern":"^[0-9]{1,12}$","example":"123456789012"}}}]}}}}]}}}}},"telecom":{"type":"array","description":"List of contact points for the patient; for example, phone numbers or email addresses.\nWhen a patient tagged as `restricted` is retrieved, all contact points are removed from the response.\n","items":{"description":"A contact point, such as a phone number or email address","type":"object","required":["system","value"],"properties":{"id":{"type":"string","description":"Unique object identifier for this contact point.","example":"789"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"system":{"description":"Means of communication, such as phone or email.","type":"string","enum":["phone","fax","email","other"],"example":"phone"},"value":{"description":"Phone number, email address, or other identifier for use with contact system.","type":"string","example":"01632960587"},"use":{"type":"string","description":"Location associated with communication system.","enum":["home","work","temp","mobile"],"example":"home"},"extension":{"type":"array","maxItems":1,"description":"Extension that is returned when the communication type is `textphone`. The only code returned is `textphone`, which means `Minicom (Textphone)`.\n\nThe `system` is `other` when the extension is included.\n","items":{"type":"object","description":"Wrapped object for other contact system details.","properties":{"url":{"type":"string","description":"Definition of other contact system extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem"]},"valueCoding":{"type":"object","description":"URL of specification of other contact systems.","properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem"},"code":{"type":"string","description":"Coded value for the other contact system in place.","example":"textphone"},"display":{"description":"Display-friendly representation of the other contact system code.","type":"string","example":"Minicom (Textphone)"}}}}}}}}},"contact":{"type":"array","description":"A list of patient contacts. Only emergency contacts are returned and only emergency contacts should be added. Any other contacts should be added to the patients `Related Person`.\nPatients designate here any contact number they desire to be used in case of an emergency.\nNote, while a patient may also desire to record various related persons telecom details, these do not separately allow for a concept of emergency contact; only ranking. See RelatedPerson endpoint.\nWhen a patient tagged as `restricted` is retrieved, all contacts are removed from the response.\n","items":{"title":"Schema for a patient contact.","type":"object","additionalProperties":false,"required":["relationship","telecom"],"properties":{"id":{"type":"string","example":"C123"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"relationship":{"type":"array","description":"The contact relationship wrapper object that holds the details of the relationship to the patient.\n\nThis is only returned when an Emergency Contact number has been set on `telecom`. The only valid code is `C`, which means `Emergency Contact`.\n","minItems":1,"maxItems":1,"items":{"type":"object","required":["coding"],"properties":{"coding":{"type":"array","description":"Exactly one contact relationship.","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","format":"url","default":"http://terminology.hl7.org/CodeSystem/v2-0131"},"code":{"type":"string","description":"Coded value for contact relationship.","example":"C"},"display":{"type":"string","description":"Display-friendly representation of the contact relationship code.","example":"Emergency Contact"}}}}}}},"telecom":{"type":"array","description":"List of Telecom objects on the contact only contains `system` and `value`.\n","items":{"description":"A contact point, such as a phone number or email address","type":"object","required":["system","value"],"properties":{"id":{"type":"string","description":"Unique object identifier for this contact point.","example":"789"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"system":{"description":"Means of communication, such as phone or email.","type":"string","enum":["phone","fax","email","other"],"example":"phone"},"value":{"description":"Phone number, email address, or other identifier for use with contact system.","type":"string","example":"01632960587"},"use":{"type":"string","description":"Location associated with communication system.","enum":["home","work","temp","mobile"],"example":"home"},"extension":{"type":"array","maxItems":1,"description":"Extension that is returned when the communication type is `textphone`. The only code returned is `textphone`, which means `Minicom (Textphone)`.\n\nThe `system` is `other` when the extension is included.\n","items":{"type":"object","description":"Wrapped object for other contact system details.","properties":{"url":{"type":"string","description":"Definition of other contact system extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem"]},"valueCoding":{"type":"object","description":"URL of specification of other contact systems.","properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem"},"code":{"type":"string","description":"Coded value for the other contact system in place.","example":"textphone"},"display":{"description":"Display-friendly representation of the other contact system code.","type":"string","example":"Minicom (Textphone)"}}}}}}}}}}}},"generalPractitioner":{"type":"array","maxItems":1,"description":"General Practice (not practitioner) with which the patient is, or was, registered. Always contains zero or one general practitioner object.\nWhen a patient tagged as `restricted` is retrieved, the General Practice is removed from the response.\n","items":{"description":"General practice (not practitioner) with which the patient is or was registered.","type":"object","required":["identifier"],"properties":{"id":{"description":"Object identifier (OID) specific to the returned details - this should be return exactly the same in any update.","type":"string","example":"254406A3"},"type":{"description":"Type of Reference being returned.","type":"string","example":"Organization"},"identifier":{"description":"Identifier and system of identification used for this Organisation.","type":"object","required":["value"],"properties":{"system":{"description":"URL for the Organisation Data Service - who are responsible for publishing codes that identify organisations and individuals across health and social care.","type":"string","example":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"description":"Organisation code for the registered general practice, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","type":"string","pattern":"^[0-9A-Z]+$","example":"Y12345"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}}}}}}},"managingOrganization":{"description":"The managing organization of a de-registered patient. This will not be returned when the reason for de-registration is death.","type":"object","required":["identifier"],"properties":{"type":{"description":"Type of Reference being returned.","type":"string","example":"Organization"},"identifier":{"description":"Identifier and system of identification used for this Organisation.","type":"object","required":["value"],"properties":{"system":{"description":"URL for the Organisation Data Service - who are responsible for publishing codes that identify organisations and individuals across health and social care.","type":"string","example":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"description":"Organisation code for the registered general practice, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","type":"string","pattern":"^[0-9A-Z]+$","example":"Y12345"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}}}}}},"extension":{"type":"array","description":"Wrapper array for the patient's pharmacies, death notification status, communication details, contact preferences and place of birth; these are all FHIR extensions.\nAlways contains zero or one of each pharmacy object, zero or one death notification status object, zero or one communication details object, zero or one contact preference and zero or one place of birth object.\nWhen a patient tagged as `restricted` is retrieved, the pharmacy and birth place extensions are removed from the response.\n","items":{"anyOf":[{"type":"object","description":"Wrapper object for the patient's nominated pharmacy. This will only be populated on a retrieval and not a search.","required":["url","valueReference"],"properties":{"url":{"type":"string","description":"URL of specification of UKCore-NominatedPharmacy FHIR extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NominatedPharmacy","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NominatedPharmacy"]},"valueReference":{"type":"object","description":"Reference to a pharmacy `Organization` resource.","required":["identifier"],"properties":{"identifier":{"type":"object","description":"Wrapper object for the patient's nominated pharmacy organisation code.","required":["value"],"properties":{"system":{"type":"string","description":"URL for the FHIR code system for the ODS organisation code.","default":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"type":"string","description":"Organisation code for the nominated pharmacy, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","pattern":"^[A-Za-z0-9]{3,10}$","example":"Y12345"}}}}}}},{"type":"object","description":"Wrapper object for the patient's dispensing doctor. This will only be populated on a retrieval and not a search.","required":["url","valueReference"],"properties":{"url":{"type":"string","description":"URL of specification of UKCore-DispensingDoctor FHIR extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-PreferredDispenserOrganization","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-PreferredDispenserOrganization"]},"valueReference":{"type":"object","description":"Reference to a GP practice pharmacy `Organization` resource.","required":["identifier"],"properties":{"identifier":{"type":"object","description":"Wrapper object for the patient's dispensing doctor organisation code.","required":["value"],"properties":{"system":{"type":"string","description":"URL for the FHIR code system for the ODS organisation code.","default":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"type":"string","description":"Organisation code for the dispensing doctor, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","pattern":"^[A-Za-z0-9]{3,10}$","example":"Y23456"}}}}}}},{"type":"object","description":"Wrapper object for the patient's medical appliance supplier. This will only be populated on a retrieval and not a search.","required":["url","valueReference"],"properties":{"url":{"type":"string","description":"URL of specification of UKCore-MedicalApplianceSupplier FHIR extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-MedicalApplianceSupplier","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-MedicalApplianceSupplier"]},"valueReference":{"type":"object","description":"Reference to medical appliance supplier pharmacy `Organization` resource.","required":["identifier"],"properties":{"identifier":{"type":"object","description":"Wrapper object for the patient's medical appliance supplier organisation code.","required":["value"],"properties":{"system":{"type":"string","description":"URL for the FHIR code system for the ODS organisation code.","default":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"type":"string","description":"Organisation code for the medical appliance supplier, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","pattern":"^[A-Za-z0-9]{3,10}$","example":"Y34567"}}}}}}},{"type":"object","description":"Wrapper object for death notification details.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of death notification extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus"]},"extension":{"type":"array","description":"Array containing exactly one death notification status code object and exactly one effective date object.","minItems":1,"maxItems":2,"items":{"oneOf":[{"type":"object","description":"Wrapper object for death notification status code.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `deathNotificationStatus`.","default":"deathNotificationStatus","enum":["deathNotificationStatus"]},"valueCodeableConcept":{"type":"object","description":"Death Notification Status.","properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["system","code"],"properties":{"system":{"type":"string","description":"URI of the coding system specification.","example":"https://fhir.hl7.org.uk/CodeSystem/UKCore-DeathNotificationStatus"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1.0.0"},"code":{"type":"string","description":"Symbol, in syntax, defined by the system:\n* `1` - Informal - death notice received via an update from a local NHS Organisation such as GP or Trust\n* `2` - Formal - death notice received from Registrar of Deaths. Only these endpoints are allowed to add a Formal death:\n - National Back Office using the Demographic Spine Application (DSA)\n - Office of National Statistics (ONS)\n - Maternity sites\n* `U` - Removed. This is a possible response, but it cannot be used on an update because Spine will reject it\n","example":"2","enum":["1","2","U"]},"display":{"type":"string","description":"Representation defined by the system.","example":"Formal - death notice received from Registrar of Deaths","enum":["Informal - death notice received via an update from a local NHS Organisation such as GP or Trust","Formal - death notice received from Registrar of Deaths","Removed"]}}}}}}}},{"type":"object","description":"Wrapper object for death notification effective date.","required":["url","valueDateTime"],"properties":{"url":{"type":"string","description":"Key of this object. Always `systemEffectiveDate`.","default":"systemEffectiveDate","enum":["systemEffectiveDate"]},"valueDateTime":{"type":"string","description":"Date and time at which death notification status took effect.","format":"date-time","example":"2010-10-22T00:00:00+00:00"}}}]}}}},{"type":"object","description":"Wrapper object for communication details. This will only be populated on a retrieval and not a search.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of communication extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSCommunication","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSCommunication"]},"extension":{"type":"array","description":"Definition of communication extension.\n\nThe array must have one item, a valueCodeableConcept for the language and can optionally include a valueBoolean for if an interpreter is required.","minItems":1,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Wrapper object for communication language.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `language`.","default":"language","enum":["language"]},"valueCodeableConcept":{"type":"object","description":"Human language.","required":["coding"],"properties":{"coding":{"type":"array","description":"Exactly one language code.","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URL of the Language Code System. Always uses the 'UKCore-HumanLanguage' Code System.","example":"https://fhir.hl7.org.uk/CodeSystem/UKCore-HumanLanguage"},"version":{"type":"string","description":"Version of the language code system.","example":"1.0.0"},"code":{"type":"string","description":"Language code based on [ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) standard plus extensions for braille, makaton and sign languages, which are:\n* `q1` - Braille\n* `q2` - American Sign Language\n* `q3` - Australian Sign Language\n* `q4` - British Sign Language\n* `q5` - Makaton\nAll valid codes combined can be found at https://fhir.hl7.org.uk/CodeSystem/UKCore-HumanLanguage.\n","example":"fr"},"display":{"type":"string","description":"Display-friendly representation of the language code (such as English). If there is a language code with no defined mapping, `Unknown` will be returned.","example":"French"}}}}}}}},{"type":"object","description":"Wrapper object for whether an interpreter is required.","required":["url","valueBoolean"],"properties":{"url":{"type":"string","description":"Key of this object. Always `interpreterRequired`.","default":"interpreterRequired","enum":["interpreterRequired"]},"valueBoolean":{"type":"boolean","description":"Whether an interpreter is required.","example":true}}}]}}}},{"type":"object","description":"Wrapper object for preferred contact details; the written communication format, preferred contact time and method. This will only be populated on a retrieval and not a search.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of the contact preference extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-ContactPreference","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-ContactPreference"]},"extension":{"description":"Wrapper array containing zero or one preferred contact method, zero or one preferred written communication format; and zero or one preferred contact time.","type":"array","maxItems":3,"items":{"oneOf":[{"type":"object","description":"Wrapper object for preferred written communication format.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredWrittenCommunicationFormat`.","default":"PreferredWrittenCommunicationFormat"},"valueCodeableConcept":{"type":"object","description":"Preferred Written Communication Format.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","format":"url","description":"Definition of the preferred written communication extension.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredWrittenCommunicationFormat","enum":["https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredWrittenCommunicationFormat"]},"code":{"type":"string","description":"A code to identify the preferred written communication format of a patient, contact or related person.\n* 11 - Large print\n* 12 - Braille\n* 13 - Audio tape\n","example":"12"},"display":{"type":"string","description":"Display-friendly representation of the preferred written communication format code.","example":"Braille"}}}}}}}},{"type":"object","description":"Wrapper object for preferred contact method.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredContactMethod`.","default":"PreferredContactMethod","enum":["PreferredContactMethod"]},"valueCodeableConcept":{"type":"object","description":"Preferred Contact Method.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","format":"url","description":"Definition of the preferred contact method extension.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredContactMethod","enum":["https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredContactMethod"]},"code":{"type":"string","description":"A code to identify to identify the preferred contact method of a patient, contact or related person.\n* 1\t- Letter\n* 2\t- Visit\n* 3\t- Telephone\n* 4\t- E-mail\n* 5\t- Minicom (Textphone)\n* 6\t- Telephone contact via proxy\n* 7\t- Sign language\n* 8\t- No Telephone contact\n","example":"1"},"display":{"type":"string","description":"Display-friendly representation of the preferred contact method code.","example":"Letter"}}}}}}}},{"type":"object","description":"Wrapper object for preferred contact times.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredContactTimes`.","default":"PreferredContactTimes","enum":["PreferredContactTimes"]},"valueString":{"type":"string","maximum":40,"description":"A free-text description about the preferred contact times.","example":"Not after 7pm"}}}]}}}},{"type":"object","description":"Wrapper object for place of birth details. This will not be returned on a restricted patient.","required":["url","valueAddress"],"properties":{"url":{"type":"string","description":"Definition of place of birth extension.","default":"http://hl7.org/fhir/StructureDefinition/patient-birthPlace","enum":["http://hl7.org/fhir/StructureDefinition/patient-birthPlace"]},"valueAddress":{"type":"object","additionalProperties":false,"properties":{"city":{"type":"string","description":"Town or city of birth.","example":"Manchester"},"district":{"type":"string","description":"County or metropolitan district of birth.","example":"Greater Manchester"},"country":{"type":"string","description":"A coded value for a patient's country of birth.\n\nFrom [ISO 3166-1](http://hl7.org/fhir/valueset-iso3166-1-3.html) plus codes from the UK Internal Code list which do not have entries in ISO 3166-1.\n\nUK Internal Codes:\n* `1` - England\n* `2` - Scotland\n* `3` - Wales\n* `4` - Northern Ireland\n* `7` - Sark\n* `9` - Alderney\n* `10` - Channel Islands\n","example":"GBR"}}}}},{"type":"object","description":"An extension to carry the reason a PDS record has been removed from the Patient Demographic Service. This will only be populated on a retrieval and not a search.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of the removal from registration extension.","default":"https://fhir.nhs.uk/StructureDefinition/Extension-PDS-RemovalFromRegistration","enum":["https://fhir.nhs.uk/StructureDefinition/Extension-PDS-RemovalFromRegistration"],"readOnly":true},"extension":{"type":"array","description":"An extension reason a PDS record has been removed from the Patient Demographic Service.","minItems":1,"maxItems":2,"items":{"oneOf":[{"type":"object","description":"Wrapper object for removalFromRegistrationCode.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"To identify the removal reason code.","default":"removalFromRegistrationCode","enum":["removalFromRegistrationCode"],"readOnly":true},"valueCodeableConcept":{"type":"object","description":"PDS Removal Reason Exit Code","required":["coding"],"properties":{"coding":{"type":"array","description":"Array containing exactly one removal reason exit code object","items":{"type":"object","required":["system","code","display"],"properties":{"system":{"type":"string","format":"url","description":"URL of the Removal Reason Exit Code. Always uses the 'PDS-RemovalReasonExitCode' Code System.","example":"https://fhir.nhs.uk/CodeSystem/PDS-RemovalReasonExitCode","readOnly":true},"code":{"type":"string","description":"A CodeSystem that identifies the reason a PDS record has been removed.","example":"SCT","enum":["DEA","EMB","SCT","NIT","TRA","ORR"]},"display":{"type":"string","description":"Display-friendly representation of the removal reason exit code.","example":"Transferred to Scotland"}}}}}}}},{"type":"object","description":"Wrapper object for removal from registration effective time.","required":["url","valuePeriod"],"properties":{"url":{"type":"string","description":"Key of this object. Always `effectiveTime`.","default":"effectiveTime","enum":["effectiveTime"],"readOnly":true},"valuePeriod":{"type":"object","description":"The effective time of removal of the Patient record from PDS.","required":["start"],"properties":{"start":{"type":"string","format":"date-time","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01T00:00:00+00:00"},"end":{"type":"string","format":"date-time","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31T00:00:00+00:00"}}}}}]}}}}]}}}},"example":{"resourceType":"Patient","id":"9000000009","identifier":[{"system":"https://fhir.nhs.uk/Id/nhs-number","value":"9000000009","extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSNumberVerificationStatus","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-NHSNumberVerificationStatus","version":"1.0.0","code":"01","display":"Number present and verified"}]}}]}],"meta":{"versionId":"2","security":[{"system":"http://terminology.hl7.org/CodeSystem/v3-Confidentiality","code":"U","display":"unrestricted"}]},"name":[{"id":"123","use":"usual","period":{"start":"2020-01-01","end":"2021-12-31"},"given":["Jane"],"family":"Smith","prefix":["Mrs"],"suffix":["MBE"]}],"gender":"female","birthDate":"2010-10-22","multipleBirthInteger":1,"deceasedDateTime":"2010-10-22T00:00:00+00:00","generalPractitioner":[{"id":"254406A3","type":"Organization","identifier":{"system":"https://fhir.nhs.uk/Id/ods-organization-code","value":"Y12345","period":{"start":"2020-01-01","end":"2021-12-31"}}}],"managingOrganization":{"type":"Organization","identifier":{"system":"https://fhir.nhs.uk/Id/ods-organization-code","value":"Y12345","period":{"start":"2020-01-01","end":"2021-12-31"}}},"extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NominatedPharmacy","valueReference":{"identifier":{"system":"https://fhir.nhs.uk/Id/ods-organization-code","value":"Y12345"}}},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-PreferredDispenserOrganization","valueReference":{"identifier":{"system":"https://fhir.nhs.uk/Id/ods-organization-code","value":"Y23456"}}},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-MedicalApplianceSupplier","valueReference":{"identifier":{"system":"https://fhir.nhs.uk/Id/ods-organization-code","value":"Y34567"}}},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus","extension":[{"url":"deathNotificationStatus","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-DeathNotificationStatus","version":"1.0.0","code":"2","display":"Formal - death notice received from Registrar of Deaths"}]}},{"url":"systemEffectiveDate","valueDateTime":"2010-10-22T00:00:00+00:00"}]},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSCommunication","extension":[{"url":"language","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-HumanLanguage","version":"1.0.0","code":"fr","display":"French"}]}},{"url":"interpreterRequired","valueBoolean":true}]},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-ContactPreference","extension":[{"url":"PreferredWrittenCommunicationFormat","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredWrittenCommunicationFormat","code":"12","display":"Braille"}]}},{"url":"PreferredContactMethod","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredContactMethod","code":"1","display":"Letter"}]}},{"url":"PreferredContactTimes","valueString":"Not after 7pm"}]},{"url":"http://hl7.org/fhir/StructureDefinition/patient-birthPlace","valueAddress":{"city":"Manchester","district":"Greater Manchester","country":"GBR"}},{"url":"https://fhir.nhs.uk/StructureDefinition/Extension-PDS-RemovalFromRegistration","extension":[{"url":"removalFromRegistrationCode","valueCodeableConcept":{"coding":[{"system":"https://fhir.nhs.uk/CodeSystem/PDS-RemovalReasonExitCode","code":"SCT","display":"Transferred to Scotland"}]}},{"url":"effectiveTime","valuePeriod":{"start":"2020-01-01T00:00:00+00:00","end":"2021-12-31T00:00:00+00:00"}}]}],"telecom":[{"id":"789","period":{"start":"2020-01-01","end":"2021-12-31"},"system":"phone","value":"01632960587","use":"home"},{"id":"790","period":{"start":"2019-01-01","end":"2022-12-31"},"system":"email","value":"jane.smith@example.com","use":"home"},{"id":"OC789","period":{"start":"2020-01-01","end":"2021-12-31"},"system":"other","value":"01632960587","use":"home","extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem","code":"textphone","display":"Minicom (Textphone)"}}]}],"contact":[{"id":"C123","period":{"start":"2020-01-01","end":"2021-12-31"},"relationship":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0131","code":"C","display":"Emergency Contact"}]}],"telecom":[{"system":"phone","value":"01632960587"}]}],"address":[{"id":"456","period":{"start":"2020-01-01","end":"2021-12-31"},"use":"home","line":["1 Trevelyan Square","Boar Lane","City Centre","Leeds","West Yorkshire"],"postalCode":"LS1 6AE","extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","extension":[{"url":"type","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType","code":"PAF"}},{"url":"value","valueString":"12345678"}]},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","extension":[{"url":"type","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType","code":"UPRN"}},{"url":"value","valueString":"123456789012"}]}]},{"id":"T456","period":{"start":"2020-01-01","end":"2021-12-31"},"use":"temp","text":"Student Accommodation","line":["1 Trevelyan Square","Boar Lane","City Centre","Leeds","West Yorkshire"],"postalCode":"LS1 6AE","extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","extension":[{"url":"type","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType","code":"PAF"}},{"url":"value","valueString":"12345678"}]},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","extension":[{"url":"type","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType","code":"UPRN"}},{"url":"value","valueString":"123456789012"}]}]}]}}}},"4XX":{"description":"An error occurred as follows:\n\n| HTTP status | Error code | Description |\n| ----------- | -------------------------- | --------------------------------------------- |\n| 400 | INVALID_RESOURCE_ID | Invalid NHS number. |\n| 400 | UNSUPPORTED_SERVICE | Missing NHS number. |\n| 400 | MISSING_VALUE | Missing header parameter. For details, see the `diagnostics` field. |\n| 400 | INVALID_VALUE | Invalid header parameter. For details, see the `diagnostics` field. |\n| 401 | ACCESS_DENIED | Access token missing, invalid or expired, or calling application not configured for this operation. |\n| 403 | ACCESS_DENIED | Patient cannot perform this action. |\n| 404 | RESOURCE_NOT_FOUND | Patient does not exist for given NHS number. |\n| 404 | INVALIDATED_RESOURCE | Patient did exist for given NHS number, but has been invalidated and not superseded by another NHS number. |\n| 408 | UNABLE_TO_CALL_SERVICE | The downstream domain processing has not completed within the configured timeout period. |\n| 429 | TOO_MANY_REQUESTS | You have exceeded your application's [rate limit](https://digital.nhs.uk/developer/guides-and-documentation/reference-guide#rate-limits). |\n","content":{"application/fhir+json":{"schema":{"type":"object","description":"Outcome of an operation that does not result in a resource or bundle being returned, for example an error or an async/batch submission.\nThere are a number of possible error codes that can be returned along with a more detailed description in the `display` field.\n","properties":{"resourceType":{"type":"string","description":"FHIR Resource Type.","default":"OperationOutcome"},"issue":{"type":"array","description":"List of issues that have occurred.","minItems":1,"items":{"type":"object","required":["severity","code"],"properties":{"severity":{"type":"string","enum":["fatal","error","warning","information"],"description":"Severity of the error.","example":"error"},"code":{"type":"string","description":"FHIR error code.","example":"invalid","enum":["invalid","structure","required","value","invariant","security","login","unknown","expired","forbidden","suppressed","processing","not-supported","duplicate","multiple-matches","not-found","deleted","too-long","code-invalid","extension","too-costly","business-rule","conflict","transient","lock-error","no-store","exception","timeout","incomplete","throttled","informational"]},"details":{"type":"object","description":"Internal error code.","properties":{"coding":{"type":"array","items":{"type":"object","properties":{"system":{"type":"string","description":"URI of the coding system specification.","example":"https://fhir.nhs.uk/R4/CodeSystem/Spine-ErrorOrWarningCode"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1"},"code":{"type":"string","description":"Symbol in syntax defined by the system.","example":"INVALID_VALUE"},"display":{"type":"string","description":"Representation defined by the system.","example":"Provided value is invalid"}}}}}},"diagnostics":{"type":"string","description":"Additional diagnostic information about the issue. This information is subject to change.","example":"Invalid value - 2019-01 in field 'birthDate'"},"expression":{"type":"string","description":"FHIRPath of element(s) related to the error.","example":"Patient.name.given"}}}}}},"example":{"resourceType":"OperationOutcome","issue":[{"severity":"error","code":"structure","details":{"coding":[{"system":"https://fhir.nhs.uk/R4/CodeSystem/Spine-ErrorOrWarningCode","version":"1","code":"MISSING_VALUE","display":"Required value is missing"}]},"diagnostics":"Missing value - 'birth_date/birth_date_range_start/birth_date_range_end'"}]}}}}}},"patch":{"description":"## Overview\nUse this endpoint to update patient details in PDS.\n\nThis is a 'PATCH' operation - you can update specific parts of the patient record, such as name or gender, without having to update the entire record.\n\nWhen you make a PATCH request with your application, the endpoint will respond with a successful (200) response code, along with the updated patient resource, or, an unsuccessful (4xx/5xx) response. \n\n99.99% of all updates complete in under 10 seconds. If an update takes longer than 10 seconds, the endpoint responds with an HTTP status of 503 (Gateway Timeout). \n\nYou can alter the timeout period using the `X-Sync-Wait` header. If you re-submit the update, use the same `X-Request-ID` header.\n\nThe behaviour of this endpoint depends on which access mode you are using:\n\n| Access mode | Behaviour restrictions |\n| ------------------------------ | ----------------------------------- |\n| Application-restricted access | Updates not allowed |\n| Healthcare worker access | Updates allowed |\n| Patient access | Updates allowed |\n\n## Patient resource versioning\nTo update a patient's resource you must have retrieved it first, to ensure you are working against an up-to-date patient resource.\n\nWhen you retrieve a patient resource, you get a version number for the resource (in the `ETag` response header in the form `W/\"2\"` and in the `versionId` field in the response, in the form `\"2\"`).\n\nYou must then pass the patient's version number in the update request (in the `If-Match` response header).\n\nIt is recommended you use the value from the `Etag` header as this is in the correct form the `If-Match` header is expected, for example `W/\"2\"` and can be mirrored back in the request.\n\nThe update only succeeds, if the patient resource has not been updated in our database between your first retrieval and the update request.\n\nIf the update succeeds, you will receive the updated patient resource, this will contain the new resource version number.\n\nIf you make a subsequent update you must use the new version number.\n\n## JSON Patch\nTo update a patient record, a [JSON Patch](https://tools.ietf.org/html/rfc6902) should be sent. A JSON Patch consists of one or more patch objects within a list.\n\nIt is recommended that all desired updates are sent together in a single request as a list of patches.\nThis is the most efficient approach and reduces the danger of race conditions occurring when updating the patient record multiple times in a short period of time.\n\nWhen processing the list of patch objects, each patch must be valid and pass all the business rules against the data. If one patch object fails, none of the patch objects are applied.\n\nA patch object consists of:\n* an operation, `op` - this is required.\n* a path to the data that you want to change, `path` - this is required.\n* the value that is assigned, `value` - this is required for `add`, `replace` and `test`; but should not be included for a `remove`.\n\nThe following operations are supported:\n* `add` - to add a new value.\n* `replace` - to replace an existing value.\n* `remove` - to remove an existing value.\n* `test` - to test the state of a value is as expected before continuing with the update.\n\nPaths point to a single value, list or object, for example:\n* `/gender` - pointing to the gender value.\n* `/name` - point to the name list.\n* `/name/0` - pointing to the 1st object in the name list.\n* `/address/0/line/1` - pointing to the 2nd line string in the 1st address object.\n\nThe value can be set to any valid value for that path, so could be a null, a string, an object or a list.\n\n### Addition\n\n`add` should be used to add new items to a patient.\n\nAdding a simple data item such as the date of death can be done using a patch such as:\n\n```json\n{\n \"patches\": [\n { \"op\": \"add\", \"path\": \"/deceasedDate\", \"value\": \"2020-01-01\" }\n ]\n}\n```\n\nAdding to a list such as a `name` should be done by including the whole object in the value field. Note, the list index is `-` this is because when adding to a list, the index is not known:\n\n```json\n{\n \"patches\": [\n {\n \"op\": \"add\",\n \"path\": \"/name/-\",\n \"value\": {\n \"use\": \"usual\",\n \"period\": { \"start\": \"2019-12-31\" },\n \"prefix\": [\"Dr\"],\n \"given\": [\n \"Joe\",\n \"Horation\",\n \"Maximus\"\n ],\n \"family\": \"Bloggs\",\n \"suffix\": [\"PhD\"]\n }\n }\n ]\n}\n```\n\nWhen adding a base level list item such as a new name or address, ensure the index is always `-`, otherwise the request is rejected. For example, `/name/-`.\nThe reason for this is because the backend system makes the decision on the ordering of the listed objects to ensure they are always returned in the same order.\n\nIf you are adding to a sub-element that is a list, such as an additional given name, it is valid to provide an exact index. So the following is valid:\n\n```json\n{\n \"patches\": [\n {\n \"op\": \"add\", \"path\": \"/name/0/id\", \"value\": \"8F8B957D\"\n },\n {\n \"op\": \"add\", \"path\": \"/name/0/given/0\", \"value\": \"Rose\"\n }\n ]\n}\n```\n\nIt is possible to `add` a sub-element to an existing object in a patch request. If the object already exists and you have the object `id`, you must supply it or the update is rejected.\nThe following patch is allowed:\n\n```json\n{\n \"patches\": [\n {\n \"op\": \"add\", \"path\": \"/name/0/id\", \"value\": \"8F8B957D\"\n },\n {\n \"op\": \"add\", \"path\": \"/name/0/given/0\", \"value\": \"Rose\"\n }\n ]\n}\n```\n\nbut the following is not allowed:\n\n```json\n{\n \"patches\": [\n {\n \"op\": \"add\", \"path\": \"/name/0/given/-\", \"value\": \"Rose\"\n }\n ]\n}\n```\n\n### Replacing\n\n`replace` should be used to alter existing items on the patient.\n\nReplacing a simple data item such as the gender can be done using a patch such as:\n\n```json\n{\n \"patches\": [\n { \"op\": \"replace\", \"path\": \"/gender\", \"value\": \"male\" }\n ]\n}\n```\n\nReplacing a list item can be done in two ways which may be dependent on any external development libraries that can be used to create the patch.\n\nThe first approach is to replace the whole list item:\n\n```json\n{\n \"patches\": [\n {\n \"op\": \"replace\",\n \"path\": \"/name/0\",\n \"value\": {\n \"id\": \"123\",\n \"use\": \"usual\",\n \"period\": { \"start\": \"2019-12-31\" },\n \"prefix\": [\"Dr\"],\n \"given\": [\n \"Joe\",\n \"Horation\",\n \"Maximus\"\n ],\n \"family\": \"Bloggs\",\n \"suffix\": [\"PhD\"]\n }\n }\n ]\n}\n```\n\nThe second approach is to replace just a part, or parts, of the list object keys if all others remain the same:\n\n```json\n{\n \"patches\": [\n { \"op\": \"replace\", \"path\": \"/name/0/id\", \"value\": \"123\" },\n { \"op\": \"replace\", \"path\": \"/name/0/prefix/0\", \"value\": \"Mr\" },\n { \"op\": \"replace\", \"path\": \"/name/0/family\", \"value\": \"Smith\" }\n ]\n}\n```\n\nAn added requirement to ensure no accidental data loss or replacement of the wrong list item, you must always include the list `id` or `url`. This is in the object on retrieval so just needs to be mirrored back. You should not include an ID on an addition as this is automatically generated by the system and is a unique object ID, so only our system can guarantee that.\n\n### Removal\n\n`remove` should be used to delete existing items on a patient.\n\nRemoving a simple data item such as the gender can be done using a patch such as:\n\n```json\n{\n \"patches\": [\n { \"op\": \"remove\", \"path\": \"/gender\" }\n ]\n}\n```\n\nNote, that in this scenario, although the patch is perfectly valid, the update is still rejected as a patients gender cannot be removed.\n\nRemoving a list item should only be done on the whole item object, not individual sub-items; instead use the replace operation.\n\nTo remove a list item, a `test` operation must immediately proceed the `remove` . This is an added requirement to ensure no accidental data loss occurs or the wrong item is removed. The test operation should be used to assert either:\n\n* the `id` - the object ID for items that have one - for example `name`, `address` or `telecom`.\n* the `url` - the URL for the extension being removed.\n* the whole object being removed.\n\nAn example of a list item removal using the `id` would be:\n\n```json\n{\n \"patches\": [\n { \"op\": \"test\", \"path\": \"/name/0/id\", \"value\": \"123\" },\n { \"op\": \"remove\", \"path\": \"/name/0\" }\n ]\n}\n```\n\nAn example of a extension list item removal using the `url` would be:\n\n```json\n{\n \"patches\": [\n { \"op\": \"test\", \"path\": \"/extension/0/url\", \"value\": \"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus\" },\n { \"op\": \"remove\", \"path\": \"/extension/0\" }\n ]\n}\n```\n\nAn example of a list item removal using the whole object would be:\n\n```json\n{\n \"patches\": [\n { \n \"op\": \"test\",\n \"path\": \"/name/0\",\n \"value\": {\n \"id\": \"123\",\n \"use\": \"usual\",\n \"period\": { \"start\": \"2019-12-31\" },\n \"prefix\": [\"Dr\"],\n \"given\": [\n \"Joe\",\n \"Horation\",\n \"Maximus\"\n ],\n \"family\": \"Bloggs\",\n \"suffix\": [\"PhD\"]\n }\n },\n { \"op\": \"remove\", \"path\": \"/name/0\" }\n ]\n}\n```\n\nSpecial care should be taken when performing multiple removals in the same list; as removing a particular index could affect all subsequent index positions. The next two examples perform **exactly** the same operation.\n\nUsing the following initial (simplified) data, with the intention of removing the names in index 1 (Irwin) and 2 (Bruce):\n\n```json\n{\n \"name\": [\n {\"id\": \"2\", \"family\": \"Parker\"},\n {\"id\": \"3\", \"family\": \"Irwin\"},\n {\"id\": \"4\", \"family\": \"Bruce\"},\n {\"id\": \"5\", \"family\": \"Sharpe\"}\n ]\n}\n```\n\n**Example 1**:\n\n```json\n{\n \"patches\": [\n { \"op\": \"test\", \"path\": \"/name/1/id\", \"value\": \"3\" },\n { \"op\": \"remove\", \"path\": \"/name/1\" },\n { \"op\": \"test\", \"path\": \"/name/1/id\", \"value\": \"4\" },\n { \"op\": \"remove\", \"path\": \"/name/1\" }\n ]\n}\n```\n\nAfter the 1st removal the data looks like:\n\n```json\n{\n \"name\": [\n {\"id\": \"2\", \"family\": \"Parker\"},\n {\"id\": \"4\", \"family\": \"Bruce\"},\n {\"id\": \"5\", \"family\": \"Sharpe\"}\n ]\n}\n```\n\nmeaning Irwin has been removed, Bruce has moved from index 2 -> 1 and Sharpe from 3 -> 2.\n\nSo after applying the 2nd removal the data looks like:\n\n```json\n{\n \"name\": [\n {\"id\": \"2\", \"family\": \"Parker\"},\n {\"id\": \"5\", \"family\": \"Sharpe\"}\n ]\n}\n```\n\nWhich is the intended outcome. Using the same index 1 for both removals may look unexpected, but the way JSON Patch works is iterating over each patch operation in turn and making the change to the list index positions. This means a developer needs to account for lists changing from one operation to the next.\n\n**Example 2**:\n\n```json\n{\n \"patches\": [\n { \"op\": \"test\", \"path\": \"/name/2/id\", \"value\": \"4\" },\n { \"op\": \"remove\", \"path\": \"/name/2\" },\n { \"op\": \"test\", \"path\": \"/name/1/id\", \"value\": \"3\" },\n { \"op\": \"remove\", \"path\": \"/name/1\" }\n ]\n}\n```\n\nAfter the 1st removal the data looks like:\n\n```json\n{\n \"name\": [\n {\"id\": \"2\", \"family\": \"Parker\"},\n {\"id\": \"3\", \"family\": \"Irwin\"},\n {\"id\": \"5\", \"family\": \"Sharpe\"}\n ]\n}\n```\n\nApplying the 2nd removal the data looks like:\n\n```json\n{\n \"name\": [\n {\"id\": \"2\", \"family\": \"Parker\"},\n {\"id\": \"5\", \"family\": \"Sharpe\"}\n ]\n}\n```\n\nWhich is the intended outcome. Providing the patches with the indexes descending means that the list stays in a stable format the whole way through as the only changes to the index positions are items have been passed over already.\n\n**Example 3 - a failure**\n\n```json\n{\n \"patches\": [\n { \"op\": \"test\", \"path\": \"/name/1/id\", \"value\": \"3\" },\n { \"op\": \"remove\", \"path\": \"/name/1\" },\n { \"op\": \"test\", \"path\": \"/name/2/id\", \"value\": \"4\" },\n { \"op\": \"remove\", \"path\": \"/name/2\" }\n ]\n}\n```\n\nAfter the 1st removal the data looks like:\n\n```json\n{\n \"name\": [\n {\"id\": \"2\", \"family\": \"Parker\"},\n {\"id\": \"4\", \"family\": \"Bruce\"},\n {\"id\": \"5\", \"family\": \"Sharpe\"}\n ]\n}\n```\n\nWhen applying the 2nd test, it fails as the index 2 ID is `5`, but the test was looking for `4`. An error is returned and none of the updates provided would be made to the database.\n\nThis failure example is a good reason for forcing the use of the `test` operation. If there was no test, index 2 would have been blindly removed, meaning the final state of the data would look like:\n\n```json\n{\n \"name\": [\n {\"id\": \"2\", \"family\": \"Parker\"},\n {\"id\": \"4\", \"family\": \"Bruce\"}\n ]\n}\n```\n\nWhich is incorrect, as Irwin and Sharpe were removed instead of Irwin and Bruce.\n\n\n## Patient data fields\n\n### Address\n\nList item found under `address` field.\n\nIn a JSON Patch request the path should be:\n* `/address/0` if the address to be replaced or removed is the first item in the list. If it is the second item in the list the path is `/address/1`, and so on.\n* `/address/-` when adding a new address.\n\nAn address consists of 5 lines of unstructured text, postcode, and address keys. Address keys can include a PAF and a UPRN.\n\nPostcode is optional but strongly encouraged.\nIf the address has no postcode, use a [pseudo postcode from the list defined by the Office for National Statistics](https://digital.nhs.uk/services/organisation-data-service/data-downloads/office-for-national-statistics-data) (see the ‘look_ups’ file).\n\nIn particular, for a patient at no fixed abode, use the pseudo postcode `ZZ99 3VZ`.\n\nWe recommend you use the [OS Places API](https://digital.nhs.uk/developer/api-catalogue/ordnance-survey-places-api) for looking up and verifying addresses prior to a PDS update. The PDS FHIR API cannot yet handle UPRNs required by the OS Places API. We are planning to support these in future.\n\nWhen adding or replacing address lines, use the following rules:\n*\tline 1 - premises ID and/or house name, for example `Flat 1` or `The Old Schoolhouse`\n*\tline 2 - house number, dependent thoroughfare name and descriptor (if present), thoroughfare name and descriptor, for example `23 Mill Lane`\n*\tline 3 - dependent locality/village, locality (if present), for example `Boxgrove`\n*\tline 4 - post town, for example `Leeds`\n*\tline 5 - county (if present), for example `West Yorkshire`\n\nWhen updating an address, you should populate lines 1 or 2, and line 4. You should not include line 5 in manually created addresses but you may include it in PAF-derived addresses. The address ID must also be included in the update as shown in the below examples.\n\nThere are exceptions:\n* if you submit a postcode and PAF key, in which case the lines are automatically populated, however if there are no matches or too many matches the message is rejected due to missing address lines\n* if you use a pseudo postcode, for example `ZZ99 3VZ` meaning `no fixed abode`\n\nWhen creating the FHIR payload message, to be fully FHIR compliant all empty lines should be removed, so for example:\n\n```json\n{\n \"address\": {\n \"line\": [\n \"\",\n \"23 Mill Lane\",\n \"\",\n \"Leeds\",\n \"\"\n ]\n }\n\n}\n```\n\nshould be sent in as:\n\n```json\n {\n \"address\": {\n \"line\": [\n \"23 Mill Lane\",\n \"Leeds\"\n ]\n }\n\n }\n```\n\nhowever if you do not do this the message is not rejected; the response is in that form though.\n\nTo ensure consistent data across all patient addresses, you should match addresses to the PAF and send them in PAF format including the PAF key.\nIf you do not include the PAF key it is added to the address if a match is found\nAdditionally the provided address lines and post code are enriched and reformatted if necessary.\n\nThe following address types are supported:\n* `home` - the home address is the patient's normal residence. Home address is also known as usual, main, registered, current or permanent address\n* `temp` - a temporary address is an address used for a set period of time, but where the patient's home, permanent address remains unchanged\n* `billing` - an address used for correspondence purposes only\n\nA patient must have no more than one current `temp` and/or `billing` address.\nHowever, historically this was constrained only by the integration requirements and was not enforced so theoretically more than one can exist for a patient when retrieving.\nWhere multiple instances already exist for the patient it is not expected that local systems should manage those, but should choose the most appropriate one to maintain (for example by examining period dates).\n\nA `home` address is the patient's main residential address and should normally be used for all clinical and demographic purposes, including clinical and appointment correspondence.\nHowever additionally, `temp` and `billing` addresses may be provided by a patient when there is a requirement to record an alternative location for the purposes of unbroken care.\nWhen sending correspondence to a patient:\n*\ta present and valid `billing` address may take precedence over `home` and `temp` addresses. A patient should have only a single current `billing` address. An address is considered 'valid' according to its period start and to dates.\n*\tif no current `billing` address is provided, a `temp` address may take precedence over the `home` address, again if it is valid according to its period start and to dates.\n* if there is no valid, current `billing` and/or `temp` address, the `home` address must be used.\n\nNot all local systems support `temp` and `billing` addresses, so these are not uniformly maintained. Therefore, where the patient contact has clinical or business significance, the precedence of these addresses over the `home` address should be determined by a user wherever possible.\nWhen the end date for a `temp` or `billing` address passes, local systems should use the patient’s `home` address. It is extremely rare that no home address is present on a patient record.\n\nBe aware of the following business rules:\n* you cannot add more than one of each address use types; `home`, `temp` or `billing`\n* `work` address `use` type is a valid response but cannot be added or replaced as it is a legacy value. An address with the `work` type can be removed though\n* any `temp` address must have both a `period start` and a `period end` date. The provision of a period end date has particular importance in order to avoid temporary addresses that are no longer relevant to the patient still being held as current data available to any system retrieving the patient record. A suggested default where no actual period end is known is 30 days later than the period start, up to a maximum of 3 months.\n* any `billing` address must have both a `period start` and a `period end` date. The provision of a period end date has particular importance in order to avoid correspondence addresses that are no longer relevant to the patient still being held as current data available to any system retrieving the patient record. A suggested default where no actual period end is known is 30 days later than the period start, up to a maximum of 12 months.\n* the date period is optional; where present they must be valid dates and the `end` date cannot be before the `start` date\n* the period `start` date is optional, however if provided cannot be a future date. If it is not provided it defaults to the date of update\n* where a `temp` address is provided a description must be sent using the `text` field, the list of possible values are:\n * `Second Home` - a patient's second home\n * `Student Accommodation` - a patient's place of residence while at university\n * `Respite Care Address` - where the patient resides during respite care\n * `Temporary Residence Address` - where the patient resides for a specific period of time\n * `Convalescence Home` - the address for a patient during a period of recovery\n * `Mobile Home` - the address of a patient's mobile home, parked for a specific period of time, e.g. the address of a caravan park\n * `Holiday Home` - the address for a patient during a holiday\n\n### Communication\n\nSingle item found under `extension` with the extension URL `https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSCommunication`.\n\nIn a JSON Patch request, where the communication extension does not exist the path should be:\n* `/extension/-` when adding a communication extension.\n\nWhere you are replacing/removing the full communication extension, the path should be:\n* `/extension/0` if the communication extension is the first item in the list. If it is the second item in the list the path is `/extension/1`, and so on.\n\nWhere the communication extension already exists and you wish to replace a specific sub-extension, then the path should be:\n* `/extension/0/extension/1` if the communication extension is the first item in the list and the sub-extension is the second item in the list.\n\nYou can find examples of the above requests in our sandbox Postman collection\n\nThere are a number of business rules that should be taken into account:\n* preferred language must not be supplied where it is English even though the [code list](https://simplifier.net/resolve?target=simplifier&scope=uk.nhsdigital.r4&canonical=https://fhir.hl7.org.uk/ValueSet/UKCore-HumanLanguage) contains a value for English (en).\n* any language codes outside the accepted list are rejected; such as local system `qa` codes.\n\n### Contact preferences\nSingle item found under `extension` with the extension URL `https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-ContactPreference`.\n\nIn a JSON Patch request, where the Contact Preference extension does not exist or you are replacing/removing the full list of Contact preferences, the path should be:\n* `/extension/0` if the contact preference is the first item in the list. If it is the second item in the list the path is `/extension/1`, and so on.\n* `/extension/-` when adding a contact preference.\n\nWhere the Contact Preference extension already exists and you wish to add, replace or remove a specific contact preference(s) sub-extension, then the path should be:\n* `/extension/0/extension/1` if the contact preference extension is the first item in the list and the method is the second item in the sub-extension list.\n\nYou can find examples of the above requests in our sandbox Postman collection \n\nThere are a number of business rules that should be taken into account:\n* a patient can have `0` or `1` contact preference.\n* preferred contact time is a free-text field limited to 40 characters.\n* where a contact time is specified a contact method must also exist.\n\n### Date of birth\n\nSingle item found under `birthDate` field.\n\nIn a JSON Patch request the path should be `/birthDate`.\n\nWhen adding or updating the birth date, the update should be in the format `yyyy-mm-dd`.\n\nThere are a number of business rules that should be taken into account:\n* cannot be removed.\n* cannot be a date in the future.\n* cannot be after the deceased date, if present.\n\n### Date of death\n\nSingle item found under `deceasedDateTime` field.\n\nIn a JSON Patch request the path should be `/deceasedDateTime`.\n\nWhen adding or updating the deceased date time, the update should be in the format `yyyy-mm-ddTHH:MM:SS+HH:MM`.\n\nThere are a number of business rules that should be taken into account:\n* cannot be removed.\n* cannot be a date in the future.\n* cannot be before the birth date.\n* cannot be replaced if the death notification status is 2 (formal).\n* when adding date of death, a death notification status must also be added.\n\n### Death notification\n\nSingle item found under `extension` with the extension URL `https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus`.\n\nIn a JSON Patch request the path should be:\n* `/extension/0` if the death notification is the first item in the list. If it is the second item in the list the path is `/extension/1`, and so on.\n* `/extension/-` when adding a death notification.\n\nYou can find examples of the above requests in our sandbox Postman collection\n\nThere are a number of business rules that should be taken into account:\n* cannot be removed.\n* cannot be replaced if the death notification status is formal (2).\n* only certain endpoints can set a death notification of formal (2).\n* when adding a death notification, a deceased date time must also be added.\n\n### Emergency contact\n\nList item found under `contact` field.\n\nIn a JSON Patch request the path should be:\n* `/contact/0` if the contact to be replaced or removed is the first item in the list. If it is the second item in the list the path is `/contact/1`, and so on.\n* `/contact/-` when adding a new contact.\n\nOnly emergency contact details should be added to `contact`, regular telecommunication methods such as home phone should be added to the `telecom` field.\nAny other contact relationship types are rejected.\n\nThere are a number of business rules that should be taken into account:\n* in any telecom child object the `use` key should not be present.\n* in any telecom child object the system cannot be `fax`.\n* the date period is optional; where present they must be valid dates and the `end` date cannot be before the `start` date.\n* the period `start` date is optional, however if provided cannot be a future date. If it is not provided it defaults to the date of update.\n* the date period, if present, should be on the parent `contact` object and not any `telecom` child objects.\n* if the system is email, the value must be a valid email format, for example john.smith@example.com; and must be more than 6 characters and less than 90 characters\n* the relationship can only be `C` meaning `Emergency Contact`\n\n### Gender\n\nSingle item found under `gender` field.\n\nIn a JSON Patch request the path should be `/gender`.\n\nWhen setting a gender, the local system should encourage the user to select `male` or `female` rather than `unknown`.\nThe fourth value of gender, `other`, meaning indeterminate; i.e. unable to be classified as either male or female; should never pro-actively be set by local systems - although this value can be retrieved due to legacy data or data quality issues.\n\nThere are a number of business rules that should be taken into account:\n * cannot be removed.\n * can only be `male`, `female` or `unknown`.\n * cannot set gender to `other`.\n\n### General practice\n\nList item found under `generalPractitioner` field. Although only a single general practice is allowed.\n\nIn a JSON Patch request the path should be:\n* `/generalPractitioner/0` for replacing or removing the general practice.\n* `/generalPractitioner/-` when adding a new general practice.\n\nThere are a number of business rules that should be taken into account:\n* only valid GP Practice codes may be used, see [Organisation Data Service FHIR API](https://developer.nhs.uk/apis/ods/) for more details on valid codes.\n* the period `start` date is optional, however if provided cannot be a future date. If it is not provided it defaults to the date of update.\n* do not provide a period `end` date.\n* the general practice should only be updated by primary care systems, [NHAIS](https://digital.nhs.uk/services/nhais) or by the National Back Office.\n* removal of a general practice can only be done by [NHAIS](https://digital.nhs.uk/services/nhais) or by the National Back Office.\n* only a single general practice is supported; emergency, temporary and additional practices must be maintained in the local system only.\n\n### Managing Organisation (internal-use only)\n\nSingle item found under `managingOrganization` field.\n\nIn a JSON Patch request the path should be `/managingOrganization`.\n\nThe following business rules should be observed:\n* only valid GP Practice codes may be used, see [Organisation Data Service FHIR API](https://developer.nhs.uk/apis/ods/) for more details on valid codes.\n* the period `start` date is optional, however if provided cannot be a future date. If it is not provided it defaults to the date of update.\n* only a single general practice is supported; emergency, temporary and additional practices must be maintained in the local system only.\n\n### Multiple birth order\n\nSingle item found under `multipleBirthInteger` field.\n\nIn a JSON Patch request the path should be `/multipleBirthInteger`.\n\nWhen adding or updating the birth order, the update should be an integer in the range `1` - `9` inclusive. These values have differing meanings:\n* 1 - 7 indicates the order of birth, with 1 indicating the first or only birth in the sequence, 2 indicating the second birth in the sequence, 3 indicating the third, and so on up to 7.\n* 8 - `Not applicable`\n* 9 - `Not known`\n\n### Name\n\nList item found under `name` field.\n\nIn a JSON Patch request the path should be:\n* `/name/0` if the name to be replaced or removed is the first item in the list. If it is the second item in the list the path is `/name/1`, and so on.\n* `/name/-` when adding a new name.\n\nThere are a number of business rules that should be taken into account:\n* cannot add more than one `usual` name.\n* cannot remove the `usual` name.\n* cannot add more than one `nickname`.\n* can have multiple instances of all other name use types.\n* cannot replace the use type on an existing name. For example, once a name is a nickname, it cannot be changed directly to an alias. You must instead remove the nickname and add the alias.\n* the first character of each `suffix` item must be `A-Z`.\n* the date period is optional; where present they must be valid dates and the `end` date cannot be before the `start` date.\n* the period `start` date is optional, however if provided cannot be a future date. If it is not provided it defaults to the date of update.\n* supplied name data can only contain characters from the following ranges:\n\n| Character Code/Range | Examples |\n|----------------------|---------------|\n| 65-90 | A-Z |\n| 97-122 | a-z |\n| 45 | Apostrophe |\n| 39 | Hyphen |\n| 32 | Space |\n| 192-214 | À, Æ, Ö, ... |\n| 216-246 | Ø, ß, ö, ... |\n| 248-383 | ø, ü, ÿ, ... |\n| 46 | Full-stop |\n| 48-57\t | Numbers |\n\n* the `period` is optional, but if included the `end` date cannot be before the `start` date. They can however be in the past, present or future.\n* the full available range of generally recognised titles are permitted, however, if any of the following are used then the value input must conform to the following format:\n * Mr\n * Mrs\n * Ms\n * Dr\n * Rev\n * Sir\n * Lady\n * Lord\n* any trailing full stops at the end of a prefix are automatically removed; for example `Mrs.` changes to `Mrs`.\n\n### Pharmacy\n\nSingle item found under `extension` with one of the extension urls:\n* `https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NominatedPharmacy`\n* `https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-MedicalApplianceSupplier`\n* `https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-PreferredDispenserOrganization`\n\nIn a JSON Patch request the path should be:\n* `/extension/0` if the pharmacy is the first item in the list. If it is the second item in the list the path is `/extension/1`, and so on\n* `/extension/-` when adding a pharmacy\n\nThere are a number of business rules that should be taken into account:\n* multiple pharmacies are allowed, however only one of each type\n* there are no effective date periods, only a single current instance of each type is supported\n* only valid National Pharmacy codes may be used for the pharmacy identifier, see [Organisation Data Service FHIR API](https://developer.nhs.uk/apis/ods/) for more details on valid codes\n\n### Place of birth\n\nSingle item found under `extension` with the extension URL `http://hl7.org/fhir/StructureDefinition/patient-birthPlace`.\n\nIn a JSON Patch request the path should be:\n* `/extension/0` if the place of birth is the first item in the list. If it is the second item in the list the path is `/extension/1`, and so on\n* `/extension/-` when adding a place of birth\n\nThere are a number of business rules that should be taken into account:\n* the three fields, `city`, `district` and `country` are all optional, however at least one of them must be provided\n* country is a coded value and must be in the set of valid values\n\n### Telecom\n\nList item found under `telecom` field.\n\nIn a JSON Patch request the path should be:\n* `/telecom/0` if the telecom to be replaced or removed is the first item in the list. If it is the second item in the list the path is `/telecom/1`, and so on\n* `/telecom/-` when adding a new telecom\n\nEmergency contact details should not be added to the `telecom` field, instead they should be added to the `contact` field.\n\nThere are a number of business rules that should be taken into account:\n* the date period is optional; where present they must be valid dates and the `end` date cannot be before the `start` date\n* the period `start` date is optional, however if provided cannot be a future date. If it is not provided it defaults to the date of update.\n* if the telecom system is email, the value must be a valid email format, for example john.smith@example.com; and must be more than 6 characters and less than 90 characters\n\n## Access Mode\n\n### Healthcare worker access\n\nA user with Healthcare worker access will be able to update the following fields:\n* Address\n* Communication\n* Contact preferences\n* Date of birth\n* Date of death\n* Death notification\n* Emergency contact\n* Gender\n* General practice\n* Managing Organisation (internal use only)\n* Multiple birth order\n* Name\n* Pharmacy\n* Place of birth\n* Telecom\n\n### Patient access\n\nA user with Patient access will be able to update the following fields:\n* Address\n* Pharmacy\n* Telecom (mobile and email only)\n\n## Sandbox test scenarios\n\nYou can test the following scenarios in our sandbox environment.\n\nThings to note when using the sandbox for PATCH:\n* Your changes are not persisted.\n* JSON Patch operations themselves are validated, but the resulting resource is not validated for correctness; meaning any business rules are not applied.\n* You can use the patient with minimal data, `9000000033` to test adding all data types (as most of them are missing on this patient), that would normally be present (e.g. gender).\n\n| Scenario | Request | Response |\n| ----------------------------------- | ------------------------------------------------------------------------- | ------------------------------------------------ |\n| Successful update | `id`=`9000000009`

Body: One of the provided examples or your own combination of patches

Headers: `If-Match`=`W/\"2\"`, `Content-Type`=`application/json-patch+json` | HTTP Status 200 with updated patient resource. |\n| Patient does not exist | `id`=`9111231130` (or any other valid NHS number) | HTTP Status 404 with problem description |\n| Invalid NHS number | `id`=`9000000000` (or any invalid NHS number) | HTTP Status 400 with problem description |\n| Missing resource version identifier | `If-Match` header missing or set to format other than `W/\"\"` | HTTP Status 412 with problem description |\n| Incorrect resource version | `If-Match`=`W/\"1\"` | HTTP Status 412 with problem description |\n| Wrong content type | `Content-Type` header missing or other than `application/json-patch+json` | HTTP Status 400 with problem description |\n| No patches sent | Send body with no `patches` attribute | HTTP Status 400 with problem description |\n| Invalid patch operations | Send body with invalid JSON patches in `patches` attribute | HTTP Status 400 with problem description |\n| Missing X-Request-ID | `id`=`9000000009` (or any other valid NHS number) | HTTP Status 412 with problem description |\n\nYou can try out the sandbox using the 'Try this API' feature on this page.\n\nAlternatively, you can try out the sandbox using our Postman collection:\n\n[![Run in Postman](https://run.pstmn.io/button.svg)](https://app.getpostman.com/run-collection/14719036-953f067f-30b9-4552-8252-7cc10b21dad3)\n","summary":"Update patient details","operationId":"update-patient-partial","externalDocs":{"description":"IETF RFC 6902, which defines json-patch.","url":"https://tools.ietf.org/html/rfc6902"},"parameters":[{"in":"header","name":"If-Match","description":"Latest known version identifier enclosed in quotes preceded by `W/`.\n\nSend the value of the patient's `ETag` response header on patient retrieval when updating a patient.\nThis is to ensure that any updates are applied against an up-to-date version of the patient resource.\n","required":true,"schema":{"type":"string","pattern":"^W/\"[0-9]+\"$","example":"W/\"2\""}},{"in":"header","name":"Content-Type","description":"For a PATCH request, this must be set to `application/json-patch+json`.\n","required":true,"schema":{"type":"string","example":"application/json-patch+json"}}],"requestBody":{"required":true,"content":{"application/json-patch+json":{"schema":{"type":"object","required":["patches"],"properties":{"patches":{"type":"array","items":{"type":"object","required":["op","path"],"properties":{"op":{"type":"string","enum":["remove","add","replace","test"]},"path":{"description":"The location of the information to remove, add or replace. The '-' character must be used to add new items to arrays, e.g. names, addresses.","type":"string","format":"jsonpointer","externalDocs":{"description":"IETF RFC 6901 JavaScript Object Notation (JSON) Pointer.","url":"https://tools.ietf.org/html/rfc6901"}},"value":{"description":"The information to be added or replaced. Should not be included on a remove.","oneOf":[{"type":"string"},{"type":"integer"},{"type":"object"}]}}}}}},"examples":{"add-deceased-date-time":{"summary":"Add a new single item (deceasedDateTime) to the patient","value":{"patches":[{"op":"add","path":"/deceasedDateTime","value":"2010-10-22T00:00:00+00:00"}]}},"add-name":{"summary":"Add a new list item (name) to the patient","value":{"patches":[{"op":"add","path":"/name/-","value":{"use":"usual","period":{"start":"2019-12-31"},"prefix":["Dr"],"given":["Joe","Horation","Maximus"],"family":"Bloggs","suffix":["PhD"]}}]}},"add-extension":{"summary":"Add a an extension (nominated pharmacy) to the Patient","value":{"patches":[{"op":"add","path":"/extension/-","value":{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NominatedPharmacy","valueReference":{"identifier":{"system":"https://fhir.nhs.uk/Id/ods-organization-code","value":"Y12345","period":{"start":"2020-01-01","end":"2021-12-31"}}}}}]}},"update-gender":{"summary":"Update the simple item (gender)","value":{"patches":[{"op":"replace","path":"/gender","value":"male"}]}},"update-address":{"summary":"Update specific fields on a list item (address)","value":{"patches":[{"op":"replace","path":"/address/0/id","value":"456"},{"op":"replace","path":"/address/0/line/0","value":"2 Whitehall Quay"},{"op":"replace","path":"/address/0/postalCode","value":"LS1 4BU"}]}},"update-address-alternative":{"summary":"Update whole object on a list item (address)","value":{"patches":[{"op":"replace","path":"/address/0","value":{"id":"456","period":{"start":"2020-01-01","end":"2021-12-31"},"use":"home","line":["2 Whitehall Quay","Leeds","West Yorkshire"],"postalCode":"LS1 4BU","extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","extension":[{"url":"type","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType","code":"PAF"}},{"url":"value","valueString":"9876543"}]}]}}]}},"update-extension":{"summary":"Update an extension (death notification)","value":{"patches":[{"op":"replace","path":"/extension/3","value":{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus","extension":[{"url":"deathNotificationStatus","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-DeathNotificationStatus","version":"1.0.0","code":"1","display":"Informal - death notice received via an update from a local NHS Organisation such as GP or Trust"}]}}]}}]}},"delete-gender":{"summary":"Remove a single item (gender) no longer in use","value":{"patches":[{"op":"remove","path":"/gender"}]}},"delete-name":{"summary":"Remove a list item (name) no longer in use, using test pointing to the name items id","value":{"patches":[{"op":"test","path":"/name/0/id","value":"123"},{"op":"remove","path":"/name/0"}]}},"delete-name-alternative":{"summary":"Remove a list item (name) no longer in use, using test pointing to the name object","value":{"patches":[{"op":"test","path":"/name/0","value":{"id":"123","use":"usual","period":{"start":"2020-01-01","end":"2021-12-31"},"given":["Jane"],"family":"Smith","prefix":["Mrs"],"suffix":["MBE"]}},{"op":"remove","path":"/name/0"}]}},"delete-extension":{"summary":"Remove an extension (dispensing doctor pharmacy) no longer in use","value":{"patches":[{"op":"test","path":"/extension/1/url","value":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-PreferredDispenserOrganization"},{"op":"remove","path":"/extension/1"}]}}}}}},"responses":{"200":{"description":"Patient updated.","headers":{"ETag":{"schema":{"type":"string","pattern":"^W/\"[0-9]+\"$","example":"W/\"2\""},"description":"Record version identifier enclosed in quotes and preceded by 'W/'. For example, `W/\"2\"`.\n\nCorresponds to `meta.versionId` attribute in the patient resource body.\n\nWhen you retrieve a patient resource, you get a version number for the resource (in the `ETag` response header and in the `versionId` field in the response).\nYou must then pass the resource's version number in any update request (in the `If-Match` response header) made for the patient.\n"},"X-Correlation-Id":{"schema":{"type":"string","example":"11C46F5F-CDEF-4865-94B2-0EE0EDCC26DA"},"description":"The X-Correlation-ID from the request header, if supplied, mirrored back.\n"},"X-Request-Id":{"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","example":"60E0B220-8136-4CA5-AE46-1D97EF59D068"},"description":"The X-Request-ID from the request header, if supplied, mirrored back.\n"}},"content":{"application/fhir+json":{"schema":{"type":"object","required":["id"],"additionalProperties":false,"properties":{"resourceType":{"type":"string","description":"FHIR resource type.","default":"Patient"},"id":{"description":"The patient's NHS number. The primary identifier of a patient, unique within NHS England and Wales. Always 10 digits and must be a [valid NHS number](https://www.datadictionary.nhs.uk/attributes/nhs_number.html).","type":"string","pattern":"^\\d{10}$","example":"9000000009"},"identifier":{"type":"array","description":"Identifier and system of identification used for this Patient.","items":{"type":"object","maxItems":1,"required":["value"],"properties":{"system":{"type":"string","format":"url","description":"System identifier belongs to.","default":"https://fhir.nhs.uk/Id/nhs-number"},"value":{"description":"The patient's NHS number. The primary identifier of a patient, unique within NHS England and Wales. Always 10 digits and must be a [valid NHS number](https://www.datadictionary.nhs.uk/attributes/nhs_number.html).","type":"string","pattern":"^\\d{10}$","example":"9000000009"},"extension":{"type":"array","description":"FHIR extensions.","items":{"type":"object","description":"Status indicating if NHS number is present and verified.","properties":{"url":{"type":"string","description":"URL of the extension definition.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSNumberVerificationStatus","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSNumberVerificationStatus"]},"valueCodeableConcept":{"type":"object","description":"NHS Number Verification Status Indicator.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URI of the coding system specification.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-NHSNumberVerificationStatus"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1.0.0"},"code":{"type":"string","description":"Symbol in syntax defined by the system.","example":"01"},"display":{"type":"string","description":"Representation defined by the system.","example":"Number present and verified"}}}}}}}}}}}},"meta":{"type":"object","description":"Metadata about this resource.","properties":{"versionId":{"type":"string","description":"The NHS Digital assigned version of the patient resource.","example":"2"},"security":{"type":"array","description":"The level of security on the patients record, which affects which fields are populated on retrieval. The possible responses are:\n* U - unrestricted. All available data is returned.\n* R - restricted. Any sensitive data around the patient's location, so `address`, `generalPractitioner` and `telecom`, are removed from the response.\n* REDACTED - redacted. The patient record has been marked as invalid, so the data should not be used. This code is never returned; you receive a 404, and appropriate error response, if an invalidated patient retrieval is attempted.\n","maxItems":1,"items":{"type":"object","properties":{"system":{"type":"string","description":"URI of the value set specification.","example":"http://terminology.hl7.org/CodeSystem/v3-Confidentiality"},"code":{"type":"string","description":"Code defined by the system value set.","enum":["U","R","V","REDACTED"],"example":"U"},"display":{"type":"string","description":"Representation defined by the system.","enum":["unrestricted","restricted","redacted"],"example":"unrestricted"}}}}}},"name":{"type":"array","description":"List of names associated with the patient. \n","minItems":1,"items":{"type":"object","required":["use","family"],"additionalProperties":false,"properties":{"id":{"type":"string","description":"Unique object identifier for this name.","example":"123"},"use":{"type":"string","description":"How this name should be used.\n* usual - Known as, conventional or the one patient normally uses. A patient always has a usual name.\n* temp - An alias or temporary name. This may also be used for temporary names assigned at birth or in emergency situations.\n* nickname - A name that the patient prefers to be addressed by, but is not part of their usual name.\n* old - This name is no longer in use (or was never correct, but retained for records).\n* maiden - Name changed for Marriage. A name used prior to changing name because of marriage. This term is not gender specific. The use of this term does not imply any particular history for a person's name.\n\nThe following use codes are included in the [name-use](https://www.hl7.org/fhir/valueset-name-use.html) value set, but should not be used and is not be returned as part of a retrieval.\n* official - The formal name as registered in an official (government) registry, but which name might not be commonly used. May be called \"legal name\".\n* anonymous - Anonymous assigned name, alias, or pseudonym (used to protect a person's identity for privacy reasons).\n","enum":["usual","temp","nickname","old","maiden"],"example":"usual"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"given":{"type":"array","maxItems":5,"description":"Given names, including any middle names.\n\nEach name(s) should be a separate item in the list. The first given name may include multiple names, separated by a space.\nSubsequent names must be broken down into list items. For example, the input `[Jane Marie Anne, Jo Adele]` returns `[Jane Marie Anne, Jo, Adele]`.\n","example":["Jane Marie Anne","Jo","Adele"],"items":{"type":"string","maxLength":35,"example":"Jane"}},"family":{"type":"string","maxLength":35,"description":"Family name (often called Surname).","example":"Smith"},"prefix":{"type":"array","description":"Name prefixes, titles, and prenominals.","example":["Mrs"],"items":{"type":"string","example":"Mrs"}},"suffix":{"type":"array","description":"Name suffices and postnominals.","example":["MBE","PhD"],"items":{"type":"string","example":"MBE"}}}}},"gender":{"type":"string","description":"Classification of the gender of a patient. The classification is phenotypical rather than genotypical, i.e. it does not provide codes for medical or scientific purposes.\nIt is the administrative gender that the patient wishes to be known as. In some cases, this may not be the same as the patient’s registered birth gender, or their current clinical gender.\n","enum":["male","female","other","unknown"],"example":"female"},"birthDate":{"description":"The date on which the patient was born or is officially deemed to have been born.\n\nIt is a date in the format `yyyy-mm-dd`. Due to data quality issues on a small number of patients `yyyy-mm` and `yyyy` format may also be returned. \n","example":"2010-10-22","type":"string","format":"date"},"multipleBirthInteger":{"type":"integer","minimum":1,"maximum":9,"description":"The order in which the patient was born, with 1 indicating the first or only birth in the sequence, 2 indicating the second birth in the sequence, 3 indicating the third, and so on up to 7.\n\nThere are two other valid values; `8` meaning `Not applicable` and `9` meaning `Not known`.\n","example":1},"deceasedDateTime":{"description":"The date and time on which a person died or is officially deemed to have died, if applicable and known.\n\nIt is a datetime in the format `yyyy-mm-ddTHH:MM:SS+HH:MM` or `yyyy-mm-dd`. Due to data quality issues on a small number of patients `yyyy-mm` and `yyyy` format may also be returned.\n","example":"2010-10-22T00:00:00+00:00","type":"string","format":"date-time","pattern":"^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2}\\+\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2}\\+\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01]))$"},"address":{"type":"array","description":"List of addresses associated with the patient.\n\nThese are fully populated on a retrieval or a successful update, only the `home` address is returned on a search.\nWhen a patient tagged as `restricted` is retrieved, all addresses are removed from the response.\n","items":{"type":"object","description":"An address associated with the patient.","required":["use"],"properties":{"id":{"type":"string","description":"Unique system identifier for this address.","example":"456"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"use":{"type":"string","description":"Purpose of this address:\n * `home` - the home address is the patient's normal residence. Home address is also known as usual, main, registered, current or permanent address\n * `temp` - a temporary address is an address used for a set period of time, but where the patient's home, permanent address remains unchanged\n * `billing` - an address used for correspondence purposes only\n * `work` - an office address. This can be returned due to legacy data but cannot be added or replaced on update\n\n A patient should have no more than one current `temp` and/or `billing` address.\n However, historically this was constrained only by the integration requirements and was not enforced so theoretically more than one can exist for a patient when retrieving.\n Where multiple instances already exist for the patient it is not expected that local systems should manage those, but should choose the most appropriate one to maintain (e.g. by examining period dates).\n\n A `home` address is the patient's main residential address and should normally be used for all clinical and demographic purposes, including clinical and appointment correspondence.\n However additionally, `temp` and `billing` addresses may be provided by a patient when there is a requirement to record an alternative location for the purposes of unbroken care.\n When sending correspondence to a patient:\n *\ta present and valid `billing` address may take precedence over `home` and `temp` addresses. A patient should have only a single current `billing` address. An address is considered 'valid' according to its period start and end dates.\n *\tif no current `billing` address is provided, a `temp` address may take precedence over the `home` address, again if it is valid according to its period start and end dates.\n * if there is no valid, current `billing` and/or `temp` address, the `home` address must be used.\n","enum":["home","work","temp","billing"],"example":"home"},"text":{"type":"string","description":"Where a `temp` address is provided a descriptor text must be sent.\nThe list of possible values are:\n* `Second Home` - a patient's second home\n* `Student Accommodation` - a patient's place of residence while at university\n* `Respite Care Address` - where the patient resides during respite care\n* `Temporary Residence Address` - where the patient resides for a specific period of time\n* `Convalescence Home` - the address for a patient during a period of recovery\n* `Mobile Home` - the address of a patient's mobile home, parked for a specific period of time, e.g. the address of a caravan park\n* `Holiday Home` - the address for a patient during a holiday\n\nA patient can also register temporarily at a GP practice using a temporary address. Temporary GP registration information does not appear on the PDS, but the address used for it may.\n","enum":["Second Home","Student Accommodation","Respite Care Address","Temporary Residence Address","Convalescence Home","Mobile Home","Holiday Home"],"example":"Student Accommodation"},"line":{"type":"array","description":"All lines of the address except the postal code.\n\nSystems must apply the following formatting convention when adding or replacing addresses lines:\n*\tline 1 - premises ID and/or house name, e.g. `Flat 1` or `The Old Schoolhouse`\n*\tline 2 - house number, dependent thoroughfare name and descriptor (if present), thoroughfare name and descriptor, e.g. `23 Mill Lane`\n*\tline 3 - dependent locality/village, locality (if present), e.g. `Boxgrove`\n*\tline 4 - post town, e.g. `Leeds`\n*\tline 5 - county (if present), e.g. `West Yorkshire`\n\nIf any of the lines are blank, they are not returned due to FHIR conformance constraints.\n","maxItems":5,"items":{"type":"string"},"example":["1 Trevelyan Square","Boar Lane","City Centre","Leeds","West Yorkshire"]},"postalCode":{"type":"string","description":"Postal code of the address.","example":"LS1 6AE"},"extension":{"type":"array","description":"List of address keys formatted as a FHIR extension. This can include up to one Unique Property Reference Number (UPRN), and up to one Postal Address File (PAF) key. If no keys for the address are known, the array will be empty. Otherwise it will be a list of objects which specify the value of the address key and the code system for it","items":{"anyOf":[{"type":"object","description":"Unique identifier for an address.","properties":{"url":{"type":"string","description":"URL of specification of the AddressKey extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey"]},"extension":{"type":"array","description":"Specification of address key system and address key value. Contains exactly two items: one describing the code system the Address Key uses, and the other specifying the value of the Address Key.","minItems":2,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Coding system of the address key.","required":["url","valueCoding"],"properties":{"url":{"type":"string","description":"Always 'type'.","default":"type"},"valueCoding":{"type":"object","description":"URL of specification of address key format.","required":["system","code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available Address Key formats.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType"},"code":{"type":"string","description":"Address Key system. Always 'PAF'.","enum":["PAF"],"example":"PAF"}}}}},{"type":"object","description":"Value of the address key.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Always 'value'.","default":"value","example":"value"},"valueString":{"type":"string","description":"Address key in PAF format. An 8 digit number including leading zeroes, formatted as a string.","minLength":8,"maxLength":8,"pattern":"^[0-9]{8}$","example":"12345678"}}}]}}}},{"type":"object","description":"Unique identifier for an address.","properties":{"url":{"type":"string","description":"URL of specification of the AddressKey extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey"]},"extension":{"type":"array","description":"Specification of address key system and address key value. Contains exactly two items: one describing the code system the Address Key uses, and the other specifying the value of the Address Key.","minItems":2,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Coding system of the address key.","required":["url","valueCoding"],"properties":{"url":{"type":"string","description":"Always 'type'.","default":"type"},"valueCoding":{"type":"object","description":"URL of specification of address key format.","required":["system","code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available Address Key formats.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType"},"code":{"type":"string","description":"Address Key system. Always 'UPRN'.","enum":["UPRN"],"example":"UPRN"}}}}},{"type":"object","description":"Value of the address key.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Always 'value'.","default":"value","example":"value"},"valueString":{"type":"string","description":"Address key in UPRN format. A number containing from 1 up to 12 digits.","minLength":1,"maxLength":12,"pattern":"^[0-9]{1,12}$","example":"123456789012"}}}]}}}}]}}}}},"telecom":{"type":"array","description":"List of contact points for the patient; for example, phone numbers or email addresses.\nWhen a patient tagged as `restricted` is retrieved, all contact points are removed from the response.\n","items":{"description":"A contact point, such as a phone number or email address","type":"object","required":["system","value"],"properties":{"id":{"type":"string","description":"Unique object identifier for this contact point.","example":"789"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"system":{"description":"Means of communication, such as phone or email.","type":"string","enum":["phone","fax","email","other"],"example":"phone"},"value":{"description":"Phone number, email address, or other identifier for use with contact system.","type":"string","example":"01632960587"},"use":{"type":"string","description":"Location associated with communication system.","enum":["home","work","temp","mobile"],"example":"home"},"extension":{"type":"array","maxItems":1,"description":"Extension that is returned when the communication type is `textphone`. The only code returned is `textphone`, which means `Minicom (Textphone)`.\n\nThe `system` is `other` when the extension is included.\n","items":{"type":"object","description":"Wrapped object for other contact system details.","properties":{"url":{"type":"string","description":"Definition of other contact system extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem"]},"valueCoding":{"type":"object","description":"URL of specification of other contact systems.","properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem"},"code":{"type":"string","description":"Coded value for the other contact system in place.","example":"textphone"},"display":{"description":"Display-friendly representation of the other contact system code.","type":"string","example":"Minicom (Textphone)"}}}}}}}}},"contact":{"type":"array","description":"A list of patient contacts. Only emergency contacts are returned and only emergency contacts should be added. Any other contacts should be added to the patients `Related Person`.\nPatients designate here any contact number they desire to be used in case of an emergency.\nNote, while a patient may also desire to record various related persons telecom details, these do not separately allow for a concept of emergency contact; only ranking. See RelatedPerson endpoint.\nWhen a patient tagged as `restricted` is retrieved, all contacts are removed from the response.\n","items":{"title":"Schema for a patient contact.","type":"object","additionalProperties":false,"required":["relationship","telecom"],"properties":{"id":{"type":"string","example":"C123"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"relationship":{"type":"array","description":"The contact relationship wrapper object that holds the details of the relationship to the patient.\n\nThis is only returned when an Emergency Contact number has been set on `telecom`. The only valid code is `C`, which means `Emergency Contact`.\n","minItems":1,"maxItems":1,"items":{"type":"object","required":["coding"],"properties":{"coding":{"type":"array","description":"Exactly one contact relationship.","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","format":"url","default":"http://terminology.hl7.org/CodeSystem/v2-0131"},"code":{"type":"string","description":"Coded value for contact relationship.","example":"C"},"display":{"type":"string","description":"Display-friendly representation of the contact relationship code.","example":"Emergency Contact"}}}}}}},"telecom":{"type":"array","description":"List of Telecom objects on the contact only contains `system` and `value`.\n","items":{"description":"A contact point, such as a phone number or email address","type":"object","required":["system","value"],"properties":{"id":{"type":"string","description":"Unique object identifier for this contact point.","example":"789"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"system":{"description":"Means of communication, such as phone or email.","type":"string","enum":["phone","fax","email","other"],"example":"phone"},"value":{"description":"Phone number, email address, or other identifier for use with contact system.","type":"string","example":"01632960587"},"use":{"type":"string","description":"Location associated with communication system.","enum":["home","work","temp","mobile"],"example":"home"},"extension":{"type":"array","maxItems":1,"description":"Extension that is returned when the communication type is `textphone`. The only code returned is `textphone`, which means `Minicom (Textphone)`.\n\nThe `system` is `other` when the extension is included.\n","items":{"type":"object","description":"Wrapped object for other contact system details.","properties":{"url":{"type":"string","description":"Definition of other contact system extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem"]},"valueCoding":{"type":"object","description":"URL of specification of other contact systems.","properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem"},"code":{"type":"string","description":"Coded value for the other contact system in place.","example":"textphone"},"display":{"description":"Display-friendly representation of the other contact system code.","type":"string","example":"Minicom (Textphone)"}}}}}}}}}}}},"generalPractitioner":{"type":"array","maxItems":1,"description":"General Practice (not practitioner) with which the patient is, or was, registered. Always contains zero or one general practitioner object.\nWhen a patient tagged as `restricted` is retrieved, the General Practice is removed from the response.\n","items":{"description":"General practice (not practitioner) with which the patient is or was registered.","type":"object","required":["identifier"],"properties":{"id":{"description":"Object identifier (OID) specific to the returned details - this should be return exactly the same in any update.","type":"string","example":"254406A3"},"type":{"description":"Type of Reference being returned.","type":"string","example":"Organization"},"identifier":{"description":"Identifier and system of identification used for this Organisation.","type":"object","required":["value"],"properties":{"system":{"description":"URL for the Organisation Data Service - who are responsible for publishing codes that identify organisations and individuals across health and social care.","type":"string","example":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"description":"Organisation code for the registered general practice, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","type":"string","pattern":"^[0-9A-Z]+$","example":"Y12345"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}}}}}}},"managingOrganization":{"description":"The managing organization of a de-registered patient. This will not be returned when the reason for de-registration is death.","type":"object","required":["identifier"],"properties":{"type":{"description":"Type of Reference being returned.","type":"string","example":"Organization"},"identifier":{"description":"Identifier and system of identification used for this Organisation.","type":"object","required":["value"],"properties":{"system":{"description":"URL for the Organisation Data Service - who are responsible for publishing codes that identify organisations and individuals across health and social care.","type":"string","example":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"description":"Organisation code for the registered general practice, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","type":"string","pattern":"^[0-9A-Z]+$","example":"Y12345"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}}}}}},"extension":{"type":"array","description":"Wrapper array for the patient's pharmacies, death notification status, communication details, contact preferences and place of birth; these are all FHIR extensions.\nAlways contains zero or one of each pharmacy object, zero or one death notification status object, zero or one communication details object, zero or one contact preference and zero or one place of birth object.\nWhen a patient tagged as `restricted` is retrieved, the pharmacy and birth place extensions are removed from the response.\n","items":{"anyOf":[{"type":"object","description":"Wrapper object for the patient's nominated pharmacy. This will only be populated on a retrieval and not a search.","required":["url","valueReference"],"properties":{"url":{"type":"string","description":"URL of specification of UKCore-NominatedPharmacy FHIR extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NominatedPharmacy","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NominatedPharmacy"]},"valueReference":{"type":"object","description":"Reference to a pharmacy `Organization` resource.","required":["identifier"],"properties":{"identifier":{"type":"object","description":"Wrapper object for the patient's nominated pharmacy organisation code.","required":["value"],"properties":{"system":{"type":"string","description":"URL for the FHIR code system for the ODS organisation code.","default":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"type":"string","description":"Organisation code for the nominated pharmacy, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","pattern":"^[A-Za-z0-9]{3,10}$","example":"Y12345"}}}}}}},{"type":"object","description":"Wrapper object for the patient's dispensing doctor. This will only be populated on a retrieval and not a search.","required":["url","valueReference"],"properties":{"url":{"type":"string","description":"URL of specification of UKCore-DispensingDoctor FHIR extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-PreferredDispenserOrganization","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-PreferredDispenserOrganization"]},"valueReference":{"type":"object","description":"Reference to a GP practice pharmacy `Organization` resource.","required":["identifier"],"properties":{"identifier":{"type":"object","description":"Wrapper object for the patient's dispensing doctor organisation code.","required":["value"],"properties":{"system":{"type":"string","description":"URL for the FHIR code system for the ODS organisation code.","default":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"type":"string","description":"Organisation code for the dispensing doctor, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","pattern":"^[A-Za-z0-9]{3,10}$","example":"Y23456"}}}}}}},{"type":"object","description":"Wrapper object for the patient's medical appliance supplier. This will only be populated on a retrieval and not a search.","required":["url","valueReference"],"properties":{"url":{"type":"string","description":"URL of specification of UKCore-MedicalApplianceSupplier FHIR extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-MedicalApplianceSupplier","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-MedicalApplianceSupplier"]},"valueReference":{"type":"object","description":"Reference to medical appliance supplier pharmacy `Organization` resource.","required":["identifier"],"properties":{"identifier":{"type":"object","description":"Wrapper object for the patient's medical appliance supplier organisation code.","required":["value"],"properties":{"system":{"type":"string","description":"URL for the FHIR code system for the ODS organisation code.","default":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"type":"string","description":"Organisation code for the medical appliance supplier, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","pattern":"^[A-Za-z0-9]{3,10}$","example":"Y34567"}}}}}}},{"type":"object","description":"Wrapper object for death notification details.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of death notification extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus"]},"extension":{"type":"array","description":"Array containing exactly one death notification status code object and exactly one effective date object.","minItems":1,"maxItems":2,"items":{"oneOf":[{"type":"object","description":"Wrapper object for death notification status code.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `deathNotificationStatus`.","default":"deathNotificationStatus","enum":["deathNotificationStatus"]},"valueCodeableConcept":{"type":"object","description":"Death Notification Status.","properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["system","code"],"properties":{"system":{"type":"string","description":"URI of the coding system specification.","example":"https://fhir.hl7.org.uk/CodeSystem/UKCore-DeathNotificationStatus"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1.0.0"},"code":{"type":"string","description":"Symbol, in syntax, defined by the system:\n* `1` - Informal - death notice received via an update from a local NHS Organisation such as GP or Trust\n* `2` - Formal - death notice received from Registrar of Deaths. Only these endpoints are allowed to add a Formal death:\n - National Back Office using the Demographic Spine Application (DSA)\n - Office of National Statistics (ONS)\n - Maternity sites\n* `U` - Removed. This is a possible response, but it cannot be used on an update because Spine will reject it\n","example":"2","enum":["1","2","U"]},"display":{"type":"string","description":"Representation defined by the system.","example":"Formal - death notice received from Registrar of Deaths","enum":["Informal - death notice received via an update from a local NHS Organisation such as GP or Trust","Formal - death notice received from Registrar of Deaths","Removed"]}}}}}}}},{"type":"object","description":"Wrapper object for death notification effective date.","required":["url","valueDateTime"],"properties":{"url":{"type":"string","description":"Key of this object. Always `systemEffectiveDate`.","default":"systemEffectiveDate","enum":["systemEffectiveDate"]},"valueDateTime":{"type":"string","description":"Date and time at which death notification status took effect.","format":"date-time","example":"2010-10-22T00:00:00+00:00"}}}]}}}},{"type":"object","description":"Wrapper object for communication details. This will only be populated on a retrieval and not a search.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of communication extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSCommunication","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSCommunication"]},"extension":{"type":"array","description":"Definition of communication extension.\n\nThe array must have one item, a valueCodeableConcept for the language and can optionally include a valueBoolean for if an interpreter is required.","minItems":1,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Wrapper object for communication language.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `language`.","default":"language","enum":["language"]},"valueCodeableConcept":{"type":"object","description":"Human language.","required":["coding"],"properties":{"coding":{"type":"array","description":"Exactly one language code.","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URL of the Language Code System. Always uses the 'UKCore-HumanLanguage' Code System.","example":"https://fhir.hl7.org.uk/CodeSystem/UKCore-HumanLanguage"},"version":{"type":"string","description":"Version of the language code system.","example":"1.0.0"},"code":{"type":"string","description":"Language code based on [ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) standard plus extensions for braille, makaton and sign languages, which are:\n* `q1` - Braille\n* `q2` - American Sign Language\n* `q3` - Australian Sign Language\n* `q4` - British Sign Language\n* `q5` - Makaton\nAll valid codes combined can be found at https://fhir.hl7.org.uk/CodeSystem/UKCore-HumanLanguage.\n","example":"fr"},"display":{"type":"string","description":"Display-friendly representation of the language code (such as English). If there is a language code with no defined mapping, `Unknown` will be returned.","example":"French"}}}}}}}},{"type":"object","description":"Wrapper object for whether an interpreter is required.","required":["url","valueBoolean"],"properties":{"url":{"type":"string","description":"Key of this object. Always `interpreterRequired`.","default":"interpreterRequired","enum":["interpreterRequired"]},"valueBoolean":{"type":"boolean","description":"Whether an interpreter is required.","example":true}}}]}}}},{"type":"object","description":"Wrapper object for preferred contact details; the written communication format, preferred contact time and method. This will only be populated on a retrieval and not a search.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of the contact preference extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-ContactPreference","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-ContactPreference"]},"extension":{"description":"Wrapper array containing zero or one preferred contact method, zero or one preferred written communication format; and zero or one preferred contact time.","type":"array","maxItems":3,"items":{"oneOf":[{"type":"object","description":"Wrapper object for preferred written communication format.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredWrittenCommunicationFormat`.","default":"PreferredWrittenCommunicationFormat"},"valueCodeableConcept":{"type":"object","description":"Preferred Written Communication Format.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","format":"url","description":"Definition of the preferred written communication extension.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredWrittenCommunicationFormat","enum":["https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredWrittenCommunicationFormat"]},"code":{"type":"string","description":"A code to identify the preferred written communication format of a patient, contact or related person.\n* 11 - Large print\n* 12 - Braille\n* 13 - Audio tape\n","example":"12"},"display":{"type":"string","description":"Display-friendly representation of the preferred written communication format code.","example":"Braille"}}}}}}}},{"type":"object","description":"Wrapper object for preferred contact method.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredContactMethod`.","default":"PreferredContactMethod","enum":["PreferredContactMethod"]},"valueCodeableConcept":{"type":"object","description":"Preferred Contact Method.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","format":"url","description":"Definition of the preferred contact method extension.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredContactMethod","enum":["https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredContactMethod"]},"code":{"type":"string","description":"A code to identify to identify the preferred contact method of a patient, contact or related person.\n* 1\t- Letter\n* 2\t- Visit\n* 3\t- Telephone\n* 4\t- E-mail\n* 5\t- Minicom (Textphone)\n* 6\t- Telephone contact via proxy\n* 7\t- Sign language\n* 8\t- No Telephone contact\n","example":"1"},"display":{"type":"string","description":"Display-friendly representation of the preferred contact method code.","example":"Letter"}}}}}}}},{"type":"object","description":"Wrapper object for preferred contact times.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredContactTimes`.","default":"PreferredContactTimes","enum":["PreferredContactTimes"]},"valueString":{"type":"string","maximum":40,"description":"A free-text description about the preferred contact times.","example":"Not after 7pm"}}}]}}}},{"type":"object","description":"Wrapper object for place of birth details. This will not be returned on a restricted patient.","required":["url","valueAddress"],"properties":{"url":{"type":"string","description":"Definition of place of birth extension.","default":"http://hl7.org/fhir/StructureDefinition/patient-birthPlace","enum":["http://hl7.org/fhir/StructureDefinition/patient-birthPlace"]},"valueAddress":{"type":"object","additionalProperties":false,"properties":{"city":{"type":"string","description":"Town or city of birth.","example":"Manchester"},"district":{"type":"string","description":"County or metropolitan district of birth.","example":"Greater Manchester"},"country":{"type":"string","description":"A coded value for a patient's country of birth.\n\nFrom [ISO 3166-1](http://hl7.org/fhir/valueset-iso3166-1-3.html) plus codes from the UK Internal Code list which do not have entries in ISO 3166-1.\n\nUK Internal Codes:\n* `1` - England\n* `2` - Scotland\n* `3` - Wales\n* `4` - Northern Ireland\n* `7` - Sark\n* `9` - Alderney\n* `10` - Channel Islands\n","example":"GBR"}}}}},{"type":"object","description":"An extension to carry the reason a PDS record has been removed from the Patient Demographic Service. This will only be populated on a retrieval and not a search.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of the removal from registration extension.","default":"https://fhir.nhs.uk/StructureDefinition/Extension-PDS-RemovalFromRegistration","enum":["https://fhir.nhs.uk/StructureDefinition/Extension-PDS-RemovalFromRegistration"],"readOnly":true},"extension":{"type":"array","description":"An extension reason a PDS record has been removed from the Patient Demographic Service.","minItems":1,"maxItems":2,"items":{"oneOf":[{"type":"object","description":"Wrapper object for removalFromRegistrationCode.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"To identify the removal reason code.","default":"removalFromRegistrationCode","enum":["removalFromRegistrationCode"],"readOnly":true},"valueCodeableConcept":{"type":"object","description":"PDS Removal Reason Exit Code","required":["coding"],"properties":{"coding":{"type":"array","description":"Array containing exactly one removal reason exit code object","items":{"type":"object","required":["system","code","display"],"properties":{"system":{"type":"string","format":"url","description":"URL of the Removal Reason Exit Code. Always uses the 'PDS-RemovalReasonExitCode' Code System.","example":"https://fhir.nhs.uk/CodeSystem/PDS-RemovalReasonExitCode","readOnly":true},"code":{"type":"string","description":"A CodeSystem that identifies the reason a PDS record has been removed.","example":"SCT","enum":["DEA","EMB","SCT","NIT","TRA","ORR"]},"display":{"type":"string","description":"Display-friendly representation of the removal reason exit code.","example":"Transferred to Scotland"}}}}}}}},{"type":"object","description":"Wrapper object for removal from registration effective time.","required":["url","valuePeriod"],"properties":{"url":{"type":"string","description":"Key of this object. Always `effectiveTime`.","default":"effectiveTime","enum":["effectiveTime"],"readOnly":true},"valuePeriod":{"type":"object","description":"The effective time of removal of the Patient record from PDS.","required":["start"],"properties":{"start":{"type":"string","format":"date-time","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01T00:00:00+00:00"},"end":{"type":"string","format":"date-time","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31T00:00:00+00:00"}}}}}]}}}}]}}}},"example":{"resourceType":"Patient","id":"9000000009","identifier":[{"system":"https://fhir.nhs.uk/Id/nhs-number","value":"9000000009","extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSNumberVerificationStatus","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-NHSNumberVerificationStatus","version":"1.0.0","code":"01","display":"Number present and verified"}]}}]}],"meta":{"versionId":"2","security":[{"system":"http://terminology.hl7.org/CodeSystem/v3-Confidentiality","code":"U","display":"unrestricted"}]},"name":[{"id":"123","use":"usual","period":{"start":"2020-01-01","end":"2021-12-31"},"given":["Jane"],"family":"Smith","prefix":["Mrs"],"suffix":["MBE"]}],"gender":"female","birthDate":"2010-10-22","multipleBirthInteger":1,"deceasedDateTime":"2010-10-22T00:00:00+00:00","generalPractitioner":[{"id":"254406A3","type":"Organization","identifier":{"system":"https://fhir.nhs.uk/Id/ods-organization-code","value":"Y12345","period":{"start":"2020-01-01","end":"2021-12-31"}}}],"managingOrganization":{"type":"Organization","identifier":{"system":"https://fhir.nhs.uk/Id/ods-organization-code","value":"Y12345","period":{"start":"2020-01-01","end":"2021-12-31"}}},"extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NominatedPharmacy","valueReference":{"identifier":{"system":"https://fhir.nhs.uk/Id/ods-organization-code","value":"Y12345"}}},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-PreferredDispenserOrganization","valueReference":{"identifier":{"system":"https://fhir.nhs.uk/Id/ods-organization-code","value":"Y23456"}}},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-MedicalApplianceSupplier","valueReference":{"identifier":{"system":"https://fhir.nhs.uk/Id/ods-organization-code","value":"Y34567"}}},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus","extension":[{"url":"deathNotificationStatus","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-DeathNotificationStatus","version":"1.0.0","code":"2","display":"Formal - death notice received from Registrar of Deaths"}]}},{"url":"systemEffectiveDate","valueDateTime":"2010-10-22T00:00:00+00:00"}]},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSCommunication","extension":[{"url":"language","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-HumanLanguage","version":"1.0.0","code":"fr","display":"French"}]}},{"url":"interpreterRequired","valueBoolean":true}]},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-ContactPreference","extension":[{"url":"PreferredWrittenCommunicationFormat","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredWrittenCommunicationFormat","code":"12","display":"Braille"}]}},{"url":"PreferredContactMethod","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredContactMethod","code":"1","display":"Letter"}]}},{"url":"PreferredContactTimes","valueString":"Not after 7pm"}]},{"url":"http://hl7.org/fhir/StructureDefinition/patient-birthPlace","valueAddress":{"city":"Manchester","district":"Greater Manchester","country":"GBR"}},{"url":"https://fhir.nhs.uk/StructureDefinition/Extension-PDS-RemovalFromRegistration","extension":[{"url":"removalFromRegistrationCode","valueCodeableConcept":{"coding":[{"system":"https://fhir.nhs.uk/CodeSystem/PDS-RemovalReasonExitCode","code":"SCT","display":"Transferred to Scotland"}]}},{"url":"effectiveTime","valuePeriod":{"start":"2020-01-01T00:00:00+00:00","end":"2021-12-31T00:00:00+00:00"}}]}],"telecom":[{"id":"789","period":{"start":"2020-01-01","end":"2021-12-31"},"system":"phone","value":"01632960587","use":"home"},{"id":"790","period":{"start":"2019-01-01","end":"2022-12-31"},"system":"email","value":"jane.smith@example.com","use":"home"},{"id":"OC789","period":{"start":"2020-01-01","end":"2021-12-31"},"system":"other","value":"01632960587","use":"home","extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem","code":"textphone","display":"Minicom (Textphone)"}}]}],"contact":[{"id":"C123","period":{"start":"2020-01-01","end":"2021-12-31"},"relationship":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0131","code":"C","display":"Emergency Contact"}]}],"telecom":[{"system":"phone","value":"01632960587"}]}],"address":[{"id":"456","period":{"start":"2020-01-01","end":"2021-12-31"},"use":"home","line":["1 Trevelyan Square","Boar Lane","City Centre","Leeds","West Yorkshire"],"postalCode":"LS1 6AE","extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","extension":[{"url":"type","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType","code":"PAF"}},{"url":"value","valueString":"12345678"}]},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","extension":[{"url":"type","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType","code":"UPRN"}},{"url":"value","valueString":"123456789012"}]}]},{"id":"T456","period":{"start":"2020-01-01","end":"2021-12-31"},"use":"temp","text":"Student Accommodation","line":["1 Trevelyan Square","Boar Lane","City Centre","Leeds","West Yorkshire"],"postalCode":"LS1 6AE","extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","extension":[{"url":"type","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType","code":"PAF"}},{"url":"value","valueString":"12345678"}]},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","extension":[{"url":"type","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType","code":"UPRN"}},{"url":"value","valueString":"123456789012"}]}]}]}}}},"503":{"description":"The request timed out during processing. This does not imply the request has failed or been rejected. Error code: `SERVICE_UNAVAILABLE`.\n\nRe-send the request after the time specified in the `Retry-After` header using the same `X-Request-ID` value.\n","headers":{"RetryAfter":{"description":"Time to wait between polls in seconds","schema":{"type":"string","example":"5"}}},"content":{"application/fhir+json":{"schema":{"type":"object","description":"Outcome of an operation that does not result in a resource or bundle being returned, for example an error or an async/batch submission.\nThere are a number of possible error codes that can be returned along with a more detailed description in the `display` field.\n","properties":{"resourceType":{"type":"string","description":"FHIR Resource Type.","default":"OperationOutcome"},"issue":{"type":"array","description":"List of issues that have occurred.","minItems":1,"items":{"type":"object","required":["severity","code"],"properties":{"severity":{"type":"string","enum":["fatal","error","warning","information"],"description":"Severity of the error.","example":"error"},"code":{"type":"string","description":"FHIR error code.","example":"invalid","enum":["invalid","structure","required","value","invariant","security","login","unknown","expired","forbidden","suppressed","processing","not-supported","duplicate","multiple-matches","not-found","deleted","too-long","code-invalid","extension","too-costly","business-rule","conflict","transient","lock-error","no-store","exception","timeout","incomplete","throttled","informational"]},"details":{"type":"object","description":"Internal error code.","properties":{"coding":{"type":"array","items":{"type":"object","properties":{"system":{"type":"string","description":"URI of the coding system specification.","example":"https://fhir.nhs.uk/R4/CodeSystem/Spine-ErrorOrWarningCode"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1"},"code":{"type":"string","description":"Symbol in syntax defined by the system.","example":"INVALID_VALUE"},"display":{"type":"string","description":"Representation defined by the system.","example":"Provided value is invalid"}}}}}},"diagnostics":{"type":"string","description":"Additional diagnostic information about the issue. This information is subject to change.","example":"Invalid value - 2019-01 in field 'birthDate'"},"expression":{"type":"string","description":"FHIRPath of element(s) related to the error.","example":"Patient.name.given"}}}}}},"example":{"resourceType":"OperationOutcome","issue":[{"severity":"error","code":"timeout","details":{"coding":[{"system":"https://fhir.nhs.uk/R4/CodeSystem/Spine-ErrorOrWarningCode","version":"1","code":"SERVICE_UNAVAILABLE","display":"Service unavailable"}]},"diagnostics":"The downstream domain processing has not completed within the configured timeout period. Using the same 'X-Request-ID' header, retry your request after the time specified by the 'Retry-After' response header."}]}}}},"4XX":{"description":"An error occurred as follows:\n\n| HTTP status | Error code | Description |\n| ----------- | -------------------------- | --------------------------------------------- |\n| 400 | UNSUPPORTED_SERVICE | Missing NHS number. |\n| 400 | MISSING_VALUE | Missing header parameter. For details, see the `diagnostics` field. |\n| 400 | INVALID_VALUE | Invalid header parameter or invalid value in body of patch request. For details, see the `diagnostics` field. |\n| 400 | INVALID_UPDATE | Malformed patch request or client error after the patch was accepted and patient was not updated. For example, a start date was after the corresponding end date. |\n| 400 | INVALID_RESOURCE_ID | Invalid NHS number. |\n| 400 | VALIDATION_ERROR | This is the \"default\" error thrown when no others are applicable. |\n| 400 | UNSUPPORTED_CHARACTERS_IN_FIELD | Invalid value in body of patch request. For details, see the `diagnostics` field. |\n| 400 | ADDITIONAL_PROPERTIES | The user sent additional properties within the dictionary. For example sending a patient patch and attempting to add 'pets', which is not an allowed field within the patient resource. |\n| 400 | UNSUPPORTED_VALUE | There was an unsupported value in the request. The value may be valid in the schema - however it could be a legacy value that we do not allow to be set anymore. For example - setting the death notification status to 'removed'. The invalid value and field will be presented in the display. |\n| 400 | TOO_FEW_VALUES_SUBMITTED | The field in question has a minimum number of items and the user sent too few. |\n| 400 | TOO_MANY_VALUES_SUBMITTED | The field in question has a maximum number of items and the user sent too many. |\n| 401 | ACCESS_DENIED | Access token missing, invalid or expired, or calling application not configured for this operation. |\n| 403 | FORBIDDEN_UPDATE | The user is not permitted to update certain resources or elements, for example most users are not allowed to update the date of death once it has been set. A detailed description will be added to the display. For example - updating a sensitive patient or adding a formal death notification is only permitted from certain systems. |\n| 403 | ACCESS_DENIED | Patient cannot perform this action. |\n| 404 | RESOURCE_NOT_FOUND | Patient does not exist for given NHS number. |\n| 404 | INVALIDATED_RESOURCE | Patient record for given NHS number has been invalidated and not superseded by another NHS number. |\n| 408 | UNABLE_TO_CALL_SERVICE | The downstream domain processing has not completed within the configured timeout period. |\n| 409 | RESOURCE_VERSION_MISMATCH | The resource version in the `If-Match` header of the update request did not match the current version of the resource. See [Patient resource versioning](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-fhir#patient-resource-versioning). |\n| 412 | PRECONDITION_FAILED | Problem with request, for example missing `If-Match` header. For details, see the `diagnostics` field. |\n| 429 | TOO_MANY_REQUESTS | You have exceeded your application's [rate limit](https://digital.nhs.uk/developer/guides-and-documentation/reference-guide#rate-limits). |\n","content":{"application/fhir+json":{"schema":{"type":"object","description":"Outcome of an operation that does not result in a resource or bundle being returned, for example an error or an async/batch submission.\nThere are a number of possible error codes that can be returned along with a more detailed description in the `display` field.\n","properties":{"resourceType":{"type":"string","description":"FHIR Resource Type.","default":"OperationOutcome"},"issue":{"type":"array","description":"List of issues that have occurred.","minItems":1,"items":{"type":"object","required":["severity","code"],"properties":{"severity":{"type":"string","enum":["fatal","error","warning","information"],"description":"Severity of the error.","example":"error"},"code":{"type":"string","description":"FHIR error code.","example":"invalid","enum":["invalid","structure","required","value","invariant","security","login","unknown","expired","forbidden","suppressed","processing","not-supported","duplicate","multiple-matches","not-found","deleted","too-long","code-invalid","extension","too-costly","business-rule","conflict","transient","lock-error","no-store","exception","timeout","incomplete","throttled","informational"]},"details":{"type":"object","description":"Internal error code.","properties":{"coding":{"type":"array","items":{"type":"object","properties":{"system":{"type":"string","description":"URI of the coding system specification.","example":"https://fhir.nhs.uk/R4/CodeSystem/Spine-ErrorOrWarningCode"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1"},"code":{"type":"string","description":"Symbol in syntax defined by the system.","example":"INVALID_VALUE"},"display":{"type":"string","description":"Representation defined by the system.","example":"Provided value is invalid"}}}}}},"diagnostics":{"type":"string","description":"Additional diagnostic information about the issue. This information is subject to change.","example":"Invalid value - 2019-01 in field 'birthDate'"},"expression":{"type":"string","description":"FHIRPath of element(s) related to the error.","example":"Patient.name.given"}}}}}},"example":{"resourceType":"OperationOutcome","issue":[{"severity":"error","code":"structure","details":{"coding":[{"system":"https://fhir.nhs.uk/R4/CodeSystem/Spine-ErrorOrWarningCode","version":"1","code":"INVALID_UPDATE","display":"Update is invalid"}]},"diagnostics":"Invalid update with error - Update unsupported for resource - 'pets'"}]}}}}}}},"/Patient/{id}/RelatedPerson":{"parameters":[{"name":"id","in":"path","description":"The patient's NHS number. The primary identifier of a patient, unique within NHS England and Wales. Always 10 digits and must be a [valid NHS number](https://www.datadictionary.nhs.uk/attributes/nhs_number.html).","required":true,"schema":{"type":"string","example":"9000000009"}},{"in":"header","name":"Authorization","description":"An [OAuth 2.0 bearer token](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation#user-restricted-apis).\n\nRequired in all environments except sandbox.\n","required":false,"schema":{"type":"string","format":"^Bearer\\ [[:ascii:]]+$","example":"Bearer g1112R_ccQ1Ebbb4gtHBP1aaaNM"}},{"in":"header","name":"NHSD-Session-URID","description":"\nThe user role ID (URID) for the current session. Also known as a user role profile ID (URPID).\n\nThis header is optional.\n\nIn Application-restricted access mode this header is ignored.\n\nIn Healthcare worker access mode if you send this header it must be valid for the logged-in user. See [determine the user's role](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation/user-restricted-restful-apis-nhs-cis2-separate-authentication-and-authorisation#step-9-determine-the-user-s-role) for guidance.\n","required":false,"schema":{"type":"string","pattern":"^[0-9]+$","example":"555254240100"}},{"in":"header","name":"X-Request-ID","required":false,"description":"A globally unique identifier (GUID) for the request, which we use to de-duplicate repeated requests and to trace the request if you contact our helpdesk.\n\nMust be a universally unique identifier (UUID) (ideally version 4).\n\nMirrored back in a response header.\n\nIf you re-send a failed request, use the same value in this header.\n","schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","example":"60E0B220-8136-4CA5-AE46-1D97EF59D068"}},{"in":"header","name":"X-Correlation-ID","required":false,"description":"An optional ID which you can use to track transactions across multiple systems. It can take any value, but we recommend avoiding `.` characters.\n\nMirrored back in a response header.\n","schema":{"type":"string","example":"11C46F5F-CDEF-4865-94B2-0EE0EDCC26DA"}},{"in":"header","name":"NHSD-End-User-Organisation-ODS","required":false,"description":"The ODS code of the user.\n\nMandatory for client applications which service multiple end user organisations (EUO). This will allow the calls to be attributed to the correct EUO.\n","schema":{"type":"string","example":"Y12345"}}],"get":{"description":"## Overview\nUse this endpoint to get a patient's related people details from PDS for a given NHS number. This is a list of people who can be contacted, and how, regarding the patient. These details may be useful for a practitioner to get in contact with a next of kin or guardian.\n\n## Restricted patients\nSome patients are tagged as [restricted](https://digital.nhs.uk/services/demographics/restricting-access-to-a-patients-demographic-record) and are sometimes known as sensitive patients. Related people are not returned for a restricted patient and an empty bundle is returned.\n\nIf a related person only contains a patient reference, and when the patient is retrieved, it is restricted; location sensitive fields such as `address` and `telecom` are removed.\n\n## Sandbox test scenarios\nYou can test the following scenarios in our sandbox environment:\n\n| Scenario | Request | Response |\n| ------------------------------- | --------------------------------------------- | ------------------------------------------------------------- |\n| Multiple related people exists | `id`=`9000000009` | HTTP Status 200 with related person data in a response Bundle |\n| Single related person exists | `id`=`9000000017` | HTTP Status 200 with related person data in a response Bundle |\n| Related people do not exist | `id`=`9000000025` | HTTP Status 200 with an empty bundle |\n| Missing X-Request-ID | `id`=`9000000009` (or any other valid NHS number) | HTTP Status 412 with problem description |\n\nYou can try out the sandbox using the 'Try this API' feature on this page.\n\nAlternatively, you can try out the sandbox using our Postman collection:\n\n[![Run in Postman](https://run.pstmn.io/button.svg)](https://app.getpostman.com/run-collection/14719036-953f067f-30b9-4552-8252-7cc10b21dad3)\n","summary":"Get a patient's related people","operationId":"get-related-people","responses":{"200":{"description":"Information successfully returned.","headers":{"ETag":{"schema":{"type":"string","pattern":"^W/\"[0-9]+\"$","example":"W/\"2\""},"description":"Record version identifier enclosed in quotes and preceded by 'W/'. For example, `W/\"2\"`.\n\nCorresponds to `meta.versionId` attribute in the patient resource body.\n\nWhen you retrieve a patient resource, you get a version number for the resource (in the `ETag` response header and in the `versionId` field in the response).\nYou must then pass the resource's version number in any update request (in the `If-Match` response header) made for the patient.\n"},"X-Correlation-Id":{"schema":{"type":"string","example":"11C46F5F-CDEF-4865-94B2-0EE0EDCC26DA"},"description":"The X-Correlation-ID from the request header, if supplied, mirrored back.\n"},"X-Request-Id":{"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","example":"60E0B220-8136-4CA5-AE46-1D97EF59D068"},"description":"The X-Request-ID from the request header, if supplied, mirrored back.\n"}},"content":{"application/fhir+json":{"schema":{"type":"object","properties":{"resourceType":{"type":"string","description":"FHIR Resource Type.","default":"Bundle"},"type":{"type":"string","description":"FHIR Bundle Type.","default":"searchset"},"timestamp":{"type":"string","description":"Time the search was performed.","format":"datetime","example":"2019-12-25T12:00:00+00:00"},"total":{"type":"integer","description":"Number of resources returned in search.","example":1},"entry":{"type":"array","description":"A list of related people details attached to the patient. \n","items":{"type":"object","properties":{"fullUrl":{"type":"string","description":"Absolute URL of the resource described in this item.","example":"https://api.service.nhs.uk/personal-demographics/FHIR/R4/Patient/9000000009/RelatedPerson/507B7621"},"resource":{"type":"object","additionalProperties":false,"required":["patient","relationship"],"properties":{"id":{"type":"string","description":"Unique object identifier for this name.","example":"507B7621"},"resourceType":{"type":"string","description":"FHIR resource type.","default":"RelatedPerson"},"patient":{"type":"object","required":["type"],"properties":{"type":{"type":"string","default":"Patient","enum":["Patient"]},"identifier":{"type":"object","description":"Identifier and system of identification used for this Patient.\n\nThis is an optional field as related person details are either a reference to another NHS number, or the details, such as name and adress, stored directly on the resource.\n","properties":{"system":{"type":"string","description":"URL for the Patient retrieval API.","format":"url","example":"https://api.service.nhs.uk/personal-demographics/FHIR/R4/Patient"},"value":{"type":"string","description":"NHS number for the related person","example":"90000000009","pattern":"^\\d{10}$"}}},"reference":{"type":"string","description":"URL for the FHIR Patient resource.","format":"url","example":"https://api.service.nhs.uk/personal-demographics/FHIR/R4/Patient/90000000009"}}},"active":{"type":"boolean","default":true},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"name":{"type":"array","description":"List containing zero or one name associated with the related person.\nThis is an optional field as there may be a `patient` reference which can be used to retrieve any details about the related person.\nIf no `patient` reference is available `name` and `address` must be provided at the minimum.\n","maxItems":1,"items":{"type":"object","required":["use","family"],"additionalProperties":false,"properties":{"id":{"type":"string","description":"Unique object identifier for this name.","example":"123"},"use":{"type":"string","description":"How this name should be used.\n* usual - Known as, conventional or the one patient normally uses. A patient always has a usual name.\n* temp - An alias or temporary name. This may also be used for temporary names assigned at birth or in emergency situations.\n* nickname - A name that the patient prefers to be addressed by, but is not part of their usual name.\n* old - This name is no longer in use (or was never correct, but retained for records).\n* maiden - Name changed for Marriage. A name used prior to changing name because of marriage. This term is not gender specific. The use of this term does not imply any particular history for a person's name.\n\nThe following use codes are included in the [name-use](https://www.hl7.org/fhir/valueset-name-use.html) value set, but should not be used and is not be returned as part of a retrieval.\n* official - The formal name as registered in an official (government) registry, but which name might not be commonly used. May be called \"legal name\".\n* anonymous - Anonymous assigned name, alias, or pseudonym (used to protect a person's identity for privacy reasons).\n","enum":["usual","temp","nickname","old","maiden"],"example":"usual"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"given":{"type":"array","maxItems":5,"description":"Given names, including any middle names.\n\nEach name(s) should be a separate item in the list. The first given name may include multiple names, separated by a space.\nSubsequent names must be broken down into list items. For example, the input `[Jane Marie Anne, Jo Adele]` returns `[Jane Marie Anne, Jo, Adele]`.\n","example":["Jane Marie Anne","Jo","Adele"],"items":{"type":"string","maxLength":35,"example":"Jane"}},"family":{"type":"string","maxLength":35,"description":"Family name (often called Surname).","example":"Smith"},"prefix":{"type":"array","description":"Name prefixes, titles, and prenominals.","example":["Mrs"],"items":{"type":"string","example":"Mrs"}},"suffix":{"type":"array","description":"Name suffices and postnominals.","example":["MBE","PhD"],"items":{"type":"string","example":"MBE"}}}}},"address":{"type":"array","description":"List containing zero or one address associated with the related person.\nThis is an optional field as there may be a `patient` reference which can be used to retrieve any details about the related person.\nIf no `patient` reference is available `name` and `address` must be provided at the minimum.\n","maxItems":1,"items":{"type":"object","description":"An address associated with the patient.","required":["use"],"properties":{"id":{"type":"string","description":"Unique system identifier for this address.","example":"456"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"use":{"type":"string","description":"Purpose of this address:\n * `home` - the home address is the patient's normal residence. Home address is also known as usual, main, registered, current or permanent address\n * `temp` - a temporary address is an address used for a set period of time, but where the patient's home, permanent address remains unchanged\n * `billing` - an address used for correspondence purposes only\n * `work` - an office address. This can be returned due to legacy data but cannot be added or replaced on update\n\n A patient should have no more than one current `temp` and/or `billing` address.\n However, historically this was constrained only by the integration requirements and was not enforced so theoretically more than one can exist for a patient when retrieving.\n Where multiple instances already exist for the patient it is not expected that local systems should manage those, but should choose the most appropriate one to maintain (e.g. by examining period dates).\n\n A `home` address is the patient's main residential address and should normally be used for all clinical and demographic purposes, including clinical and appointment correspondence.\n However additionally, `temp` and `billing` addresses may be provided by a patient when there is a requirement to record an alternative location for the purposes of unbroken care.\n When sending correspondence to a patient:\n *\ta present and valid `billing` address may take precedence over `home` and `temp` addresses. A patient should have only a single current `billing` address. An address is considered 'valid' according to its period start and end dates.\n *\tif no current `billing` address is provided, a `temp` address may take precedence over the `home` address, again if it is valid according to its period start and end dates.\n * if there is no valid, current `billing` and/or `temp` address, the `home` address must be used.\n","enum":["home","work","temp","billing"],"example":"home"},"text":{"type":"string","description":"Where a `temp` address is provided a descriptor text must be sent.\nThe list of possible values are:\n* `Second Home` - a patient's second home\n* `Student Accommodation` - a patient's place of residence while at university\n* `Respite Care Address` - where the patient resides during respite care\n* `Temporary Residence Address` - where the patient resides for a specific period of time\n* `Convalescence Home` - the address for a patient during a period of recovery\n* `Mobile Home` - the address of a patient's mobile home, parked for a specific period of time, e.g. the address of a caravan park\n* `Holiday Home` - the address for a patient during a holiday\n\nA patient can also register temporarily at a GP practice using a temporary address. Temporary GP registration information does not appear on the PDS, but the address used for it may.\n","enum":["Second Home","Student Accommodation","Respite Care Address","Temporary Residence Address","Convalescence Home","Mobile Home","Holiday Home"],"example":"Student Accommodation"},"line":{"type":"array","description":"All lines of the address except the postal code.\n\nSystems must apply the following formatting convention when adding or replacing addresses lines:\n*\tline 1 - premises ID and/or house name, e.g. `Flat 1` or `The Old Schoolhouse`\n*\tline 2 - house number, dependent thoroughfare name and descriptor (if present), thoroughfare name and descriptor, e.g. `23 Mill Lane`\n*\tline 3 - dependent locality/village, locality (if present), e.g. `Boxgrove`\n*\tline 4 - post town, e.g. `Leeds`\n*\tline 5 - county (if present), e.g. `West Yorkshire`\n\nIf any of the lines are blank, they are not returned due to FHIR conformance constraints.\n","maxItems":5,"items":{"type":"string"},"example":["1 Trevelyan Square","Boar Lane","City Centre","Leeds","West Yorkshire"]},"postalCode":{"type":"string","description":"Postal code of the address.","example":"LS1 6AE"},"extension":{"type":"array","description":"List of address keys formatted as a FHIR extension. This can include up to one Unique Property Reference Number (UPRN), and up to one Postal Address File (PAF) key. If no keys for the address are known, the array will be empty. Otherwise it will be a list of objects which specify the value of the address key and the code system for it","items":{"anyOf":[{"type":"object","description":"Unique identifier for an address.","properties":{"url":{"type":"string","description":"URL of specification of the AddressKey extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey"]},"extension":{"type":"array","description":"Specification of address key system and address key value. Contains exactly two items: one describing the code system the Address Key uses, and the other specifying the value of the Address Key.","minItems":2,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Coding system of the address key.","required":["url","valueCoding"],"properties":{"url":{"type":"string","description":"Always 'type'.","default":"type"},"valueCoding":{"type":"object","description":"URL of specification of address key format.","required":["system","code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available Address Key formats.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType"},"code":{"type":"string","description":"Address Key system. Always 'PAF'.","enum":["PAF"],"example":"PAF"}}}}},{"type":"object","description":"Value of the address key.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Always 'value'.","default":"value","example":"value"},"valueString":{"type":"string","description":"Address key in PAF format. An 8 digit number including leading zeroes, formatted as a string.","minLength":8,"maxLength":8,"pattern":"^[0-9]{8}$","example":"12345678"}}}]}}}},{"type":"object","description":"Unique identifier for an address.","properties":{"url":{"type":"string","description":"URL of specification of the AddressKey extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey"]},"extension":{"type":"array","description":"Specification of address key system and address key value. Contains exactly two items: one describing the code system the Address Key uses, and the other specifying the value of the Address Key.","minItems":2,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Coding system of the address key.","required":["url","valueCoding"],"properties":{"url":{"type":"string","description":"Always 'type'.","default":"type"},"valueCoding":{"type":"object","description":"URL of specification of address key format.","required":["system","code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available Address Key formats.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType"},"code":{"type":"string","description":"Address Key system. Always 'UPRN'.","enum":["UPRN"],"example":"UPRN"}}}}},{"type":"object","description":"Value of the address key.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Always 'value'.","default":"value","example":"value"},"valueString":{"type":"string","description":"Address key in UPRN format. A number containing from 1 up to 12 digits.","minLength":1,"maxLength":12,"pattern":"^[0-9]{1,12}$","example":"123456789012"}}}]}}}}]}}}}},"telecom":{"type":"array","description":"List containing zero to five contact methods associated with the related person.\nThis is an optional field as there may be a `patient` reference which can be used to retrieve any details about the related person.\n","maxItems":5,"items":{"description":"A contact point, such as a phone number or email address","type":"object","required":["system","value"],"properties":{"id":{"type":"string","description":"Unique object identifier for this contact point.","example":"789"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"system":{"description":"Means of communication, such as phone or email.","type":"string","enum":["phone","fax","email","other"],"example":"phone"},"value":{"description":"Phone number, email address, or other identifier for use with contact system.","type":"string","example":"01632960587"},"use":{"type":"string","description":"Location associated with communication system.","enum":["home","work","temp","mobile"],"example":"home"},"extension":{"type":"array","maxItems":1,"description":"Extension that is returned when the communication type is `textphone`. The only code returned is `textphone`, which means `Minicom (Textphone)`.\n\nThe `system` is `other` when the extension is included.\n","items":{"type":"object","description":"Wrapped object for other contact system details.","properties":{"url":{"type":"string","description":"Definition of other contact system extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem"]},"valueCoding":{"type":"object","description":"URL of specification of other contact systems.","properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem"},"code":{"type":"string","description":"Coded value for the other contact system in place.","example":"textphone"},"display":{"description":"Display-friendly representation of the other contact system code.","type":"string","example":"Minicom (Textphone)"}}}}}}}}},"relationship":{"type":"array","description":"The relationship of the related person to the patient.\n","minItems":1,"maxItems":1,"items":{"type":"object","required":["coding"],"properties":{"coding":{"type":"array","description":"Coded values for three relationship types:\n* Role\n* Type\n* Next-of-Kin\n\nThe codes used can be found at:\n* http://hl7.org/fhir/ValueSet/relatedperson-relationshiptype\n* https://fhir.nhs.uk/R4/CodeSystem/UKCore-AdditionalRelatedPersonRole\n\nThe allowed values for `Role` are:\n* Agent - Agent of patient\n* Guardian - Guardian of patient\n* Personal - Personal relationship with the patient\n\nThe allowed values for `Type` are:\n* SPS - spouse\n* DOMPART - domestic partner\n* PRN - parent\n* PRNFOST - foster parent\n* STPPRN - step parent\n* CHILD - child\n* MTH - mother\n* FTH - father\n* SIS - sister\n* BRO - brother\n* FAMMEMB - family member\n* ONESELF - self\n* N - Next-of-Kin\n* U - Unknown\n* PolygamousPartner - Polygamous Partner of patient\n* Dependant - Dependant of patient\n* NonDependant - Non Dependant of patient\n* ProxyContact - Proxy Contact for patient\n* ProxyCommunication - Proxy Communication for patient\n* ProxyContactCommunication - Proxy Contact and Communication for patient\n* Carer - Carer of patient\n* Guardian - Guardian of patient\n* NotSpecified - Not Specified\n\nThe allowed values for `Next-of-Kin` are:\n* N - Next-of-Kin\n\n`Role` and `Type` are mandatory, so both should be present - however they both contain the `Guardian` code - so a single response is possible.\n\n`Next-of-Kin` is optional and will be absent from the response when the related person is not the Next-of-Kin.\n","minItems":1,"maxItems":3,"items":{"type":"object","required":["system","code"],"properties":{"system":{"type":"string","description":"URI of the coding system specification.","format":"url","default":"https://fhir.nhs.uk/R4/CodeSystem/UKCore-AdditionalRelatedPersonRole","enum":["http://hl7.org/fhir/ValueSet/relatedperson-relationshiptype","https://fhir.nhs.uk/R4/CodeSystem/UKCore-AdditionalRelatedPersonRole"]},"code":{"type":"string","description":"Symbol in syntax defined by the system.","example":"Guardian"},"display":{"type":"string","description":"Human-friendly display representation defined by the system.","example":"Guardian of patient"}}}}}}},"extension":{"type":"array","description":"Wrapper array for copy correspondence, contact rank, contact preferences and communication details; these are all FHIR extensions. Always contains zero or one of each extension type.\n","items":{"anyOf":[{"type":"object","description":"Flag indicating if this person should be copied in on any contact with the Patient. This will only be returned if the value is true and the person should be copied in on correspondence, otherwise it will be omitted. \n","properties":{"url":{"type":"string","format":"url","description":"URL to FHIR Extension Specification.","default":"https://fhir.nhs.uk/R4/StructureDefinition/Extension-UKCore-CopyCorrespondenceIndicator","enum":["https://fhir.nhs.uk/R4/StructureDefinition/Extension-UKCore-CopyCorrespondenceIndicator"]},"valueBoolean":{"type":"boolean","description":"Flag indicating if this person should be copied in on correspondence. This will only be returned if the value is `true` otherwise it will not be returned and can be assumed `false`","example":true}}},{"type":"object","description":"Rank indicating order in which contacts should be tried.","properties":{"url":{"type":"string","format":"url","description":"URL to FHIR Extension Specification.","default":"https://fhir.nhs.uk/R4/StructureDefinition/Extension-UKCore-ContactRank","enum":["https://fhir.nhs.uk/R4/StructureDefinition/Extension-UKCore-ContactRank"]},"valuePositiveInt":{"type":"integer","minimum":1,"maximum":99,"description":"Rank expressed as positive integer (1 being the highest).","example":1}}},{"type":"object","description":"Wrapper object for preferred contact details; the written communication format, preferred contact time and method. This will only be populated on a retrieval and not a search.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of the contact preference extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-ContactPreference","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-ContactPreference"]},"extension":{"description":"Wrapper array containing zero or one preferred contact method, zero or one preferred written communication format; and zero or one preferred contact time.","type":"array","maxItems":3,"items":{"oneOf":[{"type":"object","description":"Wrapper object for preferred written communication format.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredWrittenCommunicationFormat`.","default":"PreferredWrittenCommunicationFormat"},"valueCodeableConcept":{"type":"object","description":"Preferred Written Communication Format.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","format":"url","description":"Definition of the preferred written communication extension.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredWrittenCommunicationFormat","enum":["https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredWrittenCommunicationFormat"]},"code":{"type":"string","description":"A code to identify the preferred written communication format of a patient, contact or related person.\n* 11 - Large print\n* 12 - Braille\n* 13 - Audio tape\n","example":"12"},"display":{"type":"string","description":"Display-friendly representation of the preferred written communication format code.","example":"Braille"}}}}}}}},{"type":"object","description":"Wrapper object for preferred contact method.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredContactMethod`.","default":"PreferredContactMethod","enum":["PreferredContactMethod"]},"valueCodeableConcept":{"type":"object","description":"Preferred Contact Method.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","format":"url","description":"Definition of the preferred contact method extension.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredContactMethod","enum":["https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredContactMethod"]},"code":{"type":"string","description":"A code to identify to identify the preferred contact method of a patient, contact or related person.\n* 1\t- Letter\n* 2\t- Visit\n* 3\t- Telephone\n* 4\t- E-mail\n* 5\t- Minicom (Textphone)\n* 6\t- Telephone contact via proxy\n* 7\t- Sign language\n* 8\t- No Telephone contact\n","example":"1"},"display":{"type":"string","description":"Display-friendly representation of the preferred contact method code.","example":"Letter"}}}}}}}},{"type":"object","description":"Wrapper object for preferred contact times.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredContactTimes`.","default":"PreferredContactTimes","enum":["PreferredContactTimes"]},"valueString":{"type":"string","maximum":40,"description":"A free-text description about the preferred contact times.","example":"Not after 7pm"}}}]}}}},{"type":"object","description":"Wrapper object for communication details. This will only be populated on a retrieval and not a search.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of communication extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSCommunication","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSCommunication"]},"extension":{"type":"array","description":"Definition of communication extension.\n\nThe array must have one item, a valueCodeableConcept for the language and can optionally include a valueBoolean for if an interpreter is required.","minItems":1,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Wrapper object for communication language.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `language`.","default":"language","enum":["language"]},"valueCodeableConcept":{"type":"object","description":"Human language.","required":["coding"],"properties":{"coding":{"type":"array","description":"Exactly one language code.","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URL of the Language Code System. Always uses the 'UKCore-HumanLanguage' Code System.","example":"https://fhir.hl7.org.uk/CodeSystem/UKCore-HumanLanguage"},"version":{"type":"string","description":"Version of the language code system.","example":"1.0.0"},"code":{"type":"string","description":"Language code based on [ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) standard plus extensions for braille, makaton and sign languages, which are:\n* `q1` - Braille\n* `q2` - American Sign Language\n* `q3` - Australian Sign Language\n* `q4` - British Sign Language\n* `q5` - Makaton\nAll valid codes combined can be found at https://fhir.hl7.org.uk/CodeSystem/UKCore-HumanLanguage.\n","example":"fr"},"display":{"type":"string","description":"Display-friendly representation of the language code (such as English). If there is a language code with no defined mapping, `Unknown` will be returned.","example":"French"}}}}}}}},{"type":"object","description":"Wrapper object for whether an interpreter is required.","required":["url","valueBoolean"],"properties":{"url":{"type":"string","description":"Key of this object. Always `interpreterRequired`.","default":"interpreterRequired","enum":["interpreterRequired"]},"valueBoolean":{"type":"boolean","description":"Whether an interpreter is required.","example":true}}}]}}}}]}}}}}}}}},"example":{"resourceType":"Bundle","type":"searchset","timestamp":"2019-12-25T12:00:00+00:00","total":1,"entry":[{"fullUrl":"https://api.service.nhs.uk/personal-demographics/FHIR/R4/Patient/9000000009/RelatedPerson/507B7621","resource":{"id":"507B7621","resourceType":"RelatedPerson","patient":{"type":"Patient","identifier":{"system":"https://api.service.nhs.uk/personal-demographics/FHIR/R4/Patient","value":"90000000009"},"reference":"https://api.service.nhs.uk/personal-demographics/FHIR/R4/Patient/90000000009"},"active":true,"period":{"start":"2020-01-01","end":"2021-12-31"},"name":[{"use":"usual","period":{"start":"2020-01-01","end":"2021-12-31"},"given":["Jane"],"family":"Smith","prefix":["Mrs"],"suffix":["MBE"]}],"relationship":[{"coding":[{"system":"https://fhir.nhs.uk/R4/CodeSystem/UKCore-AdditionalRelatedPersonRole","code":"Guardian","display":"Guardian of patient"}]}],"extension":[{"url":"https://fhir.nhs.uk/R4/StructureDefinition/Extension-UKCore-CopyCorrespondenceIndicator","valueBoolean":true},{"url":"https://fhir.nhs.uk/R4/StructureDefinition/Extension-UKCore-ContactRank","valuePositiveInt":1},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-ContactPreference","extension":[{"url":"PreferredWrittenCommunicationFormat","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredWrittenCommunicationFormat","code":"12","display":"Braille"}]}},{"url":"PreferredContactMethod","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredContactMethod","code":"1","display":"Letter"}]}},{"url":"PreferredContactTimes","valueString":"Not after 7pm"}]},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSCommunication","extension":[{"url":"language","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-HumanLanguage","version":"1.0.0","code":"fr","display":"French"}]}},{"url":"interpreterRequired","valueBoolean":true}]}],"telecom":[{"period":{"start":"2020-01-01","end":"2021-12-31"},"system":"phone","value":"01632960587","use":"home"}],"address":[{"period":{"start":"2020-01-01","end":"2021-12-31"},"use":"home","line":["1 Trevelyan Square","Boar Lane","City Centre","Leeds","West Yorkshire"],"postalCode":"LS1 6AE","extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","extension":[{"url":"type","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType","code":"PAF"}},{"url":"value","valueString":"12345678"}]},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","extension":[{"url":"type","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType","code":"UPRN"}},{"url":"value","valueString":"123456789012"}]}]}]}}]}}}},"4XX":{"description":"An error occurred as follows:\n\n| HTTP status | Error code | Description |\n| ----------- | -------------------------- | --------------------------------------------- |\n| 400 | INVALID_RESOURCE_ID | Invalid NHS number. |\n| 400 | MISSING_VALUE | Missing header parameter. For details, see the `diagnostics` field. |\n| 400 | INVALID_VALUE | Invalid header parameter. For details, see the `diagnostics` field. |\n| 401 | ACCESS_DENIED | Access token missing, invalid or expired, or calling application not configured for this operation. |\n| 404 | RESOURCE_NOT_FOUND | No related people exist for given NHS number. |\n| 404 | INVALIDATED_RESOURCE | Patient record for given NHS number has been invalidated and not superseded by another NHS number. |\n| 408 | UNABLE_TO_CALL_SERVICE | The downstream domain processing has not completed within the configured timeout period. |\n| 429 | TOO_MANY_REQUESTS | You have exceeded your application's [rate limit](https://digital.nhs.uk/developer/guides-and-documentation/reference-guide#rate-limits). |\n","content":{"application/fhir+json":{"schema":{"type":"object","description":"Outcome of an operation that does not result in a resource or bundle being returned, for example an error or an async/batch submission.\nThere are a number of possible error codes that can be returned along with a more detailed description in the `display` field.\n","properties":{"resourceType":{"type":"string","description":"FHIR Resource Type.","default":"OperationOutcome"},"issue":{"type":"array","description":"List of issues that have occurred.","minItems":1,"items":{"type":"object","required":["severity","code"],"properties":{"severity":{"type":"string","enum":["fatal","error","warning","information"],"description":"Severity of the error.","example":"error"},"code":{"type":"string","description":"FHIR error code.","example":"invalid","enum":["invalid","structure","required","value","invariant","security","login","unknown","expired","forbidden","suppressed","processing","not-supported","duplicate","multiple-matches","not-found","deleted","too-long","code-invalid","extension","too-costly","business-rule","conflict","transient","lock-error","no-store","exception","timeout","incomplete","throttled","informational"]},"details":{"type":"object","description":"Internal error code.","properties":{"coding":{"type":"array","items":{"type":"object","properties":{"system":{"type":"string","description":"URI of the coding system specification.","example":"https://fhir.nhs.uk/R4/CodeSystem/Spine-ErrorOrWarningCode"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1"},"code":{"type":"string","description":"Symbol in syntax defined by the system.","example":"INVALID_VALUE"},"display":{"type":"string","description":"Representation defined by the system.","example":"Provided value is invalid"}}}}}},"diagnostics":{"type":"string","description":"Additional diagnostic information about the issue. This information is subject to change.","example":"Invalid value - 2019-01 in field 'birthDate'"},"expression":{"type":"string","description":"FHIRPath of element(s) related to the error.","example":"Patient.name.given"}}}}}},"example":{"resourceType":"OperationOutcome","issue":[{"severity":"error","code":"structure","details":{"coding":[{"system":"https://fhir.nhs.uk/R4/CodeSystem/Spine-ErrorOrWarningCode","version":"1","code":"PRECONDITION_FAILED","display":"Required condition was not fulfilled"}]},"diagnostics":"Invalid request with error - X-Request-ID header must be supplied to access this resource"}]}}}}}}}},"components":{"headers":{"ETag":{"schema":{"type":"string","pattern":"^W/\"[0-9]+\"$","example":"W/\"2\""},"description":"Record version identifier enclosed in quotes and preceded by 'W/'. For example, `W/\"2\"`.\n\nCorresponds to `meta.versionId` attribute in the patient resource body.\n\nWhen you retrieve a patient resource, you get a version number for the resource (in the `ETag` response header and in the `versionId` field in the response).\nYou must then pass the resource's version number in any update request (in the `If-Match` response header) made for the patient.\n"},"X-Correlation-Id":{"schema":{"type":"string","example":"11C46F5F-CDEF-4865-94B2-0EE0EDCC26DA"},"description":"The X-Correlation-ID from the request header, if supplied, mirrored back.\n"},"X-Request-Id":{"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","example":"60E0B220-8136-4CA5-AE46-1D97EF59D068"},"description":"The X-Request-ID from the request header, if supplied, mirrored back.\n"},"RetryAfter":{"description":"Time to wait between polls in seconds","schema":{"type":"string","example":"5"}}},"parameters":{"Id":{"name":"id","in":"path","description":"The patient's NHS number. The primary identifier of a patient, unique within NHS England and Wales. Always 10 digits and must be a [valid NHS number](https://www.datadictionary.nhs.uk/attributes/nhs_number.html).","required":true,"schema":{"type":"string","example":"9000000009"}},"MessageId":{"name":"message_id","in":"path","description":"The message ID of the accepted update that needs to be submitted to confirm the resource a successfully updated.","required":true,"schema":{"type":"string","example":"20200522091633363041_000001A"}},"ObjectId":{"name":"object_id","in":"path","description":"A resource Object ID. The primary identifier of a resource.","required":true,"schema":{"type":"string","example":"507B7621"}},"IfMatch":{"in":"header","name":"If-Match","description":"Latest known version identifier enclosed in quotes preceded by `W/`.\n\nSend the value of the patient's `ETag` response header on patient retrieval when updating a patient.\nThis is to ensure that any updates are applied against an up-to-date version of the patient resource.\n","required":true,"schema":{"type":"string","pattern":"^W/\"[0-9]+\"$","example":"W/\"2\""}},"RoleId":{"in":"header","name":"NHSD-Session-URID","description":"\nThe user role ID (URID) for the current session. Also known as a user role profile ID (URPID).\n\nThis header is optional.\n\nIn Application-restricted access mode this header is ignored.\n\nIn Healthcare worker access mode if you send this header it must be valid for the logged-in user. See [determine the user's role](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation/user-restricted-restful-apis-nhs-cis2-separate-authentication-and-authorisation#step-9-determine-the-user-s-role) for guidance.\n","required":false,"schema":{"type":"string","pattern":"^[0-9]+$","example":"555254240100"}},"BearerAuthorization":{"in":"header","name":"Authorization","description":"An [OAuth 2.0 bearer token](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation#user-restricted-apis).\n\nRequired in all environments except sandbox.\n","required":false,"schema":{"type":"string","format":"^Bearer\\ [[:ascii:]]+$","example":"Bearer g1112R_ccQ1Ebbb4gtHBP1aaaNM"}},"ContentType":{"in":"header","name":"Content-Type","description":"For a PATCH request, this must be set to `application/json-patch+json`.\n","required":true,"schema":{"type":"string","example":"application/json-patch+json"}},"RequestID":{"in":"header","name":"X-Request-ID","required":false,"description":"A globally unique identifier (GUID) for the request, which we use to de-duplicate repeated requests and to trace the request if you contact our helpdesk.\n\nMust be a universally unique identifier (UUID) (ideally version 4).\n\nMirrored back in a response header.\n\nIf you re-send a failed request, use the same value in this header.\n","schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","example":"60E0B220-8136-4CA5-AE46-1D97EF59D068"}},"CorrelationID":{"in":"header","name":"X-Correlation-ID","required":false,"description":"An optional ID which you can use to track transactions across multiple systems. It can take any value, but we recommend avoiding `.` characters.\n\nMirrored back in a response header.\n","schema":{"type":"string","example":"11C46F5F-CDEF-4865-94B2-0EE0EDCC26DA"}},"NHSD-End-User-Organisation-ODS":{"in":"header","name":"NHSD-End-User-Organisation-ODS","required":false,"description":"The ODS code of the user.\n\nMandatory for client applications which service multiple end user organisations (EUO). This will allow the calls to be attributed to the correct EUO.\n","schema":{"type":"string","example":"Y12345"}},"FuzzyMatch":{"name":"_fuzzy-match","description":"A fuzzy search is performed, including checks for homophones, transposed names and historic information.\n\nYou cannot use wildcards with a fuzzy search.\n","example":false,"in":"query","required":false,"schema":{"type":"boolean","default":false}},"ExactMatch":{"name":"_exact-match","description":"The search only returns results where the `score` field is 1.0. Use this with care - it is unlikely to work with fuzzy search or wildcards.","example":false,"in":"query","required":false,"schema":{"type":"boolean","default":false}},"History":{"name":"_history","description":"The search looks for matches in historic information such as previous names and addresses.\n\nThis parameter has no effect for a fuzzy search, which always includes historic information.\n","example":true,"in":"query","required":false,"schema":{"type":"boolean","default":false}},"MaxResults":{"name":"_max-results","description":"The maximum number of matching patients to return. For healthcare worker access, this must be between 1 and 50, and the default is 50.\nFor application-restricted access, this must be 1, and the default is 1.\nIf too many patients match the search criteria, we return a `TOO_MANY_MATCHES` error.\n","example":1,"in":"query","required":false,"schema":{"type":"integer","format":"int32"}},"Family":{"name":"family","description":"The patient's family name (surname).\n\nNot case sensitive. Max 35 characters.\nUse `*` as a wildcard but not in the first two characters and not in fuzzy search mode.\nMust be [URL encoded](https://en.wikipedia.org/wiki/Percent-encoding), for example a space must be represented by either `%20` or `+` and a wildcard must be encoded as `%2A`.\n","examples":{"simple":{"value":"Smith","summary":"Matches Smythe if `_fuzzy-match` is specified."},"wildcarded":{"value":"Sm*t*","summary":"Wildcards must contain at least two characters, this matches Smith, Smythe"}},"in":"query","required":false,"schema":{"type":"string"}},"Given":{"name":"given","description":"The patient's given names.\n\nNot case sensitive. Max 35 characters.\nUse `*` as a wildcard but not in the first two characters and not in fuzzy search mode.\nWildcard searches will match the start of the first given name and not subsequent given names, for example the given names \"Alan Michael\" can be searched with \"Ala*\" but not \"Mic*\".\nMust be [URL encoded](https://en.wikipedia.org/wiki/Percent-encoding), for example a space must be represented by either `%20` or `+` and a wildcard must be encoded as `%2A`.\n\nA patient may have more than one given name. Subsequent given names are commonly referred to as 'middle names'.\nSpecify multiple given names by repeating this parameter.\nTo search for `Jane Anne Smith` use `given=Jane&given=Anne&family=Smith`.\n\nThe first given name may be a [compound name](https://en.wikipedia.org/wiki/Given_name#Compound), for example `John Paul`.\nTo search for `John Paul James Smith` (where `John Paul` is the first given name, `James` is the second given name, and `Smith` the family name) use `given=John%20Paul&given=James&family=Smith`.\n\nNote that it is not necessary to specify subsequent given (middle) names, and that doing so may impact your search results in the case they are not recorded in the demographics system.\n","example":"Jane","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"}}},"Gender":{"name":"gender","description":"Gender with which the patient most strongly identifies.","example":"female","in":"query","required":false,"schema":{"type":"string","enum":["male","female","other","unknown"],"example":"female"}},"Birthdate":{"name":"birthdate","in":"query","description":"Date of birth in the format `yyyy-mm-dd`. To specify a range, use `birthdate=geyyyy-mm-dd&birthdate=leyyyy-mm-dd`.","examples":{"simple":{"value":["eq2010-10-22"],"description":"Exact match date"},"rangege":{"value":["ge2010-10-22"],"description":"Greater than or equals match, which matches 2010-10-22 or 2010-10-23"},"rangele":{"value":["le2010-10-22"],"description":"Less than or equals match, which matches 2010-10-22 or 2010-10-21"}},"required":false,"schema":{"type":"array","items":{"type":"string"}}},"DeathDate":{"name":"death-date","in":"query","description":"Date of death in the format `yyyy-mm-dd`. To specify a range, use `death-date=geyyyy-mm-dd&death-date=leyyyy-mm-dd`.\n\nFor a fuzzy search, this is ignored for matching but included in the score calculation.\n","examples":{"simple":{"value":"eq2010-10-22","description":"Exact match date"},"rangege":{"value":"ge2010-10-22","description":"Greater than or equals match which matches 2010-10-22 or 2010-10-23"},"rangele":{"value":"le2010-10-22","description":"Less than or equals match, which matches 2010-10-22 or 2010-10-21"}},"required":false,"schema":{"type":"string","format":"date"}},"AddressPostalcode":{"name":"address-postalcode","description":"The postcode of any of the patient’s known addresses.\n\nNot case sensitive.\nSpaces are ignored, for example `LS16AE` and `LS1 6AE` both match `LS1 6AE`.\nUse `*` as a wildcard but not in the first two characters and not in fuzzy search mode.\nMust be [URL encoded](https://en.wikipedia.org/wiki/Percent-encoding), for example a space must be represented by either `%20` or `+` and a wildcard must be encoded as `%2A`.\n","examples":{"simple":{"value":"LS1 6AE","summary":"Spaces ignored, would match LS16AE"},"wildcarded":{"value":"LS1*","summary":"Matches 'LS16AE', 'LS1 6AE' and 'LS1 6AB'"}},"in":"query","required":false,"schema":{"type":"string"}},"AddressPostcode":{"name":"address-postcode","description":"**N.B. that address-postcode will be deprecated in the future, address-postalcode should be used instead. \nIf both address-postcode and address-postalcode are provided, an INVALID_SEARCH_DATA error will be returned.**\nThe postcode of any of the patient’s known addresses.\n\nNot case sensitive.\nSpaces are ignored, for example `LS16AE` and `LS1 6AE` both match `LS1 6AE`.\nUse `*` as a wildcard but not in the first two characters and not in fuzzy search mode.\nMust be [URL encoded](https://en.wikipedia.org/wiki/Percent-encoding), for example a space must be represented by either `%20` or `+` and a wildcard must be encoded as `%2A`.\n","examples":{"simple":{"value":"LS1 6AE","summary":"Spaces ignored, would match LS16AE"},"wildcarded":{"value":"LS1*","summary":"Matches 'LS16AE', 'LS1 6AE' and 'LS1 6AB'"}},"in":"query","required":false,"schema":{"type":"string"}},"GeneralPractitioner":{"name":"general-practitioner","description":"The Organisation Data Service (ODS) code of the patient's registered GP practice.\n\nNot case sensitive.\nFor a fuzzy search, this is ignored for matching but included in the score calculation.\n","example":"Y12345","in":"query","required":false,"schema":{"type":"string"}},"ManagingOrganization":{"name":"managing-organization","description":"**This field is for internal-use only**.\n\nThe Organisation Data Service (ODS) code of the patient's current managing organization.\nNot case sensitive.\nFor a fuzzy search, this is ignored for matching but included in the score calculation.\n","example":"Y12345","in":"query","required":false,"schema":{"type":"string"}},"ETag":{"name":"etag","schema":{"type":"string","pattern":"^W/\"[0-9]+\"$","example":"W/\"2\""},"in":"header","description":"Record version identifier enclosed in quotes and preceded by 'W/'. For example, `W/\"2\"`.\n\nCorresponds to `meta.versionId` attribute in the patient resource body.\n\nWhen you retrieve a patient resource, you get a version number for the resource (in the `ETag` response header and in the `versionId` field in the response).\nYou must then pass the resource's version number in any update request (in the `If-Match` response header) made for the patient.\n"},"XCorrelationId":{"name":"x-correlation-id","schema":{"type":"string","example":"11C46F5F-CDEF-4865-94B2-0EE0EDCC26DA"},"in":"header","description":"The X-Correlation-ID from the request header, if supplied, mirrored back.\n"},"XRequestID":{"name":"x-request-id","schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","example":"60E0B220-8136-4CA5-AE46-1D97EF59D068"},"in":"header","description":"The X-Request-ID from the request header, if supplied, mirrored back.\n"},"RetryAfter":{"name":"retry-after","description":"Time to wait before retrying your request in seconds","in":"header","schema":{"type":"string","example":"5"}},"EmailAddress":{"name":"email","description":"Email address\n","example":"jane.smith@example.com","in":"query","required":false,"schema":{"type":"string"}},"PhoneNumber":{"name":"phone","description":"Phone number\n","example":"01632960587","in":"query","required":false,"schema":{"type":"string"}}},"schemas":{"Patient":{"type":"object","required":["id"],"additionalProperties":false,"properties":{"resourceType":{"type":"string","description":"FHIR resource type.","default":"Patient"},"id":{"description":"The patient's NHS number. The primary identifier of a patient, unique within NHS England and Wales. Always 10 digits and must be a [valid NHS number](https://www.datadictionary.nhs.uk/attributes/nhs_number.html).","type":"string","pattern":"^\\d{10}$","example":"9000000009"},"identifier":{"type":"array","description":"Identifier and system of identification used for this Patient.","items":{"type":"object","maxItems":1,"required":["value"],"properties":{"system":{"type":"string","format":"url","description":"System identifier belongs to.","default":"https://fhir.nhs.uk/Id/nhs-number"},"value":{"description":"The patient's NHS number. The primary identifier of a patient, unique within NHS England and Wales. Always 10 digits and must be a [valid NHS number](https://www.datadictionary.nhs.uk/attributes/nhs_number.html).","type":"string","pattern":"^\\d{10}$","example":"9000000009"},"extension":{"type":"array","description":"FHIR extensions.","items":{"type":"object","description":"Status indicating if NHS number is present and verified.","properties":{"url":{"type":"string","description":"URL of the extension definition.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSNumberVerificationStatus","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSNumberVerificationStatus"]},"valueCodeableConcept":{"type":"object","description":"NHS Number Verification Status Indicator.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URI of the coding system specification.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-NHSNumberVerificationStatus"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1.0.0"},"code":{"type":"string","description":"Symbol in syntax defined by the system.","example":"01"},"display":{"type":"string","description":"Representation defined by the system.","example":"Number present and verified"}}}}}}}}}}}},"meta":{"type":"object","description":"Metadata about this resource.","properties":{"versionId":{"type":"string","description":"The NHS Digital assigned version of the patient resource.","example":"2"},"security":{"type":"array","description":"The level of security on the patients record, which affects which fields are populated on retrieval. The possible responses are:\n* U - unrestricted. All available data is returned.\n* R - restricted. Any sensitive data around the patient's location, so `address`, `generalPractitioner` and `telecom`, are removed from the response.\n* REDACTED - redacted. The patient record has been marked as invalid, so the data should not be used. This code is never returned; you receive a 404, and appropriate error response, if an invalidated patient retrieval is attempted.\n","maxItems":1,"items":{"type":"object","properties":{"system":{"type":"string","description":"URI of the value set specification.","example":"http://terminology.hl7.org/CodeSystem/v3-Confidentiality"},"code":{"type":"string","description":"Code defined by the system value set.","enum":["U","R","V","REDACTED"],"example":"U"},"display":{"type":"string","description":"Representation defined by the system.","enum":["unrestricted","restricted","redacted"],"example":"unrestricted"}}}}}},"name":{"type":"array","description":"List of names associated with the patient. \n","minItems":1,"items":{"type":"object","required":["use","family"],"additionalProperties":false,"properties":{"id":{"type":"string","description":"Unique object identifier for this name.","example":"123"},"use":{"type":"string","description":"How this name should be used.\n* usual - Known as, conventional or the one patient normally uses. A patient always has a usual name.\n* temp - An alias or temporary name. This may also be used for temporary names assigned at birth or in emergency situations.\n* nickname - A name that the patient prefers to be addressed by, but is not part of their usual name.\n* old - This name is no longer in use (or was never correct, but retained for records).\n* maiden - Name changed for Marriage. A name used prior to changing name because of marriage. This term is not gender specific. The use of this term does not imply any particular history for a person's name.\n\nThe following use codes are included in the [name-use](https://www.hl7.org/fhir/valueset-name-use.html) value set, but should not be used and is not be returned as part of a retrieval.\n* official - The formal name as registered in an official (government) registry, but which name might not be commonly used. May be called \"legal name\".\n* anonymous - Anonymous assigned name, alias, or pseudonym (used to protect a person's identity for privacy reasons).\n","enum":["usual","temp","nickname","old","maiden"],"example":"usual"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"given":{"type":"array","maxItems":5,"description":"Given names, including any middle names.\n\nEach name(s) should be a separate item in the list. The first given name may include multiple names, separated by a space.\nSubsequent names must be broken down into list items. For example, the input `[Jane Marie Anne, Jo Adele]` returns `[Jane Marie Anne, Jo, Adele]`.\n","example":["Jane Marie Anne","Jo","Adele"],"items":{"type":"string","maxLength":35,"example":"Jane"}},"family":{"type":"string","maxLength":35,"description":"Family name (often called Surname).","example":"Smith"},"prefix":{"type":"array","description":"Name prefixes, titles, and prenominals.","example":["Mrs"],"items":{"type":"string","example":"Mrs"}},"suffix":{"type":"array","description":"Name suffices and postnominals.","example":["MBE","PhD"],"items":{"type":"string","example":"MBE"}}}}},"gender":{"type":"string","description":"Classification of the gender of a patient. The classification is phenotypical rather than genotypical, i.e. it does not provide codes for medical or scientific purposes.\nIt is the administrative gender that the patient wishes to be known as. In some cases, this may not be the same as the patient’s registered birth gender, or their current clinical gender.\n","enum":["male","female","other","unknown"],"example":"female"},"birthDate":{"description":"The date on which the patient was born or is officially deemed to have been born.\n\nIt is a date in the format `yyyy-mm-dd`. Due to data quality issues on a small number of patients `yyyy-mm` and `yyyy` format may also be returned. \n","example":"2010-10-22","type":"string","format":"date"},"multipleBirthInteger":{"type":"integer","minimum":1,"maximum":9,"description":"The order in which the patient was born, with 1 indicating the first or only birth in the sequence, 2 indicating the second birth in the sequence, 3 indicating the third, and so on up to 7.\n\nThere are two other valid values; `8` meaning `Not applicable` and `9` meaning `Not known`.\n","example":1},"deceasedDateTime":{"description":"The date and time on which a person died or is officially deemed to have died, if applicable and known.\n\nIt is a datetime in the format `yyyy-mm-ddTHH:MM:SS+HH:MM` or `yyyy-mm-dd`. Due to data quality issues on a small number of patients `yyyy-mm` and `yyyy` format may also be returned.\n","example":"2010-10-22T00:00:00+00:00","type":"string","format":"date-time","pattern":"^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2}\\+\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2}\\+\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01]))$"},"address":{"type":"array","description":"List of addresses associated with the patient.\n\nThese are fully populated on a retrieval or a successful update, only the `home` address is returned on a search.\nWhen a patient tagged as `restricted` is retrieved, all addresses are removed from the response.\n","items":{"type":"object","description":"An address associated with the patient.","required":["use"],"properties":{"id":{"type":"string","description":"Unique system identifier for this address.","example":"456"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"use":{"type":"string","description":"Purpose of this address:\n * `home` - the home address is the patient's normal residence. Home address is also known as usual, main, registered, current or permanent address\n * `temp` - a temporary address is an address used for a set period of time, but where the patient's home, permanent address remains unchanged\n * `billing` - an address used for correspondence purposes only\n * `work` - an office address. This can be returned due to legacy data but cannot be added or replaced on update\n\n A patient should have no more than one current `temp` and/or `billing` address.\n However, historically this was constrained only by the integration requirements and was not enforced so theoretically more than one can exist for a patient when retrieving.\n Where multiple instances already exist for the patient it is not expected that local systems should manage those, but should choose the most appropriate one to maintain (e.g. by examining period dates).\n\n A `home` address is the patient's main residential address and should normally be used for all clinical and demographic purposes, including clinical and appointment correspondence.\n However additionally, `temp` and `billing` addresses may be provided by a patient when there is a requirement to record an alternative location for the purposes of unbroken care.\n When sending correspondence to a patient:\n *\ta present and valid `billing` address may take precedence over `home` and `temp` addresses. A patient should have only a single current `billing` address. An address is considered 'valid' according to its period start and end dates.\n *\tif no current `billing` address is provided, a `temp` address may take precedence over the `home` address, again if it is valid according to its period start and end dates.\n * if there is no valid, current `billing` and/or `temp` address, the `home` address must be used.\n","enum":["home","work","temp","billing"],"example":"home"},"text":{"type":"string","description":"Where a `temp` address is provided a descriptor text must be sent.\nThe list of possible values are:\n* `Second Home` - a patient's second home\n* `Student Accommodation` - a patient's place of residence while at university\n* `Respite Care Address` - where the patient resides during respite care\n* `Temporary Residence Address` - where the patient resides for a specific period of time\n* `Convalescence Home` - the address for a patient during a period of recovery\n* `Mobile Home` - the address of a patient's mobile home, parked for a specific period of time, e.g. the address of a caravan park\n* `Holiday Home` - the address for a patient during a holiday\n\nA patient can also register temporarily at a GP practice using a temporary address. Temporary GP registration information does not appear on the PDS, but the address used for it may.\n","enum":["Second Home","Student Accommodation","Respite Care Address","Temporary Residence Address","Convalescence Home","Mobile Home","Holiday Home"],"example":"Student Accommodation"},"line":{"type":"array","description":"All lines of the address except the postal code.\n\nSystems must apply the following formatting convention when adding or replacing addresses lines:\n*\tline 1 - premises ID and/or house name, e.g. `Flat 1` or `The Old Schoolhouse`\n*\tline 2 - house number, dependent thoroughfare name and descriptor (if present), thoroughfare name and descriptor, e.g. `23 Mill Lane`\n*\tline 3 - dependent locality/village, locality (if present), e.g. `Boxgrove`\n*\tline 4 - post town, e.g. `Leeds`\n*\tline 5 - county (if present), e.g. `West Yorkshire`\n\nIf any of the lines are blank, they are not returned due to FHIR conformance constraints.\n","maxItems":5,"items":{"type":"string"},"example":["1 Trevelyan Square","Boar Lane","City Centre","Leeds","West Yorkshire"]},"postalCode":{"type":"string","description":"Postal code of the address.","example":"LS1 6AE"},"extension":{"type":"array","description":"List of address keys formatted as a FHIR extension. This can include up to one Unique Property Reference Number (UPRN), and up to one Postal Address File (PAF) key. If no keys for the address are known, the array will be empty. Otherwise it will be a list of objects which specify the value of the address key and the code system for it","items":{"anyOf":[{"type":"object","description":"Unique identifier for an address.","properties":{"url":{"type":"string","description":"URL of specification of the AddressKey extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey"]},"extension":{"type":"array","description":"Specification of address key system and address key value. Contains exactly two items: one describing the code system the Address Key uses, and the other specifying the value of the Address Key.","minItems":2,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Coding system of the address key.","required":["url","valueCoding"],"properties":{"url":{"type":"string","description":"Always 'type'.","default":"type"},"valueCoding":{"type":"object","description":"URL of specification of address key format.","required":["system","code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available Address Key formats.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType"},"code":{"type":"string","description":"Address Key system. Always 'PAF'.","enum":["PAF"],"example":"PAF"}}}}},{"type":"object","description":"Value of the address key.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Always 'value'.","default":"value","example":"value"},"valueString":{"type":"string","description":"Address key in PAF format. An 8 digit number including leading zeroes, formatted as a string.","minLength":8,"maxLength":8,"pattern":"^[0-9]{8}$","example":"12345678"}}}]}}}},{"type":"object","description":"Unique identifier for an address.","properties":{"url":{"type":"string","description":"URL of specification of the AddressKey extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey"]},"extension":{"type":"array","description":"Specification of address key system and address key value. Contains exactly two items: one describing the code system the Address Key uses, and the other specifying the value of the Address Key.","minItems":2,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Coding system of the address key.","required":["url","valueCoding"],"properties":{"url":{"type":"string","description":"Always 'type'.","default":"type"},"valueCoding":{"type":"object","description":"URL of specification of address key format.","required":["system","code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available Address Key formats.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType"},"code":{"type":"string","description":"Address Key system. Always 'UPRN'.","enum":["UPRN"],"example":"UPRN"}}}}},{"type":"object","description":"Value of the address key.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Always 'value'.","default":"value","example":"value"},"valueString":{"type":"string","description":"Address key in UPRN format. A number containing from 1 up to 12 digits.","minLength":1,"maxLength":12,"pattern":"^[0-9]{1,12}$","example":"123456789012"}}}]}}}}]}}}}},"telecom":{"type":"array","description":"List of contact points for the patient; for example, phone numbers or email addresses.\nWhen a patient tagged as `restricted` is retrieved, all contact points are removed from the response.\n","items":{"description":"A contact point, such as a phone number or email address","type":"object","required":["system","value"],"properties":{"id":{"type":"string","description":"Unique object identifier for this contact point.","example":"789"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"system":{"description":"Means of communication, such as phone or email.","type":"string","enum":["phone","fax","email","other"],"example":"phone"},"value":{"description":"Phone number, email address, or other identifier for use with contact system.","type":"string","example":"01632960587"},"use":{"type":"string","description":"Location associated with communication system.","enum":["home","work","temp","mobile"],"example":"home"},"extension":{"type":"array","maxItems":1,"description":"Extension that is returned when the communication type is `textphone`. The only code returned is `textphone`, which means `Minicom (Textphone)`.\n\nThe `system` is `other` when the extension is included.\n","items":{"type":"object","description":"Wrapped object for other contact system details.","properties":{"url":{"type":"string","description":"Definition of other contact system extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem"]},"valueCoding":{"type":"object","description":"URL of specification of other contact systems.","properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem"},"code":{"type":"string","description":"Coded value for the other contact system in place.","example":"textphone"},"display":{"description":"Display-friendly representation of the other contact system code.","type":"string","example":"Minicom (Textphone)"}}}}}}}}},"contact":{"type":"array","description":"A list of patient contacts. Only emergency contacts are returned and only emergency contacts should be added. Any other contacts should be added to the patients `Related Person`.\nPatients designate here any contact number they desire to be used in case of an emergency.\nNote, while a patient may also desire to record various related persons telecom details, these do not separately allow for a concept of emergency contact; only ranking. See RelatedPerson endpoint.\nWhen a patient tagged as `restricted` is retrieved, all contacts are removed from the response.\n","items":{"title":"Schema for a patient contact.","type":"object","additionalProperties":false,"required":["relationship","telecom"],"properties":{"id":{"type":"string","example":"C123"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"relationship":{"type":"array","description":"The contact relationship wrapper object that holds the details of the relationship to the patient.\n\nThis is only returned when an Emergency Contact number has been set on `telecom`. The only valid code is `C`, which means `Emergency Contact`.\n","minItems":1,"maxItems":1,"items":{"type":"object","required":["coding"],"properties":{"coding":{"type":"array","description":"Exactly one contact relationship.","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","format":"url","default":"http://terminology.hl7.org/CodeSystem/v2-0131"},"code":{"type":"string","description":"Coded value for contact relationship.","example":"C"},"display":{"type":"string","description":"Display-friendly representation of the contact relationship code.","example":"Emergency Contact"}}}}}}},"telecom":{"type":"array","description":"List of Telecom objects on the contact only contains `system` and `value`.\n","items":{"description":"A contact point, such as a phone number or email address","type":"object","required":["system","value"],"properties":{"id":{"type":"string","description":"Unique object identifier for this contact point.","example":"789"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"system":{"description":"Means of communication, such as phone or email.","type":"string","enum":["phone","fax","email","other"],"example":"phone"},"value":{"description":"Phone number, email address, or other identifier for use with contact system.","type":"string","example":"01632960587"},"use":{"type":"string","description":"Location associated with communication system.","enum":["home","work","temp","mobile"],"example":"home"},"extension":{"type":"array","maxItems":1,"description":"Extension that is returned when the communication type is `textphone`. The only code returned is `textphone`, which means `Minicom (Textphone)`.\n\nThe `system` is `other` when the extension is included.\n","items":{"type":"object","description":"Wrapped object for other contact system details.","properties":{"url":{"type":"string","description":"Definition of other contact system extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem"]},"valueCoding":{"type":"object","description":"URL of specification of other contact systems.","properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem"},"code":{"type":"string","description":"Coded value for the other contact system in place.","example":"textphone"},"display":{"description":"Display-friendly representation of the other contact system code.","type":"string","example":"Minicom (Textphone)"}}}}}}}}}}}},"generalPractitioner":{"type":"array","maxItems":1,"description":"General Practice (not practitioner) with which the patient is, or was, registered. Always contains zero or one general practitioner object.\nWhen a patient tagged as `restricted` is retrieved, the General Practice is removed from the response.\n","items":{"description":"General practice (not practitioner) with which the patient is or was registered.","type":"object","required":["identifier"],"properties":{"id":{"description":"Object identifier (OID) specific to the returned details - this should be return exactly the same in any update.","type":"string","example":"254406A3"},"type":{"description":"Type of Reference being returned.","type":"string","example":"Organization"},"identifier":{"description":"Identifier and system of identification used for this Organisation.","type":"object","required":["value"],"properties":{"system":{"description":"URL for the Organisation Data Service - who are responsible for publishing codes that identify organisations and individuals across health and social care.","type":"string","example":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"description":"Organisation code for the registered general practice, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","type":"string","pattern":"^[0-9A-Z]+$","example":"Y12345"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}}}}}}},"managingOrganization":{"description":"The managing organization of a de-registered patient. This will not be returned when the reason for de-registration is death.","type":"object","required":["identifier"],"properties":{"type":{"description":"Type of Reference being returned.","type":"string","example":"Organization"},"identifier":{"description":"Identifier and system of identification used for this Organisation.","type":"object","required":["value"],"properties":{"system":{"description":"URL for the Organisation Data Service - who are responsible for publishing codes that identify organisations and individuals across health and social care.","type":"string","example":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"description":"Organisation code for the registered general practice, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","type":"string","pattern":"^[0-9A-Z]+$","example":"Y12345"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}}}}}},"extension":{"type":"array","description":"Wrapper array for the patient's pharmacies, death notification status, communication details, contact preferences and place of birth; these are all FHIR extensions.\nAlways contains zero or one of each pharmacy object, zero or one death notification status object, zero or one communication details object, zero or one contact preference and zero or one place of birth object.\nWhen a patient tagged as `restricted` is retrieved, the pharmacy and birth place extensions are removed from the response.\n","items":{"anyOf":[{"type":"object","description":"Wrapper object for the patient's nominated pharmacy. This will only be populated on a retrieval and not a search.","required":["url","valueReference"],"properties":{"url":{"type":"string","description":"URL of specification of UKCore-NominatedPharmacy FHIR extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NominatedPharmacy","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NominatedPharmacy"]},"valueReference":{"type":"object","description":"Reference to a pharmacy `Organization` resource.","required":["identifier"],"properties":{"identifier":{"type":"object","description":"Wrapper object for the patient's nominated pharmacy organisation code.","required":["value"],"properties":{"system":{"type":"string","description":"URL for the FHIR code system for the ODS organisation code.","default":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"type":"string","description":"Organisation code for the nominated pharmacy, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","pattern":"^[A-Za-z0-9]{3,10}$","example":"Y12345"}}}}}}},{"type":"object","description":"Wrapper object for the patient's dispensing doctor. This will only be populated on a retrieval and not a search.","required":["url","valueReference"],"properties":{"url":{"type":"string","description":"URL of specification of UKCore-DispensingDoctor FHIR extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-PreferredDispenserOrganization","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-PreferredDispenserOrganization"]},"valueReference":{"type":"object","description":"Reference to a GP practice pharmacy `Organization` resource.","required":["identifier"],"properties":{"identifier":{"type":"object","description":"Wrapper object for the patient's dispensing doctor organisation code.","required":["value"],"properties":{"system":{"type":"string","description":"URL for the FHIR code system for the ODS organisation code.","default":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"type":"string","description":"Organisation code for the dispensing doctor, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","pattern":"^[A-Za-z0-9]{3,10}$","example":"Y23456"}}}}}}},{"type":"object","description":"Wrapper object for the patient's medical appliance supplier. This will only be populated on a retrieval and not a search.","required":["url","valueReference"],"properties":{"url":{"type":"string","description":"URL of specification of UKCore-MedicalApplianceSupplier FHIR extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-MedicalApplianceSupplier","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-MedicalApplianceSupplier"]},"valueReference":{"type":"object","description":"Reference to medical appliance supplier pharmacy `Organization` resource.","required":["identifier"],"properties":{"identifier":{"type":"object","description":"Wrapper object for the patient's medical appliance supplier organisation code.","required":["value"],"properties":{"system":{"type":"string","description":"URL for the FHIR code system for the ODS organisation code.","default":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"type":"string","description":"Organisation code for the medical appliance supplier, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","pattern":"^[A-Za-z0-9]{3,10}$","example":"Y34567"}}}}}}},{"type":"object","description":"Wrapper object for death notification details.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of death notification extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus"]},"extension":{"type":"array","description":"Array containing exactly one death notification status code object and exactly one effective date object.","minItems":1,"maxItems":2,"items":{"oneOf":[{"type":"object","description":"Wrapper object for death notification status code.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `deathNotificationStatus`.","default":"deathNotificationStatus","enum":["deathNotificationStatus"]},"valueCodeableConcept":{"type":"object","description":"Death Notification Status.","properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["system","code"],"properties":{"system":{"type":"string","description":"URI of the coding system specification.","example":"https://fhir.hl7.org.uk/CodeSystem/UKCore-DeathNotificationStatus"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1.0.0"},"code":{"type":"string","description":"Symbol, in syntax, defined by the system:\n* `1` - Informal - death notice received via an update from a local NHS Organisation such as GP or Trust\n* `2` - Formal - death notice received from Registrar of Deaths. Only these endpoints are allowed to add a Formal death:\n - National Back Office using the Demographic Spine Application (DSA)\n - Office of National Statistics (ONS)\n - Maternity sites\n* `U` - Removed. This is a possible response, but it cannot be used on an update because Spine will reject it\n","example":"2","enum":["1","2","U"]},"display":{"type":"string","description":"Representation defined by the system.","example":"Formal - death notice received from Registrar of Deaths","enum":["Informal - death notice received via an update from a local NHS Organisation such as GP or Trust","Formal - death notice received from Registrar of Deaths","Removed"]}}}}}}}},{"type":"object","description":"Wrapper object for death notification effective date.","required":["url","valueDateTime"],"properties":{"url":{"type":"string","description":"Key of this object. Always `systemEffectiveDate`.","default":"systemEffectiveDate","enum":["systemEffectiveDate"]},"valueDateTime":{"type":"string","description":"Date and time at which death notification status took effect.","format":"date-time","example":"2010-10-22T00:00:00+00:00"}}}]}}}},{"type":"object","description":"Wrapper object for communication details. This will only be populated on a retrieval and not a search.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of communication extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSCommunication","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSCommunication"]},"extension":{"type":"array","description":"Definition of communication extension.\n\nThe array must have one item, a valueCodeableConcept for the language and can optionally include a valueBoolean for if an interpreter is required.","minItems":1,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Wrapper object for communication language.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `language`.","default":"language","enum":["language"]},"valueCodeableConcept":{"type":"object","description":"Human language.","required":["coding"],"properties":{"coding":{"type":"array","description":"Exactly one language code.","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URL of the Language Code System. Always uses the 'UKCore-HumanLanguage' Code System.","example":"https://fhir.hl7.org.uk/CodeSystem/UKCore-HumanLanguage"},"version":{"type":"string","description":"Version of the language code system.","example":"1.0.0"},"code":{"type":"string","description":"Language code based on [ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) standard plus extensions for braille, makaton and sign languages, which are:\n* `q1` - Braille\n* `q2` - American Sign Language\n* `q3` - Australian Sign Language\n* `q4` - British Sign Language\n* `q5` - Makaton\nAll valid codes combined can be found at https://fhir.hl7.org.uk/CodeSystem/UKCore-HumanLanguage.\n","example":"fr"},"display":{"type":"string","description":"Display-friendly representation of the language code (such as English). If there is a language code with no defined mapping, `Unknown` will be returned.","example":"French"}}}}}}}},{"type":"object","description":"Wrapper object for whether an interpreter is required.","required":["url","valueBoolean"],"properties":{"url":{"type":"string","description":"Key of this object. Always `interpreterRequired`.","default":"interpreterRequired","enum":["interpreterRequired"]},"valueBoolean":{"type":"boolean","description":"Whether an interpreter is required.","example":true}}}]}}}},{"type":"object","description":"Wrapper object for preferred contact details; the written communication format, preferred contact time and method. This will only be populated on a retrieval and not a search.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of the contact preference extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-ContactPreference","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-ContactPreference"]},"extension":{"description":"Wrapper array containing zero or one preferred contact method, zero or one preferred written communication format; and zero or one preferred contact time.","type":"array","maxItems":3,"items":{"oneOf":[{"type":"object","description":"Wrapper object for preferred written communication format.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredWrittenCommunicationFormat`.","default":"PreferredWrittenCommunicationFormat"},"valueCodeableConcept":{"type":"object","description":"Preferred Written Communication Format.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","format":"url","description":"Definition of the preferred written communication extension.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredWrittenCommunicationFormat","enum":["https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredWrittenCommunicationFormat"]},"code":{"type":"string","description":"A code to identify the preferred written communication format of a patient, contact or related person.\n* 11 - Large print\n* 12 - Braille\n* 13 - Audio tape\n","example":"12"},"display":{"type":"string","description":"Display-friendly representation of the preferred written communication format code.","example":"Braille"}}}}}}}},{"type":"object","description":"Wrapper object for preferred contact method.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredContactMethod`.","default":"PreferredContactMethod","enum":["PreferredContactMethod"]},"valueCodeableConcept":{"type":"object","description":"Preferred Contact Method.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","format":"url","description":"Definition of the preferred contact method extension.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredContactMethod","enum":["https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredContactMethod"]},"code":{"type":"string","description":"A code to identify to identify the preferred contact method of a patient, contact or related person.\n* 1\t- Letter\n* 2\t- Visit\n* 3\t- Telephone\n* 4\t- E-mail\n* 5\t- Minicom (Textphone)\n* 6\t- Telephone contact via proxy\n* 7\t- Sign language\n* 8\t- No Telephone contact\n","example":"1"},"display":{"type":"string","description":"Display-friendly representation of the preferred contact method code.","example":"Letter"}}}}}}}},{"type":"object","description":"Wrapper object for preferred contact times.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredContactTimes`.","default":"PreferredContactTimes","enum":["PreferredContactTimes"]},"valueString":{"type":"string","maximum":40,"description":"A free-text description about the preferred contact times.","example":"Not after 7pm"}}}]}}}},{"type":"object","description":"Wrapper object for place of birth details. This will not be returned on a restricted patient.","required":["url","valueAddress"],"properties":{"url":{"type":"string","description":"Definition of place of birth extension.","default":"http://hl7.org/fhir/StructureDefinition/patient-birthPlace","enum":["http://hl7.org/fhir/StructureDefinition/patient-birthPlace"]},"valueAddress":{"type":"object","additionalProperties":false,"properties":{"city":{"type":"string","description":"Town or city of birth.","example":"Manchester"},"district":{"type":"string","description":"County or metropolitan district of birth.","example":"Greater Manchester"},"country":{"type":"string","description":"A coded value for a patient's country of birth.\n\nFrom [ISO 3166-1](http://hl7.org/fhir/valueset-iso3166-1-3.html) plus codes from the UK Internal Code list which do not have entries in ISO 3166-1.\n\nUK Internal Codes:\n* `1` - England\n* `2` - Scotland\n* `3` - Wales\n* `4` - Northern Ireland\n* `7` - Sark\n* `9` - Alderney\n* `10` - Channel Islands\n","example":"GBR"}}}}},{"type":"object","description":"An extension to carry the reason a PDS record has been removed from the Patient Demographic Service. This will only be populated on a retrieval and not a search.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of the removal from registration extension.","default":"https://fhir.nhs.uk/StructureDefinition/Extension-PDS-RemovalFromRegistration","enum":["https://fhir.nhs.uk/StructureDefinition/Extension-PDS-RemovalFromRegistration"],"readOnly":true},"extension":{"type":"array","description":"An extension reason a PDS record has been removed from the Patient Demographic Service.","minItems":1,"maxItems":2,"items":{"oneOf":[{"type":"object","description":"Wrapper object for removalFromRegistrationCode.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"To identify the removal reason code.","default":"removalFromRegistrationCode","enum":["removalFromRegistrationCode"],"readOnly":true},"valueCodeableConcept":{"type":"object","description":"PDS Removal Reason Exit Code","required":["coding"],"properties":{"coding":{"type":"array","description":"Array containing exactly one removal reason exit code object","items":{"type":"object","required":["system","code","display"],"properties":{"system":{"type":"string","format":"url","description":"URL of the Removal Reason Exit Code. Always uses the 'PDS-RemovalReasonExitCode' Code System.","example":"https://fhir.nhs.uk/CodeSystem/PDS-RemovalReasonExitCode","readOnly":true},"code":{"type":"string","description":"A CodeSystem that identifies the reason a PDS record has been removed.","example":"SCT","enum":["DEA","EMB","SCT","NIT","TRA","ORR"]},"display":{"type":"string","description":"Display-friendly representation of the removal reason exit code.","example":"Transferred to Scotland"}}}}}}}},{"type":"object","description":"Wrapper object for removal from registration effective time.","required":["url","valuePeriod"],"properties":{"url":{"type":"string","description":"Key of this object. Always `effectiveTime`.","default":"effectiveTime","enum":["effectiveTime"],"readOnly":true},"valuePeriod":{"type":"object","description":"The effective time of removal of the Patient record from PDS.","required":["start"],"properties":{"start":{"type":"string","format":"date-time","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01T00:00:00+00:00"},"end":{"type":"string","format":"date-time","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31T00:00:00+00:00"}}}}}]}}}}]}}}},"PatientSearch":{"type":"object","properties":{"resourceType":{"type":"string","description":"FHIR Resource Type.","default":"Bundle"},"type":{"type":"string","description":"FHIR Bundle Type.","default":"searchset"},"timestamp":{"type":"string","description":"Time the search was performed.","format":"datetime","example":"2019-12-25T12:00:00+00:00"},"total":{"type":"integer","description":"Number of resources returned in search.","example":1},"entry":{"type":"array","description":"A list of matched patients. Empty if none found. The patients are ordered by match score, best first. A maximum of 50 patients are returned.\n","items":{"type":"object","properties":{"fullUrl":{"type":"string","description":"Absolute URL of the resource described in this item.","example":"https://api.service.nhs.uk/personal-demographics/FHIR/R4/Patient/9000000009"},"search":{"type":"object","properties":{"score":{"description":"Search score from 0.0 to 1.0.","type":"number","minimum":0,"maximum":1,"example":0.75}}},"resource":{"type":"object","additionalProperties":false,"properties":{"resourceType":{"type":"string","description":"FHIR resource type.","default":"Patient"},"id":{"description":"The patient's NHS number. The primary identifier of a patient, unique within NHS England and Wales. Always 10 digits and must be a [valid NHS number](https://www.datadictionary.nhs.uk/attributes/nhs_number.html).","type":"string","pattern":"^\\d{10}$","example":"9000000009"},"identifier":{"type":"array","description":"Identifier and system of identification used for this Patient.","items":{"type":"object","maxItems":1,"required":["value"],"properties":{"system":{"type":"string","format":"url","description":"System identifier belongs to.","default":"https://fhir.nhs.uk/Id/nhs-number"},"value":{"description":"The patient's NHS number. The primary identifier of a patient, unique within NHS England and Wales. Always 10 digits and must be a [valid NHS number](https://www.datadictionary.nhs.uk/attributes/nhs_number.html).","type":"string","pattern":"^\\d{10}$","example":"9000000009"},"extension":{"type":"array","description":"FHIR extensions.","items":{"type":"object","description":"Status indicating if NHS number is present and verified.","properties":{"url":{"type":"string","description":"URL of the extension definition.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSNumberVerificationStatus","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSNumberVerificationStatus"]},"valueCodeableConcept":{"type":"object","description":"NHS Number Verification Status Indicator.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URI of the coding system specification.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-NHSNumberVerificationStatus"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1.0.0"},"code":{"type":"string","description":"Symbol in syntax defined by the system.","example":"01"},"display":{"type":"string","description":"Representation defined by the system.","example":"Number present and verified"}}}}}}}}}}}},"meta":{"type":"object","description":"Metadata about this resource.","properties":{"versionId":{"type":"string","description":"The NHS Digital assigned version of the patient resource.","example":"2"},"security":{"type":"array","description":"The level of security on the patients record, which affects which fields are populated on retrieval. The possible responses are:\n* U - unrestricted. All available data is returned.\n* R - restricted. Any sensitive data around the patient's location, so `address`, `generalPractitioner` and `telecom`, are removed from the response.\n* REDACTED - redacted. The patient record has been marked as invalid, so the data should not be used. This code is never returned; you receive a 404, and appropriate error response, if an invalidated patient retrieval is attempted.\n","maxItems":1,"items":{"type":"object","properties":{"system":{"type":"string","description":"URI of the value set specification.","example":"http://terminology.hl7.org/CodeSystem/v3-Confidentiality"},"code":{"type":"string","description":"Code defined by the system value set.","enum":["U","R","V","REDACTED"],"example":"U"},"display":{"type":"string","description":"Representation defined by the system.","enum":["unrestricted","restricted","redacted"],"example":"unrestricted"}}}}}},"name":{"type":"array","description":"List of names associated with the patient.\nThis is only fully populated on a retrieval or a successful update, only the `usual`, `nickname` and `temp` names are returned on a search. \n","minItems":1,"items":{"type":"object","required":["use","family"],"additionalProperties":false,"properties":{"id":{"type":"string","description":"Unique object identifier for this name.","example":"123"},"use":{"type":"string","description":"How this name should be used.\n* usual - Known as, conventional or the one patient normally uses. A patient always has a usual name.\n* temp - An alias or temporary name. This may also be used for temporary names assigned at birth or in emergency situations.\n* nickname - A name that the patient prefers to be addressed by, but is not part of their usual name.\n* old - This name is no longer in use (or was never correct, but retained for records).\n* maiden - Name changed for Marriage. A name used prior to changing name because of marriage. This term is not gender specific. The use of this term does not imply any particular history for a person's name.\n\nThe following use codes are included in the [name-use](https://www.hl7.org/fhir/valueset-name-use.html) value set, but should not be used and is not be returned as part of a retrieval.\n* official - The formal name as registered in an official (government) registry, but which name might not be commonly used. May be called \"legal name\".\n* anonymous - Anonymous assigned name, alias, or pseudonym (used to protect a person's identity for privacy reasons).\n","enum":["usual","temp","nickname","old","maiden"],"example":"usual"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"given":{"type":"array","maxItems":5,"description":"Given names, including any middle names.\n\nEach name(s) should be a separate item in the list. The first given name may include multiple names, separated by a space.\nSubsequent names must be broken down into list items. For example, the input `[Jane Marie Anne, Jo Adele]` returns `[Jane Marie Anne, Jo, Adele]`.\n","example":["Jane Marie Anne","Jo","Adele"],"items":{"type":"string","maxLength":35,"example":"Jane"}},"family":{"type":"string","maxLength":35,"description":"Family name (often called Surname).","example":"Smith"},"prefix":{"type":"array","description":"Name prefixes, titles, and prenominals.","example":["Mrs"],"items":{"type":"string","example":"Mrs"}},"suffix":{"type":"array","description":"Name suffices and postnominals.","example":["MBE","PhD"],"items":{"type":"string","example":"MBE"}}}}},"gender":{"type":"string","description":"Classification of the gender of a patient. The classification is phenotypical rather than genotypical, i.e. it does not provide codes for medical or scientific purposes.\nIt is the administrative gender that the patient wishes to be known as. In some cases, this may not be the same as the patient’s registered birth gender, or their current clinical gender.\n","enum":["male","female","other","unknown"],"example":"female"},"birthDate":{"description":"The date on which the patient was born or is officially deemed to have been born.\n\nIt is a date in the format `yyyy-mm-dd`. Due to data quality issues on a small number of patients `yyyy-mm` and `yyyy` format may also be returned. \n","example":"2010-10-22","type":"string","format":"date"},"multipleBirthInteger":{"type":"integer","minimum":1,"maximum":9,"description":"The order in which the patient was born, with 1 indicating the first or only birth in the sequence, 2 indicating the second birth in the sequence, 3 indicating the third, and so on up to 7.\n\nThere are two other valid values; `8` meaning `Not applicable` and `9` meaning `Not known`.\n","example":1},"deceasedDateTime":{"description":"The date and time on which a person died or is officially deemed to have died, if applicable and known.\n\nIt is a datetime in the format `yyyy-mm-ddTHH:MM:SS+HH:MM` or `yyyy-mm-dd`. Due to data quality issues on a small number of patients `yyyy-mm` and `yyyy` format may also be returned.\n","example":"2010-10-22T00:00:00+00:00","type":"string","format":"date-time","pattern":"^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2}\\+\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2}\\+\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01]))$"},"address":{"type":"array","description":"List of addresses associated with the patient.\n\nThis is only fully populated on a retrieval or a successful update, only the `home` address is returned on a search.\nWhen a patient tagged as `restricted` is retrieved, all addresses are removed from the response.\n","items":{"type":"object","description":"An address associated with the patient.","required":["use"],"properties":{"id":{"type":"string","description":"Unique system identifier for this address.","example":"456"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"use":{"type":"string","description":"Purpose of this address:\n * `home` - the home address is the patient's normal residence. Home address is also known as usual, main, registered, current or permanent address\n * `temp` - a temporary address is an address used for a set period of time, but where the patient's home, permanent address remains unchanged\n * `billing` - an address used for correspondence purposes only\n * `work` - an office address. This can be returned due to legacy data but cannot be added or replaced on update\n\n A patient should have no more than one current `temp` and/or `billing` address.\n However, historically this was constrained only by the integration requirements and was not enforced so theoretically more than one can exist for a patient when retrieving.\n Where multiple instances already exist for the patient it is not expected that local systems should manage those, but should choose the most appropriate one to maintain (e.g. by examining period dates).\n\n A `home` address is the patient's main residential address and should normally be used for all clinical and demographic purposes, including clinical and appointment correspondence.\n However additionally, `temp` and `billing` addresses may be provided by a patient when there is a requirement to record an alternative location for the purposes of unbroken care.\n When sending correspondence to a patient:\n *\ta present and valid `billing` address may take precedence over `home` and `temp` addresses. A patient should have only a single current `billing` address. An address is considered 'valid' according to its period start and end dates.\n *\tif no current `billing` address is provided, a `temp` address may take precedence over the `home` address, again if it is valid according to its period start and end dates.\n * if there is no valid, current `billing` and/or `temp` address, the `home` address must be used.\n","enum":["home","work","temp","billing"],"example":"home"},"text":{"type":"string","description":"Where a `temp` address is provided a descriptor text must be sent.\nThe list of possible values are:\n* `Second Home` - a patient's second home\n* `Student Accommodation` - a patient's place of residence while at university\n* `Respite Care Address` - where the patient resides during respite care\n* `Temporary Residence Address` - where the patient resides for a specific period of time\n* `Convalescence Home` - the address for a patient during a period of recovery\n* `Mobile Home` - the address of a patient's mobile home, parked for a specific period of time, e.g. the address of a caravan park\n* `Holiday Home` - the address for a patient during a holiday\n\nA patient can also register temporarily at a GP practice using a temporary address. Temporary GP registration information does not appear on the PDS, but the address used for it may.\n","enum":["Second Home","Student Accommodation","Respite Care Address","Temporary Residence Address","Convalescence Home","Mobile Home","Holiday Home"],"example":"Student Accommodation"},"line":{"type":"array","description":"All lines of the address except the postal code.\n\nSystems must apply the following formatting convention when adding or replacing addresses lines:\n*\tline 1 - premises ID and/or house name, e.g. `Flat 1` or `The Old Schoolhouse`\n*\tline 2 - house number, dependent thoroughfare name and descriptor (if present), thoroughfare name and descriptor, e.g. `23 Mill Lane`\n*\tline 3 - dependent locality/village, locality (if present), e.g. `Boxgrove`\n*\tline 4 - post town, e.g. `Leeds`\n*\tline 5 - county (if present), e.g. `West Yorkshire`\n\nIf any of the lines are blank, they are not returned due to FHIR conformance constraints.\n","maxItems":5,"items":{"type":"string"},"example":["1 Trevelyan Square","Boar Lane","City Centre","Leeds","West Yorkshire"]},"postalCode":{"type":"string","description":"Postal code of the address.","example":"LS1 6AE"},"extension":{"type":"array","description":"List of address keys formatted as a FHIR extension. This can include up to one Unique Property Reference Number (UPRN), and up to one Postal Address File (PAF) key. If no keys for the address are known, the array will be empty. Otherwise it will be a list of objects which specify the value of the address key and the code system for it","items":{"anyOf":[{"type":"object","description":"Unique identifier for an address.","properties":{"url":{"type":"string","description":"URL of specification of the AddressKey extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey"]},"extension":{"type":"array","description":"Specification of address key system and address key value. Contains exactly two items: one describing the code system the Address Key uses, and the other specifying the value of the Address Key.","minItems":2,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Coding system of the address key.","required":["url","valueCoding"],"properties":{"url":{"type":"string","description":"Always 'type'.","default":"type"},"valueCoding":{"type":"object","description":"URL of specification of address key format.","required":["system","code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available Address Key formats.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType"},"code":{"type":"string","description":"Address Key system. Always 'PAF'.","enum":["PAF"],"example":"PAF"}}}}},{"type":"object","description":"Value of the address key.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Always 'value'.","default":"value","example":"value"},"valueString":{"type":"string","description":"Address key in PAF format. An 8 digit number including leading zeroes, formatted as a string.","minLength":8,"maxLength":8,"pattern":"^[0-9]{8}$","example":"12345678"}}}]}}}},{"type":"object","description":"Unique identifier for an address.","properties":{"url":{"type":"string","description":"URL of specification of the AddressKey extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey"]},"extension":{"type":"array","description":"Specification of address key system and address key value. Contains exactly two items: one describing the code system the Address Key uses, and the other specifying the value of the Address Key.","minItems":2,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Coding system of the address key.","required":["url","valueCoding"],"properties":{"url":{"type":"string","description":"Always 'type'.","default":"type"},"valueCoding":{"type":"object","description":"URL of specification of address key format.","required":["system","code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available Address Key formats.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType"},"code":{"type":"string","description":"Address Key system. Always 'UPRN'.","enum":["UPRN"],"example":"UPRN"}}}}},{"type":"object","description":"Value of the address key.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Always 'value'.","default":"value","example":"value"},"valueString":{"type":"string","description":"Address key in UPRN format. A number containing from 1 up to 12 digits.","minLength":1,"maxLength":12,"pattern":"^[0-9]{1,12}$","example":"123456789012"}}}]}}}}]}}}}},"telecom":{"type":"array","description":"List of contact points for the patient; for example, phone numbers or email addresses.\nWhen a patient tagged as `restricted` is retrieved, all contact points are removed from the response.\n","items":{"description":"A contact point, such as a phone number or email address","type":"object","required":["system","value"],"properties":{"id":{"type":"string","description":"Unique object identifier for this contact point.","example":"789"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"system":{"description":"Means of communication, such as phone or email.","type":"string","enum":["phone","fax","email","other"],"example":"phone"},"value":{"description":"Phone number, email address, or other identifier for use with contact system.","type":"string","example":"01632960587"},"use":{"type":"string","description":"Location associated with communication system.","enum":["home","work","temp","mobile"],"example":"home"},"extension":{"type":"array","maxItems":1,"description":"Extension that is returned when the communication type is `textphone`. The only code returned is `textphone`, which means `Minicom (Textphone)`.\n\nThe `system` is `other` when the extension is included.\n","items":{"type":"object","description":"Wrapped object for other contact system details.","properties":{"url":{"type":"string","description":"Definition of other contact system extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem"]},"valueCoding":{"type":"object","description":"URL of specification of other contact systems.","properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem"},"code":{"type":"string","description":"Coded value for the other contact system in place.","example":"textphone"},"display":{"description":"Display-friendly representation of the other contact system code.","type":"string","example":"Minicom (Textphone)"}}}}}}}}},"contact":{"type":"array","description":"A list of patient contacts. Only emergency contacts are returned. Any other contacts are returned on the patients `Related Person`.\nWhen a patient tagged as `restricted` is retrieved, all contacts are removed from the response.\n","items":{"title":"Schema for a patient contact.","type":"object","additionalProperties":false,"required":["relationship","telecom"],"properties":{"id":{"type":"string","example":"C123"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"relationship":{"type":"array","description":"The contact relationship wrapper object that holds the details of the relationship to the patient.\n\nThis is only returned when an Emergency Contact number has been set on `telecom`. The only valid code is `C`, which means `Emergency Contact`.\n","minItems":1,"maxItems":1,"items":{"type":"object","required":["coding"],"properties":{"coding":{"type":"array","description":"Exactly one contact relationship.","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","format":"url","default":"http://terminology.hl7.org/CodeSystem/v2-0131"},"code":{"type":"string","description":"Coded value for contact relationship.","example":"C"},"display":{"type":"string","description":"Display-friendly representation of the contact relationship code.","example":"Emergency Contact"}}}}}}},"telecom":{"type":"array","description":"List of Telecom objects on the contact only contains `system` and `value`.\n","items":{"description":"A contact point, such as a phone number or email address","type":"object","required":["system","value"],"properties":{"id":{"type":"string","description":"Unique object identifier for this contact point.","example":"789"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"system":{"description":"Means of communication, such as phone or email.","type":"string","enum":["phone","fax","email","other"],"example":"phone"},"value":{"description":"Phone number, email address, or other identifier for use with contact system.","type":"string","example":"01632960587"},"use":{"type":"string","description":"Location associated with communication system.","enum":["home","work","temp","mobile"],"example":"home"},"extension":{"type":"array","maxItems":1,"description":"Extension that is returned when the communication type is `textphone`. The only code returned is `textphone`, which means `Minicom (Textphone)`.\n\nThe `system` is `other` when the extension is included.\n","items":{"type":"object","description":"Wrapped object for other contact system details.","properties":{"url":{"type":"string","description":"Definition of other contact system extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem"]},"valueCoding":{"type":"object","description":"URL of specification of other contact systems.","properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem"},"code":{"type":"string","description":"Coded value for the other contact system in place.","example":"textphone"},"display":{"description":"Display-friendly representation of the other contact system code.","type":"string","example":"Minicom (Textphone)"}}}}}}}}}}}},"generalPractitioner":{"type":"array","maxItems":1,"description":"General Practice (not practitioner) with which the patient is, or was, registered. Always contains zero or one general practitioner object.\nWhen a patient tagged as `restricted` is retrieved, the General Practice is removed from the response.\n","items":{"description":"General practice (not practitioner) with which the patient is or was registered.","type":"object","required":["identifier"],"properties":{"id":{"description":"Object identifier (OID) specific to the returned details - this should be return exactly the same in any update.","type":"string","example":"254406A3"},"type":{"description":"Type of Reference being returned.","type":"string","example":"Organization"},"identifier":{"description":"Identifier and system of identification used for this Organisation.","type":"object","required":["value"],"properties":{"system":{"description":"URL for the Organisation Data Service - who are responsible for publishing codes that identify organisations and individuals across health and social care.","type":"string","example":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"description":"Organisation code for the registered general practice, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","type":"string","pattern":"^[0-9A-Z]+$","example":"Y12345"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}}}}}}},"extension":{"type":"array","description":"Wrapper array for the patient's death notification status; this is a FHIR extension. Always contains zero or one death notification status object.\n","items":{"anyOf":[{"type":"object","description":"Wrapper object for death notification details.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of death notification extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus"]},"extension":{"type":"array","description":"Array containing exactly one death notification status code object and exactly one effective date object.","minItems":1,"maxItems":2,"items":{"oneOf":[{"type":"object","description":"Wrapper object for death notification status code.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `deathNotificationStatus`.","default":"deathNotificationStatus","enum":["deathNotificationStatus"]},"valueCodeableConcept":{"type":"object","description":"Death Notification Status.","properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["system","code"],"properties":{"system":{"type":"string","description":"URI of the coding system specification.","example":"https://fhir.hl7.org.uk/CodeSystem/UKCore-DeathNotificationStatus"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1.0.0"},"code":{"type":"string","description":"Symbol, in syntax, defined by the system:\n* `1` - Informal - death notice received via an update from a local NHS Organisation such as GP or Trust\n* `2` - Formal - death notice received from Registrar of Deaths. Only these endpoints are allowed to add a Formal death:\n - National Back Office using the Demographic Spine Application (DSA)\n - Office of National Statistics (ONS)\n - Maternity sites\n* `U` - Removed. This is a possible response, but it cannot be used on an update because Spine will reject it\n","example":"2","enum":["1","2","U"]},"display":{"type":"string","description":"Representation defined by the system.","example":"Formal - death notice received from Registrar of Deaths","enum":["Informal - death notice received via an update from a local NHS Organisation such as GP or Trust","Formal - death notice received from Registrar of Deaths","Removed"]}}}}}}}},{"type":"object","description":"Wrapper object for death notification effective date.","required":["url","valueDateTime"],"properties":{"url":{"type":"string","description":"Key of this object. Always `systemEffectiveDate`.","default":"systemEffectiveDate","enum":["systemEffectiveDate"]},"valueDateTime":{"type":"string","description":"Date and time at which death notification status took effect.","format":"date-time","example":"2010-10-22T00:00:00+00:00"}}}]}}}}]}}}}}}}}},"RelatedPersonBundle":{"type":"object","properties":{"resourceType":{"type":"string","description":"FHIR Resource Type.","default":"Bundle"},"type":{"type":"string","description":"FHIR Bundle Type.","default":"searchset"},"timestamp":{"type":"string","description":"Time the search was performed.","format":"datetime","example":"2019-12-25T12:00:00+00:00"},"total":{"type":"integer","description":"Number of resources returned in search.","example":1},"entry":{"type":"array","description":"A list of related people details attached to the patient. \n","items":{"type":"object","properties":{"fullUrl":{"type":"string","description":"Absolute URL of the resource described in this item.","example":"https://api.service.nhs.uk/personal-demographics/FHIR/R4/Patient/9000000009/RelatedPerson/507B7621"},"resource":{"type":"object","additionalProperties":false,"required":["patient","relationship"],"properties":{"id":{"type":"string","description":"Unique object identifier for this name.","example":"507B7621"},"resourceType":{"type":"string","description":"FHIR resource type.","default":"RelatedPerson"},"patient":{"type":"object","required":["type"],"properties":{"type":{"type":"string","default":"Patient","enum":["Patient"]},"identifier":{"type":"object","description":"Identifier and system of identification used for this Patient.\n\nThis is an optional field as related person details are either a reference to another NHS number, or the details, such as name and adress, stored directly on the resource.\n","properties":{"system":{"type":"string","description":"URL for the Patient retrieval API.","format":"url","example":"https://api.service.nhs.uk/personal-demographics/FHIR/R4/Patient"},"value":{"type":"string","description":"NHS number for the related person","example":"90000000009","pattern":"^\\d{10}$"}}},"reference":{"type":"string","description":"URL for the FHIR Patient resource.","format":"url","example":"https://api.service.nhs.uk/personal-demographics/FHIR/R4/Patient/90000000009"}}},"active":{"type":"boolean","default":true},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"name":{"type":"array","description":"List containing zero or one name associated with the related person.\nThis is an optional field as there may be a `patient` reference which can be used to retrieve any details about the related person.\nIf no `patient` reference is available `name` and `address` must be provided at the minimum.\n","maxItems":1,"items":{"type":"object","required":["use","family"],"additionalProperties":false,"properties":{"id":{"type":"string","description":"Unique object identifier for this name.","example":"123"},"use":{"type":"string","description":"How this name should be used.\n* usual - Known as, conventional or the one patient normally uses. A patient always has a usual name.\n* temp - An alias or temporary name. This may also be used for temporary names assigned at birth or in emergency situations.\n* nickname - A name that the patient prefers to be addressed by, but is not part of their usual name.\n* old - This name is no longer in use (or was never correct, but retained for records).\n* maiden - Name changed for Marriage. A name used prior to changing name because of marriage. This term is not gender specific. The use of this term does not imply any particular history for a person's name.\n\nThe following use codes are included in the [name-use](https://www.hl7.org/fhir/valueset-name-use.html) value set, but should not be used and is not be returned as part of a retrieval.\n* official - The formal name as registered in an official (government) registry, but which name might not be commonly used. May be called \"legal name\".\n* anonymous - Anonymous assigned name, alias, or pseudonym (used to protect a person's identity for privacy reasons).\n","enum":["usual","temp","nickname","old","maiden"],"example":"usual"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"given":{"type":"array","maxItems":5,"description":"Given names, including any middle names.\n\nEach name(s) should be a separate item in the list. The first given name may include multiple names, separated by a space.\nSubsequent names must be broken down into list items. For example, the input `[Jane Marie Anne, Jo Adele]` returns `[Jane Marie Anne, Jo, Adele]`.\n","example":["Jane Marie Anne","Jo","Adele"],"items":{"type":"string","maxLength":35,"example":"Jane"}},"family":{"type":"string","maxLength":35,"description":"Family name (often called Surname).","example":"Smith"},"prefix":{"type":"array","description":"Name prefixes, titles, and prenominals.","example":["Mrs"],"items":{"type":"string","example":"Mrs"}},"suffix":{"type":"array","description":"Name suffices and postnominals.","example":["MBE","PhD"],"items":{"type":"string","example":"MBE"}}}}},"address":{"type":"array","description":"List containing zero or one address associated with the related person.\nThis is an optional field as there may be a `patient` reference which can be used to retrieve any details about the related person.\nIf no `patient` reference is available `name` and `address` must be provided at the minimum.\n","maxItems":1,"items":{"type":"object","description":"An address associated with the patient.","required":["use"],"properties":{"id":{"type":"string","description":"Unique system identifier for this address.","example":"456"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"use":{"type":"string","description":"Purpose of this address:\n * `home` - the home address is the patient's normal residence. Home address is also known as usual, main, registered, current or permanent address\n * `temp` - a temporary address is an address used for a set period of time, but where the patient's home, permanent address remains unchanged\n * `billing` - an address used for correspondence purposes only\n * `work` - an office address. This can be returned due to legacy data but cannot be added or replaced on update\n\n A patient should have no more than one current `temp` and/or `billing` address.\n However, historically this was constrained only by the integration requirements and was not enforced so theoretically more than one can exist for a patient when retrieving.\n Where multiple instances already exist for the patient it is not expected that local systems should manage those, but should choose the most appropriate one to maintain (e.g. by examining period dates).\n\n A `home` address is the patient's main residential address and should normally be used for all clinical and demographic purposes, including clinical and appointment correspondence.\n However additionally, `temp` and `billing` addresses may be provided by a patient when there is a requirement to record an alternative location for the purposes of unbroken care.\n When sending correspondence to a patient:\n *\ta present and valid `billing` address may take precedence over `home` and `temp` addresses. A patient should have only a single current `billing` address. An address is considered 'valid' according to its period start and end dates.\n *\tif no current `billing` address is provided, a `temp` address may take precedence over the `home` address, again if it is valid according to its period start and end dates.\n * if there is no valid, current `billing` and/or `temp` address, the `home` address must be used.\n","enum":["home","work","temp","billing"],"example":"home"},"text":{"type":"string","description":"Where a `temp` address is provided a descriptor text must be sent.\nThe list of possible values are:\n* `Second Home` - a patient's second home\n* `Student Accommodation` - a patient's place of residence while at university\n* `Respite Care Address` - where the patient resides during respite care\n* `Temporary Residence Address` - where the patient resides for a specific period of time\n* `Convalescence Home` - the address for a patient during a period of recovery\n* `Mobile Home` - the address of a patient's mobile home, parked for a specific period of time, e.g. the address of a caravan park\n* `Holiday Home` - the address for a patient during a holiday\n\nA patient can also register temporarily at a GP practice using a temporary address. Temporary GP registration information does not appear on the PDS, but the address used for it may.\n","enum":["Second Home","Student Accommodation","Respite Care Address","Temporary Residence Address","Convalescence Home","Mobile Home","Holiday Home"],"example":"Student Accommodation"},"line":{"type":"array","description":"All lines of the address except the postal code.\n\nSystems must apply the following formatting convention when adding or replacing addresses lines:\n*\tline 1 - premises ID and/or house name, e.g. `Flat 1` or `The Old Schoolhouse`\n*\tline 2 - house number, dependent thoroughfare name and descriptor (if present), thoroughfare name and descriptor, e.g. `23 Mill Lane`\n*\tline 3 - dependent locality/village, locality (if present), e.g. `Boxgrove`\n*\tline 4 - post town, e.g. `Leeds`\n*\tline 5 - county (if present), e.g. `West Yorkshire`\n\nIf any of the lines are blank, they are not returned due to FHIR conformance constraints.\n","maxItems":5,"items":{"type":"string"},"example":["1 Trevelyan Square","Boar Lane","City Centre","Leeds","West Yorkshire"]},"postalCode":{"type":"string","description":"Postal code of the address.","example":"LS1 6AE"},"extension":{"type":"array","description":"List of address keys formatted as a FHIR extension. This can include up to one Unique Property Reference Number (UPRN), and up to one Postal Address File (PAF) key. If no keys for the address are known, the array will be empty. Otherwise it will be a list of objects which specify the value of the address key and the code system for it","items":{"anyOf":[{"type":"object","description":"Unique identifier for an address.","properties":{"url":{"type":"string","description":"URL of specification of the AddressKey extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey"]},"extension":{"type":"array","description":"Specification of address key system and address key value. Contains exactly two items: one describing the code system the Address Key uses, and the other specifying the value of the Address Key.","minItems":2,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Coding system of the address key.","required":["url","valueCoding"],"properties":{"url":{"type":"string","description":"Always 'type'.","default":"type"},"valueCoding":{"type":"object","description":"URL of specification of address key format.","required":["system","code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available Address Key formats.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType"},"code":{"type":"string","description":"Address Key system. Always 'PAF'.","enum":["PAF"],"example":"PAF"}}}}},{"type":"object","description":"Value of the address key.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Always 'value'.","default":"value","example":"value"},"valueString":{"type":"string","description":"Address key in PAF format. An 8 digit number including leading zeroes, formatted as a string.","minLength":8,"maxLength":8,"pattern":"^[0-9]{8}$","example":"12345678"}}}]}}}},{"type":"object","description":"Unique identifier for an address.","properties":{"url":{"type":"string","description":"URL of specification of the AddressKey extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey"]},"extension":{"type":"array","description":"Specification of address key system and address key value. Contains exactly two items: one describing the code system the Address Key uses, and the other specifying the value of the Address Key.","minItems":2,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Coding system of the address key.","required":["url","valueCoding"],"properties":{"url":{"type":"string","description":"Always 'type'.","default":"type"},"valueCoding":{"type":"object","description":"URL of specification of address key format.","required":["system","code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available Address Key formats.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType"},"code":{"type":"string","description":"Address Key system. Always 'UPRN'.","enum":["UPRN"],"example":"UPRN"}}}}},{"type":"object","description":"Value of the address key.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Always 'value'.","default":"value","example":"value"},"valueString":{"type":"string","description":"Address key in UPRN format. A number containing from 1 up to 12 digits.","minLength":1,"maxLength":12,"pattern":"^[0-9]{1,12}$","example":"123456789012"}}}]}}}}]}}}}},"telecom":{"type":"array","description":"List containing zero to five contact methods associated with the related person.\nThis is an optional field as there may be a `patient` reference which can be used to retrieve any details about the related person.\n","maxItems":5,"items":{"description":"A contact point, such as a phone number or email address","type":"object","required":["system","value"],"properties":{"id":{"type":"string","description":"Unique object identifier for this contact point.","example":"789"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"system":{"description":"Means of communication, such as phone or email.","type":"string","enum":["phone","fax","email","other"],"example":"phone"},"value":{"description":"Phone number, email address, or other identifier for use with contact system.","type":"string","example":"01632960587"},"use":{"type":"string","description":"Location associated with communication system.","enum":["home","work","temp","mobile"],"example":"home"},"extension":{"type":"array","maxItems":1,"description":"Extension that is returned when the communication type is `textphone`. The only code returned is `textphone`, which means `Minicom (Textphone)`.\n\nThe `system` is `other` when the extension is included.\n","items":{"type":"object","description":"Wrapped object for other contact system details.","properties":{"url":{"type":"string","description":"Definition of other contact system extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem"]},"valueCoding":{"type":"object","description":"URL of specification of other contact systems.","properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem"},"code":{"type":"string","description":"Coded value for the other contact system in place.","example":"textphone"},"display":{"description":"Display-friendly representation of the other contact system code.","type":"string","example":"Minicom (Textphone)"}}}}}}}}},"relationship":{"type":"array","description":"The relationship of the related person to the patient.\n","minItems":1,"maxItems":1,"items":{"type":"object","required":["coding"],"properties":{"coding":{"type":"array","description":"Coded values for three relationship types:\n* Role\n* Type\n* Next-of-Kin\n\nThe codes used can be found at:\n* http://hl7.org/fhir/ValueSet/relatedperson-relationshiptype\n* https://fhir.nhs.uk/R4/CodeSystem/UKCore-AdditionalRelatedPersonRole\n\nThe allowed values for `Role` are:\n* Agent - Agent of patient\n* Guardian - Guardian of patient\n* Personal - Personal relationship with the patient\n\nThe allowed values for `Type` are:\n* SPS - spouse\n* DOMPART - domestic partner\n* PRN - parent\n* PRNFOST - foster parent\n* STPPRN - step parent\n* CHILD - child\n* MTH - mother\n* FTH - father\n* SIS - sister\n* BRO - brother\n* FAMMEMB - family member\n* ONESELF - self\n* N - Next-of-Kin\n* U - Unknown\n* PolygamousPartner - Polygamous Partner of patient\n* Dependant - Dependant of patient\n* NonDependant - Non Dependant of patient\n* ProxyContact - Proxy Contact for patient\n* ProxyCommunication - Proxy Communication for patient\n* ProxyContactCommunication - Proxy Contact and Communication for patient\n* Carer - Carer of patient\n* Guardian - Guardian of patient\n* NotSpecified - Not Specified\n\nThe allowed values for `Next-of-Kin` are:\n* N - Next-of-Kin\n\n`Role` and `Type` are mandatory, so both should be present - however they both contain the `Guardian` code - so a single response is possible.\n\n`Next-of-Kin` is optional and will be absent from the response when the related person is not the Next-of-Kin.\n","minItems":1,"maxItems":3,"items":{"type":"object","required":["system","code"],"properties":{"system":{"type":"string","description":"URI of the coding system specification.","format":"url","default":"https://fhir.nhs.uk/R4/CodeSystem/UKCore-AdditionalRelatedPersonRole","enum":["http://hl7.org/fhir/ValueSet/relatedperson-relationshiptype","https://fhir.nhs.uk/R4/CodeSystem/UKCore-AdditionalRelatedPersonRole"]},"code":{"type":"string","description":"Symbol in syntax defined by the system.","example":"Guardian"},"display":{"type":"string","description":"Human-friendly display representation defined by the system.","example":"Guardian of patient"}}}}}}},"extension":{"type":"array","description":"Wrapper array for copy correspondence, contact rank, contact preferences and communication details; these are all FHIR extensions. Always contains zero or one of each extension type.\n","items":{"anyOf":[{"type":"object","description":"Flag indicating if this person should be copied in on any contact with the Patient. This will only be returned if the value is true and the person should be copied in on correspondence, otherwise it will be omitted. \n","properties":{"url":{"type":"string","format":"url","description":"URL to FHIR Extension Specification.","default":"https://fhir.nhs.uk/R4/StructureDefinition/Extension-UKCore-CopyCorrespondenceIndicator","enum":["https://fhir.nhs.uk/R4/StructureDefinition/Extension-UKCore-CopyCorrespondenceIndicator"]},"valueBoolean":{"type":"boolean","description":"Flag indicating if this person should be copied in on correspondence. This will only be returned if the value is `true` otherwise it will not be returned and can be assumed `false`","example":true}}},{"type":"object","description":"Rank indicating order in which contacts should be tried.","properties":{"url":{"type":"string","format":"url","description":"URL to FHIR Extension Specification.","default":"https://fhir.nhs.uk/R4/StructureDefinition/Extension-UKCore-ContactRank","enum":["https://fhir.nhs.uk/R4/StructureDefinition/Extension-UKCore-ContactRank"]},"valuePositiveInt":{"type":"integer","minimum":1,"maximum":99,"description":"Rank expressed as positive integer (1 being the highest).","example":1}}},{"type":"object","description":"Wrapper object for preferred contact details; the written communication format, preferred contact time and method. This will only be populated on a retrieval and not a search.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of the contact preference extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-ContactPreference","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-ContactPreference"]},"extension":{"description":"Wrapper array containing zero or one preferred contact method, zero or one preferred written communication format; and zero or one preferred contact time.","type":"array","maxItems":3,"items":{"oneOf":[{"type":"object","description":"Wrapper object for preferred written communication format.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredWrittenCommunicationFormat`.","default":"PreferredWrittenCommunicationFormat"},"valueCodeableConcept":{"type":"object","description":"Preferred Written Communication Format.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","format":"url","description":"Definition of the preferred written communication extension.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredWrittenCommunicationFormat","enum":["https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredWrittenCommunicationFormat"]},"code":{"type":"string","description":"A code to identify the preferred written communication format of a patient, contact or related person.\n* 11 - Large print\n* 12 - Braille\n* 13 - Audio tape\n","example":"12"},"display":{"type":"string","description":"Display-friendly representation of the preferred written communication format code.","example":"Braille"}}}}}}}},{"type":"object","description":"Wrapper object for preferred contact method.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredContactMethod`.","default":"PreferredContactMethod","enum":["PreferredContactMethod"]},"valueCodeableConcept":{"type":"object","description":"Preferred Contact Method.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","format":"url","description":"Definition of the preferred contact method extension.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredContactMethod","enum":["https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredContactMethod"]},"code":{"type":"string","description":"A code to identify to identify the preferred contact method of a patient, contact or related person.\n* 1\t- Letter\n* 2\t- Visit\n* 3\t- Telephone\n* 4\t- E-mail\n* 5\t- Minicom (Textphone)\n* 6\t- Telephone contact via proxy\n* 7\t- Sign language\n* 8\t- No Telephone contact\n","example":"1"},"display":{"type":"string","description":"Display-friendly representation of the preferred contact method code.","example":"Letter"}}}}}}}},{"type":"object","description":"Wrapper object for preferred contact times.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredContactTimes`.","default":"PreferredContactTimes","enum":["PreferredContactTimes"]},"valueString":{"type":"string","maximum":40,"description":"A free-text description about the preferred contact times.","example":"Not after 7pm"}}}]}}}},{"type":"object","description":"Wrapper object for communication details. This will only be populated on a retrieval and not a search.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of communication extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSCommunication","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSCommunication"]},"extension":{"type":"array","description":"Definition of communication extension.\n\nThe array must have one item, a valueCodeableConcept for the language and can optionally include a valueBoolean for if an interpreter is required.","minItems":1,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Wrapper object for communication language.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `language`.","default":"language","enum":["language"]},"valueCodeableConcept":{"type":"object","description":"Human language.","required":["coding"],"properties":{"coding":{"type":"array","description":"Exactly one language code.","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URL of the Language Code System. Always uses the 'UKCore-HumanLanguage' Code System.","example":"https://fhir.hl7.org.uk/CodeSystem/UKCore-HumanLanguage"},"version":{"type":"string","description":"Version of the language code system.","example":"1.0.0"},"code":{"type":"string","description":"Language code based on [ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) standard plus extensions for braille, makaton and sign languages, which are:\n* `q1` - Braille\n* `q2` - American Sign Language\n* `q3` - Australian Sign Language\n* `q4` - British Sign Language\n* `q5` - Makaton\nAll valid codes combined can be found at https://fhir.hl7.org.uk/CodeSystem/UKCore-HumanLanguage.\n","example":"fr"},"display":{"type":"string","description":"Display-friendly representation of the language code (such as English). If there is a language code with no defined mapping, `Unknown` will be returned.","example":"French"}}}}}}}},{"type":"object","description":"Wrapper object for whether an interpreter is required.","required":["url","valueBoolean"],"properties":{"url":{"type":"string","description":"Key of this object. Always `interpreterRequired`.","default":"interpreterRequired","enum":["interpreterRequired"]},"valueBoolean":{"type":"boolean","description":"Whether an interpreter is required.","example":true}}}]}}}}]}}}}}}}}},"OperationOutcome":{"type":"object","description":"Outcome of an operation that does not result in a resource or bundle being returned, for example an error or an async/batch submission.\nThere are a number of possible error codes that can be returned along with a more detailed description in the `display` field.\n","properties":{"resourceType":{"type":"string","description":"FHIR Resource Type.","default":"OperationOutcome"},"issue":{"type":"array","description":"List of issues that have occurred.","minItems":1,"items":{"type":"object","required":["severity","code"],"properties":{"severity":{"type":"string","enum":["fatal","error","warning","information"],"description":"Severity of the error.","example":"error"},"code":{"type":"string","description":"FHIR error code.","example":"invalid","enum":["invalid","structure","required","value","invariant","security","login","unknown","expired","forbidden","suppressed","processing","not-supported","duplicate","multiple-matches","not-found","deleted","too-long","code-invalid","extension","too-costly","business-rule","conflict","transient","lock-error","no-store","exception","timeout","incomplete","throttled","informational"]},"details":{"type":"object","description":"Internal error code.","properties":{"coding":{"type":"array","items":{"type":"object","properties":{"system":{"type":"string","description":"URI of the coding system specification.","example":"https://fhir.nhs.uk/R4/CodeSystem/Spine-ErrorOrWarningCode"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1"},"code":{"type":"string","description":"Symbol in syntax defined by the system.","example":"INVALID_VALUE"},"display":{"type":"string","description":"Representation defined by the system.","example":"Provided value is invalid"}}}}}},"diagnostics":{"type":"string","description":"Additional diagnostic information about the issue. This information is subject to change.","example":"Invalid value - 2019-01 in field 'birthDate'"},"expression":{"type":"string","description":"FHIRPath of element(s) related to the error.","example":"Patient.name.given"}}}}}}},"examples":{"OperationOutcome":{"summary":"OperationOutcome example","value":{"resourceType":"OperationOutcome","issue":[{"severity":"error","code":"value","details":{"coding":[{"system":"https://fhir.nhs.uk/R4/CodeSystem/Spine-ErrorOrWarningCode","version":"1","code":"INVALID_RESOURCE_ID","display":"Resource Id is invalid"}]}}]}}}}} \ No newline at end of file diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 28717bb..0062d93 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -17,7 +17,7 @@ fhir: server: name: IOPS FHIR Testing baseUrl: https://3cdzg7kbj4.execute-api.eu-west-2.amazonaws.com/poc/Conformance - version: 6.10.1 + version: 6.10.2 diff --git a/src/main/resources/manifest.json b/src/main/resources/manifest.json index 9ba4f6c..7fdc8d1 100644 --- a/src/main/resources/manifest.json +++ b/src/main/resources/manifest.json @@ -1,19 +1,10 @@ [ { "packageName": "fhir.r4.ukcore.stu3.currentbuild", - "version": "0.0.7-sprint-7-review" + "version": "0.0.8-pre-release" }, { - "packageName": "fhir.r4.nhsengland.stu1", - "version": "1.1.0" - }, - { - "packageName": "hl7.fhir.uv.sdc", - "version": "3.0.0" - }, - { - "packageName": "hl7.fhir.us.core", - "version": "3.1.1" + "packageName": "uk.pathology.r4", + "version": "0.0.0-prerelease" } - -] +] \ No newline at end of file diff --git a/src/main/resources/uk.pathology.r4-0.0.0-prerelease.tgz b/src/main/resources/uk.pathology.r4-0.0.0-prerelease.tgz new file mode 100644 index 0000000000000000000000000000000000000000..21cfe2f507cc02d0067b293e03d0c0e08f654e67 GIT binary patch literal 5290 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 w(qJ$W Date: Thu, 11 Jan 2024 15:46:24 +0000 Subject: [PATCH 18/67] Removed code which overwrote a supplied profile. --- .../configuration/ValidationConfiguration.kt | 9 +++++++-- .../england/fhirvalidator/util/ProfileApplier.kt | 7 +++++-- .../uk.pathology.r4-0.0.0-prerelease.tgz | Bin 5290 -> 0 bytes 3 files changed, 12 insertions(+), 4 deletions(-) delete mode 100644 src/main/resources/uk.pathology.r4-0.0.0-prerelease.tgz diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/ValidationConfiguration.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/ValidationConfiguration.kt index 03a409e..5313bd6 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/ValidationConfiguration.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/ValidationConfiguration.kt @@ -334,8 +334,13 @@ open class ValidationConfiguration( } private fun getBase(profile : String,supportChain: IValidationSupport): String? { - val structureDefinition : StructureDefinition= - supportChain.fetchStructureDefinition(profile) as StructureDefinition; + val structureDefinitionResource = supportChain.fetchStructureDefinition(profile) + if (structureDefinitionResource === null) { + logger.error("Issue retrieving " + profile) + return null; + } + val structureDefinition = structureDefinitionResource as StructureDefinition; + if (structureDefinition.hasBaseDefinition()) { var baseProfile = structureDefinition.baseDefinition if (baseProfile.contains(".uk")) baseProfile = getBase(baseProfile, supportChain) diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/util/ProfileApplier.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/util/ProfileApplier.kt index a3951e4..b8fe839 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/util/ProfileApplier.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/util/ProfileApplier.kt @@ -21,7 +21,10 @@ fun getResourcesOfType(resource: IBaseResource, resourceType: String?): List, profile: IPrimitiveType) { resources.stream().forEach { - it.meta.profile.clear() - it.meta.addProfile(profile.value) + var found = false + it.meta.profile.forEach { + if (it.value.equals(profile.value)) found = true + } + if (!found) it.meta.addProfile(profile.value) } } diff --git a/src/main/resources/uk.pathology.r4-0.0.0-prerelease.tgz b/src/main/resources/uk.pathology.r4-0.0.0-prerelease.tgz deleted file mode 100644 index 21cfe2f507cc02d0067b293e03d0c0e08f654e67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5290 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 w(qJ$W Date: Fri, 12 Jan 2024 04:58:09 +0000 Subject: [PATCH 19/67] Removed code which overwrote a supplied profile. --- aws-repo-notes.txt | 4 ++-- pom.xml | 2 +- src/main/resources/application.yaml | 2 +- .../uk.pathology.r4-0.0.0-prerelease.tgz | Bin 0 -> 15689 bytes 4 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 src/main/resources/uk.pathology.r4-0.0.0-prerelease.tgz diff --git a/aws-repo-notes.txt b/aws-repo-notes.txt index e3c95db..a3f7187 100644 --- a/aws-repo-notes.txt +++ b/aws-repo-notes.txt @@ -23,9 +23,9 @@ mvn clean install docker build -t fhir-validator-r4 . docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest -docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.2 +docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.4 -docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.2 +docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.4 docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest diff --git a/pom.xml b/pom.xml index 7e1ac1f..32529ba 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ uk.nhs.england IOPS-FHIR-Validation-Service - 6.10.2 + 6.10.4 IOPS-FHIR-Validation-Service HAPI FHIR Validator using Spring Boot diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 0062d93..850fccc 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -17,7 +17,7 @@ fhir: server: name: IOPS FHIR Testing baseUrl: https://3cdzg7kbj4.execute-api.eu-west-2.amazonaws.com/poc/Conformance - version: 6.10.2 + version: 6.10.4 diff --git a/src/main/resources/uk.pathology.r4-0.0.0-prerelease.tgz b/src/main/resources/uk.pathology.r4-0.0.0-prerelease.tgz new file mode 100644 index 0000000000000000000000000000000000000000..643df92028a0600fc5c76055f9e349795f889ed6 GIT binary patch literal 15689 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 Date: Fri, 12 Jan 2024 08:29:29 +0000 Subject: [PATCH 20/67] Detailed changes sent via slack. Support for a diagnostics demo. App deployed to AWS --- aws-repo-notes.txt | 4 +- cloudformation/IOPSValidation.yaml | 2 +- pom.xml | 6 +- readme.md | 2 +- .../england/fhirvalidator/FHIRLOINCServer.kt | 2 + .../fhirvalidator/FHIRR4BRestfulServer.kt | 2 + .../fhirvalidator/FHIRR4RestfulServer.kt | 2 + .../fhirvalidator/FHIRSTU3RestfulServer.kt | 2 + .../fhirvalidator/FhirValidatorApplication.kt | 2 +- .../configuration/OpenApiConfig.kt | 244 ++-- .../configuration/ServicesProperties.kt | 15 + .../CapabilityStatementInterceptor.kt | 2 +- .../provider/ValidateR4Provider.kt | 37 +- .../Examples/Bundle-message-Diagnostics.json | 1190 +++++++++++++++++ .../Examples/Bundle-message-ORU-R01.json | 800 +++++++++++ ...age.json => Bundle-message-Referrals.json} | 0 src/main/resources/OAS/Imaging.json | 4 +- src/main/resources/OAS/PDS.json | 2 +- src/main/resources/application.yaml | 11 +- ...hsengland.diagnostics-0.0.0-prerelease.tgz | Bin 0 -> 15556 bytes src/main/resources/manifest.json | 6 +- .../uk.pathology.r4-0.0.0-prerelease.tgz | Bin 15689 -> 0 bytes 22 files changed, 2208 insertions(+), 127 deletions(-) create mode 100644 src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/ServicesProperties.kt create mode 100644 src/main/resources/Examples/Bundle-message-Diagnostics.json create mode 100644 src/main/resources/Examples/Bundle-message-ORU-R01.json rename src/main/resources/Examples/{Bundle-message.json => Bundle-message-Referrals.json} (100%) create mode 100644 src/main/resources/fhir.r4.nhsengland.diagnostics-0.0.0-prerelease.tgz delete mode 100644 src/main/resources/uk.pathology.r4-0.0.0-prerelease.tgz diff --git a/aws-repo-notes.txt b/aws-repo-notes.txt index a3f7187..c557c90 100644 --- a/aws-repo-notes.txt +++ b/aws-repo-notes.txt @@ -23,9 +23,9 @@ mvn clean install docker build -t fhir-validator-r4 . docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest -docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.4 +docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.5 -docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.4 +docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.5 docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest diff --git a/cloudformation/IOPSValidation.yaml b/cloudformation/IOPSValidation.yaml index 5027d95..b10f72c 100644 --- a/cloudformation/IOPSValidation.yaml +++ b/cloudformation/IOPSValidation.yaml @@ -1,5 +1,5 @@ AWSTemplateFormatVersion: "2010-09-09" -Description: NHS Digital IOPS FHIR Services +Description: NHS England Interoperability Standards FHIR Services Parameters: OntoClientId: diff --git a/pom.xml b/pom.xml index 32529ba..2a57400 100644 --- a/pom.xml +++ b/pom.xml @@ -1,6 +1,6 @@ - + 4.0.0 org.springframework.boot @@ -10,7 +10,7 @@ uk.nhs.england IOPS-FHIR-Validation-Service - 6.10.4 + 6.10.5 IOPS-FHIR-Validation-Service HAPI FHIR Validator using Spring Boot diff --git a/readme.md b/readme.md index 19e37c8..b05f609 100644 --- a/readme.md +++ b/readme.md @@ -12,7 +12,7 @@ It has several configuration options: a. To validate against a supplied set of FHIR Implementation Guides (NPM packages are supplied). b. To validate against a configured FHIR Implementation Guide (NPM package are retrieved by the service and configured via environment variables) -c. Optionally validate using the NHS Digital Ontology Service (configured via environment variables). +c. Optionally validate using the NHS England Ontology Service (configured via environment variables). The configuration is aimed at supporting different use cases. For example the lambda version with no ontology support is aimed at performing basic FHIR validation checks. This may just be FHIR core and schema validation but can also test against UKCore profiles. diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRLOINCServer.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRLOINCServer.kt index 9bfd615..57140b7 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRLOINCServer.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRLOINCServer.kt @@ -7,6 +7,7 @@ import com.amazonaws.services.sqs.AmazonSQS import com.fasterxml.jackson.databind.ObjectMapper import org.springframework.beans.factory.annotation.Autowired import org.springframework.beans.factory.annotation.Qualifier +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty import uk.nhs.england.fhirvalidator.configuration.FHIRServerProperties import uk.nhs.england.fhirvalidator.configuration.MessageProperties import uk.nhs.england.fhirvalidator.interceptor.AWSAuditEventLoggingInterceptor @@ -17,6 +18,7 @@ import uk.nhs.england.fhirvalidator.providerLOINC.ValueSetLOINCProvider import java.util.* import javax.servlet.annotation.WebServlet +@ConditionalOnProperty(prefix = "services", name = ["LOINC"]) @WebServlet("/LOINC/R4/*", loadOnStartup = 1) class FHIRLOINCServer( @Qualifier("R4") fhirContext: FhirContext, diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRR4BRestfulServer.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRR4BRestfulServer.kt index 7726e2a..e6034ed 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRR4BRestfulServer.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRR4BRestfulServer.kt @@ -4,12 +4,14 @@ import ca.uhn.fhir.context.FhirContext import ca.uhn.fhir.rest.api.EncodingEnum import ca.uhn.fhir.rest.server.RestfulServer import org.springframework.beans.factory.annotation.Qualifier +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty import uk.nhs.england.fhirvalidator.providerR4B.CapabilityStatementInterceptorR4B import uk.nhs.england.fhirvalidator.providerR4B.MedicinalProductDefinitionProviderR4B import uk.nhs.england.fhirvalidator.providerR4B.PackagedProductDefinitionProviderR4B import java.util.* import javax.servlet.annotation.WebServlet +@ConditionalOnProperty(prefix = "services", name = ["R4B"]) @WebServlet("/FHIR/R4B/*", loadOnStartup = 1) class FHIRR4BRestfulServer( @Qualifier("R4B") fhirContext: FhirContext, diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRR4RestfulServer.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRR4RestfulServer.kt index 385d7eb..e34594c 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRR4RestfulServer.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRR4RestfulServer.kt @@ -9,6 +9,7 @@ import com.fasterxml.jackson.databind.ObjectMapper import org.hl7.fhir.utilities.npm.NpmPackage import org.springframework.beans.factory.annotation.Autowired import org.springframework.beans.factory.annotation.Qualifier +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty import uk.nhs.england.fhirvalidator.configuration.FHIRServerProperties import uk.nhs.england.fhirvalidator.configuration.MessageProperties import uk.nhs.england.fhirvalidator.interceptor.AWSAuditEventLoggingInterceptor @@ -18,6 +19,7 @@ import uk.nhs.england.fhirvalidator.provider.* import java.util.* import javax.servlet.annotation.WebServlet +@ConditionalOnProperty(prefix = "services", name = ["R4"]) @WebServlet("/FHIR/R4/*", loadOnStartup = 1) class FHIRR4RestfulServer( @Qualifier("R4") fhirContext: FhirContext, diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRSTU3RestfulServer.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRSTU3RestfulServer.kt index 5201edc..b79b1ff 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRSTU3RestfulServer.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRSTU3RestfulServer.kt @@ -5,11 +5,13 @@ import ca.uhn.fhir.context.support.IValidationSupport import ca.uhn.fhir.rest.api.EncodingEnum import ca.uhn.fhir.rest.server.RestfulServer import org.springframework.beans.factory.annotation.Qualifier +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty import uk.nhs.england.fhirvalidator.providerSTU3.ConversionProviderSTU3 import uk.nhs.england.fhirvalidator.providerSTU3.ValidateProviderSTU3 import java.util.* import javax.servlet.annotation.WebServlet +@ConditionalOnProperty(prefix = "services", name = ["STU3"]) @WebServlet("/FHIR/STU3/*", loadOnStartup = 1) class FHIRSTU3RestfulServer( @Qualifier("STU3") fhirContext: FhirContext, diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/FhirValidatorApplication.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/FhirValidatorApplication.kt index 0a1399b..414d860 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/FhirValidatorApplication.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/FhirValidatorApplication.kt @@ -12,7 +12,7 @@ import uk.nhs.england.fhirvalidator.configuration.* @SpringBootApplication @ServletComponentScan -@EnableConfigurationProperties(TerminologyValidationProperties::class,FHIRServerProperties::class) +@EnableConfigurationProperties(TerminologyValidationProperties::class,FHIRServerProperties::class, ServicesProperties::class) open class FhirValidatorApplication : ApplicationRunner { companion object : KLogging() diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt index c641adf..7156f9a 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt @@ -2,6 +2,7 @@ package uk.nhs.england.fhirvalidator.configuration import ca.uhn.fhir.context.FhirContext +import com.fasterxml.jackson.databind.ObjectMapper import io.swagger.v3.oas.models.OpenAPI import io.swagger.v3.oas.models.Operation import io.swagger.v3.oas.models.PathItem @@ -21,11 +22,15 @@ import io.swagger.v3.oas.models.servers.Server import org.springframework.beans.factory.annotation.Qualifier import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration +import org.springframework.core.io.ClassPathResource +import uk.nhs.england.fhirvalidator.model.SimplifierPackage import uk.nhs.england.fhirvalidator.util.OASExamples @Configuration -open class OpenApiConfig(@Qualifier("R4") val ctx : FhirContext) { +open class OpenApiConfig(@Qualifier("R4") val ctx : FhirContext, + val objectMapper: ObjectMapper, + val servicesProperties: ServicesProperties) { var VALIDATION = "Validation" var UTILITY = "Utility" var EXPANSION = "ValueSet Expansion (inc. Filtering)" @@ -45,13 +50,26 @@ open class OpenApiConfig(@Qualifier("R4") val ctx : FhirContext) { val oas = OpenAPI() .info( Info() - .title("Conformance Support (R4)") + .title(fhirServerProperties.server.name) .version(fhirServerProperties.server.version) - .description(fhirServerProperties.server.name - + "\n " - + "\n [UK Core Implementation Guide (fhir.r4.ukcore.stu3.currentbuild)](https://simplifier.net/guide/ukcoreversionhistory?version=current)" - + "\n\n [NHS Digital Implementation Guide](https://simplifier.net/guide/nhsdigital)" - ) + .description( + "This server is a **proof of concept**, it contains experimental features and so not is recommended for live use. \n It is used internally by NHS England Interoperability Standards to support delivery of HL7 FHIR. \n" + + "\n For official HL7 FHIR Validators, see:" + + "\n - [HL7 FHIR Validator](https://confluence.hl7.org/display/FHIR/Using+the+FHIR+Validator) A command line utilty" + + "\n - [Validator GUI](https://validator.fhir.org/) A web based application " + + "\n\n This server is preconfigured with the following FHIR Implementation Packages: \n\n" + + " | Package | Version | Implementation Guide | \n" + + " |---|---|---| \n" + + getPackages() + + "\n\n This is an implementation of FHIR Validation [Asking a FHIR Server](https://hl7.org/fhir/R4/validation.html#op) and is built using [HAPI FHIR Validation](https://hapifhir.io/hapi-fhir/docs/validation/introduction.html). This is the same code base as the [official HL7 Validator](https://github.com/hapifhir/org.hl7.fhir.validator-wrapper), the main differences are: \n" + + "\n - Configuration and code to support code validation using NHS England Terminology Server." + + "\n - Support for validating **FHIR Messages** against definitions held in **FHIR MessageDefinition**" + + "\n - Default profile support configured via **FHIR CapabilityStatement**" + + "\n\n ### Terminology Testing (Coding)\n" + + "\n\n This server uses services from [NHS England Termonology Server](https://digital.nhs.uk/services/terminology-server) to perform terminology verification. The UK SNOMED CT version used for FHIR Validation is set by this ontology service. \n" + + "\n\n ### Open Source" + + "\n\n Source code [GitHub](https://github.com/NHSDigital/IOPS-FHIR-Validation-Service)" + ) .termsOfService("http://swagger.io/terms/") .license(License().name("Apache 2.0").url("http://springdoc.org")) ) @@ -84,11 +102,17 @@ open class OpenApiConfig(@Qualifier("R4") val ctx : FhirContext) { examples.put("Patient PDS", Example().value(OASExamples().loadFHIRExample("Patient-PDS.json",ctx)) ) - examples.put("Encounter converted from HL7 v2", + examples.put("Encounter converted from HL7 v2 ADT", Example().value(OASExamples().loadFHIRExample("Encounter-ADTA03.json",ctx)) ) - examples.put("Bundle - FHIR Messge example", - Example().value(OASExamples().loadFHIRExample("Bundle-message.json",ctx)) + examples.put("Referrals - FHIR Message example", + Example().value(OASExamples().loadFHIRExample("Bundle-message-Referrals.json",ctx)) + ) + examples.put("Diagnostics - FHIR Message example", + Example().value(OASExamples().loadFHIRExample("Bundle-message-Diagnostics.json",ctx)) + ) + examples.put("Diagnostics - FHIR Message transformed from HL7 v2 ORU_R01 (DHCW)", + Example().value(OASExamples().loadFHIRExample("Bundle-message-ORU-R01.json",ctx)) ) val validateItem = PathItem() .post( @@ -96,29 +120,15 @@ open class OpenApiConfig(@Qualifier("R4") val ctx : FhirContext) { .addTagsItem(VALIDATION) .summary( "The validate operation checks whether the attached content would be acceptable either generally, as a create, an update or as a delete to an existing resource.") - .description("Validating a resource means, checking that the following aspects of the resource are valid: \n" - + " - **Structure:** Check that all the content in the resource is described by the specification, and nothing extra is present \n" - + " - **Cardinality:** Check that the cardinality of all properties is correct (min & max) \n" - + " - **Value Domains:** Check that the values of all properties conform to the rules for the specified types (including checking that enumerated codes are valid) \n" - + " - **Coding/CodeableConcept bindings:** Check that codes/displays provided in the Coding/CodeableConcept types are valid \n" - + " - **Invariants:** Check that the invariants (co-occurrence rules, etc.) have been followed correctly \n" - + " - **Profiles:** Check that any rules in profiles have been followed (including those listed in the Resource.meta.profile, or in CapabilityStatement, or in an ImplementationGuide, or otherwise required by context) \n" - + " - **Questionnaires:** Check that a QuestionnaireResponse is valid against its matching Questionnaire \n" - + " \n \n" - + "The validate operation checks whether the attached content would be acceptable either generally, as a create, an update or as a delete to an existing resource. \n" - + "Note that this operation is not the only way to validate resources - see [Validating Resources](https://www.hl7.org/fhir/R4/validation.html) for further information. \n" - + "\n" - + "The official URL for this operation definition is \n" - + " **http://hl7.org/fhir/OperationDefinition/Resource-validate** ") .responses(getApiResponsesXMLJSON_JSONDefault()) .addParametersItem(Parameter() .name("profile") .`in`("query") .required(false) .style(Parameter.StyleEnum.SIMPLE) - .description("The uri that identifies the profile. If no profile uri is supplied, NHS Digital defaults will be used.") - .schema(StringSchema().format("token")) - .example("https://fhir.hl7.org.uk/StructureDefinition/UKCore-Patient")) + .description("The uri that identifies the profile (e.g. https://fhir.hl7.org.uk/StructureDefinition/UKCore-Patient). If no profile uri is supplied, NHS England defaults will be used.") + // Removed example profile + .schema(StringSchema().format("token"))) .requestBody(RequestBody().content(Content() .addMediaType("application/fhir+json", MediaType() .examples(examples) @@ -510,82 +520,90 @@ open class OpenApiConfig(@Qualifier("R4") val ctx : FhirContext) { oas.path("/FHIR/R4/CodeSystem/\$subsumes",subsumesItem) - - - // MEDICATION DEFINITION - - val medicineItem = PathItem() - .get( - Operation() - .addTagsItem(MEDICATION_DEFINITION) - .summary("EXPERIMENTAL A medicinal product, being a substance or combination of substances that is intended to treat, prevent or diagnose a disease, or to restore, correct or modify physiological functions by exerting a pharmacological, immunological or metabolic action.") - .description("[Medication Definition Module](https://www.hl7.org/fhir/medication-definition-module.html)") - .responses(getApiResponses()) - .addParametersItem(Parameter() - .name("name") - .`in`("query") - .required(false) - .style(Parameter.StyleEnum.SIMPLE) - .description("The full product name") - .schema(StringSchema()) - .example("Methotrexate 5mg")) - ) - oas.path("/FHIR/R4B/MedicinalProductDefinition",medicineItem) - - val medicineReadItem = PathItem() - .get( - Operation() - .addTagsItem(MEDICATION_DEFINITION) - .summary("EXPERIMENTAL A medicinal product, being a substance or combination of substances that is intended to treat, prevent or diagnose a disease, or to restore, correct or modify physiological functions by exerting a pharmacological, immunological or metabolic action.") - .description("[Medication Definition Module](https://www.hl7.org/fhir/medication-definition-module.html)") - .responses(getApiResponses()) - .addParametersItem(Parameter() - .name("id") - .`in`("path") - .required(false) - .style(Parameter.StyleEnum.SIMPLE) - .description("The product dm+d/SNOMED CT code") - .schema(StringSchema()) - .example("39720311000001101")) - ) - oas.path("/FHIR/R4B/MedicinalProductDefinition/{id}",medicineReadItem) - - val medicinePackItem = PathItem() - .get( - Operation() - .addTagsItem(MEDICATION_DEFINITION) - .summary("A medically related item or items, in a container or package..") - .description("[Medication Definition Module](https://www.hl7.org/fhir/medication-definition-module.html)") - .responses(getApiResponses()) - .addParametersItem(Parameter() - .name("name") - .`in`("query") - .required(false) - .style(Parameter.StyleEnum.SIMPLE) - .description("A name for this package.") - .schema(StringSchema()) - .example("Methotrexate 5mg")) - ) - oas.path("/FHIR/R4B/PackagedProductDefinition",medicinePackItem) - - val medicinePackReadItem = PathItem() - .get( - Operation() - .addTagsItem(MEDICATION_DEFINITION) - .summary("EXPERIMENTAL A medically related item or items, in a container or package..") - .description("[Medication Definition Module](https://www.hl7.org/fhir/medication-definition-module.html)") - .responses(getApiResponses()) - .addParametersItem(Parameter() - .name("id") - .`in`("path") - .required(false) - .style(Parameter.StyleEnum.SIMPLE) - .description("The product pack dm+d/SNOMED CT code") - .schema(StringSchema()) - .example("1029811000001106")) - ) - oas.path("/FHIR/R4B/PackagedProductDefinition/{id}",medicinePackReadItem) - + if (servicesProperties.R4B) { + + // MEDICATION DEFINITION + + val medicineItem = PathItem() + .get( + Operation() + .addTagsItem(MEDICATION_DEFINITION) + .summary("EXPERIMENTAL A medicinal product, being a substance or combination of substances that is intended to treat, prevent or diagnose a disease, or to restore, correct or modify physiological functions by exerting a pharmacological, immunological or metabolic action.") + .description("[Medication Definition Module](https://www.hl7.org/fhir/medication-definition-module.html)") + .responses(getApiResponses()) + .addParametersItem( + Parameter() + .name("name") + .`in`("query") + .required(false) + .style(Parameter.StyleEnum.SIMPLE) + .description("The full product name") + .schema(StringSchema()) + .example("Methotrexate 5mg") + ) + ) + oas.path("/FHIR/R4B/MedicinalProductDefinition", medicineItem) + + val medicineReadItem = PathItem() + .get( + Operation() + .addTagsItem(MEDICATION_DEFINITION) + .summary("EXPERIMENTAL A medicinal product, being a substance or combination of substances that is intended to treat, prevent or diagnose a disease, or to restore, correct or modify physiological functions by exerting a pharmacological, immunological or metabolic action.") + .description("[Medication Definition Module](https://www.hl7.org/fhir/medication-definition-module.html)") + .responses(getApiResponses()) + .addParametersItem( + Parameter() + .name("id") + .`in`("path") + .required(false) + .style(Parameter.StyleEnum.SIMPLE) + .description("The product dm+d/SNOMED CT code") + .schema(StringSchema()) + .example("39720311000001101") + ) + ) + oas.path("/FHIR/R4B/MedicinalProductDefinition/{id}", medicineReadItem) + + val medicinePackItem = PathItem() + .get( + Operation() + .addTagsItem(MEDICATION_DEFINITION) + .summary("A medically related item or items, in a container or package..") + .description("[Medication Definition Module](https://www.hl7.org/fhir/medication-definition-module.html)") + .responses(getApiResponses()) + .addParametersItem( + Parameter() + .name("name") + .`in`("query") + .required(false) + .style(Parameter.StyleEnum.SIMPLE) + .description("A name for this package.") + .schema(StringSchema()) + .example("Methotrexate 5mg") + ) + ) + oas.path("/FHIR/R4B/PackagedProductDefinition", medicinePackItem) + + val medicinePackReadItem = PathItem() + .get( + Operation() + .addTagsItem(MEDICATION_DEFINITION) + .summary("EXPERIMENTAL A medically related item or items, in a container or package..") + .description("[Medication Definition Module](https://www.hl7.org/fhir/medication-definition-module.html)") + .responses(getApiResponses()) + .addParametersItem( + Parameter() + .name("id") + .`in`("path") + .required(false) + .style(Parameter.StyleEnum.SIMPLE) + .description("The product pack dm+d/SNOMED CT code") + .schema(StringSchema()) + .example("1029811000001106") + ) + ) + oas.path("/FHIR/R4B/PackagedProductDefinition/{id}", medicinePackReadItem) + } // Hidden oas.path("/FHIR/R4/metadata",PathItem() @@ -799,4 +817,24 @@ open class OpenApiConfig(@Qualifier("R4") val ctx : FhirContext) { .example(example))) return pathItem } + + fun getPackages() : String { + var packages = "" + val configurationInputStream = ClassPathResource("manifest.json").inputStream + val manifest = objectMapper.readValue(configurationInputStream, Array::class.java) + manifest.forEach { + packages += " | "+ it.packageName + " | " + it.version + " | " + if (it.packageName.contains("ukcore")) { + packages += "[UK Core Implementation Guide](https://simplifier.net/guide/ukcoreversionhistory?version=current)" + } else if (it.packageName.contains("diagnostics")) { + packages += "[NHS England Pathology Implementation Guide](https://simplifier.net/guide/pathology-fhir-implementation-guide)" + } else if (it.packageName.contains("eu.laboratory")) { + packages += "[https://build.fhir.org/ig/hl7-eu/laboratory/](https://build.fhir.org/ig/hl7-eu/laboratory/)" + } else if (it.packageName.contains("hl7.fhir.uv.ips")) { + packages += "[International Patient Summary Implementation Guide](https://build.fhir.org/ig/HL7/fhir-ips/)" + } + packages += " | \n" + } + return packages + } } diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/ServicesProperties.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/ServicesProperties.kt new file mode 100644 index 0000000..93afda4 --- /dev/null +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/ServicesProperties.kt @@ -0,0 +1,15 @@ +package uk.nhs.england.fhirvalidator.configuration + +import org.springframework.boot.context.properties.ConfigurationProperties +import org.springframework.boot.context.properties.ConstructorBinding + +@ConstructorBinding +@ConfigurationProperties(prefix = "services") +data class ServicesProperties( + var STU3: Boolean, + var R4: Boolean, + var LOINC: Boolean, + var R4B: Boolean +) { + +} diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/CapabilityStatementInterceptor.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/CapabilityStatementInterceptor.kt index 7fc2ccd..055cbff 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/CapabilityStatementInterceptor.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/CapabilityStatementInterceptor.kt @@ -53,7 +53,7 @@ class CapabilityStatementInterceptor( val packageExtension = Extension(); packageExtension.url="openApi" packageExtension.extension.add(Extension().setUrl("documentation").setValue(UriType("https://simplifier.net/guide/NHSDigital/Home"))) - packageExtension.extension.add(Extension().setUrl("description").setValue(StringType("NHS Digital FHIR Implementation Guide"))) + packageExtension.extension.add(Extension().setUrl("description").setValue(StringType("NHS England FHIR Implementation Guide"))) apiextension.extension.add(packageExtension) cs.extension.add(apiextension) diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/ValidateR4Provider.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/ValidateR4Provider.kt index 0b19cde..42885ed 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/ValidateR4Provider.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/ValidateR4Provider.kt @@ -13,6 +13,7 @@ import mu.KLogging import org.hl7.fhir.instance.model.api.IBaseResource import org.hl7.fhir.r4.hapi.ctx.HapiWorkerContext import org.hl7.fhir.r4.model.* +import org.hl7.fhir.r4.model.OperationOutcome.OperationOutcomeIssueComponent import org.hl7.fhir.r4.utils.FHIRPathEngine import org.springframework.beans.factory.annotation.Qualifier import org.springframework.stereotype.Component @@ -157,14 +158,36 @@ class ValidateR4Provider ( } fun validateResource(resource: IBaseResource, profile: String?): OperationOutcome? { - if (profile != null) return validator.validateWithResult(resource, ValidationOptions().addProfile(profile)) - .toOperationOutcome() as? OperationOutcome - capabilityStatementApplier.applyCapabilityStatementProfiles(resource) - val messageDefinitionErrors = messageDefinitionApplier.applyMessageDefinition(resource) - if (messageDefinitionErrors != null) { - return messageDefinitionErrors + var additionalIssues = ArrayList() + if (resource is Resource) { + if (resource.hasMeta() && resource.meta.hasProfile()) { + additionalIssues.add(OperationOutcome.OperationOutcomeIssueComponent() + .setSeverity(OperationOutcome.IssueSeverity.INFORMATION) + .setCode(OperationOutcome.IssueType.INFORMATIONAL) + .setDiagnostics("UK Core advice - population of meta.profile claims is not required for resource instances.") + ) + } + } + var result : OperationOutcome? = null + if (profile != null) { + result = validator.validateWithResult(resource, ValidationOptions().addProfile(profile)) + .toOperationOutcome() as? OperationOutcome + } else { + capabilityStatementApplier.applyCapabilityStatementProfiles(resource) + val messageDefinitionErrors = messageDefinitionApplier.applyMessageDefinition(resource) + if (messageDefinitionErrors != null) { + messageDefinitionErrors.issue.forEach{ + additionalIssues.add(it) + } + } + result = validator.validateWithResult(resource).toOperationOutcome() as? OperationOutcome + } + if (result !== null) { + additionalIssues.forEach{ + result.issue.add(it) + } } - return validator.validateWithResult(resource).toOperationOutcome() as? OperationOutcome + return result } fun getResourcesToValidate(inputResource: IBaseResource?): List { diff --git a/src/main/resources/Examples/Bundle-message-Diagnostics.json b/src/main/resources/Examples/Bundle-message-Diagnostics.json new file mode 100644 index 0000000..3101b8d --- /dev/null +++ b/src/main/resources/Examples/Bundle-message-Diagnostics.json @@ -0,0 +1,1190 @@ +{ + "resourceType": "Bundle", + "id": "path-R4-example-bundle-LFT-UandE-report", + "meta": { + "lastUpdated": "2022-03-08T14:23:00+00:00", + "profile": [ + "https://fhir.hl7.org.uk/StructureDefinition/UKCore-Bundle" + ] + }, + "identifier": { + "system": "https://tools.ietf.org/html/rfc4122", + "value": "d8d2d20e-8c44-466d-8640-7a516db7cd27" + }, + "type": "message", + "entry": [ + { + "fullUrl": "urn:uuid:f18a2226-c0ab-480d-b80a-b6561fe8f9c4", + "resource": { + "resourceType": "MessageHeader", + "id": "f18a2226-c0ab-480d-b80a-b6561fe8f9c4", + "meta": { + "profile": [ + "https://fhir.hl7.org.uk/StructureDefinition/UKCore-MessageHeader" + ] + }, + "eventCoding": { + "system": "https://fhir.nhs.uk/CodeSystem/message-event", + "code": "unsolicited-observations" + }, + "destination": [ + { + "name": "PICKERING MEDICAL PRACTICE", + "endpoint": "TBC", + "receiver": { + "reference": "urn:uuid:3c43b5b3-06d6-445f-ae9a-48d5f05df434" + } + } + ], + "sender": { + "reference": "urn:uuid:8a6d85b8-9837-4fed-a257-4cf207988338" + }, + "source": { + "endpoint": "TBC" + }, + "focus": [ + { + "reference": "urn:uuid:35d46ca1-f253-4c97-b7ee-fb5fccdf6c20" + } + ] + } + }, + { + "fullUrl": "urn:uuid:8a6d85b8-9837-4fed-a257-4cf207988338", + "resource": { + "resourceType": "Organization", + "id": "8a6d85b8-9837-4fed-a257-4cf207988338", + "meta": { + "profile": [ + "https://fhir.hl7.org.uk/StructureDefinition/UKCore-Organization" + ] + }, + "identifier": [ + { + "system": "https://fhir.nhs.uk/Id/ods-organization-code", + "value": "Y8J7D" + } + ], + "name": "TD008362 PATH LAB 001", + "address": [ + { + "line": [ + "PATHOLOGY LAB", + "7-8 WELLINGTON PLACE" + ], + "city": "LEEDS", + "district": "WEST YORKSHIRE", + "postalCode": "LS1 4AP" + } + ] + } + }, + { + "fullUrl": "urn:uuid:3c43b5b3-06d6-445f-ae9a-48d5f05df434", + "resource": { + "resourceType": "Organization", + "id": "3c43b5b3-06d6-445f-ae9a-48d5f05df434", + "meta": { + "profile": [ + "https://fhir.hl7.org.uk/StructureDefinition/UKCore-Organization" + ] + }, + "identifier": [ + { + "system": "https://fhir.nhs.uk/Id/ods-organization-code", + "value": "B82033" + } + ], + "name": "PICKERING MEDICAL PRACTICE", + "address": [ + { + "line": [ + "SOUTHGATE" + ], + "city": "PICKERING", + "district": "NORTH YORKSHIRE", + "postalCode": "YO18 8BL" + } + ] + } + }, + { + "fullUrl": "urn:uuid:9a835acf-d715-4d84-8dcf-a8435f6417fe", + "resource": { + "resourceType": "Practitioner", + "id": "9a835acf-d715-4d84-8dcf-a8435f6417fe", + "meta": { + "profile": [ + "https://fhir.hl7.org.uk/StructureDefinition/UKCore-Practitioner" + ] + }, + "identifier": [ + { + "system": "https://fhir.nhs.uk/Id/sds-user-id", + "value": "TBC" + } + ], + "name": [ + { + "use": "official", + "family": "GASKELL", + "given": [ + "Gale" + ], + "prefix": [ + "Dr" + ] + } + ] + } + }, + { + "fullUrl": "urn:uuid:ab87a3f8-1d37-44a9-804e-5e962598a6e4", + "resource": { + "resourceType": "Patient", + "id": "ab87a3f8-1d37-44a9-804e-5e962598a6e4", + "meta": { + "profile": [ + "https://fhir.hl7.org.uk/StructureDefinition/UKCore-Patient" + ] + }, + "identifier": [ + { + "extension": [ + { + "url": "https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSNumberVerificationStatus", + "valueCodeableConcept": { + "coding": [ + { + "system": "https://fhir.hl7.org.uk/CodeSystem/UKCore-NHSNumberVerificationStatus", + "code": "number-present-and-verified", + "display": "Number present and verified" + } + ] + } + } + ], + "system": "https://fhir.nhs.uk/Id/nhs-number", + "value": "9727710638" + } + ], + "name": [ + { + "use": "official", + "family": "WELSH", + "given": [ + "Joel" + ] + } + ], + "gender": "male", + "birthDate": "1972-08-23", + "address": [ + { + "line": [ + "ACONBURY", + "LARPOOL DRIVE" + ], + "district": "NORTH YORKSHIRE", + "postalCode": "YO22 4ND" + } + ] + } + }, + { + "fullUrl": "urn:uuid:1c38d507-9ad7-4b49-ba91-7da204842cac", + "resource": { + "resourceType": "ServiceRequest", + "id": "1c38d507-9ad7-4b49-ba91-7da204842cac", + "meta": { + "profile": [ + "https://fhir.hl7.org.uk/StructureDefinition/UKCore-ServiceRequest-Lab" + ] + }, + "identifier": [ + { + "system": "http://B82033-pickeringmedicalpractice.com/labrequest", + "value": "REQ-20220307-000046-001" + } + ], + "requisition": { + "system": "http://B82033-pickeringmedicalpractice.com/labrequest", + "value": "REQ-20220307-000046" + }, + "status": "active", + "intent": "order", + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "26958001", + "display": "Hepatic function panel" + } + ] + }, + "subject": { + "reference": "urn:uuid:ab87a3f8-1d37-44a9-804e-5e962598a6e4", + "display": "WELSH, Joel" + }, + "authoredOn": "2022-03-07T09:48:00+00:00", + "requester": { + "reference": "urn:uuid:9a835acf-d715-4d84-8dcf-a8435f6417fe", + "display": "GASKELL, Dr Gale" + }, + "performer": [ + { + "reference": "urn:uuid:8a6d85b8-9837-4fed-a257-4cf207988338", + "display": "TD008362 PATH LAB 001" + } + ] + } + }, + { + "fullUrl": "urn:uuid:8660ef6a-65ef-408f-92ce-b4d6d03d783c", + "resource": { + "resourceType": "ServiceRequest", + "id": "8660ef6a-65ef-408f-92ce-b4d6d03d783c", + "meta": { + "profile": [ + "https://fhir.hl7.org.uk/StructureDefinition/UKCore-ServiceRequest-Lab" + ] + }, + "identifier": [ + { + "system": "http://B82033-pickeringmedicalpractice.com/labrequest", + "value": "REQ-20220307-000046-002" + } + ], + "requisition": { + "system": "http://B82033-pickeringmedicalpractice.com/labrequest", + "value": "REQ-20220307-000046" + }, + "status": "active", + "intent": "order", + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "252167001", + "display": "Urea and electrolytes" + } + ] + }, + "subject": { + "reference": "urn:uuid:ab87a3f8-1d37-44a9-804e-5e962598a6e4", + "display": "WELSH, Joel" + }, + "authoredOn": "2022-03-07T09:48:00+00:00", + "requester": { + "reference": "urn:uuid:9a835acf-d715-4d84-8dcf-a8435f6417fe", + "display": "GASKELL, Gale" + }, + "performer": [ + { + "reference": "urn:uuid:8a6d85b8-9837-4fed-a257-4cf207988338", + "display": "TD008362 PATH LAB 001" + } + ] + } + }, + { + "fullUrl": "urn:uuid:35d46ca1-f253-4c97-b7ee-fb5fccdf6c20", + "resource": { + "resourceType": "DiagnosticReport", + "id": "35d46ca1-f253-4c97-b7ee-fb5fccdf6c20", + "meta": { + "profile": [ + "https://fhir.hl7.org.uk/StructureDefinition/UKCore-DiagnosticReport-Lab" + ] + }, + "identifier": [ + { + "system": "http://Y8J7D-pathlab001.com/report", + "value": "REP-20220308-008902" + } + ], + "basedOn": [ + { + "reference": "urn:uuid:1c38d507-9ad7-4b49-ba91-7da204842cac" + }, + { + "reference": "urn:uuid:8660ef6a-65ef-408f-92ce-b4d6d03d783c" + } + ], + "status": "final", + "category": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/v2-0074", + "code": "LAB", + "display": "Laboratory" + } + ] + } + ], + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "721981007", + "display": "Diagnostic studies report" + } + ] + }, + "subject": { + "reference": "urn:uuid:ab87a3f8-1d37-44a9-804e-5e962598a6e4", + "display": "WELSH, Joel" + }, + "issued": "2022-03-08T14:23:00+00:00", + "performer": [ + { + "reference": "urn:uuid:8a6d85b8-9837-4fed-a257-4cf207988338", + "display": "TD008362 PATH LAB 001" + } + ], + "specimen": [ + { + "reference": "urn:uuid:bab0eaec-1ec5-4598-b660-90bb38a1030d" + } + ], + "result": [ + { + "reference": "urn:uuid:33a88119-6dbc-4bdf-809a-c1d822b74e90" + }, + { + "reference": "urn:uuid:a5c7f5e2-eb95-469b-b588-f7861c260ccb" + } + ] + } + }, + { + "fullUrl": "urn:uuid:bab0eaec-1ec5-4598-b660-90bb38a1030d", + "resource": { + "resourceType": "Specimen", + "id": "bab0eaec-1ec5-4598-b660-90bb38a1030d", + "meta": { + "profile": [ + "https://fhir.hl7.org.uk/StructureDefinition/UKCore-Specimen" + ] + }, + "identifier": [ + { + "system": "http://B82033-pickeringmedicalpractice.com/specimen", + "value": "SPC-REQ-20220307-000014" + } + ], + "accessionIdentifier": { + "system": "http://Y8J7D-pathlab001.com/specimen", + "value": "SPC-LAB-20220307-007856" + }, + "status": "available", + "type": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "122555007", + "display": "Venous blood specimen" + } + ] + }, + "subject": { + "reference": "urn:uuid:ab87a3f8-1d37-44a9-804e-5e962598a6e4", + "display": "WELSH, Joel" + }, + "receivedTime": "2022-03-07T14:54:00+00:00", + "request": [ + { + "reference": "urn:uuid:bab0eaec-1ec5-4598-b660-90bb38a1030d" + } + ], + "collection": { + "collectedDateTime": "2022-03-07T10:02:00+00:00" + } + } + }, + { + "fullUrl": "urn:uuid:33a88119-6dbc-4bdf-809a-c1d822b74e90", + "resource": { + "resourceType": "Observation", + "id": "33a88119-6dbc-4bdf-809a-c1d822b74e90", + "meta": { + "profile": [ + "https://fhir.hl7.org.uk/StructureDefinition/UKCore-Observation-LabGroup" + ] + }, + "identifier": [ + { + "system": "https://tools.ietf.org/html/rfc4122", + "value": "9920b5d3-9f19-41df-8d5a-fd2d4288e305" + } + ], + "status": "final", + "category": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + } + ] + } + ], + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "26958001", + "display": "Hepatic function panel" + } + ] + }, + "subject": { + "reference": "urn:uuid:ab87a3f8-1d37-44a9-804e-5e962598a6e4", + "display": "WELSH, Joel" + }, + "issued": "2022-03-08T14:23:00+00:00", + "performer": [ + { + "reference": "urn:uuid:8a6d85b8-9837-4fed-a257-4cf207988338", + "display": "TD008362 PATH LAB 001" + } + ], + "hasMember": [ + { + "reference": "urn:uuid:47faffbf-34c0-45b2-9c65-285f89fd1521" + }, + { + "reference": "urn:uuid:a0a65e1f-8aba-47a7-ab20-014f2943e7dd" + }, + { + "reference": "urn:uuid:aa8aa37b-3a69-478f-a2be-947af624d7cb" + }, + { + "reference": "urn:uuid:3f98327b-f215-4bc5-bd52-ed6477a3da4a" + } + ] + } + }, + { + "fullUrl": "urn:uuid:47faffbf-34c0-45b2-9c65-285f89fd1521", + "resource": { + "resourceType": "Observation", + "id": "47faffbf-34c0-45b2-9c65-285f89fd1521", + "meta": { + "profile": [ + "https://fhir.hl7.org.uk/StructureDefinition/UKCore-Observation-Lab" + ] + }, + "identifier": [ + { + "system": "https://tools.ietf.org/html/rfc4122", + "value": "a26ada79-ac32-4ff8-a3e4-fb5950462271" + } + ], + "status": "final", + "category": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + } + ] + } + ], + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "1107221000000109", + "display": "Total bilirubin substance concentration in serum" + } + ] + }, + "subject": { + "reference": "urn:uuid:ab87a3f8-1d37-44a9-804e-5e962598a6e4", + "display": "WELSH, Joel" + }, + "issued": "2022-03-08T14:23:00+00:00", + "performer": [ + { + "reference": "urn:uuid:8a6d85b8-9837-4fed-a257-4cf207988338", + "display": "TD008362 PATH LAB 001" + } + ], + "valueQuantity": { + "value": 6, + "unit": "umol/L", + "system": "http://unitsofmeasure.org", + "code": "umol/L" + }, + "specimen": { + "reference": "urn:uuid:bab0eaec-1ec5-4598-b660-90bb38a1030d" + }, + "referenceRange": [ + { + "high": { + "value": 21, + "unit": "umol/L", + "system": "http://unitsofmeasure.org", + "code": "umol/L" + } + } + ] + } + }, + { + "fullUrl": "urn:uuid:a0a65e1f-8aba-47a7-ab20-014f2943e7dd", + "resource": { + "resourceType": "Observation", + "id": "a0a65e1f-8aba-47a7-ab20-014f2943e7dd", + "meta": { + "profile": [ + "https://fhir.hl7.org.uk/StructureDefinition/UKCore-Observation-Lab" + ] + }, + "identifier": [ + { + "system": "https://tools.ietf.org/html/rfc4122", + "value": "78443cb9-f248-44ef-9e6b-37fc4a592c1b" + } + ], + "status": "final", + "category": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + } + ] + } + ], + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "1105861000000106", + "display": "Albumin mass concentration in serum" + } + ] + }, + "subject": { + "reference": "urn:uuid:ab87a3f8-1d37-44a9-804e-5e962598a6e4", + "display": "WELSH, Joel" + }, + "issued": "2022-03-08T14:23:00+00:00", + "performer": [ + { + "reference": "urn:uuid:8a6d85b8-9837-4fed-a257-4cf207988338", + "display": "TD008362 PATH LAB 001" + } + ], + "valueQuantity": { + "value": 47, + "unit": "g/L", + "system": "http://unitsofmeasure.org", + "code": "g/L" + }, + "specimen": { + "reference": "urn:uuid:bab0eaec-1ec5-4598-b660-90bb38a1030d" + }, + "referenceRange": [ + { + "low": { + "value": 35, + "unit": "g/L", + "system": "http://unitsofmeasure.org", + "code": "g/L" + }, + "high": { + "value": 50, + "unit": "g/L", + "system": "http://unitsofmeasure.org", + "code": "g/L" + } + } + ] + } + }, + { + "fullUrl": "urn:uuid:aa8aa37b-3a69-478f-a2be-947af624d7cb", + "resource": { + "resourceType": "Observation", + "id": "aa8aa37b-3a69-478f-a2be-947af624d7cb", + "meta": { + "profile": [ + "https://fhir.hl7.org.uk/StructureDefinition/UKCore-Observation-Lab" + ] + }, + "identifier": [ + { + "system": "https://tools.ietf.org/html/rfc4122", + "value": "b9c64863-06b5-4e98-b226-8ef28059f238" + } + ], + "status": "final", + "category": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + } + ] + } + ], + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "1106051000000106", + "display": "Alkaline phosphatase enzyme activity in serum" + } + ] + }, + "subject": { + "reference": "urn:uuid:ab87a3f8-1d37-44a9-804e-5e962598a6e4", + "display": "WELSH, Joel" + }, + "issued": "2022-03-08T14:23:00+00:00", + "performer": [ + { + "reference": "urn:uuid:8a6d85b8-9837-4fed-a257-4cf207988338", + "display": "TD008362 PATH LAB 001" + } + ], + "valueQuantity": { + "value": 96, + "unit": "iu/L", + "system": "http://unitsofmeasure.org", + "code": "[iU]/L" + }, + "specimen": { + "reference": "urn:uuid:bab0eaec-1ec5-4598-b660-90bb38a1030d" + }, + "referenceRange": [ + { + "low": { + "value": 30, + "unit": "iu/L", + "system": "http://unitsofmeasure.org", + "code": "[iU]/L" + }, + "high": { + "value": 130, + "unit": "iu/L", + "system": "http://unitsofmeasure.org", + "code": "[iU]/L" + } + } + ] + } + }, + { + "fullUrl": "urn:uuid:3f98327b-f215-4bc5-bd52-ed6477a3da4a", + "resource": { + "resourceType": "Observation", + "id": "3f98327b-f215-4bc5-bd52-ed6477a3da4a", + "meta": { + "profile": [ + "https://fhir.hl7.org.uk/StructureDefinition/UKCore-Observation-Lab" + ] + }, + "identifier": [ + { + "system": "https://tools.ietf.org/html/rfc4122", + "value": "9f022172-f721-4657-ab23-a28157e783af" + } + ], + "status": "final", + "category": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + } + ] + } + ], + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "1106081000000100", + "display": "Alanine aminotransferase enzyme activity in serum" + } + ] + }, + "subject": { + "reference": "urn:uuid:ab87a3f8-1d37-44a9-804e-5e962598a6e4", + "display": "WELSH, Joel" + }, + "issued": "2022-03-08T14:23:00+00:00", + "performer": [ + { + "reference": "urn:uuid:8a6d85b8-9837-4fed-a257-4cf207988338", + "display": "TD008362 PATH LAB 001" + } + ], + "valueQuantity": { + "value": 15, + "unit": "iu/L", + "system": "http://unitsofmeasure.org", + "code": "[iU]/L" + }, + "specimen": { + "reference": "urn:uuid:bab0eaec-1ec5-4598-b660-90bb38a1030d" + }, + "referenceRange": [ + { + "high": { + "value": 40, + "unit": "iu/L", + "system": "http://unitsofmeasure.org", + "code": "[iU]/L" + } + } + ] + } + }, + { + "fullUrl": "urn:uuid:a5c7f5e2-eb95-469b-b588-f7861c260ccb", + "resource": { + "resourceType": "Observation", + "id": "a5c7f5e2-eb95-469b-b588-f7861c260ccb", + "meta": { + "profile": [ + "https://fhir.hl7.org.uk/StructureDefinition/UKCore-Observation-LabGroup" + ] + }, + "identifier": [ + { + "system": "https://tools.ietf.org/html/rfc4122", + "value": "c949a08a-49f9-4093-9f17-67d23ec92e46" + } + ], + "status": "final", + "category": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + } + ] + } + ], + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "26958001", + "display": "Hepatic function panel" + } + ] + }, + "subject": { + "reference": "urn:uuid:ab87a3f8-1d37-44a9-804e-5e962598a6e4", + "display": "WELSH, Joel" + }, + "issued": "2022-03-08T14:23:00+00:00", + "performer": [ + { + "reference": "urn:uuid:8a6d85b8-9837-4fed-a257-4cf207988338", + "display": "TD008362 PATH LAB 001" + } + ], + "hasMember": [ + { + "reference": "urn:uuid:c6989afa-156a-4f7e-ab91-d4249680d8bf" + }, + { + "reference": "urn:uuid:f5a0e88f-a76a-4526-8927-579771471c58" + }, + { + "reference": "urn:uuid:aa2151a3-3f5b-4f0d-9074-52563aa77c6c" + }, + { + "reference": "urn:uuid:3c6b11c8-83b6-4402-90b9-2e1e7400d7cc" + }, + { + "reference": "urn:uuid:e6127f03-4a96-45d3-abd8-1adcf0189be4" + } + ] + } + }, + { + "fullUrl": "urn:uuid:c6989afa-156a-4f7e-ab91-d4249680d8bf", + "resource": { + "resourceType": "Observation", + "id": "c6989afa-156a-4f7e-ab91-d4249680d8bf", + "meta": { + "profile": [ + "https://fhir.hl7.org.uk/StructureDefinition/UKCore-Observation-Lab" + ] + }, + "identifier": [ + { + "system": "https://tools.ietf.org/html/rfc4122", + "value": "ac255464-4557-40ee-8f53-ef3104b10872" + } + ], + "status": "final", + "category": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + } + ] + } + ], + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "1110281000000107", + "display": "Urea substance concentration in serum" + } + ] + }, + "subject": { + "reference": "urn:uuid:ab87a3f8-1d37-44a9-804e-5e962598a6e4", + "display": "WELSH, Joel" + }, + "issued": "2022-03-08T14:23:00+00:00", + "performer": [ + { + "reference": "urn:uuid:8a6d85b8-9837-4fed-a257-4cf207988338", + "display": "TD008362 PATH LAB 001" + } + ], + "valueQuantity": { + "value": 3.7, + "unit": "mmol/L", + "system": "http://unitsofmeasure.org", + "code": "mmol/L" + }, + "specimen": { + "reference": "urn:uuid:bab0eaec-1ec5-4598-b660-90bb38a1030d" + }, + "referenceRange": [ + { + "low": { + "value": 2.5, + "unit": "mmol/L", + "system": "http://unitsofmeasure.org", + "code": "mmol/L" + }, + "high": { + "value": 7.8, + "unit": "mmol/L", + "system": "http://unitsofmeasure.org", + "code": "mmol/L" + } + } + ] + } + }, + { + "fullUrl": "urn:uuid:f5a0e88f-a76a-4526-8927-579771471c58", + "resource": { + "resourceType": "Observation", + "id": "f5a0e88f-a76a-4526-8927-579771471c58", + "meta": { + "profile": [ + "https://fhir.hl7.org.uk/StructureDefinition/UKCore-Observation-Lab" + ] + }, + "identifier": [ + { + "system": "https://tools.ietf.org/html/rfc4122", + "value": "b1890fe7-ef3b-4d74-bc2f-665059d0c9d7" + } + ], + "status": "final", + "category": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + } + ] + } + ], + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "1107871000000107", + "display": "Sodium substance concentration in serum" + } + ] + }, + "subject": { + "reference": "urn:uuid:ab87a3f8-1d37-44a9-804e-5e962598a6e4", + "display": "WELSH, Joel" + }, + "issued": "2022-03-08T14:23:00+00:00", + "performer": [ + { + "reference": "urn:uuid:8a6d85b8-9837-4fed-a257-4cf207988338", + "display": "TD008362 PATH LAB 001" + } + ], + "valueQuantity": { + "value": 139, + "unit": "mmol/L", + "system": "http://unitsofmeasure.org", + "code": "mmol/L" + }, + "specimen": { + "reference": "urn:uuid:bab0eaec-1ec5-4598-b660-90bb38a1030d" + }, + "referenceRange": [ + { + "low": { + "value": 133, + "unit": "mmol/L", + "system": "http://unitsofmeasure.org", + "code": "mmol/L" + }, + "high": { + "value": 146, + "unit": "mmol/L", + "system": "http://unitsofmeasure.org", + "code": "mmol/L" + } + } + ] + } + }, + { + "fullUrl": "urn:uuid:aa2151a3-3f5b-4f0d-9074-52563aa77c6c", + "resource": { + "resourceType": "Observation", + "id": "aa2151a3-3f5b-4f0d-9074-52563aa77c6c", + "meta": { + "profile": [ + "https://fhir.hl7.org.uk/StructureDefinition/UKCore-Observation-Lab" + ] + }, + "identifier": [ + { + "system": "https://tools.ietf.org/html/rfc4122", + "value": "b88011a3-e10b-4f35-b388-5622c4e8d808" + } + ], + "status": "final", + "category": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + } + ] + } + ], + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "1107751000000106", + "display": "Potassium substance concentration in plasma" + } + ] + }, + "subject": { + "reference": "urn:uuid:ab87a3f8-1d37-44a9-804e-5e962598a6e4", + "display": "WELSH, Joel" + }, + "issued": "2022-03-08T14:23:00+00:00", + "performer": [ + { + "reference": "urn:uuid:8a6d85b8-9837-4fed-a257-4cf207988338", + "display": "TD008362 PATH LAB 001" + } + ], + "valueQuantity": { + "value": 4.7, + "unit": "mmol/L", + "system": "http://unitsofmeasure.org", + "code": "mmol/L" + }, + "specimen": { + "reference": "urn:uuid:bab0eaec-1ec5-4598-b660-90bb38a1030d" + }, + "referenceRange": [ + { + "low": { + "value": 3.5, + "unit": "mmol/L", + "system": "http://unitsofmeasure.org", + "code": "mmol/L" + }, + "high": { + "value": 5.3, + "unit": "mmol/L", + "system": "http://unitsofmeasure.org", + "code": "mmol/L" + } + } + ] + } + }, + { + "fullUrl": "urn:uuid:3c6b11c8-83b6-4402-90b9-2e1e7400d7cc", + "resource": { + "resourceType": "Observation", + "id": "3c6b11c8-83b6-4402-90b9-2e1e7400d7cc", + "meta": { + "profile": [ + "https://fhir.hl7.org.uk/StructureDefinition/UKCore-Observation-Lab" + ] + }, + "identifier": [ + { + "system": "https://tools.ietf.org/html/rfc4122", + "value": "86fb479a-ab58-4f99-81de-af848d9af40c" + } + ], + "status": "final", + "category": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + } + ] + } + ], + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "1107001000000108", + "display": "Creatinine substance concentration in serum" + } + ] + }, + "subject": { + "reference": "urn:uuid:ab87a3f8-1d37-44a9-804e-5e962598a6e4", + "display": "WELSH, Joel" + }, + "issued": "2022-03-08T14:23:00+00:00", + "performer": [ + { + "reference": "urn:uuid:8a6d85b8-9837-4fed-a257-4cf207988338", + "display": "TD008362 PATH LAB 001" + } + ], + "valueQuantity": { + "value": 73, + "unit": "umol/L", + "system": "http://unitsofmeasure.org", + "code": "umol/L" + }, + "specimen": { + "reference": "urn:uuid:bab0eaec-1ec5-4598-b660-90bb38a1030d" + }, + "referenceRange": [ + { + "low": { + "value": 59, + "unit": "umol/L", + "system": "http://unitsofmeasure.org", + "code": "umol/L" + }, + "high": { + "value": 104, + "unit": "umol/L", + "system": "http://unitsofmeasure.org", + "code": "umol/L" + } + } + ] + } + }, + { + "fullUrl": "urn:uuid:e6127f03-4a96-45d3-abd8-1adcf0189be4", + "resource": { + "resourceType": "Observation", + "id": "e6127f03-4a96-45d3-abd8-1adcf0189be4", + "meta": { + "profile": [ + "https://fhir.hl7.org.uk/StructureDefinition/UKCore-Observation-Lab" + ] + }, + "identifier": [ + { + "system": "https://tools.ietf.org/html/rfc4122", + "value": "c6d25926-fb74-400b-98b8-47ae7393f127" + } + ], + "status": "final", + "category": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + } + ] + } + ], + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "1011481000000105", + "display": "eGFR (estimated glomerular filtration rate) using creatinine Chronic Kidney Disease Epidemiology Collaboration equation per 1.73 square metres" + } + ] + }, + "subject": { + "reference": "urn:uuid:ab87a3f8-1d37-44a9-804e-5e962598a6e4", + "display": "WELSH, Joel" + }, + "issued": "2022-03-08T14:23:00+00:00", + "performer": [ + { + "reference": "urn:uuid:8a6d85b8-9837-4fed-a257-4cf207988338", + "display": "TD008362 PATH LAB 001" + } + ], + "valueQuantity": { + "value": 100, + "unit": "mL/min/1.73m2", + "system": "http://unitsofmeasure.org", + "code": "mL/min/((173/100).m2)" + }, + "note": [ + { + "text": "Calculated eGFR is not valid in children or pregnancy.\nLess accurate with acute change in creatinine (AKI).\nCaution with high or low muscle mass or amputation.\nAvoid blood sampling within 12 hours of eating meat.\nEthnicity factor comment removed Dec21 NG203." + } + ], + "specimen": { + "reference": "urn:uuid:bab0eaec-1ec5-4598-b660-90bb38a1030d" + } + } + } + ] +} diff --git a/src/main/resources/Examples/Bundle-message-ORU-R01.json b/src/main/resources/Examples/Bundle-message-ORU-R01.json new file mode 100644 index 0000000..99a7583 --- /dev/null +++ b/src/main/resources/Examples/Bundle-message-ORU-R01.json @@ -0,0 +1,800 @@ +{ + "resourceType": "Bundle", + "identifier": { + "system": "https://tools.ietf.org/html/rfc4122", + "value": "889fb12f-1318-4816-bf42-2a80e706743c" + }, + "type": "message", + "entry": [ + { + "fullUrl": "urn:uuid:f18a2226-c0ab-480d-b80a-b6561fe8f9c4", + "resource": { + "resourceType": "MessageHeader", + "id": "f18a2226-c0ab-480d-b80a-b6561fe8f9c4", + "eventCoding": { + "system": "https://fhir.nhs.uk/CodeSystem/message-event", + "code": "unsolicited-observations" + }, + "destination": [ + { + "name": "PICKERING MEDICAL PRACTICE", + "endpoint": "TBC" + } + ], + "source": { + "endpoint": "TBC" + }, + "focus": [ + { + "reference": "urn:uuid:f8684a34-e056-4576-8f23-cd8e433c7183" + }, + { + "reference": "urn:uuid:a82cf83a-8c6a-4cd9-933e-9434b3a296a2" + } + ] + } + }, + { + "fullUrl": "urn:uuid:a26cc7ff-c97b-4c7e-a2d1-b906fa704588", + "resource": { + "resourceType": "Patient", + "identifier": [ + { + "system": "https://cardiff.nhs.uk/Id/mrn", + "value": "403281375" + }, + { + "system": "https://fhir.nhs.uk/Id/nhs-number", + "value": "5189214567" + } + ], + "name": [ + { + "family": "Bloggs", + "given": [ + "Joe" + ], + "prefix": [ + "Mr" + ] + } + ], + "birthDate": "2001-03-28", + "address": [ + { + "city": "Baglan", + "district": "Neath port talbot", + "postalCode": "SA12 7BR" + } + ] + } + }, + { + "fullUrl": "urn:uuid:5e66d610-f72a-472c-b459-e04eb3e043a4", + "resource": { + "resourceType": "Encounter", + "identifier": [ + { + "value": "914694928301" + } + ], + "status": "in-progress", + "class": { + "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode", + "code": "AMB", + "display": "ambulatory" + }, + "subject": { + "identifier": { + "system": "https://fhir.nhs.uk/Id/nhs-number", + "value": "5189214567" + } + } + } + }, + { + "fullUrl": "urn:uuid:46422a30-7431-43e8-8d87-21cd8606d478", + "resource": { + "resourceType": "ServiceRequest", + "identifier": [ + { + "type": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "FILL" + } + ] + }, + "value": "914694928301" + } + ], + "status": "active", + "intent": "order", + "priority": "stat", + "code": { + "coding": [ + { + "code": "B3051", + "display": "HbA1c (IFCC traceable)" + } + ] + }, + "orderDetail": [ + { + "coding": [ + { + "code": "B3051", + "display": "HbA1c (IFCC traceable)" + } + ] + }, + { + "coding": [ + { + "code": "B0001", + "display": "Full blood count" + } + ] + } + ], + "subject": { + "reference": "urn:uuid:a26cc7ff-c97b-4c7e-a2d1-b906fa704588" + }, + "occurrencePeriod": { + "start": "2018-03-09T14:00:00+00:00", + "end": "2018-03-09T15:00:00+00:00" + }, + "requester": { + "display": "Dr Andar Gunneberg" + } + } + }, + { + "fullUrl": "urn:uuid:f8684a34-e056-4576-8f23-cd8e433c7183", + "resource": { + "resourceType": "DiagnosticReport", + "extension": [ + { + "url": "http://hl7.org/fhir/5.0/StructureDefinition/extension-DiagnosticReport.note", + "valueAnnotation": { + "text": "For monitoring known diabetic patients, please follow NICE guidelines. If not a known diabetic and the patient is asymptomatic, a second confirmatory sample is required within 2 weeks (WEDS Guidance). HbA1c is unreliable for diagnostic and monitoring purposes in the context of several conditions, including some haemoglobinopathies, abnormal haemoglobin levels, chronic renal failure, recent transfusion, pregnancy, or alcoholism./r" + } + } + ], + "identifier": [ + { + "value": "914694928301-1" + } + ], + "basedOn": [ + { + "reference": "urn:uuid:46422a30-7431-43e8-8d87-21cd8606d478", + "type": "ServiceRequest", + "identifier": { + "type": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "FILL" + } + ] + }, + "value": "914694928301" + } + } + ], + "status": "final", + "category": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/v2-0074", + "code": "LAB" + } + ] + } + ], + "code": { + "coding": [ + { + "code": "B3051", + "display": "HbA1c (IFCC traceable)" + } + ] + }, + "subject": { + "reference": "urn:uuid:a26cc7ff-c97b-4c7e-a2d1-b906fa704588" + }, + "encounter": { + "reference": "urn:uuid:5e66d610-f72a-472c-b459-e04eb3e043a4" + }, + "effectiveDateTime": "2018-03-09T15:00:00+00:00", + "performer": [ + { + "display": "ABM: Angharad Shore" + } + ], + "result": [ + { + "reference": "urn:uuid:9bf0cef4-90f9-474d-8d9a-1b24021ff58c" + } + ] + } + }, + { + "fullUrl": "urn:uuid:9bf0cef4-90f9-474d-8d9a-1b24021ff58c", + "resource": { + "resourceType": "Observation", + "identifier": [ + { + "value": "914694928301-1-1" + } + ], + "status": "final", + "category": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + } + ] + } + ], + "code": { + "coding": [ + { + "code": "B3553", + "display": "HbA1c (IFCC traceable)" + } + ] + }, + "subject": { + "reference": "urn:uuid:a26cc7ff-c97b-4c7e-a2d1-b906fa704588" + }, + "encounter": { + "reference": "urn:uuid:5e66d610-f72a-472c-b459-e04eb3e043a4" + }, + "effectiveDateTime": "2018-03-09T15:00:00+00:00", + "valueQuantity": { + "value": 49, + "unit": "mmol/mol" + }, + "interpretation": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation", + "code": "H", + "display": "High" + } + ] + } + ], + "referenceRange": [ + { + "text": "<48" + } + ] + } + }, + { + "fullUrl": "urn:uuid:ea538cd0-3dc9-4979-927f-d92e6c758492", + "resource": { + "resourceType": "Specimen", + "accessionIdentifier": { + "value": "9146949283" + }, + "type": { + "coding": [ + { + "code": "BLOO", + "display": "Blood" + } + ] + }, + "subject": { + "reference": "urn:uuid:a26cc7ff-c97b-4c7e-a2d1-b906fa704588" + }, + "collection": { + "collectedDateTime": "2018-03-09T14:00:00+00:00" + } + } + }, + { + "fullUrl": "urn:uuid:a82cf83a-8c6a-4cd9-933e-9434b3a296a2", + "resource": { + "resourceType": "DiagnosticReport", + "identifier": [ + { + "value": "914694928301-2" + } + ], + "basedOn": [ + { + "reference": "urn:uuid:46422a30-7431-43e8-8d87-21cd8606d478", + "type": "ServiceRequest", + "identifier": { + "type": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "FILL" + } + ] + }, + "value": "914694928301" + } + } + ], + "status": "final", + "category": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/v2-0074", + "code": "LAB" + } + ] + } + ], + "code": { + "coding": [ + { + "code": "B0001", + "display": "Full blood count" + } + ] + }, + "subject": { + "reference": "urn:uuid:a26cc7ff-c97b-4c7e-a2d1-b906fa704588" + }, + "encounter": { + "reference": "urn:uuid:5e66d610-f72a-472c-b459-e04eb3e043a4" + }, + "effectiveDateTime": "2018-03-09T15:00:00+00:00", + "performer": [ + { + "display": "ABM: Carl Owen" + } + ], + "specimen": [ + { + "reference": "urn:uuid:ea538cd0-3dc9-4979-927f-d92e6c758492" + } + ], + "result": [ + { + "reference": "urn:uuid:acd3687b-3419-488d-af10-acd4a65adee1" + }, + { + "reference": "urn:uuid:199eb5d1-0ef1-45d3-8603-e386e0eadf1f" + }, + { + "reference": "urn:uuid:142454e9-d444-4610-9588-10f1c0ac0181" + }, + { + "reference": "urn:uuid:013ededa-e403-4799-b944-be0131d30a7d" + }, + { + "reference": "urn:uuid:9f095865-a743-4a64-b9c8-84f335a2912f" + }, + { + "reference": "urn:uuid:f16ba7d2-93ec-4c2f-abca-75ed4ca59df5" + }, + { + "reference": "urn:uuid:609fe923-e837-4799-8d44-1371ed2de9cc" + } + ] + } + }, + { + "fullUrl": "urn:uuid:acd3687b-3419-488d-af10-acd4a65adee1", + "resource": { + "resourceType": "Observation", + "identifier": [ + { + "value": "914694928301-2-1" + } + ], + "status": "final", + "category": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + } + ] + } + ], + "code": { + "coding": [ + { + "code": "B0300", + "display": "White blood cell (WBC) count" + } + ] + }, + "subject": { + "reference": "urn:uuid:a26cc7ff-c97b-4c7e-a2d1-b906fa704588" + }, + "encounter": { + "reference": "urn:uuid:5e66d610-f72a-472c-b459-e04eb3e043a4" + }, + "effectiveDateTime": "2018-03-09T15:00:00+00:00", + "valueQuantity": { + "value": 3.5, + "unit": "x10^9/L" + }, + "interpretation": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation", + "code": "L", + "display": "Low" + } + ] + } + ], + "referenceRange": [ + { + "text": "4.0-11.0" + } + ] + } + }, + { + "fullUrl": "urn:uuid:199eb5d1-0ef1-45d3-8603-e386e0eadf1f", + "resource": { + "resourceType": "Observation", + "identifier": [ + { + "value": "914694928301-2-2" + } + ], + "status": "final", + "category": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + } + ] + } + ], + "code": { + "coding": [ + { + "code": "B0307", + "display": "Haemoglobin (Hb)" + } + ] + }, + "subject": { + "reference": "urn:uuid:a26cc7ff-c97b-4c7e-a2d1-b906fa704588" + }, + "encounter": { + "reference": "urn:uuid:5e66d610-f72a-472c-b459-e04eb3e043a4" + }, + "effectiveDateTime": "2018-03-09T15:00:00+00:00", + "valueQuantity": { + "value": 200, + "unit": "g/L" + }, + "interpretation": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation", + "code": "H", + "display": "High" + } + ] + } + ], + "referenceRange": [ + { + "text": "130-180" + } + ] + } + }, + { + "fullUrl": "urn:uuid:142454e9-d444-4610-9588-10f1c0ac0181", + "resource": { + "resourceType": "Observation", + "identifier": [ + { + "value": "914694928301-2-3" + } + ], + "status": "final", + "category": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + } + ] + } + ], + "code": { + "coding": [ + { + "code": "B0314", + "display": "Platelet (PLT) count" + } + ] + }, + "subject": { + "reference": "urn:uuid:a26cc7ff-c97b-4c7e-a2d1-b906fa704588" + }, + "encounter": { + "reference": "urn:uuid:5e66d610-f72a-472c-b459-e04eb3e043a4" + }, + "effectiveDateTime": "2018-03-09T15:00:00+00:00", + "valueQuantity": { + "value": 500, + "unit": "x10^9/L" + }, + "interpretation": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation", + "code": "H", + "display": "High" + } + ] + } + ], + "referenceRange": [ + { + "text": "150-400" + } + ] + } + }, + { + "fullUrl": "urn:uuid:013ededa-e403-4799-b944-be0131d30a7d", + "resource": { + "resourceType": "Observation", + "identifier": [ + { + "value": "914694928301-2-4" + } + ], + "status": "final", + "category": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + } + ] + } + ], + "code": { + "coding": [ + { + "code": "B0306", + "display": "Red blood cell (RBC) count" + } + ] + }, + "subject": { + "reference": "urn:uuid:a26cc7ff-c97b-4c7e-a2d1-b906fa704588" + }, + "encounter": { + "reference": "urn:uuid:5e66d610-f72a-472c-b459-e04eb3e043a4" + }, + "effectiveDateTime": "2018-03-09T15:00:00+00:00", + "valueQuantity": { + "value": 6, + "unit": "x10^12/L" + }, + "interpretation": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation", + "code": "N", + "display": "Normal" + } + ] + } + ], + "referenceRange": [ + { + "text": "4.50-6.00" + } + ] + } + }, + { + "fullUrl": "urn:uuid:9f095865-a743-4a64-b9c8-84f335a2912f", + "resource": { + "resourceType": "Observation", + "identifier": [ + { + "value": "914694928301-2-5" + } + ], + "status": "final", + "category": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + } + ] + } + ], + "code": { + "coding": [ + { + "code": "B0308", + "display": "Haematocrit (Hct)" + } + ] + }, + "subject": { + "reference": "urn:uuid:a26cc7ff-c97b-4c7e-a2d1-b906fa704588" + }, + "encounter": { + "reference": "urn:uuid:5e66d610-f72a-472c-b459-e04eb3e043a4" + }, + "effectiveDateTime": "2018-03-09T15:00:00+00:00", + "valueQuantity": { + "value": 0.6, + "unit": "L/L" + }, + "interpretation": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation", + "code": "H", + "display": "High" + } + ] + } + ], + "referenceRange": [ + { + "text": "0.40-0.52" + } + ] + } + }, + { + "fullUrl": "urn:uuid:f16ba7d2-93ec-4c2f-abca-75ed4ca59df5", + "resource": { + "resourceType": "Observation", + "identifier": [ + { + "value": "914694928301-2-6" + } + ], + "status": "final", + "category": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + } + ] + } + ], + "code": { + "coding": [ + { + "code": "B0309", + "display": "Mean cell volume (MCV)" + } + ] + }, + "subject": { + "reference": "urn:uuid:a26cc7ff-c97b-4c7e-a2d1-b906fa704588" + }, + "encounter": { + "reference": "urn:uuid:5e66d610-f72a-472c-b459-e04eb3e043a4" + }, + "effectiveDateTime": "2018-03-09T15:00:00+00:00", + "valueQuantity": { + "value": 120, + "unit": "fL" + }, + "interpretation": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation", + "code": "H", + "display": "High" + } + ] + } + ], + "referenceRange": [ + { + "text": "80-100" + } + ] + } + }, + { + "fullUrl": "urn:uuid:609fe923-e837-4799-8d44-1371ed2de9cc", + "resource": { + "resourceType": "Observation", + "identifier": [ + { + "value": "914694928301-2-7" + } + ], + "status": "final", + "category": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + } + ] + } + ], + "code": { + "coding": [ + { + "code": "B0310", + "display": "Mean cell haemoglobin (MCH)" + } + ] + }, + "subject": { + "reference": "urn:uuid:a26cc7ff-c97b-4c7e-a2d1-b906fa704588" + }, + "encounter": { + "reference": "urn:uuid:5e66d610-f72a-472c-b459-e04eb3e043a4" + }, + "effectiveDateTime": "2018-03-09T15:00:00+00:00", + "valueQuantity": { + "value": 34, + "unit": "pg" + }, + "interpretation": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation", + "code": "H", + "display": "High" + } + ] + } + ], + "referenceRange": [ + { + "text": "27.0-33.0" + } + ] + } + } + ] +} diff --git a/src/main/resources/Examples/Bundle-message.json b/src/main/resources/Examples/Bundle-message-Referrals.json similarity index 100% rename from src/main/resources/Examples/Bundle-message.json rename to src/main/resources/Examples/Bundle-message-Referrals.json diff --git a/src/main/resources/OAS/Imaging.json b/src/main/resources/OAS/Imaging.json index 58e284e..7663345 100644 --- a/src/main/resources/OAS/Imaging.json +++ b/src/main/resources/OAS/Imaging.json @@ -9,7 +9,7 @@ "url": "https://opensource.org/license/mit/" }, "contact": { - "name": "NHS Digital API Management", + "name": "NHS England API Management", "url": "https://digital.nhs.uk/developer/help-and-support", "email": "api.management@nhs.net" } @@ -557,4 +557,4 @@ } } } -} \ No newline at end of file +} diff --git a/src/main/resources/OAS/PDS.json b/src/main/resources/OAS/PDS.json index bc33d34..746db61 100644 --- a/src/main/resources/OAS/PDS.json +++ b/src/main/resources/OAS/PDS.json @@ -1 +1 @@ -{"openapi":"3.0.0","info":{"version":"v1.2.2156-beta","title":"Personal Demographics Service (FHIR) API","description":"## Overview \nUse this API to access the [Personal Demographics Service (PDS)](https://digital.nhs.uk/services/demographics) - the national electronic database of NHS patient details such as name, address, date of birth, related people, registered GP and NHS number.\n\nYou can:\n* search for patients\n* get patient details\n* update patient details\n* verify an NHS number for a patient\n\nYou cannot currently use this API to:\n* create a new record for a birth - use [PDS HL7 V3 API](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-hl7-v3)\n* receive birth notifications - use [PDS HL7 V3 API](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-hl7-v3) or [PDS Notifications FHIR API](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-notifications-fhir) \n* create a record for a new patient - use [PDS HL7 V3 API](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-hl7-v3)\n* register a new patient at a GP Practice - use [NHAIS GP Links API](https://digital.nhs.uk/developer/api-catalogue/nhais-gp-links)\n* receive patient death notifications - use [PDS Notifications FHIR API](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-notifications-fhir) \n* receive notifications about a patient's change of address - use [PDS Notifications FHIR API](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-notifications-fhir) \n* receive notifications about a patient's change of GP - use [PDS Notifications FHIR API](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-notifications-fhir) \n* receive notifications about any PDS record change - use [PDS Notifications FHIR API](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-notifications-fhir) \n\nYou can read and update the following data:\n* NHS number (read only)\n* name\n* gender\n* addresses and contact details\n* birth information\n* death information\n* registered GP\n* nominated pharmacy\n* dispensing doctor pharmacy\n* medical appliance supplier pharmacy\n* related people, such as next of kin (read only - update coming soon)\n\n### Patients included in PDS\nRegardless of nationality, or where they live now, PDS includes all patients who have ever been registered with a GP practice, or treated by a health or care organisation (even as a visitor or migrant) in England, Wales, the Isle of Man, or in a UK Defence Medical Services unit anywhere in the world. \n\nAll patients in PDS have an NHS number which is unique. The 10-digit NHS number is used in England, Wales, the Isle of Man, Scotland and Northern Ireland, but not the Channel Islands. Scotland and Northern Ireland have their own distinct number ranges.\n\n### Access modes\nThis API has three access modes:\n\n| Access mode | Functions | Availability |\n| ------------------------------ | ------------------ | ------------ |\n| [Application-restricted access](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation#application-restricted-apis) |Search for a patient (single result).
Get patient details. | Available in production ([stable](https://digital.nhs.uk/developer/guides-and-documentation/reference-guide#api-status)) |\n| [Healthcare worker access](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation#user-restricted-apis) |Search for patients (multiple results).
Get patient details.
Update patient details. | Available in production ([beta](https://digital.nhs.uk/developer/guides-and-documentation/reference-guide#api-status)) |\n| [Patient access](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation#user-restricted-apis) |Get own details.
Update own details (limited). | Available in production ([beta](https://digital.nhs.uk/developer/guides-and-documentation/reference-guide#api-status)) |\n\nFor further details about the access modes for this API, see [Security and authorisation](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-fhir#api-description__security-and-authorisation) below.\n\n## Who can use this API\nThis API can only be used where there is a [legal basis](http://digital.nhs.uk/services/demographics/access-data-on-the-personal-demographics-service) to do so. Make sure you have a valid use case before you go too far with your development. You must demonstrate you have a [valid use case](https://digital.nhs.uk/services/demographics/access-data-on-the-personal-demographics-service) as part of digital onboarding. \n\nYou must do this before you can go live (see ‘Onboarding’ below).\n\n### Who can access PDS records\nHealth and care organisations in England and the Isle of Man can access PDS records. Legitimate direct care examples include NHS organisations delivering healthcare, local authorities delivering care, third sector and private sector health and care organisations, and developers delivering systems to health and care organisations. \n\nHealth and care organisations in Wales access their own version of PDS called the Welsh Demographics Service (WDS) which is connected to PDS behind the scenes. \n\nHealth and care organisations in Scotland, Northern Ireland and the Channel Islands access their own equivalents of PDS.\n\nPatients who receive health and social care or make use of NHS services in England, Wales, the Isle of Man, Scotland, Northern Ireland and the Channel Islands.\n\n### Existing API users\nTo find out which healthcare software development organisations and products are already using this API, see [PDS FHIR API - integrated products](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-fhir/integrated-products).\n\n## Related APIs\nThe following APIs also give access to the Personal Demographics Service:\n- [Personal Demographics Service (SMSP) API](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-smsp) - this API is now deprecated.\n- [Personal Demographics Service (HL7 V3) API](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-hl7-v3) - use this if you want to use functions that are not yet available on the FHIR API, such as creating a new record for a birth, receiving birth notifications, or creating a record for a new patient (except when registering a new patient at a GP Practice, use [NHAIS](https://digital.nhs.uk/services/nhais)). For birth notifications, another option is [PDS Notifications - FHIR API](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-notifications-fhir).\n\nOnce our roadmap is complete, the above APIs will become redundant.\n\nThe following APIs are also related to this API:\n- [Personal Demographics Service Notifications - FHIR API](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-notifications-fhir) - use this to subscribe to be notified of a set of patient record changes, including any record update, birth, death, change of address and change of GP.\n- [Organisation Data Service FHIR API](https://developer.nhs.uk/apis/ods/) - use this to get full details for the organisations related to the patient, such as their registered GP or nominated pharmacy.\n- [Ordnance Survey (OS Places) API](https://digital.nhs.uk/developer/api-catalogue/ordnance-survey-places-api) - use this to identify, look up and verify addresses prior to a PDS update.\n\n## API status and roadmap\n### Application-restricted access\nThis access mode is [in production](https://digital.nhs.uk/developer/guides-and-documentation/reference-guide#statuses):\n* you should strongly consider it as the primary choice for PDS integration\n* we do not make routine breaking changes, if it cannot be avoided, for example, for security reasons, we will give advance notice\n \n### Healthcare worker access\nThis access mode is [in production, beta](https://digital.nhs.uk/developer/guides-and-documentation/reference-guide#statuses), meaning:\n- we might make breaking changes, but only if we cannot avoid it, and we will give advance notice\n\nIf you would like to be involved in our beta programme, [contact us](https://digital.nhs.uk/developer/help-and-support).\n \n### Patient access\nThis access mode is [in production, beta](https://digital.nhs.uk/developer/guides-and-documentation/reference-guide#statuses), meaning:\n- we might make breaking changes, but only if we cannot avoid it, and we will give advance notice\n\nIf you would like to be involved in our beta programme, [contact us](https://digital.nhs.uk/developer/help-and-support).\n\n### Roadmap\nTo see our roadmap, or to suggest, comment or vote on features for this API, see our [interactive product backlog](https://nhs-digital-api-management.featureupvote.com/?order=popular&filter=allexceptdone&tag=pds-fhir-api).\n\nIf you have any other queries, please [contact us](https://digital.nhs.uk/developer/help-and-support).\n\n## Service level\n\nThis API is a platinum service, meaning it is operational and supported 24 hours a day, 365 days a year.\n\nFor more details, see [service levels](https://digital.nhs.uk/developer/guides-and-documentation/reference-guide#service-levels).\n\n## Technology\nThis API is [RESTful](https://digital.nhs.uk/developer/guides-and-documentation/our-api-technologies#basic-rest).\n\nIt conforms to the [FHIR](https://digital.nhs.uk/developer/guides-and-documentation/our-api-technologies#fhir) global standard for health care data exchange, specifically to [FHIR R4 (v4.0.1)](https://hl7.org/fhir/r4/), except that it does not support the [capabilities](http://hl7.org/fhir/R4/http.html#capabilities) interaction.\n\nIt includes some country-specific FHIR extensions, which are built against [FHIR UK Core](https://digital.nhs.uk/services/fhir-uk-core), specifically [UK.core.r4 1.0.0](https://simplifier.net/packages/uk.core.r4/1.0.0).\n\nYou do not need to know much about FHIR to use this API - FHIR APIs are just RESTful APIs that follow specific rules.\nIn particular:\n- resource names are capitalised and singular, for example `/Patient` not `/patients`\n- array names are singular, for example `line` not `lines` for address lines\n- data items that are country-specific and thus not included in the FHIR global base resources are usually wrapped in an `extension` object\n\nThere are [libraries and SDKs available](https://digital.nhs.uk/developer/guides-and-documentation/api-technologies-at-nhs-digital#fhir-libraries-and-sdks) to help with FHIR API integration.\n\n## Network access\nThis API is available on the internet and, indirectly, on the [Health and Social Care Network (HSCN)](https://digital.nhs.uk/services/health-and-social-care-network).\n\nTo use this API with [NHS smartcards](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation/nhs-smartcards-for-developers), the end user needs an HSCN connection, although internet-facing alternatives to smartcards are available.\n\nFor more details see [Network access for APIs](https://digital.nhs.uk/developer/guides-and-documentation/network-access-for-apis).\n\n## Security and authorisation\n\nThis API has three access modes:\n- application-restricted access\n- healthcare worker access\n- patient access\n\n### Application-restricted access\nUse this access mode if you need to:\n* search for a patient – and only get a result if there is a unique match\n* get a single patient's details\n\nThis access mode is [application-restricted](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation#application-restricted-apis), meaning we authenticate the calling application but not the end user.\n\nThe end user could be:\n* a healthcare worker - in which case you must ensure they are authenticated and suitably authorised locally\n* a patient - in which case you must ensure they are authenticated locally\n* not present at all - for example as part of a back end process to check NHS numbers for data flowing from one system to another\n\nTo use this access mode, use the following security pattern:\n* [Application-restricted RESTful API - signed JWT authentication](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation/application-restricted-restful-apis-signed-jwt-authentication)\n\n### Healthcare worker access\nUse this access mode if the end user is a healthcare worker and you need to: \n* search for patients – and be able to present a list of matches for the user to choose from \n* get patient details \n* update patient details \n\nThis access mode is [user-restricted](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation#user-restricted-apis), meaning an end user must be present, authenticated and authorised.\n\nThe end user must be:\n* a healthcare worker\n* strongly authenticated, using either an [NHS smartcard or a modern alternative](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation/nhs-smartcards-for-developers)\n* authorised, using [national role-based access control (RBAC)](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation/national-rbac-for-developers)\n\nTo use this access mode, use one of the following security patterns:\n\n|\tSecurity pattern\t\t |\tTechnical details\t |\tAdvantages | Disadvantages |\n|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ---------------------------------------------------------| -------------------------------------------------------------------------|---------------------------------------------------------------------------|\n|[NHS CIS2 - combined authentication and authorisation](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation/user-restricted-restful-apis-nhs-cis2-combined-authentication-and-authorisation) |OAuth 2.0 authorisation code flow with API key and secret |No need to integrate and onboard separately with NHS CIS2. |No access to user information.
Not recommended for use in GP software. |\n|[NHS CIS2 - separate authentication and authorisation](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation/user-restricted-restful-apis-nhs-cis2-separate-authentication-and-authorisation) |OAuth 2.0 token exchange with signed JWT |Gives access to user information.
Recommended for use in GP software. |Need to integrate and onboard separately with NHS CIS2. |\n\n### Patient access\nUse this access mode if the end user is a patient and you need to: \n* get the patient’s own details\n* update the patient’s own details\n\nThis access mode is [user-restricted](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation#user-restricted-apis), meaning an end user must be present, authenticated and authorised.\n\nThe end user must be:\n* a patient who receives health and social care or makes use of NHS services\n* strongly authenticated, using [NHS login](https://digital.nhs.uk/services/nhs-login)\n\nTo use this access mode, use one of the following security patterns:\n\n|\tSecurity pattern\t\t |\tTechnical details\t |\tAdvantages\t | Disadvantages |\n|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ----------------------------------------------------| ------------------------------------------------------------|---------------------------------------------------------|\n|[NHS login - combined authentication and authorisation](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation/user-restricted-restful-apis-nhs-login-combined-authentication-and-authorisation) |OAuth 2.0 authorisation code with API key and secret |No need to integrate and onboard separately with NHS login. |No access to user information. |\n|[NHS login - separate authentication and authorisation](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation/user-restricted-restful-apis-nhs-login-separate-authentication-and-authorisation) |OAuth 2.0 token exchange with signed JWT |Gives access to user information. |Need to integrate and onboard separately with NHS login. |\n\n## Errors\nWe use standard HTTP status codes to show whether an API request succeeded or not. They are usually in the range:\n\n* 200 to 299 if it succeeded, including code 202 if it was accepted by an API that needs to wait for further action\n* 400 to 499 if it failed because of a client error by your application\n* 500 to 599 if it failed because of an error on our server\n\nErrors specific to each API are shown in the Endpoints section, under Response. See our [reference guide](https://digital.nhs.uk/developer/guides-and-documentation/reference-guide#http-status-codes) for more on errors.\n\n## Open source\nYou might find the following [open source](https://digital.nhs.uk/developer/guides-and-documentation/reference-guide#open-source) resources useful:\n\n| Resource | Description | Links |\n|---------------------------|----------------------------------------------------------------------|--------------------------------------------------------------------------------|\n| PDS FHIR API | Source code for the API proxy, sandbox and specification. | [GitHub repo](https://github.com/NHSDigital/personal-demographics-service-api) |\n| FHIR libraries and SDKs | Various open source libraries for integrating with FHIR APIs. | [FHIR libraries and SDKs](https://digital.nhs.uk/developer/guides-and-documentation/api-technologies-at-nhs-digital#fhir-libraries-and-sdks) |\n| nhs-number | Python package containing utilities for NHS numbers including validity checks, normalisation and generation. | [GitHub repo](https://github.com/uk-fci/nhs-number) \\| [Python Package index](https://pypi.org/project/nhs-number/) \\| [Docs](https://nhs-number.uk-fci.tech/) |\n\nWe currently don't have any open source client libraries or sample code for this API. If you think this would be useful, you can [upvote the suggestion on our Interactive Product Backlog](https://nhs-digital-api-management.featureupvote.com/suggestions/107439/client-libraries-and-reference-implementations).\n\nThe source code for the PDS FHIR back end (the Core Spine source code) is not currently in the open. If you think this would be useful, you can [upvote the suggestion on our Interactive Product Backlog](https://nhs-digital-api-management.featureupvote.com/suggestions/466692/open-source-core-spine-including-pds-eps-scr-and-more).\n\n## Environments and testing\n\n| Environment | Base URL |\n| ----------------- | ---------------------------------------------------------------------- |\n| Sandbox | `https://sandbox.api.service.nhs.uk/personal-demographics/FHIR/R4/` |\n| Integration test | `https://int.api.service.nhs.uk/personal-demographics/FHIR/R4/` |\n| Production | `https://api.service.nhs.uk/personal-demographics/FHIR/R4/` |\n\n### Sandbox testing\nOur [sandbox environment](https://digital.nhs.uk/developer/guides-and-documentation/testing#sandbox-testing):\n* is for early developer testing\n* only covers a limited set of scenarios\n* is stateless, so does not actually persist any updates\n* is open access, so does not allow you to test authorisation\n\nFor details of sandbox test scenarios, or to try out the sandbox using our 'Try this API' feature, see the documentation for each endpoint.\n\nAlternatively, you can try out the sandbox using our Postman collection:\n\n[![Run in Postman](https://run.pstmn.io/button.svg)](https://app.getpostman.com/run-collection/14719036-953f067f-30b9-4552-8252-7cc10b21dad3)\n\n### Integration testing\nOur [integration test environment](https://digital.nhs.uk/developer/guides-and-documentation/testing#integration-testing):\n* is for formal integration testing\n* is stateful, so persists updates\n* includes authorisation, with options for user-restricted access (with or without [smartcards](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation/nhs-smartcards-for-developers) and application-restricted access\n \nFor read-only testing, you can either use our [PDS FHIR API test data packs](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-fhir/pds-fhir-api-test-data) or set up your own test data.\n\nTo test updating patient details, you must set up your own test data.\n\nFor more details see [integration testing with our RESTful APIs](https://digital.nhs.uk/developer/guides-and-documentation/testing#integration-testing-with-our-restful-apis).\n\n### Production smoke testing\nYou must not use real patient data for smoke testing in the production environment.\n\nRather, use our [production test patient](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-fhir/pds-fhir-api-test-data#production-smoke-testing).\n\n## Onboarding\nYou need to get your software approved by us before it can go live with this API. We call this onboarding. The onboarding process can sometimes be quite long, so it’s worth planning well ahead.\n\nAs part of this process, you need to demonstrate your technical conformance to the requirements for this API. For more details according to your access mode, see:\n* [PDS FHIR API technical conformance - application-restricted access mode](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-fhir/pds-fhir-technical-conformance---application-restricted-access-mode)\n* [PDS FHIR API technical conformance - healthcare worker access mode](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-fhir/pds-fhir-technical-conformance---healthcare-worker-access-mode)\n\nYou also need to demonstrate that you can manage risks. This might impact the design of your software. For details, see [Onboarding support information](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-fhir/onboarding-support-information).\n\nTo understand how our online digital onboarding process works, see [digital onboarding](https://digital.nhs.uk/developer/guides-and-documentation/digital-onboarding). \n\n
\n
\n
\n
\n \n \"\"\n \n
\n
\n
\n

To get started, sign in or create a developer account, then select 'product onboarding'.

\n
\n
\n
\n","contact":{"name":"Personal Demographics Service FHIR API Support","url":"https://digital.nhs.uk/developer/help-and-support","email":"ssd.nationalservicedesk@nhs.net"}},"servers":[{"url":"https://sandbox.api.service.nhs.uk/personal-demographics/FHIR/R4","description":"Sandbox environment."},{"url":"https://int.api.service.nhs.uk/personal-demographics/FHIR/R4","description":"Integration test environment."},{"url":"https://api.service.nhs.uk/personal-demographics/FHIR/R4","description":"Production environment."}],"paths":{"/Patient":{"parameters":[{"in":"header","name":"Authorization","description":"An [OAuth 2.0 bearer token](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation#user-restricted-apis).\n\nRequired in all environments except sandbox.\n","required":false,"schema":{"type":"string","format":"^Bearer\\ [[:ascii:]]+$","example":"Bearer g1112R_ccQ1Ebbb4gtHBP1aaaNM"}},{"in":"header","name":"NHSD-Session-URID","description":"\nThe user role ID (URID) for the current session. Also known as a user role profile ID (URPID).\n\nThis header is optional.\n\nIn Application-restricted access mode this header is ignored.\n\nIn Healthcare worker access mode if you send this header it must be valid for the logged-in user. See [determine the user's role](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation/user-restricted-restful-apis-nhs-cis2-separate-authentication-and-authorisation#step-9-determine-the-user-s-role) for guidance.\n","required":false,"schema":{"type":"string","pattern":"^[0-9]+$","example":"555254240100"}},{"in":"header","name":"X-Request-ID","required":false,"description":"A globally unique identifier (GUID) for the request, which we use to de-duplicate repeated requests and to trace the request if you contact our helpdesk.\n\nMust be a universally unique identifier (UUID) (ideally version 4).\n\nMirrored back in a response header.\n\nIf you re-send a failed request, use the same value in this header.\n","schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","example":"60E0B220-8136-4CA5-AE46-1D97EF59D068"}},{"in":"header","name":"X-Correlation-ID","required":false,"description":"An optional ID which you can use to track transactions across multiple systems. It can take any value, but we recommend avoiding `.` characters.\n\nMirrored back in a response header.\n","schema":{"type":"string","example":"11C46F5F-CDEF-4865-94B2-0EE0EDCC26DA"}},{"in":"header","name":"NHSD-End-User-Organisation-ODS","required":false,"description":"The ODS code of the user.\n\nMandatory for client applications which service multiple end user organisations (EUO). This will allow the calls to be attributed to the correct EUO.\n","schema":{"type":"string","example":"Y12345"}}],"get":{"summary":"Search for a patient","operationId":"search-patient","externalDocs":{"description":"ODS codes and documentation.","url":"https://fhir.nhs.uk/Id/ods-organization-code"},"description":"## Overview\nUse this endpoint to search for a patient in PDS.\n\nYou can search using various combinations of:\n * given name\n * family name\n * gender\n * postcode\n * date of birth - which can be a range\n * date of death - which can be a range\n * registered GP practice\n * email address\n * phone number\n\n \nThere are various search options, such as fuzzy search, exact match, history and wildcards.\n\nThe behaviour of this endpoint depends on which access mode you are using:\n\n| Access mode | Behaviour |\n| ------------------------------ | ------------------------------------------ |\n| Application-restricted access | Only a single unique match returned |\n| Healthcare worker access | Up to 50 matching patient records returned |\n| Patient access | Not yet available |\n\n## Search options\nThe following sections explain the various search options.\nWhich options you choose depends very much on your use case, and getting it right is really important.\nIf you need help, [contact us](https://digital.nhs.uk/developer/help-and-support).\n\n### Application-restricted access mode\nIn this access mode, you only get a single matching patient record, and only if it's a unique match.\n\nUse search options that are likely to find a unique match. In our experience, the following is a good starting point:\n * search on given name, family name, postcode and date of birth - this combination should uniquely identify a patient\n * for given name, use the first three characters and a wildcard, for example to search for `Annabel`, use `Ann*` - this caters for different name spellings and abbreviations\n * for postcode, use the first two characters and a wildcard, for example to search for `LS11 6AD`, use `LS*` - this caters for people who have moved locally but not updated PDS\n * use a non-fuzzy search - this reduces the chance of multiple matches\n * use a non-exact match - an exact match does not work with wildcards\n * include history - this increases the chance of a match\n\nFor more details, see the following sections.\n\n### Healthcare worker access mode\nIn this access mode - where the end user is a strongly authenticated healthcare worker - you can get up to 50 matching patient records.\nThis allows the end user to choose the best match.\n\nUse search parameters that are relevant to your use case - for example date of death is not always appropriate.\n\nTo protect patient privacy, design your search to minimise the number of matching patients.\nFor example, you could:\n * encourage users to enter as many search parameters as they can\n * force users to try a non-fuzzy search first and then only offer a fuzzy search if they cannot find the patient\n\nFor more details, see the following sections.\n\n### Non-fuzzy search\nA non-fuzzy search:\n * allows wildcards in names and postcodes\n * does not match homophones or transposed names\n * can optionally search history, such as previous names and addresses\n\nIt is less likely to return multiple matches than a fuzzy search, so is more suitable for finding a unique match.\n\nThe minimum search parameters are:\n * family name - which can include wildcards\n * date of birth - which can be a range\n\n \n### Fuzzy search\nA fuzzy search:\n * matches common homophones, such as `Smith` and `Smythe`, using the [Soundex](https://en.wikipedia.org/wiki/Soundex) algorithm\n * checks for transposed names, such as `Adam Thomas` and `Thomas Adam`\n * always searches history, such as previous names and addresses\n\nIt is more likely to include multiple matches than a non-fuzzy search, so is not ideal for finding a unique match.\n\nIt is also more likely to include false positives - other patients that match the search criteria.\nTherefore, for privacy reasons, it is better to use it only if a non-fuzzy match has failed.\n\nYou must use one of the following search parameter combinations:\n * given name, family name and date of birth\n * family name, date of birth, gender and postcode\n * given name, date of birth, gender and postcode\n\nIf you include the date of death or registered GP practice query parameters, they are not used in the search. However they do affect the patient's matching score - a mismatch reduces the returned score.\n\n### History\nPDS holds historic information, including previous names and addresses.\n\nA fuzzy search always includes history. For a non-fuzzy search, you can request to include history.\n\nSearching history can match patients when only a previous name or address is known, or if a patient provides a previous name or address on the assumption that their record hasn’t been updated. When a search done on historic data results in a match, the patient's current data will be returned in the response message, not the historic data used to identify the match.\n\n### Exact match\nYou can request an exact match.\nThis might be useful if you are verifying an NHS number against details you already believe to be correct.\nIt is unlikely to work well with wildcards or fuzzy search.\n\n### Names\nMatching names can be difficult due to:\n * multiple given names, such as in `Jane Anne Smith`\n * [compound given names](https://en.wikipedia.org/wiki/Given_name#Compound), such as in `John Paul Smith`\n * multiple or double-barrelled surnames, such as in `Michael Smith-Jones`\n * homophones, such as `Smith` and `Smythe` or `Ann` and `Anne`\n * abbreviated names, such as `Bob` instead of `Robert`\n * transposed names, such as `Adam Thomas` instead of `Thomas Adam`\n * previous names, such as maiden names\n * special characters such as in `O'Reilly`, `Jones-Smith` or `Kociński`\n * spelling mistakes, either in the search criteria or in PDS\n\nTo deal with some of these issues:\n * we search across all types of name - usual, nickname and temporary\n * a fuzzy search matches homophones, transposed names and previous names\n * for a non fuzzy search, you can optionally search previous names and use wildcards. Wildcards will match against the start of the name string, for example the start of a compound name.\n\n### Gender\nPDS has four options for gender - `male`, `female`, `other` and `unknown`.\nFor some people, the gender held in PDS might not match the gender they identify with.\n\nIn these cases, searching by gender might not find the patient.\nThese are edge cases but are important to consider because gender can be a sensitive issue for the people in question.\n\nIn general, we recommend not including gender as a search parameter.\n \n### Date of birth and death\nSometimes, the exact date of birth or death is not known when doing a search.\nSometimes, the date of birth or death is not accurate in PDS.\nFor example, if only the year of birth is known, the day and month of birth might be recorded as the first of January - for example, `01/01/1932`.\n\nIn such cases, searching a range of dates can help. This can result in multiple matches, so might not work well when searching for a unique match.\n\n### Postcode\nPeople sometimes move locally, meaning the postcode in PDS is out of date, but does at least match on the first two characters.\n\nSearching for the first two characters of the postcode and a wildcard can work well. For example, to search for `LS11 6AD`, use `LS*`.\nThis is only possible for a non-fuzzy search.\n\nThis can result in multiple matches, but it has been known to work well in some cases - even for unique matches.\n\n### General practitioner\nThis is an ODS code. If you use it, it must match exactly.\n\n### Phone number and email address\nIf you use phone number and/or email address, only exact matches will be returned.\n * Wildcards are not supported\n * Only current data will be searched, unless a history search is also requested in which case the match will take into account both current and historic data\n * Email addresses are not case-sensitive.\n\n## Patient data returned\nThe patient data returned on a search is not the full set of data that is returned on a retrieval by NHS number. The following data is included:\n* NHS number\n* names - usual, nickname and temporary\n* gender\n* birth information, apart from place of birth\n* death information\n* address - home address\n* contact details\n* registered GP\n* restricted patient flag\n\nThe following data is excluded:\n* place of birth\n* names, apart from usual, nickname and temporary \n* addresses, apart from home address\n* pharmacy details\n* communication details\n* contact preferences\n\n### Restricted patients\nSome patients are tagged as [restricted](https://digital.nhs.uk/services/demographics/restricting-access-to-a-patients-demographic-record) and are sometimes known as sensitive patients. When performing a search, restricted patients can be returned; however, location sensitive fields such as `address`, `telecom`, `contact` and `generalPractitioner` are removed.\n\nIf `address-postalcode`, `address-postcode`, or `general-practitioner` are included in the search parameters, no restricted patients are returned even if a match is identified.\n\nThe restricted flag can be found in the data under `meta/security` on the patient resource.\n\n### Invalidated patients\nSome patients are marked as invalidated in PDS - also known as `redacted` in FHIR terminology. Invalidated patient records are not returned in search results.\nIf an invalidated patient record has been superseded, the superseding record is returned.\n\n## Scoring\nEvery matched patient in the result list includes a score to indicate how closely the patient matched the search parameters.\n\nA score of 1.0 indicates an exact match. A score of less than 1.0 indicates a partial match.\n\nThe result list is sorted in descending score order - best match first.\n\nUse the `_exact-match` query parameter to return exact matches only - where the score is 1.0.\n\n## Clinical safety and privacy\nThis endpoint can return multiple matching patients for a given search, including partial matches.\n\nEnsure that you design your software to minimise the following risks:\n* an end user selects the wrong patient from the results presented, so there is a risk of clinical harm; for example due to retrieval of the wrong clinical data\n* the end user has access to patients’ personal data, so there is a risk to patient privacy\n\nNote that:\n* we record an access request in our audit trail for all patients matched in a PDS search\n* it is almost certainly a good idea to display search results in descending score order - best match first\n\nPlease consider the information your application returns to users. For example a patient's temporary address can be used to perform a successful search. The home address will be included in the response. For citizen facing services please be aware of this behaviour and do not present a different address to the patient, unless they are logged in at a sufficiently high proof point.\n\n## Sandbox testing\nYou can test the following scenarios in our sandbox environment:\n\n| Scenario | Request | Response |\n| ----------------------------------------| ----------------------------------------------------------------------------------------------------------------------------------------------------------------| ------------------------------------------------------------------------|\n| Basic search with phone & email positive| `family`=`Smith`, `gender`=`female`, `birthdate`=`eq2010-10-22`, `email`=`jane.smith@example.com`, `phone`=`01632960587` | HTTP Status 200 with single search result. |\n| Basic search with phone & email negative| `family`=`Smith`, `gender`=`female`, `birthdate`=`eq2010-10-22`, `email`=`deb.trotter@example.com`, `phone`=`0121111111` | HTTP Status 200 with no search results\n| Wildcard search without phone/email | `family`=`Sm*`, `gender`=`female`, `birthdate`=`eq2010-10-22` | HTTP Status 200 with search result of two. |\n| Wildcard search with email and phone | `family`=`Sm*`, `gender`=`female`, `birthdate`=`eq2010-10-22`, `email`=`jane.smith@example.com`, `phone`=`01632960587` | HTTP Status 200 with single search result. |\n| Search with limited results | `family`=`Sm*`, `gender`=`female`, `birthdate`=`eq2010-10-22`, `email`=`jane.smith@example.com`, `phone`=`01632960587`, `_max-results`=`1` | HTTP Status 200 with single search result. |\n| Search with date range | `family`=`Smith`, `gender`=`female`, `birthdate`=`ge2010-10-21`, `birthdate`=`le2010-10-23`, `email`=`jane.smith@example.com`, `phone`=`01632960587` | HTTP Status 200 with single search result. |\n| Fuzzy search with phone and email | `family`=`Smith`, `given`=`Jane`, `gender`=`female`, `birthdate`=`eq2010-10-22`, `email`=`jane.smith@example.com`, `phone`=`01632960587`, `_fuzzy-match`=`true` | HTTP Status 200 with single search result. |\n| Fuzzy search without phone or email | `family`=`Smith`, `given`=`Jane`, `gender`=`female`, `birthdate`=`eq2010-10-22` | HTTP Status 200 with search result of two.\n| Restricted patient search | `family`=`Smythe`, `given`=`Janet`, `gender`=`female`, `birthdate`=`eq2005-06-16`, `email`=`janet.smythe@example.com`, `phone`=`01632960587` | HTTP Status 200 with single search result with restricted data omitted. |\n| Compound name search | `family`=`Smith`, `given`=`John Paul`, `given`=`James`, `gender`=`female`, `birthdate`=`eq2010-10-22`, `email`=`johnp.smith@example.com`, `phone`=`01632960587` | HTTP Status 200 with single search result. |\n| Unsuccessful search | Any other valid search query parameters | HTTP Status 200 with no search results |\n| Valid/invalid search criteria | `family`=`Sm*`, `gender`=`female`, 'invalidParam'='123', `birthdate`=`eq2010-10-22`, `email`=`j.smith@example.com`, `phone`=`0163` | HTTP Status 400 with problem description |\n| Unsuccessful search on email/phone only | `email`=`j.smith@example.com`, `phone`=`0163` | HTTP Status 400 with problem description |\n| Invalid date format | `birthdate` or `death-date` query parameters with values not in format `YYYY-MM-DD` | HTTP Status 400 with problem description |\n| Too few search parameters | Any invalid combination of query parameters | HTTP Status 400 with problem description |\n| Missing X-Request-ID | `id`=`9000000009` (or any other valid NHS number) | HTTP Status 412 with problem description |\n\nYou can try out the sandbox using the 'Try this API' feature on this page.\n\nAlternatively, you can try out the sandbox using our Postman collection:\n\n\n[![Run in Postman](https://run.pstmn.io/button.svg)](https://app.getpostman.com/run-collection/a1ce1b055839caa384a8?action=collection%2Fimport)\n","parameters":[{"name":"_fuzzy-match","description":"A fuzzy search is performed, including checks for homophones, transposed names and historic information.\n\nYou cannot use wildcards with a fuzzy search.\n","example":false,"in":"query","required":false,"schema":{"type":"boolean","default":false}},{"name":"_exact-match","description":"The search only returns results where the `score` field is 1.0. Use this with care - it is unlikely to work with fuzzy search or wildcards.","example":false,"in":"query","required":false,"schema":{"type":"boolean","default":false}},{"name":"_history","description":"The search looks for matches in historic information such as previous names and addresses.\n\nThis parameter has no effect for a fuzzy search, which always includes historic information.\n","example":true,"in":"query","required":false,"schema":{"type":"boolean","default":false}},{"name":"_max-results","description":"The maximum number of matching patients to return. For healthcare worker access, this must be between 1 and 50, and the default is 50.\nFor application-restricted access, this must be 1, and the default is 1.\nIf too many patients match the search criteria, we return a `TOO_MANY_MATCHES` error.\n","example":1,"in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"family","description":"The patient's family name (surname).\n\nNot case sensitive. Max 35 characters.\nUse `*` as a wildcard but not in the first two characters and not in fuzzy search mode.\nMust be [URL encoded](https://en.wikipedia.org/wiki/Percent-encoding), for example a space must be represented by either `%20` or `+` and a wildcard must be encoded as `%2A`.\n","examples":{"simple":{"value":"Smith","summary":"Matches Smythe if `_fuzzy-match` is specified."},"wildcarded":{"value":"Sm*t*","summary":"Wildcards must contain at least two characters, this matches Smith, Smythe"}},"in":"query","required":false,"schema":{"type":"string"}},{"name":"given","description":"The patient's given names.\n\nNot case sensitive. Max 35 characters.\nUse `*` as a wildcard but not in the first two characters and not in fuzzy search mode.\nWildcard searches will match the start of the first given name and not subsequent given names, for example the given names \"Alan Michael\" can be searched with \"Ala*\" but not \"Mic*\".\nMust be [URL encoded](https://en.wikipedia.org/wiki/Percent-encoding), for example a space must be represented by either `%20` or `+` and a wildcard must be encoded as `%2A`.\n\nA patient may have more than one given name. Subsequent given names are commonly referred to as 'middle names'.\nSpecify multiple given names by repeating this parameter.\nTo search for `Jane Anne Smith` use `given=Jane&given=Anne&family=Smith`.\n\nThe first given name may be a [compound name](https://en.wikipedia.org/wiki/Given_name#Compound), for example `John Paul`.\nTo search for `John Paul James Smith` (where `John Paul` is the first given name, `James` is the second given name, and `Smith` the family name) use `given=John%20Paul&given=James&family=Smith`.\n\nNote that it is not necessary to specify subsequent given (middle) names, and that doing so may impact your search results in the case they are not recorded in the demographics system.\n","example":"Jane","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"}}},{"name":"gender","description":"Gender with which the patient most strongly identifies.","example":"female","in":"query","required":false,"schema":{"type":"string","enum":["male","female","other","unknown"],"example":"female"}},{"name":"birthdate","in":"query","description":"Date of birth in the format `yyyy-mm-dd`. To specify a range, use `birthdate=geyyyy-mm-dd&birthdate=leyyyy-mm-dd`.","examples":{"simple":{"value":["eq2010-10-22"],"description":"Exact match date"},"rangege":{"value":["ge2010-10-22"],"description":"Greater than or equals match, which matches 2010-10-22 or 2010-10-23"},"rangele":{"value":["le2010-10-22"],"description":"Less than or equals match, which matches 2010-10-22 or 2010-10-21"}},"required":false,"schema":{"type":"array","items":{"type":"string"}}},{"name":"death-date","in":"query","description":"Date of death in the format `yyyy-mm-dd`. To specify a range, use `death-date=geyyyy-mm-dd&death-date=leyyyy-mm-dd`.\n\nFor a fuzzy search, this is ignored for matching but included in the score calculation.\n","examples":{"simple":{"value":"eq2010-10-22","description":"Exact match date"},"rangege":{"value":"ge2010-10-22","description":"Greater than or equals match which matches 2010-10-22 or 2010-10-23"},"rangele":{"value":"le2010-10-22","description":"Less than or equals match, which matches 2010-10-22 or 2010-10-21"}},"required":false,"schema":{"type":"string","format":"date"}},{"name":"address-postalcode","description":"The postcode of any of the patient’s known addresses.\n\nNot case sensitive.\nSpaces are ignored, for example `LS16AE` and `LS1 6AE` both match `LS1 6AE`.\nUse `*` as a wildcard but not in the first two characters and not in fuzzy search mode.\nMust be [URL encoded](https://en.wikipedia.org/wiki/Percent-encoding), for example a space must be represented by either `%20` or `+` and a wildcard must be encoded as `%2A`.\n","examples":{"simple":{"value":"LS1 6AE","summary":"Spaces ignored, would match LS16AE"},"wildcarded":{"value":"LS1*","summary":"Matches 'LS16AE', 'LS1 6AE' and 'LS1 6AB'"}},"in":"query","required":false,"schema":{"type":"string"}},{"name":"address-postcode","description":"**N.B. that address-postcode will be deprecated in the future, address-postalcode should be used instead. \nIf both address-postcode and address-postalcode are provided, an INVALID_SEARCH_DATA error will be returned.**\nThe postcode of any of the patient’s known addresses.\n\nNot case sensitive.\nSpaces are ignored, for example `LS16AE` and `LS1 6AE` both match `LS1 6AE`.\nUse `*` as a wildcard but not in the first two characters and not in fuzzy search mode.\nMust be [URL encoded](https://en.wikipedia.org/wiki/Percent-encoding), for example a space must be represented by either `%20` or `+` and a wildcard must be encoded as `%2A`.\n","examples":{"simple":{"value":"LS1 6AE","summary":"Spaces ignored, would match LS16AE"},"wildcarded":{"value":"LS1*","summary":"Matches 'LS16AE', 'LS1 6AE' and 'LS1 6AB'"}},"in":"query","required":false,"schema":{"type":"string"}},{"name":"general-practitioner","description":"The Organisation Data Service (ODS) code of the patient's registered GP practice.\n\nNot case sensitive.\nFor a fuzzy search, this is ignored for matching but included in the score calculation.\n","example":"Y12345","in":"query","required":false,"schema":{"type":"string"}},{"name":"email","description":"Email address\n","example":"jane.smith@example.com","in":"query","required":false,"schema":{"type":"string"}},{"name":"phone","description":"Phone number\n","example":"01632960587","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"A completed search. This might contain zero, one or many matching patients, or it might contain a 'TOO_MANY_MATCHES' error.\n","headers":{"X-Correlation-Id":{"schema":{"type":"string","example":"11C46F5F-CDEF-4865-94B2-0EE0EDCC26DA"},"description":"The X-Correlation-ID from the request header, if supplied, mirrored back.\n"},"X-Request-Id":{"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","example":"60E0B220-8136-4CA5-AE46-1D97EF59D068"},"description":"The X-Request-ID from the request header, if supplied, mirrored back.\n"}},"content":{"application/fhir+json":{"schema":{"type":"object","properties":{"resourceType":{"type":"string","description":"FHIR Resource Type.","default":"Bundle"},"type":{"type":"string","description":"FHIR Bundle Type.","default":"searchset"},"timestamp":{"type":"string","description":"Time the search was performed.","format":"datetime","example":"2019-12-25T12:00:00+00:00"},"total":{"type":"integer","description":"Number of resources returned in search.","example":1},"entry":{"type":"array","description":"A list of matched patients. Empty if none found. The patients are ordered by match score, best first. A maximum of 50 patients are returned.\n","items":{"type":"object","properties":{"fullUrl":{"type":"string","description":"Absolute URL of the resource described in this item.","example":"https://api.service.nhs.uk/personal-demographics/FHIR/R4/Patient/9000000009"},"search":{"type":"object","properties":{"score":{"description":"Search score from 0.0 to 1.0.","type":"number","minimum":0,"maximum":1,"example":0.75}}},"resource":{"type":"object","additionalProperties":false,"properties":{"resourceType":{"type":"string","description":"FHIR resource type.","default":"Patient"},"id":{"description":"The patient's NHS number. The primary identifier of a patient, unique within NHS England and Wales. Always 10 digits and must be a [valid NHS number](https://www.datadictionary.nhs.uk/attributes/nhs_number.html).","type":"string","pattern":"^\\d{10}$","example":"9000000009"},"identifier":{"type":"array","description":"Identifier and system of identification used for this Patient.","items":{"type":"object","maxItems":1,"required":["value"],"properties":{"system":{"type":"string","format":"url","description":"System identifier belongs to.","default":"https://fhir.nhs.uk/Id/nhs-number"},"value":{"description":"The patient's NHS number. The primary identifier of a patient, unique within NHS England and Wales. Always 10 digits and must be a [valid NHS number](https://www.datadictionary.nhs.uk/attributes/nhs_number.html).","type":"string","pattern":"^\\d{10}$","example":"9000000009"},"extension":{"type":"array","description":"FHIR extensions.","items":{"type":"object","description":"Status indicating if NHS number is present and verified.","properties":{"url":{"type":"string","description":"URL of the extension definition.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSNumberVerificationStatus","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSNumberVerificationStatus"]},"valueCodeableConcept":{"type":"object","description":"NHS Number Verification Status Indicator.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URI of the coding system specification.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-NHSNumberVerificationStatus"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1.0.0"},"code":{"type":"string","description":"Symbol in syntax defined by the system.","example":"01"},"display":{"type":"string","description":"Representation defined by the system.","example":"Number present and verified"}}}}}}}}}}}},"meta":{"type":"object","description":"Metadata about this resource.","properties":{"versionId":{"type":"string","description":"The NHS Digital assigned version of the patient resource.","example":"2"},"security":{"type":"array","description":"The level of security on the patients record, which affects which fields are populated on retrieval. The possible responses are:\n* U - unrestricted. All available data is returned.\n* R - restricted. Any sensitive data around the patient's location, so `address`, `generalPractitioner` and `telecom`, are removed from the response.\n* REDACTED - redacted. The patient record has been marked as invalid, so the data should not be used. This code is never returned; you receive a 404, and appropriate error response, if an invalidated patient retrieval is attempted.\n","maxItems":1,"items":{"type":"object","properties":{"system":{"type":"string","description":"URI of the value set specification.","example":"http://terminology.hl7.org/CodeSystem/v3-Confidentiality"},"code":{"type":"string","description":"Code defined by the system value set.","enum":["U","R","V","REDACTED"],"example":"U"},"display":{"type":"string","description":"Representation defined by the system.","enum":["unrestricted","restricted","redacted"],"example":"unrestricted"}}}}}},"name":{"type":"array","description":"List of names associated with the patient.\nThis is only fully populated on a retrieval or a successful update, only the `usual`, `nickname` and `temp` names are returned on a search. \n","minItems":1,"items":{"type":"object","required":["use","family"],"additionalProperties":false,"properties":{"id":{"type":"string","description":"Unique object identifier for this name.","example":"123"},"use":{"type":"string","description":"How this name should be used.\n* usual - Known as, conventional or the one patient normally uses. A patient always has a usual name.\n* temp - An alias or temporary name. This may also be used for temporary names assigned at birth or in emergency situations.\n* nickname - A name that the patient prefers to be addressed by, but is not part of their usual name.\n* old - This name is no longer in use (or was never correct, but retained for records).\n* maiden - Name changed for Marriage. A name used prior to changing name because of marriage. This term is not gender specific. The use of this term does not imply any particular history for a person's name.\n\nThe following use codes are included in the [name-use](https://www.hl7.org/fhir/valueset-name-use.html) value set, but should not be used and is not be returned as part of a retrieval.\n* official - The formal name as registered in an official (government) registry, but which name might not be commonly used. May be called \"legal name\".\n* anonymous - Anonymous assigned name, alias, or pseudonym (used to protect a person's identity for privacy reasons).\n","enum":["usual","temp","nickname","old","maiden"],"example":"usual"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"given":{"type":"array","maxItems":5,"description":"Given names, including any middle names.\n\nEach name(s) should be a separate item in the list. The first given name may include multiple names, separated by a space.\nSubsequent names must be broken down into list items. For example, the input `[Jane Marie Anne, Jo Adele]` returns `[Jane Marie Anne, Jo, Adele]`.\n","example":["Jane Marie Anne","Jo","Adele"],"items":{"type":"string","maxLength":35,"example":"Jane"}},"family":{"type":"string","maxLength":35,"description":"Family name (often called Surname).","example":"Smith"},"prefix":{"type":"array","description":"Name prefixes, titles, and prenominals.","example":["Mrs"],"items":{"type":"string","example":"Mrs"}},"suffix":{"type":"array","description":"Name suffices and postnominals.","example":["MBE","PhD"],"items":{"type":"string","example":"MBE"}}}}},"gender":{"type":"string","description":"Classification of the gender of a patient. The classification is phenotypical rather than genotypical, i.e. it does not provide codes for medical or scientific purposes.\nIt is the administrative gender that the patient wishes to be known as. In some cases, this may not be the same as the patient’s registered birth gender, or their current clinical gender.\n","enum":["male","female","other","unknown"],"example":"female"},"birthDate":{"description":"The date on which the patient was born or is officially deemed to have been born.\n\nIt is a date in the format `yyyy-mm-dd`. Due to data quality issues on a small number of patients `yyyy-mm` and `yyyy` format may also be returned. \n","example":"2010-10-22","type":"string","format":"date"},"multipleBirthInteger":{"type":"integer","minimum":1,"maximum":9,"description":"The order in which the patient was born, with 1 indicating the first or only birth in the sequence, 2 indicating the second birth in the sequence, 3 indicating the third, and so on up to 7.\n\nThere are two other valid values; `8` meaning `Not applicable` and `9` meaning `Not known`.\n","example":1},"deceasedDateTime":{"description":"The date and time on which a person died or is officially deemed to have died, if applicable and known.\n\nIt is a datetime in the format `yyyy-mm-ddTHH:MM:SS+HH:MM` or `yyyy-mm-dd`. Due to data quality issues on a small number of patients `yyyy-mm` and `yyyy` format may also be returned.\n","example":"2010-10-22T00:00:00+00:00","type":"string","format":"date-time","pattern":"^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2}\\+\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2}\\+\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01]))$"},"address":{"type":"array","description":"List of addresses associated with the patient.\n\nThis is only fully populated on a retrieval or a successful update, only the `home` address is returned on a search.\nWhen a patient tagged as `restricted` is retrieved, all addresses are removed from the response.\n","items":{"type":"object","description":"An address associated with the patient.","required":["use"],"properties":{"id":{"type":"string","description":"Unique system identifier for this address.","example":"456"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"use":{"type":"string","description":"Purpose of this address:\n * `home` - the home address is the patient's normal residence. Home address is also known as usual, main, registered, current or permanent address\n * `temp` - a temporary address is an address used for a set period of time, but where the patient's home, permanent address remains unchanged\n * `billing` - an address used for correspondence purposes only\n * `work` - an office address. This can be returned due to legacy data but cannot be added or replaced on update\n\n A patient should have no more than one current `temp` and/or `billing` address.\n However, historically this was constrained only by the integration requirements and was not enforced so theoretically more than one can exist for a patient when retrieving.\n Where multiple instances already exist for the patient it is not expected that local systems should manage those, but should choose the most appropriate one to maintain (e.g. by examining period dates).\n\n A `home` address is the patient's main residential address and should normally be used for all clinical and demographic purposes, including clinical and appointment correspondence.\n However additionally, `temp` and `billing` addresses may be provided by a patient when there is a requirement to record an alternative location for the purposes of unbroken care.\n When sending correspondence to a patient:\n *\ta present and valid `billing` address may take precedence over `home` and `temp` addresses. A patient should have only a single current `billing` address. An address is considered 'valid' according to its period start and end dates.\n *\tif no current `billing` address is provided, a `temp` address may take precedence over the `home` address, again if it is valid according to its period start and end dates.\n * if there is no valid, current `billing` and/or `temp` address, the `home` address must be used.\n","enum":["home","work","temp","billing"],"example":"home"},"text":{"type":"string","description":"Where a `temp` address is provided a descriptor text must be sent.\nThe list of possible values are:\n* `Second Home` - a patient's second home\n* `Student Accommodation` - a patient's place of residence while at university\n* `Respite Care Address` - where the patient resides during respite care\n* `Temporary Residence Address` - where the patient resides for a specific period of time\n* `Convalescence Home` - the address for a patient during a period of recovery\n* `Mobile Home` - the address of a patient's mobile home, parked for a specific period of time, e.g. the address of a caravan park\n* `Holiday Home` - the address for a patient during a holiday\n\nA patient can also register temporarily at a GP practice using a temporary address. Temporary GP registration information does not appear on the PDS, but the address used for it may.\n","enum":["Second Home","Student Accommodation","Respite Care Address","Temporary Residence Address","Convalescence Home","Mobile Home","Holiday Home"],"example":"Student Accommodation"},"line":{"type":"array","description":"All lines of the address except the postal code.\n\nSystems must apply the following formatting convention when adding or replacing addresses lines:\n*\tline 1 - premises ID and/or house name, e.g. `Flat 1` or `The Old Schoolhouse`\n*\tline 2 - house number, dependent thoroughfare name and descriptor (if present), thoroughfare name and descriptor, e.g. `23 Mill Lane`\n*\tline 3 - dependent locality/village, locality (if present), e.g. `Boxgrove`\n*\tline 4 - post town, e.g. `Leeds`\n*\tline 5 - county (if present), e.g. `West Yorkshire`\n\nIf any of the lines are blank, they are not returned due to FHIR conformance constraints.\n","maxItems":5,"items":{"type":"string"},"example":["1 Trevelyan Square","Boar Lane","City Centre","Leeds","West Yorkshire"]},"postalCode":{"type":"string","description":"Postal code of the address.","example":"LS1 6AE"},"extension":{"type":"array","description":"List of address keys formatted as a FHIR extension. This can include up to one Unique Property Reference Number (UPRN), and up to one Postal Address File (PAF) key. If no keys for the address are known, the array will be empty. Otherwise it will be a list of objects which specify the value of the address key and the code system for it","items":{"anyOf":[{"type":"object","description":"Unique identifier for an address.","properties":{"url":{"type":"string","description":"URL of specification of the AddressKey extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey"]},"extension":{"type":"array","description":"Specification of address key system and address key value. Contains exactly two items: one describing the code system the Address Key uses, and the other specifying the value of the Address Key.","minItems":2,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Coding system of the address key.","required":["url","valueCoding"],"properties":{"url":{"type":"string","description":"Always 'type'.","default":"type"},"valueCoding":{"type":"object","description":"URL of specification of address key format.","required":["system","code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available Address Key formats.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType"},"code":{"type":"string","description":"Address Key system. Always 'PAF'.","enum":["PAF"],"example":"PAF"}}}}},{"type":"object","description":"Value of the address key.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Always 'value'.","default":"value","example":"value"},"valueString":{"type":"string","description":"Address key in PAF format. An 8 digit number including leading zeroes, formatted as a string.","minLength":8,"maxLength":8,"pattern":"^[0-9]{8}$","example":"12345678"}}}]}}}},{"type":"object","description":"Unique identifier for an address.","properties":{"url":{"type":"string","description":"URL of specification of the AddressKey extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey"]},"extension":{"type":"array","description":"Specification of address key system and address key value. Contains exactly two items: one describing the code system the Address Key uses, and the other specifying the value of the Address Key.","minItems":2,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Coding system of the address key.","required":["url","valueCoding"],"properties":{"url":{"type":"string","description":"Always 'type'.","default":"type"},"valueCoding":{"type":"object","description":"URL of specification of address key format.","required":["system","code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available Address Key formats.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType"},"code":{"type":"string","description":"Address Key system. Always 'UPRN'.","enum":["UPRN"],"example":"UPRN"}}}}},{"type":"object","description":"Value of the address key.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Always 'value'.","default":"value","example":"value"},"valueString":{"type":"string","description":"Address key in UPRN format. A number containing from 1 up to 12 digits.","minLength":1,"maxLength":12,"pattern":"^[0-9]{1,12}$","example":"123456789012"}}}]}}}}]}}}}},"telecom":{"type":"array","description":"List of contact points for the patient; for example, phone numbers or email addresses.\nWhen a patient tagged as `restricted` is retrieved, all contact points are removed from the response.\n","items":{"description":"A contact point, such as a phone number or email address","type":"object","required":["system","value"],"properties":{"id":{"type":"string","description":"Unique object identifier for this contact point.","example":"789"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"system":{"description":"Means of communication, such as phone or email.","type":"string","enum":["phone","fax","email","other"],"example":"phone"},"value":{"description":"Phone number, email address, or other identifier for use with contact system.","type":"string","example":"01632960587"},"use":{"type":"string","description":"Location associated with communication system.","enum":["home","work","temp","mobile"],"example":"home"},"extension":{"type":"array","maxItems":1,"description":"Extension that is returned when the communication type is `textphone`. The only code returned is `textphone`, which means `Minicom (Textphone)`.\n\nThe `system` is `other` when the extension is included.\n","items":{"type":"object","description":"Wrapped object for other contact system details.","properties":{"url":{"type":"string","description":"Definition of other contact system extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem"]},"valueCoding":{"type":"object","description":"URL of specification of other contact systems.","properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem"},"code":{"type":"string","description":"Coded value for the other contact system in place.","example":"textphone"},"display":{"description":"Display-friendly representation of the other contact system code.","type":"string","example":"Minicom (Textphone)"}}}}}}}}},"contact":{"type":"array","description":"A list of patient contacts. Only emergency contacts are returned. Any other contacts are returned on the patients `Related Person`.\nWhen a patient tagged as `restricted` is retrieved, all contacts are removed from the response.\n","items":{"title":"Schema for a patient contact.","type":"object","additionalProperties":false,"required":["relationship","telecom"],"properties":{"id":{"type":"string","example":"C123"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"relationship":{"type":"array","description":"The contact relationship wrapper object that holds the details of the relationship to the patient.\n\nThis is only returned when an Emergency Contact number has been set on `telecom`. The only valid code is `C`, which means `Emergency Contact`.\n","minItems":1,"maxItems":1,"items":{"type":"object","required":["coding"],"properties":{"coding":{"type":"array","description":"Exactly one contact relationship.","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","format":"url","default":"http://terminology.hl7.org/CodeSystem/v2-0131"},"code":{"type":"string","description":"Coded value for contact relationship.","example":"C"},"display":{"type":"string","description":"Display-friendly representation of the contact relationship code.","example":"Emergency Contact"}}}}}}},"telecom":{"type":"array","description":"List of Telecom objects on the contact only contains `system` and `value`.\n","items":{"description":"A contact point, such as a phone number or email address","type":"object","required":["system","value"],"properties":{"id":{"type":"string","description":"Unique object identifier for this contact point.","example":"789"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"system":{"description":"Means of communication, such as phone or email.","type":"string","enum":["phone","fax","email","other"],"example":"phone"},"value":{"description":"Phone number, email address, or other identifier for use with contact system.","type":"string","example":"01632960587"},"use":{"type":"string","description":"Location associated with communication system.","enum":["home","work","temp","mobile"],"example":"home"},"extension":{"type":"array","maxItems":1,"description":"Extension that is returned when the communication type is `textphone`. The only code returned is `textphone`, which means `Minicom (Textphone)`.\n\nThe `system` is `other` when the extension is included.\n","items":{"type":"object","description":"Wrapped object for other contact system details.","properties":{"url":{"type":"string","description":"Definition of other contact system extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem"]},"valueCoding":{"type":"object","description":"URL of specification of other contact systems.","properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem"},"code":{"type":"string","description":"Coded value for the other contact system in place.","example":"textphone"},"display":{"description":"Display-friendly representation of the other contact system code.","type":"string","example":"Minicom (Textphone)"}}}}}}}}}}}},"generalPractitioner":{"type":"array","maxItems":1,"description":"General Practice (not practitioner) with which the patient is, or was, registered. Always contains zero or one general practitioner object.\nWhen a patient tagged as `restricted` is retrieved, the General Practice is removed from the response.\n","items":{"description":"General practice (not practitioner) with which the patient is or was registered.","type":"object","required":["identifier"],"properties":{"id":{"description":"Object identifier (OID) specific to the returned details - this should be return exactly the same in any update.","type":"string","example":"254406A3"},"type":{"description":"Type of Reference being returned.","type":"string","example":"Organization"},"identifier":{"description":"Identifier and system of identification used for this Organisation.","type":"object","required":["value"],"properties":{"system":{"description":"URL for the Organisation Data Service - who are responsible for publishing codes that identify organisations and individuals across health and social care.","type":"string","example":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"description":"Organisation code for the registered general practice, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","type":"string","pattern":"^[0-9A-Z]+$","example":"Y12345"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}}}}}}},"extension":{"type":"array","description":"Wrapper array for the patient's death notification status; this is a FHIR extension. Always contains zero or one death notification status object.\n","items":{"anyOf":[{"type":"object","description":"Wrapper object for death notification details.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of death notification extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus"]},"extension":{"type":"array","description":"Array containing exactly one death notification status code object and exactly one effective date object.","minItems":1,"maxItems":2,"items":{"oneOf":[{"type":"object","description":"Wrapper object for death notification status code.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `deathNotificationStatus`.","default":"deathNotificationStatus","enum":["deathNotificationStatus"]},"valueCodeableConcept":{"type":"object","description":"Death Notification Status.","properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["system","code"],"properties":{"system":{"type":"string","description":"URI of the coding system specification.","example":"https://fhir.hl7.org.uk/CodeSystem/UKCore-DeathNotificationStatus"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1.0.0"},"code":{"type":"string","description":"Symbol, in syntax, defined by the system:\n* `1` - Informal - death notice received via an update from a local NHS Organisation such as GP or Trust\n* `2` - Formal - death notice received from Registrar of Deaths. Only these endpoints are allowed to add a Formal death:\n - National Back Office using the Demographic Spine Application (DSA)\n - Office of National Statistics (ONS)\n - Maternity sites\n* `U` - Removed. This is a possible response, but it cannot be used on an update because Spine will reject it\n","example":"2","enum":["1","2","U"]},"display":{"type":"string","description":"Representation defined by the system.","example":"Formal - death notice received from Registrar of Deaths","enum":["Informal - death notice received via an update from a local NHS Organisation such as GP or Trust","Formal - death notice received from Registrar of Deaths","Removed"]}}}}}}}},{"type":"object","description":"Wrapper object for death notification effective date.","required":["url","valueDateTime"],"properties":{"url":{"type":"string","description":"Key of this object. Always `systemEffectiveDate`.","default":"systemEffectiveDate","enum":["systemEffectiveDate"]},"valueDateTime":{"type":"string","description":"Date and time at which death notification status took effect.","format":"date-time","example":"2010-10-22T00:00:00+00:00"}}}]}}}}]}}}}}}}}},"example":{"resourceType":"Bundle","type":"searchset","timestamp":"2019-12-25T12:00:00+00:00","total":1,"entry":[{"fullUrl":"https://api.service.nhs.uk/personal-demographics/FHIR/R4/Patient/9000000009","search":{"score":0.75},"resource":{"resourceType":"Patient","id":"9000000009","identifier":[{"system":"https://fhir.nhs.uk/Id/nhs-number","value":"9000000009","extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSNumberVerificationStatus","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-NHSNumberVerificationStatus","version":"1.0.0","code":"01","display":"Number present and verified"}]}}]}],"meta":{"versionId":"2","security":[{"system":"http://terminology.hl7.org/CodeSystem/v3-Confidentiality","code":"U","display":"unrestricted"}]},"name":[{"id":"123","use":"usual","period":{"start":"2020-01-01","end":"2021-12-31"},"given":["Jane"],"family":"Smith","prefix":["Mrs"],"suffix":["MBE"]}],"gender":"female","birthDate":"2010-10-22","multipleBirthInteger":1,"deceasedDateTime":"2010-10-22T00:00:00+00:00","address":[{"id":"456","period":{"start":"2020-01-01","end":"2021-12-31"},"use":"home","line":["1 Trevelyan Square","Boar Lane","City Centre","Leeds","West Yorkshire"],"postalCode":"LS1 6AE","extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","extension":[{"url":"type","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType","code":"PAF"}},{"url":"value","valueString":"12345678"}]},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","extension":[{"url":"type","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType","code":"UPRN"}},{"url":"value","valueString":"123456789012"}]}]}],"telecom":[{"id":"789","period":{"start":"2020-01-01","end":"2021-12-31"},"system":"phone","value":"01632960587","use":"home"},{"id":"790","period":{"start":"2019-01-01","end":"2022-12-31"},"system":"email","value":"jane.smith@example.com","use":"home"},{"id":"OC789","period":{"start":"2020-01-01","end":"2021-12-31"},"system":"other","value":"01632960587","use":"home","extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem","code":"textphone","display":"Minicom (Textphone)"}}]}],"contact":[{"id":"C123","period":{"start":"2020-01-01","end":"2021-12-31"},"relationship":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0131","code":"C","display":"Emergency Contact"}]}],"telecom":[{"system":"phone","value":"01632960587"}]}],"generalPractitioner":[{"id":"254406A3","type":"Organization","identifier":{"system":"https://fhir.nhs.uk/Id/ods-organization-code","value":"Y12345","period":{"start":"2020-01-01","end":"2021-12-31"}}}],"extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus","extension":[{"url":"deathNotificationStatus","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-DeathNotificationStatus","version":"1.0.0","code":"2","display":"Formal - death notice received from Registrar of Deaths"}]}},{"url":"systemEffectiveDate","valueDateTime":"2010-10-22T00:00:00+00:00"}]}]}}]}}}},"4XX":{"description":"An error occurred as follows:\n\n| HTTP status | Error code | Description |\n| ----------- | -------------------------- | --------------------------------------------- |\n| 200 | TOO_MANY_MATCHES | Too many matches were found - user should be told to refine their search parameters.\t|\n| 400 | INVALID_SEARCH_DATA\t | Invalid combination of search parameters. For details, see the `diagnostics` field. |\n| 400 | UNSUPPORTED_SERVICE | No search parameters provided. |\n| 400 | MISSING_VALUE | Missing header or query parameter. For details, see the `diagnostics` field. |\n| 400 | INVALID_VALUE | Invalid header or query parameter. For details, see the `diagnostics` field. |\n| 400 | ADDITIONAL_PROPERTIES | Unrecognised query parameter. For details, see the `diagnostics` field. |\n| 401 | ACCESS_DENIED | Access token missing, invalid or expired, or calling application not configured for this operation. |\n| 403 | INVALID_VALUE | Multiple results requested when using the API in application-restricted mode. |\n| 408 | UNABLE_TO_CALL_SERVICE | The downstream domain processing has not completed within the configured timeout period. |\n| 429 | TOO_MANY_REQUESTS | You have exceeded your application's [rate limit](https://digital.nhs.uk/developer/guides-and-documentation/reference-guide#rate-limits). |\n","content":{"application/fhir+json":{"schema":{"type":"object","description":"Outcome of an operation that does not result in a resource or bundle being returned, for example an error or an async/batch submission.\nThere are a number of possible error codes that can be returned along with a more detailed description in the `display` field.\n","properties":{"resourceType":{"type":"string","description":"FHIR Resource Type.","default":"OperationOutcome"},"issue":{"type":"array","description":"List of issues that have occurred.","minItems":1,"items":{"type":"object","required":["severity","code"],"properties":{"severity":{"type":"string","enum":["fatal","error","warning","information"],"description":"Severity of the error.","example":"error"},"code":{"type":"string","description":"FHIR error code.","example":"invalid","enum":["invalid","structure","required","value","invariant","security","login","unknown","expired","forbidden","suppressed","processing","not-supported","duplicate","multiple-matches","not-found","deleted","too-long","code-invalid","extension","too-costly","business-rule","conflict","transient","lock-error","no-store","exception","timeout","incomplete","throttled","informational"]},"details":{"type":"object","description":"Internal error code.","properties":{"coding":{"type":"array","items":{"type":"object","properties":{"system":{"type":"string","description":"URI of the coding system specification.","example":"https://fhir.nhs.uk/R4/CodeSystem/Spine-ErrorOrWarningCode"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1"},"code":{"type":"string","description":"Symbol in syntax defined by the system.","example":"INVALID_VALUE"},"display":{"type":"string","description":"Representation defined by the system.","example":"Provided value is invalid"}}}}}},"diagnostics":{"type":"string","description":"Additional diagnostic information about the issue. This information is subject to change.","example":"Invalid value - 2019-01 in field 'birthDate'"},"expression":{"type":"string","description":"FHIRPath of element(s) related to the error.","example":"Patient.name.given"}}}}}},"example":{"resourceType":"OperationOutcome","issue":[{"severity":"error","code":"value","details":{"coding":[{"system":"https://fhir.nhs.uk/R4/CodeSystem/Spine-ErrorOrWarningCode","version":"1","code":"INVALID_VALUE","display":"Provided value is invalid"}]},"diagnostics":"Invalid value - 'mal' in field 'gender'"}]}}}}}}},"/Patient/{id}":{"parameters":[{"name":"id","in":"path","description":"The patient's NHS number. The primary identifier of a patient, unique within NHS England and Wales. Always 10 digits and must be a [valid NHS number](https://www.datadictionary.nhs.uk/attributes/nhs_number.html).","required":true,"schema":{"type":"string","example":"9000000009"}},{"in":"header","name":"Authorization","description":"An [OAuth 2.0 bearer token](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation#user-restricted-apis).\n\nRequired in all environments except sandbox.\n","required":false,"schema":{"type":"string","format":"^Bearer\\ [[:ascii:]]+$","example":"Bearer g1112R_ccQ1Ebbb4gtHBP1aaaNM"}},{"in":"header","name":"NHSD-Session-URID","description":"\nThe user role ID (URID) for the current session. Also known as a user role profile ID (URPID).\n\nThis header is optional.\n\nIn Application-restricted access mode this header is ignored.\n\nIn Healthcare worker access mode if you send this header it must be valid for the logged-in user. See [determine the user's role](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation/user-restricted-restful-apis-nhs-cis2-separate-authentication-and-authorisation#step-9-determine-the-user-s-role) for guidance.\n","required":false,"schema":{"type":"string","pattern":"^[0-9]+$","example":"555254240100"}},{"in":"header","name":"X-Request-ID","required":false,"description":"A globally unique identifier (GUID) for the request, which we use to de-duplicate repeated requests and to trace the request if you contact our helpdesk.\n\nMust be a universally unique identifier (UUID) (ideally version 4).\n\nMirrored back in a response header.\n\nIf you re-send a failed request, use the same value in this header.\n","schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","example":"60E0B220-8136-4CA5-AE46-1D97EF59D068"}},{"in":"header","name":"X-Correlation-ID","required":false,"description":"An optional ID which you can use to track transactions across multiple systems. It can take any value, but we recommend avoiding `.` characters.\n\nMirrored back in a response header.\n","schema":{"type":"string","example":"11C46F5F-CDEF-4865-94B2-0EE0EDCC26DA"}},{"in":"header","name":"NHSD-End-User-Organisation-ODS","required":false,"description":"The ODS code of the user.\n\nMandatory for client applications which service multiple end user organisations (EUO). This will allow the calls to be attributed to the correct EUO.\n","schema":{"type":"string","example":"Y12345"}}],"get":{"description":"## Overview\nUse this endpoint to get patient details from PDS for a given NHS number.\n\nYou cannot get a patient's related people details, use the RelatedPerson endpoint instead.\n\n## Superseded patients\nSome patients are marked as superseded, this means that for some reason the original resource is no longer valid and has been replaced with a different resource.\n\nOn retrieval of a superseded resource, the new resource is automatically returned in place of the requested resource. You can spot a superseded resource when the `id` is not the same as the one requested.\n\nWhen retrieving a superseding resource you must update your system with the new resource and remove the superseded resource, ensuring that the same `id` does not exist against another resource in your system.\n\n## Restricted patients\nSome patients are tagged as [restricted](https://digital.nhs.uk/services/demographics/restricting-access-to-a-patients-demographic-record) and are sometimes known as sensitive patients. Restricted patients can be retrieved; however, location sensitive fields such as `address`, `telecom` and `generalPractitioner` are removed.\n\nThe restricted flag can be found in the data under `meta/security` on the patient resource.\n\n## Sandbox test scenarios\nYou can test the following scenarios in our sandbox environment:\n\n| Scenario | Request | Response |\n| -------------------------------- | ------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |\n| Patient exists | `id`=`9000000009` | HTTP Status 200 with patient data in response |\n| Sensitive patient exists | `id`=`9000000025` | HTTP Status 200 with patient data in response with the restricted data removed |\n| Patient exists with minimal data | `id`=`9000000033` | HTTP Status 200 with patient data in response, there will be very little data so can be used as an example of a patient with bad data quality |\n| Patient does not exist | `id`=`9111231130` (or any other valid NHS number) | HTTP Status 404 with problem description |\n| Invalid NHS number | `id`=`9000000000` (or any invalid NHS number) | HTTP Status 400 with problem description |\n| Missing X-Request-ID | `id`=`9000000009` (or any other valid NHS number) | HTTP Status 412 with problem description |\n\nYou can try out the sandbox using the 'Try this API' feature on this page.\n\nAlternatively, you can try out the sandbox using our Postman collection:\n\n[![Run in Postman](https://run.pstmn.io/button.svg)](https://app.getpostman.com/run-collection/14719036-953f067f-30b9-4552-8252-7cc10b21dad3)\n","summary":"Get patient details","operationId":"get-patient","responses":{"200":{"description":"Information successfully returned.","headers":{"ETag":{"schema":{"type":"string","pattern":"^W/\"[0-9]+\"$","example":"W/\"2\""},"description":"Record version identifier enclosed in quotes and preceded by 'W/'. For example, `W/\"2\"`.\n\nCorresponds to `meta.versionId` attribute in the patient resource body.\n\nWhen you retrieve a patient resource, you get a version number for the resource (in the `ETag` response header and in the `versionId` field in the response).\nYou must then pass the resource's version number in any update request (in the `If-Match` response header) made for the patient.\n"},"X-Correlation-Id":{"schema":{"type":"string","example":"11C46F5F-CDEF-4865-94B2-0EE0EDCC26DA"},"description":"The X-Correlation-ID from the request header, if supplied, mirrored back.\n"},"X-Request-Id":{"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","example":"60E0B220-8136-4CA5-AE46-1D97EF59D068"},"description":"The X-Request-ID from the request header, if supplied, mirrored back.\n"}},"content":{"application/fhir+json":{"schema":{"type":"object","required":["id"],"additionalProperties":false,"properties":{"resourceType":{"type":"string","description":"FHIR resource type.","default":"Patient"},"id":{"description":"The patient's NHS number. The primary identifier of a patient, unique within NHS England and Wales. Always 10 digits and must be a [valid NHS number](https://www.datadictionary.nhs.uk/attributes/nhs_number.html).","type":"string","pattern":"^\\d{10}$","example":"9000000009"},"identifier":{"type":"array","description":"Identifier and system of identification used for this Patient.","items":{"type":"object","maxItems":1,"required":["value"],"properties":{"system":{"type":"string","format":"url","description":"System identifier belongs to.","default":"https://fhir.nhs.uk/Id/nhs-number"},"value":{"description":"The patient's NHS number. The primary identifier of a patient, unique within NHS England and Wales. Always 10 digits and must be a [valid NHS number](https://www.datadictionary.nhs.uk/attributes/nhs_number.html).","type":"string","pattern":"^\\d{10}$","example":"9000000009"},"extension":{"type":"array","description":"FHIR extensions.","items":{"type":"object","description":"Status indicating if NHS number is present and verified.","properties":{"url":{"type":"string","description":"URL of the extension definition.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSNumberVerificationStatus","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSNumberVerificationStatus"]},"valueCodeableConcept":{"type":"object","description":"NHS Number Verification Status Indicator.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URI of the coding system specification.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-NHSNumberVerificationStatus"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1.0.0"},"code":{"type":"string","description":"Symbol in syntax defined by the system.","example":"01"},"display":{"type":"string","description":"Representation defined by the system.","example":"Number present and verified"}}}}}}}}}}}},"meta":{"type":"object","description":"Metadata about this resource.","properties":{"versionId":{"type":"string","description":"The NHS Digital assigned version of the patient resource.","example":"2"},"security":{"type":"array","description":"The level of security on the patients record, which affects which fields are populated on retrieval. The possible responses are:\n* U - unrestricted. All available data is returned.\n* R - restricted. Any sensitive data around the patient's location, so `address`, `generalPractitioner` and `telecom`, are removed from the response.\n* REDACTED - redacted. The patient record has been marked as invalid, so the data should not be used. This code is never returned; you receive a 404, and appropriate error response, if an invalidated patient retrieval is attempted.\n","maxItems":1,"items":{"type":"object","properties":{"system":{"type":"string","description":"URI of the value set specification.","example":"http://terminology.hl7.org/CodeSystem/v3-Confidentiality"},"code":{"type":"string","description":"Code defined by the system value set.","enum":["U","R","V","REDACTED"],"example":"U"},"display":{"type":"string","description":"Representation defined by the system.","enum":["unrestricted","restricted","redacted"],"example":"unrestricted"}}}}}},"name":{"type":"array","description":"List of names associated with the patient. \n","minItems":1,"items":{"type":"object","required":["use","family"],"additionalProperties":false,"properties":{"id":{"type":"string","description":"Unique object identifier for this name.","example":"123"},"use":{"type":"string","description":"How this name should be used.\n* usual - Known as, conventional or the one patient normally uses. A patient always has a usual name.\n* temp - An alias or temporary name. This may also be used for temporary names assigned at birth or in emergency situations.\n* nickname - A name that the patient prefers to be addressed by, but is not part of their usual name.\n* old - This name is no longer in use (or was never correct, but retained for records).\n* maiden - Name changed for Marriage. A name used prior to changing name because of marriage. This term is not gender specific. The use of this term does not imply any particular history for a person's name.\n\nThe following use codes are included in the [name-use](https://www.hl7.org/fhir/valueset-name-use.html) value set, but should not be used and is not be returned as part of a retrieval.\n* official - The formal name as registered in an official (government) registry, but which name might not be commonly used. May be called \"legal name\".\n* anonymous - Anonymous assigned name, alias, or pseudonym (used to protect a person's identity for privacy reasons).\n","enum":["usual","temp","nickname","old","maiden"],"example":"usual"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"given":{"type":"array","maxItems":5,"description":"Given names, including any middle names.\n\nEach name(s) should be a separate item in the list. The first given name may include multiple names, separated by a space.\nSubsequent names must be broken down into list items. For example, the input `[Jane Marie Anne, Jo Adele]` returns `[Jane Marie Anne, Jo, Adele]`.\n","example":["Jane Marie Anne","Jo","Adele"],"items":{"type":"string","maxLength":35,"example":"Jane"}},"family":{"type":"string","maxLength":35,"description":"Family name (often called Surname).","example":"Smith"},"prefix":{"type":"array","description":"Name prefixes, titles, and prenominals.","example":["Mrs"],"items":{"type":"string","example":"Mrs"}},"suffix":{"type":"array","description":"Name suffices and postnominals.","example":["MBE","PhD"],"items":{"type":"string","example":"MBE"}}}}},"gender":{"type":"string","description":"Classification of the gender of a patient. The classification is phenotypical rather than genotypical, i.e. it does not provide codes for medical or scientific purposes.\nIt is the administrative gender that the patient wishes to be known as. In some cases, this may not be the same as the patient’s registered birth gender, or their current clinical gender.\n","enum":["male","female","other","unknown"],"example":"female"},"birthDate":{"description":"The date on which the patient was born or is officially deemed to have been born.\n\nIt is a date in the format `yyyy-mm-dd`. Due to data quality issues on a small number of patients `yyyy-mm` and `yyyy` format may also be returned. \n","example":"2010-10-22","type":"string","format":"date"},"multipleBirthInteger":{"type":"integer","minimum":1,"maximum":9,"description":"The order in which the patient was born, with 1 indicating the first or only birth in the sequence, 2 indicating the second birth in the sequence, 3 indicating the third, and so on up to 7.\n\nThere are two other valid values; `8` meaning `Not applicable` and `9` meaning `Not known`.\n","example":1},"deceasedDateTime":{"description":"The date and time on which a person died or is officially deemed to have died, if applicable and known.\n\nIt is a datetime in the format `yyyy-mm-ddTHH:MM:SS+HH:MM` or `yyyy-mm-dd`. Due to data quality issues on a small number of patients `yyyy-mm` and `yyyy` format may also be returned.\n","example":"2010-10-22T00:00:00+00:00","type":"string","format":"date-time","pattern":"^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2}\\+\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2}\\+\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01]))$"},"address":{"type":"array","description":"List of addresses associated with the patient.\n\nThese are fully populated on a retrieval or a successful update, only the `home` address is returned on a search.\nWhen a patient tagged as `restricted` is retrieved, all addresses are removed from the response.\n","items":{"type":"object","description":"An address associated with the patient.","required":["use"],"properties":{"id":{"type":"string","description":"Unique system identifier for this address.","example":"456"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"use":{"type":"string","description":"Purpose of this address:\n * `home` - the home address is the patient's normal residence. Home address is also known as usual, main, registered, current or permanent address\n * `temp` - a temporary address is an address used for a set period of time, but where the patient's home, permanent address remains unchanged\n * `billing` - an address used for correspondence purposes only\n * `work` - an office address. This can be returned due to legacy data but cannot be added or replaced on update\n\n A patient should have no more than one current `temp` and/or `billing` address.\n However, historically this was constrained only by the integration requirements and was not enforced so theoretically more than one can exist for a patient when retrieving.\n Where multiple instances already exist for the patient it is not expected that local systems should manage those, but should choose the most appropriate one to maintain (e.g. by examining period dates).\n\n A `home` address is the patient's main residential address and should normally be used for all clinical and demographic purposes, including clinical and appointment correspondence.\n However additionally, `temp` and `billing` addresses may be provided by a patient when there is a requirement to record an alternative location for the purposes of unbroken care.\n When sending correspondence to a patient:\n *\ta present and valid `billing` address may take precedence over `home` and `temp` addresses. A patient should have only a single current `billing` address. An address is considered 'valid' according to its period start and end dates.\n *\tif no current `billing` address is provided, a `temp` address may take precedence over the `home` address, again if it is valid according to its period start and end dates.\n * if there is no valid, current `billing` and/or `temp` address, the `home` address must be used.\n","enum":["home","work","temp","billing"],"example":"home"},"text":{"type":"string","description":"Where a `temp` address is provided a descriptor text must be sent.\nThe list of possible values are:\n* `Second Home` - a patient's second home\n* `Student Accommodation` - a patient's place of residence while at university\n* `Respite Care Address` - where the patient resides during respite care\n* `Temporary Residence Address` - where the patient resides for a specific period of time\n* `Convalescence Home` - the address for a patient during a period of recovery\n* `Mobile Home` - the address of a patient's mobile home, parked for a specific period of time, e.g. the address of a caravan park\n* `Holiday Home` - the address for a patient during a holiday\n\nA patient can also register temporarily at a GP practice using a temporary address. Temporary GP registration information does not appear on the PDS, but the address used for it may.\n","enum":["Second Home","Student Accommodation","Respite Care Address","Temporary Residence Address","Convalescence Home","Mobile Home","Holiday Home"],"example":"Student Accommodation"},"line":{"type":"array","description":"All lines of the address except the postal code.\n\nSystems must apply the following formatting convention when adding or replacing addresses lines:\n*\tline 1 - premises ID and/or house name, e.g. `Flat 1` or `The Old Schoolhouse`\n*\tline 2 - house number, dependent thoroughfare name and descriptor (if present), thoroughfare name and descriptor, e.g. `23 Mill Lane`\n*\tline 3 - dependent locality/village, locality (if present), e.g. `Boxgrove`\n*\tline 4 - post town, e.g. `Leeds`\n*\tline 5 - county (if present), e.g. `West Yorkshire`\n\nIf any of the lines are blank, they are not returned due to FHIR conformance constraints.\n","maxItems":5,"items":{"type":"string"},"example":["1 Trevelyan Square","Boar Lane","City Centre","Leeds","West Yorkshire"]},"postalCode":{"type":"string","description":"Postal code of the address.","example":"LS1 6AE"},"extension":{"type":"array","description":"List of address keys formatted as a FHIR extension. This can include up to one Unique Property Reference Number (UPRN), and up to one Postal Address File (PAF) key. If no keys for the address are known, the array will be empty. Otherwise it will be a list of objects which specify the value of the address key and the code system for it","items":{"anyOf":[{"type":"object","description":"Unique identifier for an address.","properties":{"url":{"type":"string","description":"URL of specification of the AddressKey extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey"]},"extension":{"type":"array","description":"Specification of address key system and address key value. Contains exactly two items: one describing the code system the Address Key uses, and the other specifying the value of the Address Key.","minItems":2,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Coding system of the address key.","required":["url","valueCoding"],"properties":{"url":{"type":"string","description":"Always 'type'.","default":"type"},"valueCoding":{"type":"object","description":"URL of specification of address key format.","required":["system","code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available Address Key formats.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType"},"code":{"type":"string","description":"Address Key system. Always 'PAF'.","enum":["PAF"],"example":"PAF"}}}}},{"type":"object","description":"Value of the address key.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Always 'value'.","default":"value","example":"value"},"valueString":{"type":"string","description":"Address key in PAF format. An 8 digit number including leading zeroes, formatted as a string.","minLength":8,"maxLength":8,"pattern":"^[0-9]{8}$","example":"12345678"}}}]}}}},{"type":"object","description":"Unique identifier for an address.","properties":{"url":{"type":"string","description":"URL of specification of the AddressKey extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey"]},"extension":{"type":"array","description":"Specification of address key system and address key value. Contains exactly two items: one describing the code system the Address Key uses, and the other specifying the value of the Address Key.","minItems":2,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Coding system of the address key.","required":["url","valueCoding"],"properties":{"url":{"type":"string","description":"Always 'type'.","default":"type"},"valueCoding":{"type":"object","description":"URL of specification of address key format.","required":["system","code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available Address Key formats.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType"},"code":{"type":"string","description":"Address Key system. Always 'UPRN'.","enum":["UPRN"],"example":"UPRN"}}}}},{"type":"object","description":"Value of the address key.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Always 'value'.","default":"value","example":"value"},"valueString":{"type":"string","description":"Address key in UPRN format. A number containing from 1 up to 12 digits.","minLength":1,"maxLength":12,"pattern":"^[0-9]{1,12}$","example":"123456789012"}}}]}}}}]}}}}},"telecom":{"type":"array","description":"List of contact points for the patient; for example, phone numbers or email addresses.\nWhen a patient tagged as `restricted` is retrieved, all contact points are removed from the response.\n","items":{"description":"A contact point, such as a phone number or email address","type":"object","required":["system","value"],"properties":{"id":{"type":"string","description":"Unique object identifier for this contact point.","example":"789"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"system":{"description":"Means of communication, such as phone or email.","type":"string","enum":["phone","fax","email","other"],"example":"phone"},"value":{"description":"Phone number, email address, or other identifier for use with contact system.","type":"string","example":"01632960587"},"use":{"type":"string","description":"Location associated with communication system.","enum":["home","work","temp","mobile"],"example":"home"},"extension":{"type":"array","maxItems":1,"description":"Extension that is returned when the communication type is `textphone`. The only code returned is `textphone`, which means `Minicom (Textphone)`.\n\nThe `system` is `other` when the extension is included.\n","items":{"type":"object","description":"Wrapped object for other contact system details.","properties":{"url":{"type":"string","description":"Definition of other contact system extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem"]},"valueCoding":{"type":"object","description":"URL of specification of other contact systems.","properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem"},"code":{"type":"string","description":"Coded value for the other contact system in place.","example":"textphone"},"display":{"description":"Display-friendly representation of the other contact system code.","type":"string","example":"Minicom (Textphone)"}}}}}}}}},"contact":{"type":"array","description":"A list of patient contacts. Only emergency contacts are returned and only emergency contacts should be added. Any other contacts should be added to the patients `Related Person`.\nPatients designate here any contact number they desire to be used in case of an emergency.\nNote, while a patient may also desire to record various related persons telecom details, these do not separately allow for a concept of emergency contact; only ranking. See RelatedPerson endpoint.\nWhen a patient tagged as `restricted` is retrieved, all contacts are removed from the response.\n","items":{"title":"Schema for a patient contact.","type":"object","additionalProperties":false,"required":["relationship","telecom"],"properties":{"id":{"type":"string","example":"C123"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"relationship":{"type":"array","description":"The contact relationship wrapper object that holds the details of the relationship to the patient.\n\nThis is only returned when an Emergency Contact number has been set on `telecom`. The only valid code is `C`, which means `Emergency Contact`.\n","minItems":1,"maxItems":1,"items":{"type":"object","required":["coding"],"properties":{"coding":{"type":"array","description":"Exactly one contact relationship.","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","format":"url","default":"http://terminology.hl7.org/CodeSystem/v2-0131"},"code":{"type":"string","description":"Coded value for contact relationship.","example":"C"},"display":{"type":"string","description":"Display-friendly representation of the contact relationship code.","example":"Emergency Contact"}}}}}}},"telecom":{"type":"array","description":"List of Telecom objects on the contact only contains `system` and `value`.\n","items":{"description":"A contact point, such as a phone number or email address","type":"object","required":["system","value"],"properties":{"id":{"type":"string","description":"Unique object identifier for this contact point.","example":"789"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"system":{"description":"Means of communication, such as phone or email.","type":"string","enum":["phone","fax","email","other"],"example":"phone"},"value":{"description":"Phone number, email address, or other identifier for use with contact system.","type":"string","example":"01632960587"},"use":{"type":"string","description":"Location associated with communication system.","enum":["home","work","temp","mobile"],"example":"home"},"extension":{"type":"array","maxItems":1,"description":"Extension that is returned when the communication type is `textphone`. The only code returned is `textphone`, which means `Minicom (Textphone)`.\n\nThe `system` is `other` when the extension is included.\n","items":{"type":"object","description":"Wrapped object for other contact system details.","properties":{"url":{"type":"string","description":"Definition of other contact system extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem"]},"valueCoding":{"type":"object","description":"URL of specification of other contact systems.","properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem"},"code":{"type":"string","description":"Coded value for the other contact system in place.","example":"textphone"},"display":{"description":"Display-friendly representation of the other contact system code.","type":"string","example":"Minicom (Textphone)"}}}}}}}}}}}},"generalPractitioner":{"type":"array","maxItems":1,"description":"General Practice (not practitioner) with which the patient is, or was, registered. Always contains zero or one general practitioner object.\nWhen a patient tagged as `restricted` is retrieved, the General Practice is removed from the response.\n","items":{"description":"General practice (not practitioner) with which the patient is or was registered.","type":"object","required":["identifier"],"properties":{"id":{"description":"Object identifier (OID) specific to the returned details - this should be return exactly the same in any update.","type":"string","example":"254406A3"},"type":{"description":"Type of Reference being returned.","type":"string","example":"Organization"},"identifier":{"description":"Identifier and system of identification used for this Organisation.","type":"object","required":["value"],"properties":{"system":{"description":"URL for the Organisation Data Service - who are responsible for publishing codes that identify organisations and individuals across health and social care.","type":"string","example":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"description":"Organisation code for the registered general practice, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","type":"string","pattern":"^[0-9A-Z]+$","example":"Y12345"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}}}}}}},"managingOrganization":{"description":"The managing organization of a de-registered patient. This will not be returned when the reason for de-registration is death.","type":"object","required":["identifier"],"properties":{"type":{"description":"Type of Reference being returned.","type":"string","example":"Organization"},"identifier":{"description":"Identifier and system of identification used for this Organisation.","type":"object","required":["value"],"properties":{"system":{"description":"URL for the Organisation Data Service - who are responsible for publishing codes that identify organisations and individuals across health and social care.","type":"string","example":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"description":"Organisation code for the registered general practice, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","type":"string","pattern":"^[0-9A-Z]+$","example":"Y12345"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}}}}}},"extension":{"type":"array","description":"Wrapper array for the patient's pharmacies, death notification status, communication details, contact preferences and place of birth; these are all FHIR extensions.\nAlways contains zero or one of each pharmacy object, zero or one death notification status object, zero or one communication details object, zero or one contact preference and zero or one place of birth object.\nWhen a patient tagged as `restricted` is retrieved, the pharmacy and birth place extensions are removed from the response.\n","items":{"anyOf":[{"type":"object","description":"Wrapper object for the patient's nominated pharmacy. This will only be populated on a retrieval and not a search.","required":["url","valueReference"],"properties":{"url":{"type":"string","description":"URL of specification of UKCore-NominatedPharmacy FHIR extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NominatedPharmacy","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NominatedPharmacy"]},"valueReference":{"type":"object","description":"Reference to a pharmacy `Organization` resource.","required":["identifier"],"properties":{"identifier":{"type":"object","description":"Wrapper object for the patient's nominated pharmacy organisation code.","required":["value"],"properties":{"system":{"type":"string","description":"URL for the FHIR code system for the ODS organisation code.","default":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"type":"string","description":"Organisation code for the nominated pharmacy, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","pattern":"^[A-Za-z0-9]{3,10}$","example":"Y12345"}}}}}}},{"type":"object","description":"Wrapper object for the patient's dispensing doctor. This will only be populated on a retrieval and not a search.","required":["url","valueReference"],"properties":{"url":{"type":"string","description":"URL of specification of UKCore-DispensingDoctor FHIR extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-PreferredDispenserOrganization","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-PreferredDispenserOrganization"]},"valueReference":{"type":"object","description":"Reference to a GP practice pharmacy `Organization` resource.","required":["identifier"],"properties":{"identifier":{"type":"object","description":"Wrapper object for the patient's dispensing doctor organisation code.","required":["value"],"properties":{"system":{"type":"string","description":"URL for the FHIR code system for the ODS organisation code.","default":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"type":"string","description":"Organisation code for the dispensing doctor, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","pattern":"^[A-Za-z0-9]{3,10}$","example":"Y23456"}}}}}}},{"type":"object","description":"Wrapper object for the patient's medical appliance supplier. This will only be populated on a retrieval and not a search.","required":["url","valueReference"],"properties":{"url":{"type":"string","description":"URL of specification of UKCore-MedicalApplianceSupplier FHIR extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-MedicalApplianceSupplier","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-MedicalApplianceSupplier"]},"valueReference":{"type":"object","description":"Reference to medical appliance supplier pharmacy `Organization` resource.","required":["identifier"],"properties":{"identifier":{"type":"object","description":"Wrapper object for the patient's medical appliance supplier organisation code.","required":["value"],"properties":{"system":{"type":"string","description":"URL for the FHIR code system for the ODS organisation code.","default":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"type":"string","description":"Organisation code for the medical appliance supplier, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","pattern":"^[A-Za-z0-9]{3,10}$","example":"Y34567"}}}}}}},{"type":"object","description":"Wrapper object for death notification details.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of death notification extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus"]},"extension":{"type":"array","description":"Array containing exactly one death notification status code object and exactly one effective date object.","minItems":1,"maxItems":2,"items":{"oneOf":[{"type":"object","description":"Wrapper object for death notification status code.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `deathNotificationStatus`.","default":"deathNotificationStatus","enum":["deathNotificationStatus"]},"valueCodeableConcept":{"type":"object","description":"Death Notification Status.","properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["system","code"],"properties":{"system":{"type":"string","description":"URI of the coding system specification.","example":"https://fhir.hl7.org.uk/CodeSystem/UKCore-DeathNotificationStatus"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1.0.0"},"code":{"type":"string","description":"Symbol, in syntax, defined by the system:\n* `1` - Informal - death notice received via an update from a local NHS Organisation such as GP or Trust\n* `2` - Formal - death notice received from Registrar of Deaths. Only these endpoints are allowed to add a Formal death:\n - National Back Office using the Demographic Spine Application (DSA)\n - Office of National Statistics (ONS)\n - Maternity sites\n* `U` - Removed. This is a possible response, but it cannot be used on an update because Spine will reject it\n","example":"2","enum":["1","2","U"]},"display":{"type":"string","description":"Representation defined by the system.","example":"Formal - death notice received from Registrar of Deaths","enum":["Informal - death notice received via an update from a local NHS Organisation such as GP or Trust","Formal - death notice received from Registrar of Deaths","Removed"]}}}}}}}},{"type":"object","description":"Wrapper object for death notification effective date.","required":["url","valueDateTime"],"properties":{"url":{"type":"string","description":"Key of this object. Always `systemEffectiveDate`.","default":"systemEffectiveDate","enum":["systemEffectiveDate"]},"valueDateTime":{"type":"string","description":"Date and time at which death notification status took effect.","format":"date-time","example":"2010-10-22T00:00:00+00:00"}}}]}}}},{"type":"object","description":"Wrapper object for communication details. This will only be populated on a retrieval and not a search.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of communication extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSCommunication","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSCommunication"]},"extension":{"type":"array","description":"Definition of communication extension.\n\nThe array must have one item, a valueCodeableConcept for the language and can optionally include a valueBoolean for if an interpreter is required.","minItems":1,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Wrapper object for communication language.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `language`.","default":"language","enum":["language"]},"valueCodeableConcept":{"type":"object","description":"Human language.","required":["coding"],"properties":{"coding":{"type":"array","description":"Exactly one language code.","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URL of the Language Code System. Always uses the 'UKCore-HumanLanguage' Code System.","example":"https://fhir.hl7.org.uk/CodeSystem/UKCore-HumanLanguage"},"version":{"type":"string","description":"Version of the language code system.","example":"1.0.0"},"code":{"type":"string","description":"Language code based on [ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) standard plus extensions for braille, makaton and sign languages, which are:\n* `q1` - Braille\n* `q2` - American Sign Language\n* `q3` - Australian Sign Language\n* `q4` - British Sign Language\n* `q5` - Makaton\nAll valid codes combined can be found at https://fhir.hl7.org.uk/CodeSystem/UKCore-HumanLanguage.\n","example":"fr"},"display":{"type":"string","description":"Display-friendly representation of the language code (such as English). If there is a language code with no defined mapping, `Unknown` will be returned.","example":"French"}}}}}}}},{"type":"object","description":"Wrapper object for whether an interpreter is required.","required":["url","valueBoolean"],"properties":{"url":{"type":"string","description":"Key of this object. Always `interpreterRequired`.","default":"interpreterRequired","enum":["interpreterRequired"]},"valueBoolean":{"type":"boolean","description":"Whether an interpreter is required.","example":true}}}]}}}},{"type":"object","description":"Wrapper object for preferred contact details; the written communication format, preferred contact time and method. This will only be populated on a retrieval and not a search.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of the contact preference extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-ContactPreference","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-ContactPreference"]},"extension":{"description":"Wrapper array containing zero or one preferred contact method, zero or one preferred written communication format; and zero or one preferred contact time.","type":"array","maxItems":3,"items":{"oneOf":[{"type":"object","description":"Wrapper object for preferred written communication format.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredWrittenCommunicationFormat`.","default":"PreferredWrittenCommunicationFormat"},"valueCodeableConcept":{"type":"object","description":"Preferred Written Communication Format.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","format":"url","description":"Definition of the preferred written communication extension.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredWrittenCommunicationFormat","enum":["https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredWrittenCommunicationFormat"]},"code":{"type":"string","description":"A code to identify the preferred written communication format of a patient, contact or related person.\n* 11 - Large print\n* 12 - Braille\n* 13 - Audio tape\n","example":"12"},"display":{"type":"string","description":"Display-friendly representation of the preferred written communication format code.","example":"Braille"}}}}}}}},{"type":"object","description":"Wrapper object for preferred contact method.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredContactMethod`.","default":"PreferredContactMethod","enum":["PreferredContactMethod"]},"valueCodeableConcept":{"type":"object","description":"Preferred Contact Method.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","format":"url","description":"Definition of the preferred contact method extension.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredContactMethod","enum":["https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredContactMethod"]},"code":{"type":"string","description":"A code to identify to identify the preferred contact method of a patient, contact or related person.\n* 1\t- Letter\n* 2\t- Visit\n* 3\t- Telephone\n* 4\t- E-mail\n* 5\t- Minicom (Textphone)\n* 6\t- Telephone contact via proxy\n* 7\t- Sign language\n* 8\t- No Telephone contact\n","example":"1"},"display":{"type":"string","description":"Display-friendly representation of the preferred contact method code.","example":"Letter"}}}}}}}},{"type":"object","description":"Wrapper object for preferred contact times.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredContactTimes`.","default":"PreferredContactTimes","enum":["PreferredContactTimes"]},"valueString":{"type":"string","maximum":40,"description":"A free-text description about the preferred contact times.","example":"Not after 7pm"}}}]}}}},{"type":"object","description":"Wrapper object for place of birth details. This will not be returned on a restricted patient.","required":["url","valueAddress"],"properties":{"url":{"type":"string","description":"Definition of place of birth extension.","default":"http://hl7.org/fhir/StructureDefinition/patient-birthPlace","enum":["http://hl7.org/fhir/StructureDefinition/patient-birthPlace"]},"valueAddress":{"type":"object","additionalProperties":false,"properties":{"city":{"type":"string","description":"Town or city of birth.","example":"Manchester"},"district":{"type":"string","description":"County or metropolitan district of birth.","example":"Greater Manchester"},"country":{"type":"string","description":"A coded value for a patient's country of birth.\n\nFrom [ISO 3166-1](http://hl7.org/fhir/valueset-iso3166-1-3.html) plus codes from the UK Internal Code list which do not have entries in ISO 3166-1.\n\nUK Internal Codes:\n* `1` - England\n* `2` - Scotland\n* `3` - Wales\n* `4` - Northern Ireland\n* `7` - Sark\n* `9` - Alderney\n* `10` - Channel Islands\n","example":"GBR"}}}}},{"type":"object","description":"An extension to carry the reason a PDS record has been removed from the Patient Demographic Service. This will only be populated on a retrieval and not a search.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of the removal from registration extension.","default":"https://fhir.nhs.uk/StructureDefinition/Extension-PDS-RemovalFromRegistration","enum":["https://fhir.nhs.uk/StructureDefinition/Extension-PDS-RemovalFromRegistration"],"readOnly":true},"extension":{"type":"array","description":"An extension reason a PDS record has been removed from the Patient Demographic Service.","minItems":1,"maxItems":2,"items":{"oneOf":[{"type":"object","description":"Wrapper object for removalFromRegistrationCode.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"To identify the removal reason code.","default":"removalFromRegistrationCode","enum":["removalFromRegistrationCode"],"readOnly":true},"valueCodeableConcept":{"type":"object","description":"PDS Removal Reason Exit Code","required":["coding"],"properties":{"coding":{"type":"array","description":"Array containing exactly one removal reason exit code object","items":{"type":"object","required":["system","code","display"],"properties":{"system":{"type":"string","format":"url","description":"URL of the Removal Reason Exit Code. Always uses the 'PDS-RemovalReasonExitCode' Code System.","example":"https://fhir.nhs.uk/CodeSystem/PDS-RemovalReasonExitCode","readOnly":true},"code":{"type":"string","description":"A CodeSystem that identifies the reason a PDS record has been removed.","example":"SCT","enum":["DEA","EMB","SCT","NIT","TRA","ORR"]},"display":{"type":"string","description":"Display-friendly representation of the removal reason exit code.","example":"Transferred to Scotland"}}}}}}}},{"type":"object","description":"Wrapper object for removal from registration effective time.","required":["url","valuePeriod"],"properties":{"url":{"type":"string","description":"Key of this object. Always `effectiveTime`.","default":"effectiveTime","enum":["effectiveTime"],"readOnly":true},"valuePeriod":{"type":"object","description":"The effective time of removal of the Patient record from PDS.","required":["start"],"properties":{"start":{"type":"string","format":"date-time","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01T00:00:00+00:00"},"end":{"type":"string","format":"date-time","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31T00:00:00+00:00"}}}}}]}}}}]}}}},"example":{"resourceType":"Patient","id":"9000000009","identifier":[{"system":"https://fhir.nhs.uk/Id/nhs-number","value":"9000000009","extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSNumberVerificationStatus","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-NHSNumberVerificationStatus","version":"1.0.0","code":"01","display":"Number present and verified"}]}}]}],"meta":{"versionId":"2","security":[{"system":"http://terminology.hl7.org/CodeSystem/v3-Confidentiality","code":"U","display":"unrestricted"}]},"name":[{"id":"123","use":"usual","period":{"start":"2020-01-01","end":"2021-12-31"},"given":["Jane"],"family":"Smith","prefix":["Mrs"],"suffix":["MBE"]}],"gender":"female","birthDate":"2010-10-22","multipleBirthInteger":1,"deceasedDateTime":"2010-10-22T00:00:00+00:00","generalPractitioner":[{"id":"254406A3","type":"Organization","identifier":{"system":"https://fhir.nhs.uk/Id/ods-organization-code","value":"Y12345","period":{"start":"2020-01-01","end":"2021-12-31"}}}],"managingOrganization":{"type":"Organization","identifier":{"system":"https://fhir.nhs.uk/Id/ods-organization-code","value":"Y12345","period":{"start":"2020-01-01","end":"2021-12-31"}}},"extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NominatedPharmacy","valueReference":{"identifier":{"system":"https://fhir.nhs.uk/Id/ods-organization-code","value":"Y12345"}}},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-PreferredDispenserOrganization","valueReference":{"identifier":{"system":"https://fhir.nhs.uk/Id/ods-organization-code","value":"Y23456"}}},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-MedicalApplianceSupplier","valueReference":{"identifier":{"system":"https://fhir.nhs.uk/Id/ods-organization-code","value":"Y34567"}}},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus","extension":[{"url":"deathNotificationStatus","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-DeathNotificationStatus","version":"1.0.0","code":"2","display":"Formal - death notice received from Registrar of Deaths"}]}},{"url":"systemEffectiveDate","valueDateTime":"2010-10-22T00:00:00+00:00"}]},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSCommunication","extension":[{"url":"language","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-HumanLanguage","version":"1.0.0","code":"fr","display":"French"}]}},{"url":"interpreterRequired","valueBoolean":true}]},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-ContactPreference","extension":[{"url":"PreferredWrittenCommunicationFormat","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredWrittenCommunicationFormat","code":"12","display":"Braille"}]}},{"url":"PreferredContactMethod","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredContactMethod","code":"1","display":"Letter"}]}},{"url":"PreferredContactTimes","valueString":"Not after 7pm"}]},{"url":"http://hl7.org/fhir/StructureDefinition/patient-birthPlace","valueAddress":{"city":"Manchester","district":"Greater Manchester","country":"GBR"}},{"url":"https://fhir.nhs.uk/StructureDefinition/Extension-PDS-RemovalFromRegistration","extension":[{"url":"removalFromRegistrationCode","valueCodeableConcept":{"coding":[{"system":"https://fhir.nhs.uk/CodeSystem/PDS-RemovalReasonExitCode","code":"SCT","display":"Transferred to Scotland"}]}},{"url":"effectiveTime","valuePeriod":{"start":"2020-01-01T00:00:00+00:00","end":"2021-12-31T00:00:00+00:00"}}]}],"telecom":[{"id":"789","period":{"start":"2020-01-01","end":"2021-12-31"},"system":"phone","value":"01632960587","use":"home"},{"id":"790","period":{"start":"2019-01-01","end":"2022-12-31"},"system":"email","value":"jane.smith@example.com","use":"home"},{"id":"OC789","period":{"start":"2020-01-01","end":"2021-12-31"},"system":"other","value":"01632960587","use":"home","extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem","code":"textphone","display":"Minicom (Textphone)"}}]}],"contact":[{"id":"C123","period":{"start":"2020-01-01","end":"2021-12-31"},"relationship":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0131","code":"C","display":"Emergency Contact"}]}],"telecom":[{"system":"phone","value":"01632960587"}]}],"address":[{"id":"456","period":{"start":"2020-01-01","end":"2021-12-31"},"use":"home","line":["1 Trevelyan Square","Boar Lane","City Centre","Leeds","West Yorkshire"],"postalCode":"LS1 6AE","extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","extension":[{"url":"type","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType","code":"PAF"}},{"url":"value","valueString":"12345678"}]},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","extension":[{"url":"type","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType","code":"UPRN"}},{"url":"value","valueString":"123456789012"}]}]},{"id":"T456","period":{"start":"2020-01-01","end":"2021-12-31"},"use":"temp","text":"Student Accommodation","line":["1 Trevelyan Square","Boar Lane","City Centre","Leeds","West Yorkshire"],"postalCode":"LS1 6AE","extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","extension":[{"url":"type","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType","code":"PAF"}},{"url":"value","valueString":"12345678"}]},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","extension":[{"url":"type","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType","code":"UPRN"}},{"url":"value","valueString":"123456789012"}]}]}]}}}},"4XX":{"description":"An error occurred as follows:\n\n| HTTP status | Error code | Description |\n| ----------- | -------------------------- | --------------------------------------------- |\n| 400 | INVALID_RESOURCE_ID | Invalid NHS number. |\n| 400 | UNSUPPORTED_SERVICE | Missing NHS number. |\n| 400 | MISSING_VALUE | Missing header parameter. For details, see the `diagnostics` field. |\n| 400 | INVALID_VALUE | Invalid header parameter. For details, see the `diagnostics` field. |\n| 401 | ACCESS_DENIED | Access token missing, invalid or expired, or calling application not configured for this operation. |\n| 403 | ACCESS_DENIED | Patient cannot perform this action. |\n| 404 | RESOURCE_NOT_FOUND | Patient does not exist for given NHS number. |\n| 404 | INVALIDATED_RESOURCE | Patient did exist for given NHS number, but has been invalidated and not superseded by another NHS number. |\n| 408 | UNABLE_TO_CALL_SERVICE | The downstream domain processing has not completed within the configured timeout period. |\n| 429 | TOO_MANY_REQUESTS | You have exceeded your application's [rate limit](https://digital.nhs.uk/developer/guides-and-documentation/reference-guide#rate-limits). |\n","content":{"application/fhir+json":{"schema":{"type":"object","description":"Outcome of an operation that does not result in a resource or bundle being returned, for example an error or an async/batch submission.\nThere are a number of possible error codes that can be returned along with a more detailed description in the `display` field.\n","properties":{"resourceType":{"type":"string","description":"FHIR Resource Type.","default":"OperationOutcome"},"issue":{"type":"array","description":"List of issues that have occurred.","minItems":1,"items":{"type":"object","required":["severity","code"],"properties":{"severity":{"type":"string","enum":["fatal","error","warning","information"],"description":"Severity of the error.","example":"error"},"code":{"type":"string","description":"FHIR error code.","example":"invalid","enum":["invalid","structure","required","value","invariant","security","login","unknown","expired","forbidden","suppressed","processing","not-supported","duplicate","multiple-matches","not-found","deleted","too-long","code-invalid","extension","too-costly","business-rule","conflict","transient","lock-error","no-store","exception","timeout","incomplete","throttled","informational"]},"details":{"type":"object","description":"Internal error code.","properties":{"coding":{"type":"array","items":{"type":"object","properties":{"system":{"type":"string","description":"URI of the coding system specification.","example":"https://fhir.nhs.uk/R4/CodeSystem/Spine-ErrorOrWarningCode"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1"},"code":{"type":"string","description":"Symbol in syntax defined by the system.","example":"INVALID_VALUE"},"display":{"type":"string","description":"Representation defined by the system.","example":"Provided value is invalid"}}}}}},"diagnostics":{"type":"string","description":"Additional diagnostic information about the issue. This information is subject to change.","example":"Invalid value - 2019-01 in field 'birthDate'"},"expression":{"type":"string","description":"FHIRPath of element(s) related to the error.","example":"Patient.name.given"}}}}}},"example":{"resourceType":"OperationOutcome","issue":[{"severity":"error","code":"structure","details":{"coding":[{"system":"https://fhir.nhs.uk/R4/CodeSystem/Spine-ErrorOrWarningCode","version":"1","code":"MISSING_VALUE","display":"Required value is missing"}]},"diagnostics":"Missing value - 'birth_date/birth_date_range_start/birth_date_range_end'"}]}}}}}},"patch":{"description":"## Overview\nUse this endpoint to update patient details in PDS.\n\nThis is a 'PATCH' operation - you can update specific parts of the patient record, such as name or gender, without having to update the entire record.\n\nWhen you make a PATCH request with your application, the endpoint will respond with a successful (200) response code, along with the updated patient resource, or, an unsuccessful (4xx/5xx) response. \n\n99.99% of all updates complete in under 10 seconds. If an update takes longer than 10 seconds, the endpoint responds with an HTTP status of 503 (Gateway Timeout). \n\nYou can alter the timeout period using the `X-Sync-Wait` header. If you re-submit the update, use the same `X-Request-ID` header.\n\nThe behaviour of this endpoint depends on which access mode you are using:\n\n| Access mode | Behaviour restrictions |\n| ------------------------------ | ----------------------------------- |\n| Application-restricted access | Updates not allowed |\n| Healthcare worker access | Updates allowed |\n| Patient access | Updates allowed |\n\n## Patient resource versioning\nTo update a patient's resource you must have retrieved it first, to ensure you are working against an up-to-date patient resource.\n\nWhen you retrieve a patient resource, you get a version number for the resource (in the `ETag` response header in the form `W/\"2\"` and in the `versionId` field in the response, in the form `\"2\"`).\n\nYou must then pass the patient's version number in the update request (in the `If-Match` response header).\n\nIt is recommended you use the value from the `Etag` header as this is in the correct form the `If-Match` header is expected, for example `W/\"2\"` and can be mirrored back in the request.\n\nThe update only succeeds, if the patient resource has not been updated in our database between your first retrieval and the update request.\n\nIf the update succeeds, you will receive the updated patient resource, this will contain the new resource version number.\n\nIf you make a subsequent update you must use the new version number.\n\n## JSON Patch\nTo update a patient record, a [JSON Patch](https://tools.ietf.org/html/rfc6902) should be sent. A JSON Patch consists of one or more patch objects within a list.\n\nIt is recommended that all desired updates are sent together in a single request as a list of patches.\nThis is the most efficient approach and reduces the danger of race conditions occurring when updating the patient record multiple times in a short period of time.\n\nWhen processing the list of patch objects, each patch must be valid and pass all the business rules against the data. If one patch object fails, none of the patch objects are applied.\n\nA patch object consists of:\n* an operation, `op` - this is required.\n* a path to the data that you want to change, `path` - this is required.\n* the value that is assigned, `value` - this is required for `add`, `replace` and `test`; but should not be included for a `remove`.\n\nThe following operations are supported:\n* `add` - to add a new value.\n* `replace` - to replace an existing value.\n* `remove` - to remove an existing value.\n* `test` - to test the state of a value is as expected before continuing with the update.\n\nPaths point to a single value, list or object, for example:\n* `/gender` - pointing to the gender value.\n* `/name` - point to the name list.\n* `/name/0` - pointing to the 1st object in the name list.\n* `/address/0/line/1` - pointing to the 2nd line string in the 1st address object.\n\nThe value can be set to any valid value for that path, so could be a null, a string, an object or a list.\n\n### Addition\n\n`add` should be used to add new items to a patient.\n\nAdding a simple data item such as the date of death can be done using a patch such as:\n\n```json\n{\n \"patches\": [\n { \"op\": \"add\", \"path\": \"/deceasedDate\", \"value\": \"2020-01-01\" }\n ]\n}\n```\n\nAdding to a list such as a `name` should be done by including the whole object in the value field. Note, the list index is `-` this is because when adding to a list, the index is not known:\n\n```json\n{\n \"patches\": [\n {\n \"op\": \"add\",\n \"path\": \"/name/-\",\n \"value\": {\n \"use\": \"usual\",\n \"period\": { \"start\": \"2019-12-31\" },\n \"prefix\": [\"Dr\"],\n \"given\": [\n \"Joe\",\n \"Horation\",\n \"Maximus\"\n ],\n \"family\": \"Bloggs\",\n \"suffix\": [\"PhD\"]\n }\n }\n ]\n}\n```\n\nWhen adding a base level list item such as a new name or address, ensure the index is always `-`, otherwise the request is rejected. For example, `/name/-`.\nThe reason for this is because the backend system makes the decision on the ordering of the listed objects to ensure they are always returned in the same order.\n\nIf you are adding to a sub-element that is a list, such as an additional given name, it is valid to provide an exact index. So the following is valid:\n\n```json\n{\n \"patches\": [\n {\n \"op\": \"add\", \"path\": \"/name/0/id\", \"value\": \"8F8B957D\"\n },\n {\n \"op\": \"add\", \"path\": \"/name/0/given/0\", \"value\": \"Rose\"\n }\n ]\n}\n```\n\nIt is possible to `add` a sub-element to an existing object in a patch request. If the object already exists and you have the object `id`, you must supply it or the update is rejected.\nThe following patch is allowed:\n\n```json\n{\n \"patches\": [\n {\n \"op\": \"add\", \"path\": \"/name/0/id\", \"value\": \"8F8B957D\"\n },\n {\n \"op\": \"add\", \"path\": \"/name/0/given/0\", \"value\": \"Rose\"\n }\n ]\n}\n```\n\nbut the following is not allowed:\n\n```json\n{\n \"patches\": [\n {\n \"op\": \"add\", \"path\": \"/name/0/given/-\", \"value\": \"Rose\"\n }\n ]\n}\n```\n\n### Replacing\n\n`replace` should be used to alter existing items on the patient.\n\nReplacing a simple data item such as the gender can be done using a patch such as:\n\n```json\n{\n \"patches\": [\n { \"op\": \"replace\", \"path\": \"/gender\", \"value\": \"male\" }\n ]\n}\n```\n\nReplacing a list item can be done in two ways which may be dependent on any external development libraries that can be used to create the patch.\n\nThe first approach is to replace the whole list item:\n\n```json\n{\n \"patches\": [\n {\n \"op\": \"replace\",\n \"path\": \"/name/0\",\n \"value\": {\n \"id\": \"123\",\n \"use\": \"usual\",\n \"period\": { \"start\": \"2019-12-31\" },\n \"prefix\": [\"Dr\"],\n \"given\": [\n \"Joe\",\n \"Horation\",\n \"Maximus\"\n ],\n \"family\": \"Bloggs\",\n \"suffix\": [\"PhD\"]\n }\n }\n ]\n}\n```\n\nThe second approach is to replace just a part, or parts, of the list object keys if all others remain the same:\n\n```json\n{\n \"patches\": [\n { \"op\": \"replace\", \"path\": \"/name/0/id\", \"value\": \"123\" },\n { \"op\": \"replace\", \"path\": \"/name/0/prefix/0\", \"value\": \"Mr\" },\n { \"op\": \"replace\", \"path\": \"/name/0/family\", \"value\": \"Smith\" }\n ]\n}\n```\n\nAn added requirement to ensure no accidental data loss or replacement of the wrong list item, you must always include the list `id` or `url`. This is in the object on retrieval so just needs to be mirrored back. You should not include an ID on an addition as this is automatically generated by the system and is a unique object ID, so only our system can guarantee that.\n\n### Removal\n\n`remove` should be used to delete existing items on a patient.\n\nRemoving a simple data item such as the gender can be done using a patch such as:\n\n```json\n{\n \"patches\": [\n { \"op\": \"remove\", \"path\": \"/gender\" }\n ]\n}\n```\n\nNote, that in this scenario, although the patch is perfectly valid, the update is still rejected as a patients gender cannot be removed.\n\nRemoving a list item should only be done on the whole item object, not individual sub-items; instead use the replace operation.\n\nTo remove a list item, a `test` operation must immediately proceed the `remove` . This is an added requirement to ensure no accidental data loss occurs or the wrong item is removed. The test operation should be used to assert either:\n\n* the `id` - the object ID for items that have one - for example `name`, `address` or `telecom`.\n* the `url` - the URL for the extension being removed.\n* the whole object being removed.\n\nAn example of a list item removal using the `id` would be:\n\n```json\n{\n \"patches\": [\n { \"op\": \"test\", \"path\": \"/name/0/id\", \"value\": \"123\" },\n { \"op\": \"remove\", \"path\": \"/name/0\" }\n ]\n}\n```\n\nAn example of a extension list item removal using the `url` would be:\n\n```json\n{\n \"patches\": [\n { \"op\": \"test\", \"path\": \"/extension/0/url\", \"value\": \"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus\" },\n { \"op\": \"remove\", \"path\": \"/extension/0\" }\n ]\n}\n```\n\nAn example of a list item removal using the whole object would be:\n\n```json\n{\n \"patches\": [\n { \n \"op\": \"test\",\n \"path\": \"/name/0\",\n \"value\": {\n \"id\": \"123\",\n \"use\": \"usual\",\n \"period\": { \"start\": \"2019-12-31\" },\n \"prefix\": [\"Dr\"],\n \"given\": [\n \"Joe\",\n \"Horation\",\n \"Maximus\"\n ],\n \"family\": \"Bloggs\",\n \"suffix\": [\"PhD\"]\n }\n },\n { \"op\": \"remove\", \"path\": \"/name/0\" }\n ]\n}\n```\n\nSpecial care should be taken when performing multiple removals in the same list; as removing a particular index could affect all subsequent index positions. The next two examples perform **exactly** the same operation.\n\nUsing the following initial (simplified) data, with the intention of removing the names in index 1 (Irwin) and 2 (Bruce):\n\n```json\n{\n \"name\": [\n {\"id\": \"2\", \"family\": \"Parker\"},\n {\"id\": \"3\", \"family\": \"Irwin\"},\n {\"id\": \"4\", \"family\": \"Bruce\"},\n {\"id\": \"5\", \"family\": \"Sharpe\"}\n ]\n}\n```\n\n**Example 1**:\n\n```json\n{\n \"patches\": [\n { \"op\": \"test\", \"path\": \"/name/1/id\", \"value\": \"3\" },\n { \"op\": \"remove\", \"path\": \"/name/1\" },\n { \"op\": \"test\", \"path\": \"/name/1/id\", \"value\": \"4\" },\n { \"op\": \"remove\", \"path\": \"/name/1\" }\n ]\n}\n```\n\nAfter the 1st removal the data looks like:\n\n```json\n{\n \"name\": [\n {\"id\": \"2\", \"family\": \"Parker\"},\n {\"id\": \"4\", \"family\": \"Bruce\"},\n {\"id\": \"5\", \"family\": \"Sharpe\"}\n ]\n}\n```\n\nmeaning Irwin has been removed, Bruce has moved from index 2 -> 1 and Sharpe from 3 -> 2.\n\nSo after applying the 2nd removal the data looks like:\n\n```json\n{\n \"name\": [\n {\"id\": \"2\", \"family\": \"Parker\"},\n {\"id\": \"5\", \"family\": \"Sharpe\"}\n ]\n}\n```\n\nWhich is the intended outcome. Using the same index 1 for both removals may look unexpected, but the way JSON Patch works is iterating over each patch operation in turn and making the change to the list index positions. This means a developer needs to account for lists changing from one operation to the next.\n\n**Example 2**:\n\n```json\n{\n \"patches\": [\n { \"op\": \"test\", \"path\": \"/name/2/id\", \"value\": \"4\" },\n { \"op\": \"remove\", \"path\": \"/name/2\" },\n { \"op\": \"test\", \"path\": \"/name/1/id\", \"value\": \"3\" },\n { \"op\": \"remove\", \"path\": \"/name/1\" }\n ]\n}\n```\n\nAfter the 1st removal the data looks like:\n\n```json\n{\n \"name\": [\n {\"id\": \"2\", \"family\": \"Parker\"},\n {\"id\": \"3\", \"family\": \"Irwin\"},\n {\"id\": \"5\", \"family\": \"Sharpe\"}\n ]\n}\n```\n\nApplying the 2nd removal the data looks like:\n\n```json\n{\n \"name\": [\n {\"id\": \"2\", \"family\": \"Parker\"},\n {\"id\": \"5\", \"family\": \"Sharpe\"}\n ]\n}\n```\n\nWhich is the intended outcome. Providing the patches with the indexes descending means that the list stays in a stable format the whole way through as the only changes to the index positions are items have been passed over already.\n\n**Example 3 - a failure**\n\n```json\n{\n \"patches\": [\n { \"op\": \"test\", \"path\": \"/name/1/id\", \"value\": \"3\" },\n { \"op\": \"remove\", \"path\": \"/name/1\" },\n { \"op\": \"test\", \"path\": \"/name/2/id\", \"value\": \"4\" },\n { \"op\": \"remove\", \"path\": \"/name/2\" }\n ]\n}\n```\n\nAfter the 1st removal the data looks like:\n\n```json\n{\n \"name\": [\n {\"id\": \"2\", \"family\": \"Parker\"},\n {\"id\": \"4\", \"family\": \"Bruce\"},\n {\"id\": \"5\", \"family\": \"Sharpe\"}\n ]\n}\n```\n\nWhen applying the 2nd test, it fails as the index 2 ID is `5`, but the test was looking for `4`. An error is returned and none of the updates provided would be made to the database.\n\nThis failure example is a good reason for forcing the use of the `test` operation. If there was no test, index 2 would have been blindly removed, meaning the final state of the data would look like:\n\n```json\n{\n \"name\": [\n {\"id\": \"2\", \"family\": \"Parker\"},\n {\"id\": \"4\", \"family\": \"Bruce\"}\n ]\n}\n```\n\nWhich is incorrect, as Irwin and Sharpe were removed instead of Irwin and Bruce.\n\n\n## Patient data fields\n\n### Address\n\nList item found under `address` field.\n\nIn a JSON Patch request the path should be:\n* `/address/0` if the address to be replaced or removed is the first item in the list. If it is the second item in the list the path is `/address/1`, and so on.\n* `/address/-` when adding a new address.\n\nAn address consists of 5 lines of unstructured text, postcode, and address keys. Address keys can include a PAF and a UPRN.\n\nPostcode is optional but strongly encouraged.\nIf the address has no postcode, use a [pseudo postcode from the list defined by the Office for National Statistics](https://digital.nhs.uk/services/organisation-data-service/data-downloads/office-for-national-statistics-data) (see the ‘look_ups’ file).\n\nIn particular, for a patient at no fixed abode, use the pseudo postcode `ZZ99 3VZ`.\n\nWe recommend you use the [OS Places API](https://digital.nhs.uk/developer/api-catalogue/ordnance-survey-places-api) for looking up and verifying addresses prior to a PDS update. The PDS FHIR API cannot yet handle UPRNs required by the OS Places API. We are planning to support these in future.\n\nWhen adding or replacing address lines, use the following rules:\n*\tline 1 - premises ID and/or house name, for example `Flat 1` or `The Old Schoolhouse`\n*\tline 2 - house number, dependent thoroughfare name and descriptor (if present), thoroughfare name and descriptor, for example `23 Mill Lane`\n*\tline 3 - dependent locality/village, locality (if present), for example `Boxgrove`\n*\tline 4 - post town, for example `Leeds`\n*\tline 5 - county (if present), for example `West Yorkshire`\n\nWhen updating an address, you should populate lines 1 or 2, and line 4. You should not include line 5 in manually created addresses but you may include it in PAF-derived addresses. The address ID must also be included in the update as shown in the below examples.\n\nThere are exceptions:\n* if you submit a postcode and PAF key, in which case the lines are automatically populated, however if there are no matches or too many matches the message is rejected due to missing address lines\n* if you use a pseudo postcode, for example `ZZ99 3VZ` meaning `no fixed abode`\n\nWhen creating the FHIR payload message, to be fully FHIR compliant all empty lines should be removed, so for example:\n\n```json\n{\n \"address\": {\n \"line\": [\n \"\",\n \"23 Mill Lane\",\n \"\",\n \"Leeds\",\n \"\"\n ]\n }\n\n}\n```\n\nshould be sent in as:\n\n```json\n {\n \"address\": {\n \"line\": [\n \"23 Mill Lane\",\n \"Leeds\"\n ]\n }\n\n }\n```\n\nhowever if you do not do this the message is not rejected; the response is in that form though.\n\nTo ensure consistent data across all patient addresses, you should match addresses to the PAF and send them in PAF format including the PAF key.\nIf you do not include the PAF key it is added to the address if a match is found\nAdditionally the provided address lines and post code are enriched and reformatted if necessary.\n\nThe following address types are supported:\n* `home` - the home address is the patient's normal residence. Home address is also known as usual, main, registered, current or permanent address\n* `temp` - a temporary address is an address used for a set period of time, but where the patient's home, permanent address remains unchanged\n* `billing` - an address used for correspondence purposes only\n\nA patient must have no more than one current `temp` and/or `billing` address.\nHowever, historically this was constrained only by the integration requirements and was not enforced so theoretically more than one can exist for a patient when retrieving.\nWhere multiple instances already exist for the patient it is not expected that local systems should manage those, but should choose the most appropriate one to maintain (for example by examining period dates).\n\nA `home` address is the patient's main residential address and should normally be used for all clinical and demographic purposes, including clinical and appointment correspondence.\nHowever additionally, `temp` and `billing` addresses may be provided by a patient when there is a requirement to record an alternative location for the purposes of unbroken care.\nWhen sending correspondence to a patient:\n*\ta present and valid `billing` address may take precedence over `home` and `temp` addresses. A patient should have only a single current `billing` address. An address is considered 'valid' according to its period start and to dates.\n*\tif no current `billing` address is provided, a `temp` address may take precedence over the `home` address, again if it is valid according to its period start and to dates.\n* if there is no valid, current `billing` and/or `temp` address, the `home` address must be used.\n\nNot all local systems support `temp` and `billing` addresses, so these are not uniformly maintained. Therefore, where the patient contact has clinical or business significance, the precedence of these addresses over the `home` address should be determined by a user wherever possible.\nWhen the end date for a `temp` or `billing` address passes, local systems should use the patient’s `home` address. It is extremely rare that no home address is present on a patient record.\n\nBe aware of the following business rules:\n* you cannot add more than one of each address use types; `home`, `temp` or `billing`\n* `work` address `use` type is a valid response but cannot be added or replaced as it is a legacy value. An address with the `work` type can be removed though\n* any `temp` address must have both a `period start` and a `period end` date. The provision of a period end date has particular importance in order to avoid temporary addresses that are no longer relevant to the patient still being held as current data available to any system retrieving the patient record. A suggested default where no actual period end is known is 30 days later than the period start, up to a maximum of 3 months.\n* any `billing` address must have both a `period start` and a `period end` date. The provision of a period end date has particular importance in order to avoid correspondence addresses that are no longer relevant to the patient still being held as current data available to any system retrieving the patient record. A suggested default where no actual period end is known is 30 days later than the period start, up to a maximum of 12 months.\n* the date period is optional; where present they must be valid dates and the `end` date cannot be before the `start` date\n* the period `start` date is optional, however if provided cannot be a future date. If it is not provided it defaults to the date of update\n* where a `temp` address is provided a description must be sent using the `text` field, the list of possible values are:\n * `Second Home` - a patient's second home\n * `Student Accommodation` - a patient's place of residence while at university\n * `Respite Care Address` - where the patient resides during respite care\n * `Temporary Residence Address` - where the patient resides for a specific period of time\n * `Convalescence Home` - the address for a patient during a period of recovery\n * `Mobile Home` - the address of a patient's mobile home, parked for a specific period of time, e.g. the address of a caravan park\n * `Holiday Home` - the address for a patient during a holiday\n\n### Communication\n\nSingle item found under `extension` with the extension URL `https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSCommunication`.\n\nIn a JSON Patch request, where the communication extension does not exist the path should be:\n* `/extension/-` when adding a communication extension.\n\nWhere you are replacing/removing the full communication extension, the path should be:\n* `/extension/0` if the communication extension is the first item in the list. If it is the second item in the list the path is `/extension/1`, and so on.\n\nWhere the communication extension already exists and you wish to replace a specific sub-extension, then the path should be:\n* `/extension/0/extension/1` if the communication extension is the first item in the list and the sub-extension is the second item in the list.\n\nYou can find examples of the above requests in our sandbox Postman collection\n\nThere are a number of business rules that should be taken into account:\n* preferred language must not be supplied where it is English even though the [code list](https://simplifier.net/resolve?target=simplifier&scope=uk.nhsdigital.r4&canonical=https://fhir.hl7.org.uk/ValueSet/UKCore-HumanLanguage) contains a value for English (en).\n* any language codes outside the accepted list are rejected; such as local system `qa` codes.\n\n### Contact preferences\nSingle item found under `extension` with the extension URL `https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-ContactPreference`.\n\nIn a JSON Patch request, where the Contact Preference extension does not exist or you are replacing/removing the full list of Contact preferences, the path should be:\n* `/extension/0` if the contact preference is the first item in the list. If it is the second item in the list the path is `/extension/1`, and so on.\n* `/extension/-` when adding a contact preference.\n\nWhere the Contact Preference extension already exists and you wish to add, replace or remove a specific contact preference(s) sub-extension, then the path should be:\n* `/extension/0/extension/1` if the contact preference extension is the first item in the list and the method is the second item in the sub-extension list.\n\nYou can find examples of the above requests in our sandbox Postman collection \n\nThere are a number of business rules that should be taken into account:\n* a patient can have `0` or `1` contact preference.\n* preferred contact time is a free-text field limited to 40 characters.\n* where a contact time is specified a contact method must also exist.\n\n### Date of birth\n\nSingle item found under `birthDate` field.\n\nIn a JSON Patch request the path should be `/birthDate`.\n\nWhen adding or updating the birth date, the update should be in the format `yyyy-mm-dd`.\n\nThere are a number of business rules that should be taken into account:\n* cannot be removed.\n* cannot be a date in the future.\n* cannot be after the deceased date, if present.\n\n### Date of death\n\nSingle item found under `deceasedDateTime` field.\n\nIn a JSON Patch request the path should be `/deceasedDateTime`.\n\nWhen adding or updating the deceased date time, the update should be in the format `yyyy-mm-ddTHH:MM:SS+HH:MM`.\n\nThere are a number of business rules that should be taken into account:\n* cannot be removed.\n* cannot be a date in the future.\n* cannot be before the birth date.\n* cannot be replaced if the death notification status is 2 (formal).\n* when adding date of death, a death notification status must also be added.\n\n### Death notification\n\nSingle item found under `extension` with the extension URL `https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus`.\n\nIn a JSON Patch request the path should be:\n* `/extension/0` if the death notification is the first item in the list. If it is the second item in the list the path is `/extension/1`, and so on.\n* `/extension/-` when adding a death notification.\n\nYou can find examples of the above requests in our sandbox Postman collection\n\nThere are a number of business rules that should be taken into account:\n* cannot be removed.\n* cannot be replaced if the death notification status is formal (2).\n* only certain endpoints can set a death notification of formal (2).\n* when adding a death notification, a deceased date time must also be added.\n\n### Emergency contact\n\nList item found under `contact` field.\n\nIn a JSON Patch request the path should be:\n* `/contact/0` if the contact to be replaced or removed is the first item in the list. If it is the second item in the list the path is `/contact/1`, and so on.\n* `/contact/-` when adding a new contact.\n\nOnly emergency contact details should be added to `contact`, regular telecommunication methods such as home phone should be added to the `telecom` field.\nAny other contact relationship types are rejected.\n\nThere are a number of business rules that should be taken into account:\n* in any telecom child object the `use` key should not be present.\n* in any telecom child object the system cannot be `fax`.\n* the date period is optional; where present they must be valid dates and the `end` date cannot be before the `start` date.\n* the period `start` date is optional, however if provided cannot be a future date. If it is not provided it defaults to the date of update.\n* the date period, if present, should be on the parent `contact` object and not any `telecom` child objects.\n* if the system is email, the value must be a valid email format, for example john.smith@example.com; and must be more than 6 characters and less than 90 characters\n* the relationship can only be `C` meaning `Emergency Contact`\n\n### Gender\n\nSingle item found under `gender` field.\n\nIn a JSON Patch request the path should be `/gender`.\n\nWhen setting a gender, the local system should encourage the user to select `male` or `female` rather than `unknown`.\nThe fourth value of gender, `other`, meaning indeterminate; i.e. unable to be classified as either male or female; should never pro-actively be set by local systems - although this value can be retrieved due to legacy data or data quality issues.\n\nThere are a number of business rules that should be taken into account:\n * cannot be removed.\n * can only be `male`, `female` or `unknown`.\n * cannot set gender to `other`.\n\n### General practice\n\nList item found under `generalPractitioner` field. Although only a single general practice is allowed.\n\nIn a JSON Patch request the path should be:\n* `/generalPractitioner/0` for replacing or removing the general practice.\n* `/generalPractitioner/-` when adding a new general practice.\n\nThere are a number of business rules that should be taken into account:\n* only valid GP Practice codes may be used, see [Organisation Data Service FHIR API](https://developer.nhs.uk/apis/ods/) for more details on valid codes.\n* the period `start` date is optional, however if provided cannot be a future date. If it is not provided it defaults to the date of update.\n* do not provide a period `end` date.\n* the general practice should only be updated by primary care systems, [NHAIS](https://digital.nhs.uk/services/nhais) or by the National Back Office.\n* removal of a general practice can only be done by [NHAIS](https://digital.nhs.uk/services/nhais) or by the National Back Office.\n* only a single general practice is supported; emergency, temporary and additional practices must be maintained in the local system only.\n\n### Managing Organisation (internal-use only)\n\nSingle item found under `managingOrganization` field.\n\nIn a JSON Patch request the path should be `/managingOrganization`.\n\nThe following business rules should be observed:\n* only valid GP Practice codes may be used, see [Organisation Data Service FHIR API](https://developer.nhs.uk/apis/ods/) for more details on valid codes.\n* the period `start` date is optional, however if provided cannot be a future date. If it is not provided it defaults to the date of update.\n* only a single general practice is supported; emergency, temporary and additional practices must be maintained in the local system only.\n\n### Multiple birth order\n\nSingle item found under `multipleBirthInteger` field.\n\nIn a JSON Patch request the path should be `/multipleBirthInteger`.\n\nWhen adding or updating the birth order, the update should be an integer in the range `1` - `9` inclusive. These values have differing meanings:\n* 1 - 7 indicates the order of birth, with 1 indicating the first or only birth in the sequence, 2 indicating the second birth in the sequence, 3 indicating the third, and so on up to 7.\n* 8 - `Not applicable`\n* 9 - `Not known`\n\n### Name\n\nList item found under `name` field.\n\nIn a JSON Patch request the path should be:\n* `/name/0` if the name to be replaced or removed is the first item in the list. If it is the second item in the list the path is `/name/1`, and so on.\n* `/name/-` when adding a new name.\n\nThere are a number of business rules that should be taken into account:\n* cannot add more than one `usual` name.\n* cannot remove the `usual` name.\n* cannot add more than one `nickname`.\n* can have multiple instances of all other name use types.\n* cannot replace the use type on an existing name. For example, once a name is a nickname, it cannot be changed directly to an alias. You must instead remove the nickname and add the alias.\n* the first character of each `suffix` item must be `A-Z`.\n* the date period is optional; where present they must be valid dates and the `end` date cannot be before the `start` date.\n* the period `start` date is optional, however if provided cannot be a future date. If it is not provided it defaults to the date of update.\n* supplied name data can only contain characters from the following ranges:\n\n| Character Code/Range | Examples |\n|----------------------|---------------|\n| 65-90 | A-Z |\n| 97-122 | a-z |\n| 45 | Apostrophe |\n| 39 | Hyphen |\n| 32 | Space |\n| 192-214 | À, Æ, Ö, ... |\n| 216-246 | Ø, ß, ö, ... |\n| 248-383 | ø, ü, ÿ, ... |\n| 46 | Full-stop |\n| 48-57\t | Numbers |\n\n* the `period` is optional, but if included the `end` date cannot be before the `start` date. They can however be in the past, present or future.\n* the full available range of generally recognised titles are permitted, however, if any of the following are used then the value input must conform to the following format:\n * Mr\n * Mrs\n * Ms\n * Dr\n * Rev\n * Sir\n * Lady\n * Lord\n* any trailing full stops at the end of a prefix are automatically removed; for example `Mrs.` changes to `Mrs`.\n\n### Pharmacy\n\nSingle item found under `extension` with one of the extension urls:\n* `https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NominatedPharmacy`\n* `https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-MedicalApplianceSupplier`\n* `https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-PreferredDispenserOrganization`\n\nIn a JSON Patch request the path should be:\n* `/extension/0` if the pharmacy is the first item in the list. If it is the second item in the list the path is `/extension/1`, and so on\n* `/extension/-` when adding a pharmacy\n\nThere are a number of business rules that should be taken into account:\n* multiple pharmacies are allowed, however only one of each type\n* there are no effective date periods, only a single current instance of each type is supported\n* only valid National Pharmacy codes may be used for the pharmacy identifier, see [Organisation Data Service FHIR API](https://developer.nhs.uk/apis/ods/) for more details on valid codes\n\n### Place of birth\n\nSingle item found under `extension` with the extension URL `http://hl7.org/fhir/StructureDefinition/patient-birthPlace`.\n\nIn a JSON Patch request the path should be:\n* `/extension/0` if the place of birth is the first item in the list. If it is the second item in the list the path is `/extension/1`, and so on\n* `/extension/-` when adding a place of birth\n\nThere are a number of business rules that should be taken into account:\n* the three fields, `city`, `district` and `country` are all optional, however at least one of them must be provided\n* country is a coded value and must be in the set of valid values\n\n### Telecom\n\nList item found under `telecom` field.\n\nIn a JSON Patch request the path should be:\n* `/telecom/0` if the telecom to be replaced or removed is the first item in the list. If it is the second item in the list the path is `/telecom/1`, and so on\n* `/telecom/-` when adding a new telecom\n\nEmergency contact details should not be added to the `telecom` field, instead they should be added to the `contact` field.\n\nThere are a number of business rules that should be taken into account:\n* the date period is optional; where present they must be valid dates and the `end` date cannot be before the `start` date\n* the period `start` date is optional, however if provided cannot be a future date. If it is not provided it defaults to the date of update.\n* if the telecom system is email, the value must be a valid email format, for example john.smith@example.com; and must be more than 6 characters and less than 90 characters\n\n## Access Mode\n\n### Healthcare worker access\n\nA user with Healthcare worker access will be able to update the following fields:\n* Address\n* Communication\n* Contact preferences\n* Date of birth\n* Date of death\n* Death notification\n* Emergency contact\n* Gender\n* General practice\n* Managing Organisation (internal use only)\n* Multiple birth order\n* Name\n* Pharmacy\n* Place of birth\n* Telecom\n\n### Patient access\n\nA user with Patient access will be able to update the following fields:\n* Address\n* Pharmacy\n* Telecom (mobile and email only)\n\n## Sandbox test scenarios\n\nYou can test the following scenarios in our sandbox environment.\n\nThings to note when using the sandbox for PATCH:\n* Your changes are not persisted.\n* JSON Patch operations themselves are validated, but the resulting resource is not validated for correctness; meaning any business rules are not applied.\n* You can use the patient with minimal data, `9000000033` to test adding all data types (as most of them are missing on this patient), that would normally be present (e.g. gender).\n\n| Scenario | Request | Response |\n| ----------------------------------- | ------------------------------------------------------------------------- | ------------------------------------------------ |\n| Successful update | `id`=`9000000009`

Body: One of the provided examples or your own combination of patches

Headers: `If-Match`=`W/\"2\"`, `Content-Type`=`application/json-patch+json` | HTTP Status 200 with updated patient resource. |\n| Patient does not exist | `id`=`9111231130` (or any other valid NHS number) | HTTP Status 404 with problem description |\n| Invalid NHS number | `id`=`9000000000` (or any invalid NHS number) | HTTP Status 400 with problem description |\n| Missing resource version identifier | `If-Match` header missing or set to format other than `W/\"\"` | HTTP Status 412 with problem description |\n| Incorrect resource version | `If-Match`=`W/\"1\"` | HTTP Status 412 with problem description |\n| Wrong content type | `Content-Type` header missing or other than `application/json-patch+json` | HTTP Status 400 with problem description |\n| No patches sent | Send body with no `patches` attribute | HTTP Status 400 with problem description |\n| Invalid patch operations | Send body with invalid JSON patches in `patches` attribute | HTTP Status 400 with problem description |\n| Missing X-Request-ID | `id`=`9000000009` (or any other valid NHS number) | HTTP Status 412 with problem description |\n\nYou can try out the sandbox using the 'Try this API' feature on this page.\n\nAlternatively, you can try out the sandbox using our Postman collection:\n\n[![Run in Postman](https://run.pstmn.io/button.svg)](https://app.getpostman.com/run-collection/14719036-953f067f-30b9-4552-8252-7cc10b21dad3)\n","summary":"Update patient details","operationId":"update-patient-partial","externalDocs":{"description":"IETF RFC 6902, which defines json-patch.","url":"https://tools.ietf.org/html/rfc6902"},"parameters":[{"in":"header","name":"If-Match","description":"Latest known version identifier enclosed in quotes preceded by `W/`.\n\nSend the value of the patient's `ETag` response header on patient retrieval when updating a patient.\nThis is to ensure that any updates are applied against an up-to-date version of the patient resource.\n","required":true,"schema":{"type":"string","pattern":"^W/\"[0-9]+\"$","example":"W/\"2\""}},{"in":"header","name":"Content-Type","description":"For a PATCH request, this must be set to `application/json-patch+json`.\n","required":true,"schema":{"type":"string","example":"application/json-patch+json"}}],"requestBody":{"required":true,"content":{"application/json-patch+json":{"schema":{"type":"object","required":["patches"],"properties":{"patches":{"type":"array","items":{"type":"object","required":["op","path"],"properties":{"op":{"type":"string","enum":["remove","add","replace","test"]},"path":{"description":"The location of the information to remove, add or replace. The '-' character must be used to add new items to arrays, e.g. names, addresses.","type":"string","format":"jsonpointer","externalDocs":{"description":"IETF RFC 6901 JavaScript Object Notation (JSON) Pointer.","url":"https://tools.ietf.org/html/rfc6901"}},"value":{"description":"The information to be added or replaced. Should not be included on a remove.","oneOf":[{"type":"string"},{"type":"integer"},{"type":"object"}]}}}}}},"examples":{"add-deceased-date-time":{"summary":"Add a new single item (deceasedDateTime) to the patient","value":{"patches":[{"op":"add","path":"/deceasedDateTime","value":"2010-10-22T00:00:00+00:00"}]}},"add-name":{"summary":"Add a new list item (name) to the patient","value":{"patches":[{"op":"add","path":"/name/-","value":{"use":"usual","period":{"start":"2019-12-31"},"prefix":["Dr"],"given":["Joe","Horation","Maximus"],"family":"Bloggs","suffix":["PhD"]}}]}},"add-extension":{"summary":"Add a an extension (nominated pharmacy) to the Patient","value":{"patches":[{"op":"add","path":"/extension/-","value":{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NominatedPharmacy","valueReference":{"identifier":{"system":"https://fhir.nhs.uk/Id/ods-organization-code","value":"Y12345","period":{"start":"2020-01-01","end":"2021-12-31"}}}}}]}},"update-gender":{"summary":"Update the simple item (gender)","value":{"patches":[{"op":"replace","path":"/gender","value":"male"}]}},"update-address":{"summary":"Update specific fields on a list item (address)","value":{"patches":[{"op":"replace","path":"/address/0/id","value":"456"},{"op":"replace","path":"/address/0/line/0","value":"2 Whitehall Quay"},{"op":"replace","path":"/address/0/postalCode","value":"LS1 4BU"}]}},"update-address-alternative":{"summary":"Update whole object on a list item (address)","value":{"patches":[{"op":"replace","path":"/address/0","value":{"id":"456","period":{"start":"2020-01-01","end":"2021-12-31"},"use":"home","line":["2 Whitehall Quay","Leeds","West Yorkshire"],"postalCode":"LS1 4BU","extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","extension":[{"url":"type","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType","code":"PAF"}},{"url":"value","valueString":"9876543"}]}]}}]}},"update-extension":{"summary":"Update an extension (death notification)","value":{"patches":[{"op":"replace","path":"/extension/3","value":{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus","extension":[{"url":"deathNotificationStatus","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-DeathNotificationStatus","version":"1.0.0","code":"1","display":"Informal - death notice received via an update from a local NHS Organisation such as GP or Trust"}]}}]}}]}},"delete-gender":{"summary":"Remove a single item (gender) no longer in use","value":{"patches":[{"op":"remove","path":"/gender"}]}},"delete-name":{"summary":"Remove a list item (name) no longer in use, using test pointing to the name items id","value":{"patches":[{"op":"test","path":"/name/0/id","value":"123"},{"op":"remove","path":"/name/0"}]}},"delete-name-alternative":{"summary":"Remove a list item (name) no longer in use, using test pointing to the name object","value":{"patches":[{"op":"test","path":"/name/0","value":{"id":"123","use":"usual","period":{"start":"2020-01-01","end":"2021-12-31"},"given":["Jane"],"family":"Smith","prefix":["Mrs"],"suffix":["MBE"]}},{"op":"remove","path":"/name/0"}]}},"delete-extension":{"summary":"Remove an extension (dispensing doctor pharmacy) no longer in use","value":{"patches":[{"op":"test","path":"/extension/1/url","value":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-PreferredDispenserOrganization"},{"op":"remove","path":"/extension/1"}]}}}}}},"responses":{"200":{"description":"Patient updated.","headers":{"ETag":{"schema":{"type":"string","pattern":"^W/\"[0-9]+\"$","example":"W/\"2\""},"description":"Record version identifier enclosed in quotes and preceded by 'W/'. For example, `W/\"2\"`.\n\nCorresponds to `meta.versionId` attribute in the patient resource body.\n\nWhen you retrieve a patient resource, you get a version number for the resource (in the `ETag` response header and in the `versionId` field in the response).\nYou must then pass the resource's version number in any update request (in the `If-Match` response header) made for the patient.\n"},"X-Correlation-Id":{"schema":{"type":"string","example":"11C46F5F-CDEF-4865-94B2-0EE0EDCC26DA"},"description":"The X-Correlation-ID from the request header, if supplied, mirrored back.\n"},"X-Request-Id":{"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","example":"60E0B220-8136-4CA5-AE46-1D97EF59D068"},"description":"The X-Request-ID from the request header, if supplied, mirrored back.\n"}},"content":{"application/fhir+json":{"schema":{"type":"object","required":["id"],"additionalProperties":false,"properties":{"resourceType":{"type":"string","description":"FHIR resource type.","default":"Patient"},"id":{"description":"The patient's NHS number. The primary identifier of a patient, unique within NHS England and Wales. Always 10 digits and must be a [valid NHS number](https://www.datadictionary.nhs.uk/attributes/nhs_number.html).","type":"string","pattern":"^\\d{10}$","example":"9000000009"},"identifier":{"type":"array","description":"Identifier and system of identification used for this Patient.","items":{"type":"object","maxItems":1,"required":["value"],"properties":{"system":{"type":"string","format":"url","description":"System identifier belongs to.","default":"https://fhir.nhs.uk/Id/nhs-number"},"value":{"description":"The patient's NHS number. The primary identifier of a patient, unique within NHS England and Wales. Always 10 digits and must be a [valid NHS number](https://www.datadictionary.nhs.uk/attributes/nhs_number.html).","type":"string","pattern":"^\\d{10}$","example":"9000000009"},"extension":{"type":"array","description":"FHIR extensions.","items":{"type":"object","description":"Status indicating if NHS number is present and verified.","properties":{"url":{"type":"string","description":"URL of the extension definition.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSNumberVerificationStatus","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSNumberVerificationStatus"]},"valueCodeableConcept":{"type":"object","description":"NHS Number Verification Status Indicator.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URI of the coding system specification.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-NHSNumberVerificationStatus"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1.0.0"},"code":{"type":"string","description":"Symbol in syntax defined by the system.","example":"01"},"display":{"type":"string","description":"Representation defined by the system.","example":"Number present and verified"}}}}}}}}}}}},"meta":{"type":"object","description":"Metadata about this resource.","properties":{"versionId":{"type":"string","description":"The NHS Digital assigned version of the patient resource.","example":"2"},"security":{"type":"array","description":"The level of security on the patients record, which affects which fields are populated on retrieval. The possible responses are:\n* U - unrestricted. All available data is returned.\n* R - restricted. Any sensitive data around the patient's location, so `address`, `generalPractitioner` and `telecom`, are removed from the response.\n* REDACTED - redacted. The patient record has been marked as invalid, so the data should not be used. This code is never returned; you receive a 404, and appropriate error response, if an invalidated patient retrieval is attempted.\n","maxItems":1,"items":{"type":"object","properties":{"system":{"type":"string","description":"URI of the value set specification.","example":"http://terminology.hl7.org/CodeSystem/v3-Confidentiality"},"code":{"type":"string","description":"Code defined by the system value set.","enum":["U","R","V","REDACTED"],"example":"U"},"display":{"type":"string","description":"Representation defined by the system.","enum":["unrestricted","restricted","redacted"],"example":"unrestricted"}}}}}},"name":{"type":"array","description":"List of names associated with the patient. \n","minItems":1,"items":{"type":"object","required":["use","family"],"additionalProperties":false,"properties":{"id":{"type":"string","description":"Unique object identifier for this name.","example":"123"},"use":{"type":"string","description":"How this name should be used.\n* usual - Known as, conventional or the one patient normally uses. A patient always has a usual name.\n* temp - An alias or temporary name. This may also be used for temporary names assigned at birth or in emergency situations.\n* nickname - A name that the patient prefers to be addressed by, but is not part of their usual name.\n* old - This name is no longer in use (or was never correct, but retained for records).\n* maiden - Name changed for Marriage. A name used prior to changing name because of marriage. This term is not gender specific. The use of this term does not imply any particular history for a person's name.\n\nThe following use codes are included in the [name-use](https://www.hl7.org/fhir/valueset-name-use.html) value set, but should not be used and is not be returned as part of a retrieval.\n* official - The formal name as registered in an official (government) registry, but which name might not be commonly used. May be called \"legal name\".\n* anonymous - Anonymous assigned name, alias, or pseudonym (used to protect a person's identity for privacy reasons).\n","enum":["usual","temp","nickname","old","maiden"],"example":"usual"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"given":{"type":"array","maxItems":5,"description":"Given names, including any middle names.\n\nEach name(s) should be a separate item in the list. The first given name may include multiple names, separated by a space.\nSubsequent names must be broken down into list items. For example, the input `[Jane Marie Anne, Jo Adele]` returns `[Jane Marie Anne, Jo, Adele]`.\n","example":["Jane Marie Anne","Jo","Adele"],"items":{"type":"string","maxLength":35,"example":"Jane"}},"family":{"type":"string","maxLength":35,"description":"Family name (often called Surname).","example":"Smith"},"prefix":{"type":"array","description":"Name prefixes, titles, and prenominals.","example":["Mrs"],"items":{"type":"string","example":"Mrs"}},"suffix":{"type":"array","description":"Name suffices and postnominals.","example":["MBE","PhD"],"items":{"type":"string","example":"MBE"}}}}},"gender":{"type":"string","description":"Classification of the gender of a patient. The classification is phenotypical rather than genotypical, i.e. it does not provide codes for medical or scientific purposes.\nIt is the administrative gender that the patient wishes to be known as. In some cases, this may not be the same as the patient’s registered birth gender, or their current clinical gender.\n","enum":["male","female","other","unknown"],"example":"female"},"birthDate":{"description":"The date on which the patient was born or is officially deemed to have been born.\n\nIt is a date in the format `yyyy-mm-dd`. Due to data quality issues on a small number of patients `yyyy-mm` and `yyyy` format may also be returned. \n","example":"2010-10-22","type":"string","format":"date"},"multipleBirthInteger":{"type":"integer","minimum":1,"maximum":9,"description":"The order in which the patient was born, with 1 indicating the first or only birth in the sequence, 2 indicating the second birth in the sequence, 3 indicating the third, and so on up to 7.\n\nThere are two other valid values; `8` meaning `Not applicable` and `9` meaning `Not known`.\n","example":1},"deceasedDateTime":{"description":"The date and time on which a person died or is officially deemed to have died, if applicable and known.\n\nIt is a datetime in the format `yyyy-mm-ddTHH:MM:SS+HH:MM` or `yyyy-mm-dd`. Due to data quality issues on a small number of patients `yyyy-mm` and `yyyy` format may also be returned.\n","example":"2010-10-22T00:00:00+00:00","type":"string","format":"date-time","pattern":"^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2}\\+\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2}\\+\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01]))$"},"address":{"type":"array","description":"List of addresses associated with the patient.\n\nThese are fully populated on a retrieval or a successful update, only the `home` address is returned on a search.\nWhen a patient tagged as `restricted` is retrieved, all addresses are removed from the response.\n","items":{"type":"object","description":"An address associated with the patient.","required":["use"],"properties":{"id":{"type":"string","description":"Unique system identifier for this address.","example":"456"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"use":{"type":"string","description":"Purpose of this address:\n * `home` - the home address is the patient's normal residence. Home address is also known as usual, main, registered, current or permanent address\n * `temp` - a temporary address is an address used for a set period of time, but where the patient's home, permanent address remains unchanged\n * `billing` - an address used for correspondence purposes only\n * `work` - an office address. This can be returned due to legacy data but cannot be added or replaced on update\n\n A patient should have no more than one current `temp` and/or `billing` address.\n However, historically this was constrained only by the integration requirements and was not enforced so theoretically more than one can exist for a patient when retrieving.\n Where multiple instances already exist for the patient it is not expected that local systems should manage those, but should choose the most appropriate one to maintain (e.g. by examining period dates).\n\n A `home` address is the patient's main residential address and should normally be used for all clinical and demographic purposes, including clinical and appointment correspondence.\n However additionally, `temp` and `billing` addresses may be provided by a patient when there is a requirement to record an alternative location for the purposes of unbroken care.\n When sending correspondence to a patient:\n *\ta present and valid `billing` address may take precedence over `home` and `temp` addresses. A patient should have only a single current `billing` address. An address is considered 'valid' according to its period start and end dates.\n *\tif no current `billing` address is provided, a `temp` address may take precedence over the `home` address, again if it is valid according to its period start and end dates.\n * if there is no valid, current `billing` and/or `temp` address, the `home` address must be used.\n","enum":["home","work","temp","billing"],"example":"home"},"text":{"type":"string","description":"Where a `temp` address is provided a descriptor text must be sent.\nThe list of possible values are:\n* `Second Home` - a patient's second home\n* `Student Accommodation` - a patient's place of residence while at university\n* `Respite Care Address` - where the patient resides during respite care\n* `Temporary Residence Address` - where the patient resides for a specific period of time\n* `Convalescence Home` - the address for a patient during a period of recovery\n* `Mobile Home` - the address of a patient's mobile home, parked for a specific period of time, e.g. the address of a caravan park\n* `Holiday Home` - the address for a patient during a holiday\n\nA patient can also register temporarily at a GP practice using a temporary address. Temporary GP registration information does not appear on the PDS, but the address used for it may.\n","enum":["Second Home","Student Accommodation","Respite Care Address","Temporary Residence Address","Convalescence Home","Mobile Home","Holiday Home"],"example":"Student Accommodation"},"line":{"type":"array","description":"All lines of the address except the postal code.\n\nSystems must apply the following formatting convention when adding or replacing addresses lines:\n*\tline 1 - premises ID and/or house name, e.g. `Flat 1` or `The Old Schoolhouse`\n*\tline 2 - house number, dependent thoroughfare name and descriptor (if present), thoroughfare name and descriptor, e.g. `23 Mill Lane`\n*\tline 3 - dependent locality/village, locality (if present), e.g. `Boxgrove`\n*\tline 4 - post town, e.g. `Leeds`\n*\tline 5 - county (if present), e.g. `West Yorkshire`\n\nIf any of the lines are blank, they are not returned due to FHIR conformance constraints.\n","maxItems":5,"items":{"type":"string"},"example":["1 Trevelyan Square","Boar Lane","City Centre","Leeds","West Yorkshire"]},"postalCode":{"type":"string","description":"Postal code of the address.","example":"LS1 6AE"},"extension":{"type":"array","description":"List of address keys formatted as a FHIR extension. This can include up to one Unique Property Reference Number (UPRN), and up to one Postal Address File (PAF) key. If no keys for the address are known, the array will be empty. Otherwise it will be a list of objects which specify the value of the address key and the code system for it","items":{"anyOf":[{"type":"object","description":"Unique identifier for an address.","properties":{"url":{"type":"string","description":"URL of specification of the AddressKey extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey"]},"extension":{"type":"array","description":"Specification of address key system and address key value. Contains exactly two items: one describing the code system the Address Key uses, and the other specifying the value of the Address Key.","minItems":2,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Coding system of the address key.","required":["url","valueCoding"],"properties":{"url":{"type":"string","description":"Always 'type'.","default":"type"},"valueCoding":{"type":"object","description":"URL of specification of address key format.","required":["system","code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available Address Key formats.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType"},"code":{"type":"string","description":"Address Key system. Always 'PAF'.","enum":["PAF"],"example":"PAF"}}}}},{"type":"object","description":"Value of the address key.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Always 'value'.","default":"value","example":"value"},"valueString":{"type":"string","description":"Address key in PAF format. An 8 digit number including leading zeroes, formatted as a string.","minLength":8,"maxLength":8,"pattern":"^[0-9]{8}$","example":"12345678"}}}]}}}},{"type":"object","description":"Unique identifier for an address.","properties":{"url":{"type":"string","description":"URL of specification of the AddressKey extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey"]},"extension":{"type":"array","description":"Specification of address key system and address key value. Contains exactly two items: one describing the code system the Address Key uses, and the other specifying the value of the Address Key.","minItems":2,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Coding system of the address key.","required":["url","valueCoding"],"properties":{"url":{"type":"string","description":"Always 'type'.","default":"type"},"valueCoding":{"type":"object","description":"URL of specification of address key format.","required":["system","code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available Address Key formats.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType"},"code":{"type":"string","description":"Address Key system. Always 'UPRN'.","enum":["UPRN"],"example":"UPRN"}}}}},{"type":"object","description":"Value of the address key.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Always 'value'.","default":"value","example":"value"},"valueString":{"type":"string","description":"Address key in UPRN format. A number containing from 1 up to 12 digits.","minLength":1,"maxLength":12,"pattern":"^[0-9]{1,12}$","example":"123456789012"}}}]}}}}]}}}}},"telecom":{"type":"array","description":"List of contact points for the patient; for example, phone numbers or email addresses.\nWhen a patient tagged as `restricted` is retrieved, all contact points are removed from the response.\n","items":{"description":"A contact point, such as a phone number or email address","type":"object","required":["system","value"],"properties":{"id":{"type":"string","description":"Unique object identifier for this contact point.","example":"789"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"system":{"description":"Means of communication, such as phone or email.","type":"string","enum":["phone","fax","email","other"],"example":"phone"},"value":{"description":"Phone number, email address, or other identifier for use with contact system.","type":"string","example":"01632960587"},"use":{"type":"string","description":"Location associated with communication system.","enum":["home","work","temp","mobile"],"example":"home"},"extension":{"type":"array","maxItems":1,"description":"Extension that is returned when the communication type is `textphone`. The only code returned is `textphone`, which means `Minicom (Textphone)`.\n\nThe `system` is `other` when the extension is included.\n","items":{"type":"object","description":"Wrapped object for other contact system details.","properties":{"url":{"type":"string","description":"Definition of other contact system extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem"]},"valueCoding":{"type":"object","description":"URL of specification of other contact systems.","properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem"},"code":{"type":"string","description":"Coded value for the other contact system in place.","example":"textphone"},"display":{"description":"Display-friendly representation of the other contact system code.","type":"string","example":"Minicom (Textphone)"}}}}}}}}},"contact":{"type":"array","description":"A list of patient contacts. Only emergency contacts are returned and only emergency contacts should be added. Any other contacts should be added to the patients `Related Person`.\nPatients designate here any contact number they desire to be used in case of an emergency.\nNote, while a patient may also desire to record various related persons telecom details, these do not separately allow for a concept of emergency contact; only ranking. See RelatedPerson endpoint.\nWhen a patient tagged as `restricted` is retrieved, all contacts are removed from the response.\n","items":{"title":"Schema for a patient contact.","type":"object","additionalProperties":false,"required":["relationship","telecom"],"properties":{"id":{"type":"string","example":"C123"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"relationship":{"type":"array","description":"The contact relationship wrapper object that holds the details of the relationship to the patient.\n\nThis is only returned when an Emergency Contact number has been set on `telecom`. The only valid code is `C`, which means `Emergency Contact`.\n","minItems":1,"maxItems":1,"items":{"type":"object","required":["coding"],"properties":{"coding":{"type":"array","description":"Exactly one contact relationship.","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","format":"url","default":"http://terminology.hl7.org/CodeSystem/v2-0131"},"code":{"type":"string","description":"Coded value for contact relationship.","example":"C"},"display":{"type":"string","description":"Display-friendly representation of the contact relationship code.","example":"Emergency Contact"}}}}}}},"telecom":{"type":"array","description":"List of Telecom objects on the contact only contains `system` and `value`.\n","items":{"description":"A contact point, such as a phone number or email address","type":"object","required":["system","value"],"properties":{"id":{"type":"string","description":"Unique object identifier for this contact point.","example":"789"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"system":{"description":"Means of communication, such as phone or email.","type":"string","enum":["phone","fax","email","other"],"example":"phone"},"value":{"description":"Phone number, email address, or other identifier for use with contact system.","type":"string","example":"01632960587"},"use":{"type":"string","description":"Location associated with communication system.","enum":["home","work","temp","mobile"],"example":"home"},"extension":{"type":"array","maxItems":1,"description":"Extension that is returned when the communication type is `textphone`. The only code returned is `textphone`, which means `Minicom (Textphone)`.\n\nThe `system` is `other` when the extension is included.\n","items":{"type":"object","description":"Wrapped object for other contact system details.","properties":{"url":{"type":"string","description":"Definition of other contact system extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem"]},"valueCoding":{"type":"object","description":"URL of specification of other contact systems.","properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem"},"code":{"type":"string","description":"Coded value for the other contact system in place.","example":"textphone"},"display":{"description":"Display-friendly representation of the other contact system code.","type":"string","example":"Minicom (Textphone)"}}}}}}}}}}}},"generalPractitioner":{"type":"array","maxItems":1,"description":"General Practice (not practitioner) with which the patient is, or was, registered. Always contains zero or one general practitioner object.\nWhen a patient tagged as `restricted` is retrieved, the General Practice is removed from the response.\n","items":{"description":"General practice (not practitioner) with which the patient is or was registered.","type":"object","required":["identifier"],"properties":{"id":{"description":"Object identifier (OID) specific to the returned details - this should be return exactly the same in any update.","type":"string","example":"254406A3"},"type":{"description":"Type of Reference being returned.","type":"string","example":"Organization"},"identifier":{"description":"Identifier and system of identification used for this Organisation.","type":"object","required":["value"],"properties":{"system":{"description":"URL for the Organisation Data Service - who are responsible for publishing codes that identify organisations and individuals across health and social care.","type":"string","example":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"description":"Organisation code for the registered general practice, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","type":"string","pattern":"^[0-9A-Z]+$","example":"Y12345"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}}}}}}},"managingOrganization":{"description":"The managing organization of a de-registered patient. This will not be returned when the reason for de-registration is death.","type":"object","required":["identifier"],"properties":{"type":{"description":"Type of Reference being returned.","type":"string","example":"Organization"},"identifier":{"description":"Identifier and system of identification used for this Organisation.","type":"object","required":["value"],"properties":{"system":{"description":"URL for the Organisation Data Service - who are responsible for publishing codes that identify organisations and individuals across health and social care.","type":"string","example":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"description":"Organisation code for the registered general practice, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","type":"string","pattern":"^[0-9A-Z]+$","example":"Y12345"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}}}}}},"extension":{"type":"array","description":"Wrapper array for the patient's pharmacies, death notification status, communication details, contact preferences and place of birth; these are all FHIR extensions.\nAlways contains zero or one of each pharmacy object, zero or one death notification status object, zero or one communication details object, zero or one contact preference and zero or one place of birth object.\nWhen a patient tagged as `restricted` is retrieved, the pharmacy and birth place extensions are removed from the response.\n","items":{"anyOf":[{"type":"object","description":"Wrapper object for the patient's nominated pharmacy. This will only be populated on a retrieval and not a search.","required":["url","valueReference"],"properties":{"url":{"type":"string","description":"URL of specification of UKCore-NominatedPharmacy FHIR extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NominatedPharmacy","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NominatedPharmacy"]},"valueReference":{"type":"object","description":"Reference to a pharmacy `Organization` resource.","required":["identifier"],"properties":{"identifier":{"type":"object","description":"Wrapper object for the patient's nominated pharmacy organisation code.","required":["value"],"properties":{"system":{"type":"string","description":"URL for the FHIR code system for the ODS organisation code.","default":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"type":"string","description":"Organisation code for the nominated pharmacy, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","pattern":"^[A-Za-z0-9]{3,10}$","example":"Y12345"}}}}}}},{"type":"object","description":"Wrapper object for the patient's dispensing doctor. This will only be populated on a retrieval and not a search.","required":["url","valueReference"],"properties":{"url":{"type":"string","description":"URL of specification of UKCore-DispensingDoctor FHIR extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-PreferredDispenserOrganization","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-PreferredDispenserOrganization"]},"valueReference":{"type":"object","description":"Reference to a GP practice pharmacy `Organization` resource.","required":["identifier"],"properties":{"identifier":{"type":"object","description":"Wrapper object for the patient's dispensing doctor organisation code.","required":["value"],"properties":{"system":{"type":"string","description":"URL for the FHIR code system for the ODS organisation code.","default":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"type":"string","description":"Organisation code for the dispensing doctor, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","pattern":"^[A-Za-z0-9]{3,10}$","example":"Y23456"}}}}}}},{"type":"object","description":"Wrapper object for the patient's medical appliance supplier. This will only be populated on a retrieval and not a search.","required":["url","valueReference"],"properties":{"url":{"type":"string","description":"URL of specification of UKCore-MedicalApplianceSupplier FHIR extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-MedicalApplianceSupplier","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-MedicalApplianceSupplier"]},"valueReference":{"type":"object","description":"Reference to medical appliance supplier pharmacy `Organization` resource.","required":["identifier"],"properties":{"identifier":{"type":"object","description":"Wrapper object for the patient's medical appliance supplier organisation code.","required":["value"],"properties":{"system":{"type":"string","description":"URL for the FHIR code system for the ODS organisation code.","default":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"type":"string","description":"Organisation code for the medical appliance supplier, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","pattern":"^[A-Za-z0-9]{3,10}$","example":"Y34567"}}}}}}},{"type":"object","description":"Wrapper object for death notification details.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of death notification extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus"]},"extension":{"type":"array","description":"Array containing exactly one death notification status code object and exactly one effective date object.","minItems":1,"maxItems":2,"items":{"oneOf":[{"type":"object","description":"Wrapper object for death notification status code.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `deathNotificationStatus`.","default":"deathNotificationStatus","enum":["deathNotificationStatus"]},"valueCodeableConcept":{"type":"object","description":"Death Notification Status.","properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["system","code"],"properties":{"system":{"type":"string","description":"URI of the coding system specification.","example":"https://fhir.hl7.org.uk/CodeSystem/UKCore-DeathNotificationStatus"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1.0.0"},"code":{"type":"string","description":"Symbol, in syntax, defined by the system:\n* `1` - Informal - death notice received via an update from a local NHS Organisation such as GP or Trust\n* `2` - Formal - death notice received from Registrar of Deaths. Only these endpoints are allowed to add a Formal death:\n - National Back Office using the Demographic Spine Application (DSA)\n - Office of National Statistics (ONS)\n - Maternity sites\n* `U` - Removed. This is a possible response, but it cannot be used on an update because Spine will reject it\n","example":"2","enum":["1","2","U"]},"display":{"type":"string","description":"Representation defined by the system.","example":"Formal - death notice received from Registrar of Deaths","enum":["Informal - death notice received via an update from a local NHS Organisation such as GP or Trust","Formal - death notice received from Registrar of Deaths","Removed"]}}}}}}}},{"type":"object","description":"Wrapper object for death notification effective date.","required":["url","valueDateTime"],"properties":{"url":{"type":"string","description":"Key of this object. Always `systemEffectiveDate`.","default":"systemEffectiveDate","enum":["systemEffectiveDate"]},"valueDateTime":{"type":"string","description":"Date and time at which death notification status took effect.","format":"date-time","example":"2010-10-22T00:00:00+00:00"}}}]}}}},{"type":"object","description":"Wrapper object for communication details. This will only be populated on a retrieval and not a search.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of communication extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSCommunication","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSCommunication"]},"extension":{"type":"array","description":"Definition of communication extension.\n\nThe array must have one item, a valueCodeableConcept for the language and can optionally include a valueBoolean for if an interpreter is required.","minItems":1,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Wrapper object for communication language.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `language`.","default":"language","enum":["language"]},"valueCodeableConcept":{"type":"object","description":"Human language.","required":["coding"],"properties":{"coding":{"type":"array","description":"Exactly one language code.","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URL of the Language Code System. Always uses the 'UKCore-HumanLanguage' Code System.","example":"https://fhir.hl7.org.uk/CodeSystem/UKCore-HumanLanguage"},"version":{"type":"string","description":"Version of the language code system.","example":"1.0.0"},"code":{"type":"string","description":"Language code based on [ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) standard plus extensions for braille, makaton and sign languages, which are:\n* `q1` - Braille\n* `q2` - American Sign Language\n* `q3` - Australian Sign Language\n* `q4` - British Sign Language\n* `q5` - Makaton\nAll valid codes combined can be found at https://fhir.hl7.org.uk/CodeSystem/UKCore-HumanLanguage.\n","example":"fr"},"display":{"type":"string","description":"Display-friendly representation of the language code (such as English). If there is a language code with no defined mapping, `Unknown` will be returned.","example":"French"}}}}}}}},{"type":"object","description":"Wrapper object for whether an interpreter is required.","required":["url","valueBoolean"],"properties":{"url":{"type":"string","description":"Key of this object. Always `interpreterRequired`.","default":"interpreterRequired","enum":["interpreterRequired"]},"valueBoolean":{"type":"boolean","description":"Whether an interpreter is required.","example":true}}}]}}}},{"type":"object","description":"Wrapper object for preferred contact details; the written communication format, preferred contact time and method. This will only be populated on a retrieval and not a search.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of the contact preference extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-ContactPreference","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-ContactPreference"]},"extension":{"description":"Wrapper array containing zero or one preferred contact method, zero or one preferred written communication format; and zero or one preferred contact time.","type":"array","maxItems":3,"items":{"oneOf":[{"type":"object","description":"Wrapper object for preferred written communication format.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredWrittenCommunicationFormat`.","default":"PreferredWrittenCommunicationFormat"},"valueCodeableConcept":{"type":"object","description":"Preferred Written Communication Format.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","format":"url","description":"Definition of the preferred written communication extension.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredWrittenCommunicationFormat","enum":["https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredWrittenCommunicationFormat"]},"code":{"type":"string","description":"A code to identify the preferred written communication format of a patient, contact or related person.\n* 11 - Large print\n* 12 - Braille\n* 13 - Audio tape\n","example":"12"},"display":{"type":"string","description":"Display-friendly representation of the preferred written communication format code.","example":"Braille"}}}}}}}},{"type":"object","description":"Wrapper object for preferred contact method.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredContactMethod`.","default":"PreferredContactMethod","enum":["PreferredContactMethod"]},"valueCodeableConcept":{"type":"object","description":"Preferred Contact Method.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","format":"url","description":"Definition of the preferred contact method extension.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredContactMethod","enum":["https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredContactMethod"]},"code":{"type":"string","description":"A code to identify to identify the preferred contact method of a patient, contact or related person.\n* 1\t- Letter\n* 2\t- Visit\n* 3\t- Telephone\n* 4\t- E-mail\n* 5\t- Minicom (Textphone)\n* 6\t- Telephone contact via proxy\n* 7\t- Sign language\n* 8\t- No Telephone contact\n","example":"1"},"display":{"type":"string","description":"Display-friendly representation of the preferred contact method code.","example":"Letter"}}}}}}}},{"type":"object","description":"Wrapper object for preferred contact times.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredContactTimes`.","default":"PreferredContactTimes","enum":["PreferredContactTimes"]},"valueString":{"type":"string","maximum":40,"description":"A free-text description about the preferred contact times.","example":"Not after 7pm"}}}]}}}},{"type":"object","description":"Wrapper object for place of birth details. This will not be returned on a restricted patient.","required":["url","valueAddress"],"properties":{"url":{"type":"string","description":"Definition of place of birth extension.","default":"http://hl7.org/fhir/StructureDefinition/patient-birthPlace","enum":["http://hl7.org/fhir/StructureDefinition/patient-birthPlace"]},"valueAddress":{"type":"object","additionalProperties":false,"properties":{"city":{"type":"string","description":"Town or city of birth.","example":"Manchester"},"district":{"type":"string","description":"County or metropolitan district of birth.","example":"Greater Manchester"},"country":{"type":"string","description":"A coded value for a patient's country of birth.\n\nFrom [ISO 3166-1](http://hl7.org/fhir/valueset-iso3166-1-3.html) plus codes from the UK Internal Code list which do not have entries in ISO 3166-1.\n\nUK Internal Codes:\n* `1` - England\n* `2` - Scotland\n* `3` - Wales\n* `4` - Northern Ireland\n* `7` - Sark\n* `9` - Alderney\n* `10` - Channel Islands\n","example":"GBR"}}}}},{"type":"object","description":"An extension to carry the reason a PDS record has been removed from the Patient Demographic Service. This will only be populated on a retrieval and not a search.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of the removal from registration extension.","default":"https://fhir.nhs.uk/StructureDefinition/Extension-PDS-RemovalFromRegistration","enum":["https://fhir.nhs.uk/StructureDefinition/Extension-PDS-RemovalFromRegistration"],"readOnly":true},"extension":{"type":"array","description":"An extension reason a PDS record has been removed from the Patient Demographic Service.","minItems":1,"maxItems":2,"items":{"oneOf":[{"type":"object","description":"Wrapper object for removalFromRegistrationCode.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"To identify the removal reason code.","default":"removalFromRegistrationCode","enum":["removalFromRegistrationCode"],"readOnly":true},"valueCodeableConcept":{"type":"object","description":"PDS Removal Reason Exit Code","required":["coding"],"properties":{"coding":{"type":"array","description":"Array containing exactly one removal reason exit code object","items":{"type":"object","required":["system","code","display"],"properties":{"system":{"type":"string","format":"url","description":"URL of the Removal Reason Exit Code. Always uses the 'PDS-RemovalReasonExitCode' Code System.","example":"https://fhir.nhs.uk/CodeSystem/PDS-RemovalReasonExitCode","readOnly":true},"code":{"type":"string","description":"A CodeSystem that identifies the reason a PDS record has been removed.","example":"SCT","enum":["DEA","EMB","SCT","NIT","TRA","ORR"]},"display":{"type":"string","description":"Display-friendly representation of the removal reason exit code.","example":"Transferred to Scotland"}}}}}}}},{"type":"object","description":"Wrapper object for removal from registration effective time.","required":["url","valuePeriod"],"properties":{"url":{"type":"string","description":"Key of this object. Always `effectiveTime`.","default":"effectiveTime","enum":["effectiveTime"],"readOnly":true},"valuePeriod":{"type":"object","description":"The effective time of removal of the Patient record from PDS.","required":["start"],"properties":{"start":{"type":"string","format":"date-time","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01T00:00:00+00:00"},"end":{"type":"string","format":"date-time","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31T00:00:00+00:00"}}}}}]}}}}]}}}},"example":{"resourceType":"Patient","id":"9000000009","identifier":[{"system":"https://fhir.nhs.uk/Id/nhs-number","value":"9000000009","extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSNumberVerificationStatus","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-NHSNumberVerificationStatus","version":"1.0.0","code":"01","display":"Number present and verified"}]}}]}],"meta":{"versionId":"2","security":[{"system":"http://terminology.hl7.org/CodeSystem/v3-Confidentiality","code":"U","display":"unrestricted"}]},"name":[{"id":"123","use":"usual","period":{"start":"2020-01-01","end":"2021-12-31"},"given":["Jane"],"family":"Smith","prefix":["Mrs"],"suffix":["MBE"]}],"gender":"female","birthDate":"2010-10-22","multipleBirthInteger":1,"deceasedDateTime":"2010-10-22T00:00:00+00:00","generalPractitioner":[{"id":"254406A3","type":"Organization","identifier":{"system":"https://fhir.nhs.uk/Id/ods-organization-code","value":"Y12345","period":{"start":"2020-01-01","end":"2021-12-31"}}}],"managingOrganization":{"type":"Organization","identifier":{"system":"https://fhir.nhs.uk/Id/ods-organization-code","value":"Y12345","period":{"start":"2020-01-01","end":"2021-12-31"}}},"extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NominatedPharmacy","valueReference":{"identifier":{"system":"https://fhir.nhs.uk/Id/ods-organization-code","value":"Y12345"}}},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-PreferredDispenserOrganization","valueReference":{"identifier":{"system":"https://fhir.nhs.uk/Id/ods-organization-code","value":"Y23456"}}},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-MedicalApplianceSupplier","valueReference":{"identifier":{"system":"https://fhir.nhs.uk/Id/ods-organization-code","value":"Y34567"}}},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus","extension":[{"url":"deathNotificationStatus","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-DeathNotificationStatus","version":"1.0.0","code":"2","display":"Formal - death notice received from Registrar of Deaths"}]}},{"url":"systemEffectiveDate","valueDateTime":"2010-10-22T00:00:00+00:00"}]},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSCommunication","extension":[{"url":"language","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-HumanLanguage","version":"1.0.0","code":"fr","display":"French"}]}},{"url":"interpreterRequired","valueBoolean":true}]},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-ContactPreference","extension":[{"url":"PreferredWrittenCommunicationFormat","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredWrittenCommunicationFormat","code":"12","display":"Braille"}]}},{"url":"PreferredContactMethod","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredContactMethod","code":"1","display":"Letter"}]}},{"url":"PreferredContactTimes","valueString":"Not after 7pm"}]},{"url":"http://hl7.org/fhir/StructureDefinition/patient-birthPlace","valueAddress":{"city":"Manchester","district":"Greater Manchester","country":"GBR"}},{"url":"https://fhir.nhs.uk/StructureDefinition/Extension-PDS-RemovalFromRegistration","extension":[{"url":"removalFromRegistrationCode","valueCodeableConcept":{"coding":[{"system":"https://fhir.nhs.uk/CodeSystem/PDS-RemovalReasonExitCode","code":"SCT","display":"Transferred to Scotland"}]}},{"url":"effectiveTime","valuePeriod":{"start":"2020-01-01T00:00:00+00:00","end":"2021-12-31T00:00:00+00:00"}}]}],"telecom":[{"id":"789","period":{"start":"2020-01-01","end":"2021-12-31"},"system":"phone","value":"01632960587","use":"home"},{"id":"790","period":{"start":"2019-01-01","end":"2022-12-31"},"system":"email","value":"jane.smith@example.com","use":"home"},{"id":"OC789","period":{"start":"2020-01-01","end":"2021-12-31"},"system":"other","value":"01632960587","use":"home","extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem","code":"textphone","display":"Minicom (Textphone)"}}]}],"contact":[{"id":"C123","period":{"start":"2020-01-01","end":"2021-12-31"},"relationship":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0131","code":"C","display":"Emergency Contact"}]}],"telecom":[{"system":"phone","value":"01632960587"}]}],"address":[{"id":"456","period":{"start":"2020-01-01","end":"2021-12-31"},"use":"home","line":["1 Trevelyan Square","Boar Lane","City Centre","Leeds","West Yorkshire"],"postalCode":"LS1 6AE","extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","extension":[{"url":"type","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType","code":"PAF"}},{"url":"value","valueString":"12345678"}]},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","extension":[{"url":"type","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType","code":"UPRN"}},{"url":"value","valueString":"123456789012"}]}]},{"id":"T456","period":{"start":"2020-01-01","end":"2021-12-31"},"use":"temp","text":"Student Accommodation","line":["1 Trevelyan Square","Boar Lane","City Centre","Leeds","West Yorkshire"],"postalCode":"LS1 6AE","extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","extension":[{"url":"type","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType","code":"PAF"}},{"url":"value","valueString":"12345678"}]},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","extension":[{"url":"type","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType","code":"UPRN"}},{"url":"value","valueString":"123456789012"}]}]}]}}}},"503":{"description":"The request timed out during processing. This does not imply the request has failed or been rejected. Error code: `SERVICE_UNAVAILABLE`.\n\nRe-send the request after the time specified in the `Retry-After` header using the same `X-Request-ID` value.\n","headers":{"RetryAfter":{"description":"Time to wait between polls in seconds","schema":{"type":"string","example":"5"}}},"content":{"application/fhir+json":{"schema":{"type":"object","description":"Outcome of an operation that does not result in a resource or bundle being returned, for example an error or an async/batch submission.\nThere are a number of possible error codes that can be returned along with a more detailed description in the `display` field.\n","properties":{"resourceType":{"type":"string","description":"FHIR Resource Type.","default":"OperationOutcome"},"issue":{"type":"array","description":"List of issues that have occurred.","minItems":1,"items":{"type":"object","required":["severity","code"],"properties":{"severity":{"type":"string","enum":["fatal","error","warning","information"],"description":"Severity of the error.","example":"error"},"code":{"type":"string","description":"FHIR error code.","example":"invalid","enum":["invalid","structure","required","value","invariant","security","login","unknown","expired","forbidden","suppressed","processing","not-supported","duplicate","multiple-matches","not-found","deleted","too-long","code-invalid","extension","too-costly","business-rule","conflict","transient","lock-error","no-store","exception","timeout","incomplete","throttled","informational"]},"details":{"type":"object","description":"Internal error code.","properties":{"coding":{"type":"array","items":{"type":"object","properties":{"system":{"type":"string","description":"URI of the coding system specification.","example":"https://fhir.nhs.uk/R4/CodeSystem/Spine-ErrorOrWarningCode"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1"},"code":{"type":"string","description":"Symbol in syntax defined by the system.","example":"INVALID_VALUE"},"display":{"type":"string","description":"Representation defined by the system.","example":"Provided value is invalid"}}}}}},"diagnostics":{"type":"string","description":"Additional diagnostic information about the issue. This information is subject to change.","example":"Invalid value - 2019-01 in field 'birthDate'"},"expression":{"type":"string","description":"FHIRPath of element(s) related to the error.","example":"Patient.name.given"}}}}}},"example":{"resourceType":"OperationOutcome","issue":[{"severity":"error","code":"timeout","details":{"coding":[{"system":"https://fhir.nhs.uk/R4/CodeSystem/Spine-ErrorOrWarningCode","version":"1","code":"SERVICE_UNAVAILABLE","display":"Service unavailable"}]},"diagnostics":"The downstream domain processing has not completed within the configured timeout period. Using the same 'X-Request-ID' header, retry your request after the time specified by the 'Retry-After' response header."}]}}}},"4XX":{"description":"An error occurred as follows:\n\n| HTTP status | Error code | Description |\n| ----------- | -------------------------- | --------------------------------------------- |\n| 400 | UNSUPPORTED_SERVICE | Missing NHS number. |\n| 400 | MISSING_VALUE | Missing header parameter. For details, see the `diagnostics` field. |\n| 400 | INVALID_VALUE | Invalid header parameter or invalid value in body of patch request. For details, see the `diagnostics` field. |\n| 400 | INVALID_UPDATE | Malformed patch request or client error after the patch was accepted and patient was not updated. For example, a start date was after the corresponding end date. |\n| 400 | INVALID_RESOURCE_ID | Invalid NHS number. |\n| 400 | VALIDATION_ERROR | This is the \"default\" error thrown when no others are applicable. |\n| 400 | UNSUPPORTED_CHARACTERS_IN_FIELD | Invalid value in body of patch request. For details, see the `diagnostics` field. |\n| 400 | ADDITIONAL_PROPERTIES | The user sent additional properties within the dictionary. For example sending a patient patch and attempting to add 'pets', which is not an allowed field within the patient resource. |\n| 400 | UNSUPPORTED_VALUE | There was an unsupported value in the request. The value may be valid in the schema - however it could be a legacy value that we do not allow to be set anymore. For example - setting the death notification status to 'removed'. The invalid value and field will be presented in the display. |\n| 400 | TOO_FEW_VALUES_SUBMITTED | The field in question has a minimum number of items and the user sent too few. |\n| 400 | TOO_MANY_VALUES_SUBMITTED | The field in question has a maximum number of items and the user sent too many. |\n| 401 | ACCESS_DENIED | Access token missing, invalid or expired, or calling application not configured for this operation. |\n| 403 | FORBIDDEN_UPDATE | The user is not permitted to update certain resources or elements, for example most users are not allowed to update the date of death once it has been set. A detailed description will be added to the display. For example - updating a sensitive patient or adding a formal death notification is only permitted from certain systems. |\n| 403 | ACCESS_DENIED | Patient cannot perform this action. |\n| 404 | RESOURCE_NOT_FOUND | Patient does not exist for given NHS number. |\n| 404 | INVALIDATED_RESOURCE | Patient record for given NHS number has been invalidated and not superseded by another NHS number. |\n| 408 | UNABLE_TO_CALL_SERVICE | The downstream domain processing has not completed within the configured timeout period. |\n| 409 | RESOURCE_VERSION_MISMATCH | The resource version in the `If-Match` header of the update request did not match the current version of the resource. See [Patient resource versioning](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-fhir#patient-resource-versioning). |\n| 412 | PRECONDITION_FAILED | Problem with request, for example missing `If-Match` header. For details, see the `diagnostics` field. |\n| 429 | TOO_MANY_REQUESTS | You have exceeded your application's [rate limit](https://digital.nhs.uk/developer/guides-and-documentation/reference-guide#rate-limits). |\n","content":{"application/fhir+json":{"schema":{"type":"object","description":"Outcome of an operation that does not result in a resource or bundle being returned, for example an error or an async/batch submission.\nThere are a number of possible error codes that can be returned along with a more detailed description in the `display` field.\n","properties":{"resourceType":{"type":"string","description":"FHIR Resource Type.","default":"OperationOutcome"},"issue":{"type":"array","description":"List of issues that have occurred.","minItems":1,"items":{"type":"object","required":["severity","code"],"properties":{"severity":{"type":"string","enum":["fatal","error","warning","information"],"description":"Severity of the error.","example":"error"},"code":{"type":"string","description":"FHIR error code.","example":"invalid","enum":["invalid","structure","required","value","invariant","security","login","unknown","expired","forbidden","suppressed","processing","not-supported","duplicate","multiple-matches","not-found","deleted","too-long","code-invalid","extension","too-costly","business-rule","conflict","transient","lock-error","no-store","exception","timeout","incomplete","throttled","informational"]},"details":{"type":"object","description":"Internal error code.","properties":{"coding":{"type":"array","items":{"type":"object","properties":{"system":{"type":"string","description":"URI of the coding system specification.","example":"https://fhir.nhs.uk/R4/CodeSystem/Spine-ErrorOrWarningCode"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1"},"code":{"type":"string","description":"Symbol in syntax defined by the system.","example":"INVALID_VALUE"},"display":{"type":"string","description":"Representation defined by the system.","example":"Provided value is invalid"}}}}}},"diagnostics":{"type":"string","description":"Additional diagnostic information about the issue. This information is subject to change.","example":"Invalid value - 2019-01 in field 'birthDate'"},"expression":{"type":"string","description":"FHIRPath of element(s) related to the error.","example":"Patient.name.given"}}}}}},"example":{"resourceType":"OperationOutcome","issue":[{"severity":"error","code":"structure","details":{"coding":[{"system":"https://fhir.nhs.uk/R4/CodeSystem/Spine-ErrorOrWarningCode","version":"1","code":"INVALID_UPDATE","display":"Update is invalid"}]},"diagnostics":"Invalid update with error - Update unsupported for resource - 'pets'"}]}}}}}}},"/Patient/{id}/RelatedPerson":{"parameters":[{"name":"id","in":"path","description":"The patient's NHS number. The primary identifier of a patient, unique within NHS England and Wales. Always 10 digits and must be a [valid NHS number](https://www.datadictionary.nhs.uk/attributes/nhs_number.html).","required":true,"schema":{"type":"string","example":"9000000009"}},{"in":"header","name":"Authorization","description":"An [OAuth 2.0 bearer token](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation#user-restricted-apis).\n\nRequired in all environments except sandbox.\n","required":false,"schema":{"type":"string","format":"^Bearer\\ [[:ascii:]]+$","example":"Bearer g1112R_ccQ1Ebbb4gtHBP1aaaNM"}},{"in":"header","name":"NHSD-Session-URID","description":"\nThe user role ID (URID) for the current session. Also known as a user role profile ID (URPID).\n\nThis header is optional.\n\nIn Application-restricted access mode this header is ignored.\n\nIn Healthcare worker access mode if you send this header it must be valid for the logged-in user. See [determine the user's role](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation/user-restricted-restful-apis-nhs-cis2-separate-authentication-and-authorisation#step-9-determine-the-user-s-role) for guidance.\n","required":false,"schema":{"type":"string","pattern":"^[0-9]+$","example":"555254240100"}},{"in":"header","name":"X-Request-ID","required":false,"description":"A globally unique identifier (GUID) for the request, which we use to de-duplicate repeated requests and to trace the request if you contact our helpdesk.\n\nMust be a universally unique identifier (UUID) (ideally version 4).\n\nMirrored back in a response header.\n\nIf you re-send a failed request, use the same value in this header.\n","schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","example":"60E0B220-8136-4CA5-AE46-1D97EF59D068"}},{"in":"header","name":"X-Correlation-ID","required":false,"description":"An optional ID which you can use to track transactions across multiple systems. It can take any value, but we recommend avoiding `.` characters.\n\nMirrored back in a response header.\n","schema":{"type":"string","example":"11C46F5F-CDEF-4865-94B2-0EE0EDCC26DA"}},{"in":"header","name":"NHSD-End-User-Organisation-ODS","required":false,"description":"The ODS code of the user.\n\nMandatory for client applications which service multiple end user organisations (EUO). This will allow the calls to be attributed to the correct EUO.\n","schema":{"type":"string","example":"Y12345"}}],"get":{"description":"## Overview\nUse this endpoint to get a patient's related people details from PDS for a given NHS number. This is a list of people who can be contacted, and how, regarding the patient. These details may be useful for a practitioner to get in contact with a next of kin or guardian.\n\n## Restricted patients\nSome patients are tagged as [restricted](https://digital.nhs.uk/services/demographics/restricting-access-to-a-patients-demographic-record) and are sometimes known as sensitive patients. Related people are not returned for a restricted patient and an empty bundle is returned.\n\nIf a related person only contains a patient reference, and when the patient is retrieved, it is restricted; location sensitive fields such as `address` and `telecom` are removed.\n\n## Sandbox test scenarios\nYou can test the following scenarios in our sandbox environment:\n\n| Scenario | Request | Response |\n| ------------------------------- | --------------------------------------------- | ------------------------------------------------------------- |\n| Multiple related people exists | `id`=`9000000009` | HTTP Status 200 with related person data in a response Bundle |\n| Single related person exists | `id`=`9000000017` | HTTP Status 200 with related person data in a response Bundle |\n| Related people do not exist | `id`=`9000000025` | HTTP Status 200 with an empty bundle |\n| Missing X-Request-ID | `id`=`9000000009` (or any other valid NHS number) | HTTP Status 412 with problem description |\n\nYou can try out the sandbox using the 'Try this API' feature on this page.\n\nAlternatively, you can try out the sandbox using our Postman collection:\n\n[![Run in Postman](https://run.pstmn.io/button.svg)](https://app.getpostman.com/run-collection/14719036-953f067f-30b9-4552-8252-7cc10b21dad3)\n","summary":"Get a patient's related people","operationId":"get-related-people","responses":{"200":{"description":"Information successfully returned.","headers":{"ETag":{"schema":{"type":"string","pattern":"^W/\"[0-9]+\"$","example":"W/\"2\""},"description":"Record version identifier enclosed in quotes and preceded by 'W/'. For example, `W/\"2\"`.\n\nCorresponds to `meta.versionId` attribute in the patient resource body.\n\nWhen you retrieve a patient resource, you get a version number for the resource (in the `ETag` response header and in the `versionId` field in the response).\nYou must then pass the resource's version number in any update request (in the `If-Match` response header) made for the patient.\n"},"X-Correlation-Id":{"schema":{"type":"string","example":"11C46F5F-CDEF-4865-94B2-0EE0EDCC26DA"},"description":"The X-Correlation-ID from the request header, if supplied, mirrored back.\n"},"X-Request-Id":{"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","example":"60E0B220-8136-4CA5-AE46-1D97EF59D068"},"description":"The X-Request-ID from the request header, if supplied, mirrored back.\n"}},"content":{"application/fhir+json":{"schema":{"type":"object","properties":{"resourceType":{"type":"string","description":"FHIR Resource Type.","default":"Bundle"},"type":{"type":"string","description":"FHIR Bundle Type.","default":"searchset"},"timestamp":{"type":"string","description":"Time the search was performed.","format":"datetime","example":"2019-12-25T12:00:00+00:00"},"total":{"type":"integer","description":"Number of resources returned in search.","example":1},"entry":{"type":"array","description":"A list of related people details attached to the patient. \n","items":{"type":"object","properties":{"fullUrl":{"type":"string","description":"Absolute URL of the resource described in this item.","example":"https://api.service.nhs.uk/personal-demographics/FHIR/R4/Patient/9000000009/RelatedPerson/507B7621"},"resource":{"type":"object","additionalProperties":false,"required":["patient","relationship"],"properties":{"id":{"type":"string","description":"Unique object identifier for this name.","example":"507B7621"},"resourceType":{"type":"string","description":"FHIR resource type.","default":"RelatedPerson"},"patient":{"type":"object","required":["type"],"properties":{"type":{"type":"string","default":"Patient","enum":["Patient"]},"identifier":{"type":"object","description":"Identifier and system of identification used for this Patient.\n\nThis is an optional field as related person details are either a reference to another NHS number, or the details, such as name and adress, stored directly on the resource.\n","properties":{"system":{"type":"string","description":"URL for the Patient retrieval API.","format":"url","example":"https://api.service.nhs.uk/personal-demographics/FHIR/R4/Patient"},"value":{"type":"string","description":"NHS number for the related person","example":"90000000009","pattern":"^\\d{10}$"}}},"reference":{"type":"string","description":"URL for the FHIR Patient resource.","format":"url","example":"https://api.service.nhs.uk/personal-demographics/FHIR/R4/Patient/90000000009"}}},"active":{"type":"boolean","default":true},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"name":{"type":"array","description":"List containing zero or one name associated with the related person.\nThis is an optional field as there may be a `patient` reference which can be used to retrieve any details about the related person.\nIf no `patient` reference is available `name` and `address` must be provided at the minimum.\n","maxItems":1,"items":{"type":"object","required":["use","family"],"additionalProperties":false,"properties":{"id":{"type":"string","description":"Unique object identifier for this name.","example":"123"},"use":{"type":"string","description":"How this name should be used.\n* usual - Known as, conventional or the one patient normally uses. A patient always has a usual name.\n* temp - An alias or temporary name. This may also be used for temporary names assigned at birth or in emergency situations.\n* nickname - A name that the patient prefers to be addressed by, but is not part of their usual name.\n* old - This name is no longer in use (or was never correct, but retained for records).\n* maiden - Name changed for Marriage. A name used prior to changing name because of marriage. This term is not gender specific. The use of this term does not imply any particular history for a person's name.\n\nThe following use codes are included in the [name-use](https://www.hl7.org/fhir/valueset-name-use.html) value set, but should not be used and is not be returned as part of a retrieval.\n* official - The formal name as registered in an official (government) registry, but which name might not be commonly used. May be called \"legal name\".\n* anonymous - Anonymous assigned name, alias, or pseudonym (used to protect a person's identity for privacy reasons).\n","enum":["usual","temp","nickname","old","maiden"],"example":"usual"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"given":{"type":"array","maxItems":5,"description":"Given names, including any middle names.\n\nEach name(s) should be a separate item in the list. The first given name may include multiple names, separated by a space.\nSubsequent names must be broken down into list items. For example, the input `[Jane Marie Anne, Jo Adele]` returns `[Jane Marie Anne, Jo, Adele]`.\n","example":["Jane Marie Anne","Jo","Adele"],"items":{"type":"string","maxLength":35,"example":"Jane"}},"family":{"type":"string","maxLength":35,"description":"Family name (often called Surname).","example":"Smith"},"prefix":{"type":"array","description":"Name prefixes, titles, and prenominals.","example":["Mrs"],"items":{"type":"string","example":"Mrs"}},"suffix":{"type":"array","description":"Name suffices and postnominals.","example":["MBE","PhD"],"items":{"type":"string","example":"MBE"}}}}},"address":{"type":"array","description":"List containing zero or one address associated with the related person.\nThis is an optional field as there may be a `patient` reference which can be used to retrieve any details about the related person.\nIf no `patient` reference is available `name` and `address` must be provided at the minimum.\n","maxItems":1,"items":{"type":"object","description":"An address associated with the patient.","required":["use"],"properties":{"id":{"type":"string","description":"Unique system identifier for this address.","example":"456"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"use":{"type":"string","description":"Purpose of this address:\n * `home` - the home address is the patient's normal residence. Home address is also known as usual, main, registered, current or permanent address\n * `temp` - a temporary address is an address used for a set period of time, but where the patient's home, permanent address remains unchanged\n * `billing` - an address used for correspondence purposes only\n * `work` - an office address. This can be returned due to legacy data but cannot be added or replaced on update\n\n A patient should have no more than one current `temp` and/or `billing` address.\n However, historically this was constrained only by the integration requirements and was not enforced so theoretically more than one can exist for a patient when retrieving.\n Where multiple instances already exist for the patient it is not expected that local systems should manage those, but should choose the most appropriate one to maintain (e.g. by examining period dates).\n\n A `home` address is the patient's main residential address and should normally be used for all clinical and demographic purposes, including clinical and appointment correspondence.\n However additionally, `temp` and `billing` addresses may be provided by a patient when there is a requirement to record an alternative location for the purposes of unbroken care.\n When sending correspondence to a patient:\n *\ta present and valid `billing` address may take precedence over `home` and `temp` addresses. A patient should have only a single current `billing` address. An address is considered 'valid' according to its period start and end dates.\n *\tif no current `billing` address is provided, a `temp` address may take precedence over the `home` address, again if it is valid according to its period start and end dates.\n * if there is no valid, current `billing` and/or `temp` address, the `home` address must be used.\n","enum":["home","work","temp","billing"],"example":"home"},"text":{"type":"string","description":"Where a `temp` address is provided a descriptor text must be sent.\nThe list of possible values are:\n* `Second Home` - a patient's second home\n* `Student Accommodation` - a patient's place of residence while at university\n* `Respite Care Address` - where the patient resides during respite care\n* `Temporary Residence Address` - where the patient resides for a specific period of time\n* `Convalescence Home` - the address for a patient during a period of recovery\n* `Mobile Home` - the address of a patient's mobile home, parked for a specific period of time, e.g. the address of a caravan park\n* `Holiday Home` - the address for a patient during a holiday\n\nA patient can also register temporarily at a GP practice using a temporary address. Temporary GP registration information does not appear on the PDS, but the address used for it may.\n","enum":["Second Home","Student Accommodation","Respite Care Address","Temporary Residence Address","Convalescence Home","Mobile Home","Holiday Home"],"example":"Student Accommodation"},"line":{"type":"array","description":"All lines of the address except the postal code.\n\nSystems must apply the following formatting convention when adding or replacing addresses lines:\n*\tline 1 - premises ID and/or house name, e.g. `Flat 1` or `The Old Schoolhouse`\n*\tline 2 - house number, dependent thoroughfare name and descriptor (if present), thoroughfare name and descriptor, e.g. `23 Mill Lane`\n*\tline 3 - dependent locality/village, locality (if present), e.g. `Boxgrove`\n*\tline 4 - post town, e.g. `Leeds`\n*\tline 5 - county (if present), e.g. `West Yorkshire`\n\nIf any of the lines are blank, they are not returned due to FHIR conformance constraints.\n","maxItems":5,"items":{"type":"string"},"example":["1 Trevelyan Square","Boar Lane","City Centre","Leeds","West Yorkshire"]},"postalCode":{"type":"string","description":"Postal code of the address.","example":"LS1 6AE"},"extension":{"type":"array","description":"List of address keys formatted as a FHIR extension. This can include up to one Unique Property Reference Number (UPRN), and up to one Postal Address File (PAF) key. If no keys for the address are known, the array will be empty. Otherwise it will be a list of objects which specify the value of the address key and the code system for it","items":{"anyOf":[{"type":"object","description":"Unique identifier for an address.","properties":{"url":{"type":"string","description":"URL of specification of the AddressKey extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey"]},"extension":{"type":"array","description":"Specification of address key system and address key value. Contains exactly two items: one describing the code system the Address Key uses, and the other specifying the value of the Address Key.","minItems":2,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Coding system of the address key.","required":["url","valueCoding"],"properties":{"url":{"type":"string","description":"Always 'type'.","default":"type"},"valueCoding":{"type":"object","description":"URL of specification of address key format.","required":["system","code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available Address Key formats.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType"},"code":{"type":"string","description":"Address Key system. Always 'PAF'.","enum":["PAF"],"example":"PAF"}}}}},{"type":"object","description":"Value of the address key.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Always 'value'.","default":"value","example":"value"},"valueString":{"type":"string","description":"Address key in PAF format. An 8 digit number including leading zeroes, formatted as a string.","minLength":8,"maxLength":8,"pattern":"^[0-9]{8}$","example":"12345678"}}}]}}}},{"type":"object","description":"Unique identifier for an address.","properties":{"url":{"type":"string","description":"URL of specification of the AddressKey extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey"]},"extension":{"type":"array","description":"Specification of address key system and address key value. Contains exactly two items: one describing the code system the Address Key uses, and the other specifying the value of the Address Key.","minItems":2,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Coding system of the address key.","required":["url","valueCoding"],"properties":{"url":{"type":"string","description":"Always 'type'.","default":"type"},"valueCoding":{"type":"object","description":"URL of specification of address key format.","required":["system","code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available Address Key formats.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType"},"code":{"type":"string","description":"Address Key system. Always 'UPRN'.","enum":["UPRN"],"example":"UPRN"}}}}},{"type":"object","description":"Value of the address key.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Always 'value'.","default":"value","example":"value"},"valueString":{"type":"string","description":"Address key in UPRN format. A number containing from 1 up to 12 digits.","minLength":1,"maxLength":12,"pattern":"^[0-9]{1,12}$","example":"123456789012"}}}]}}}}]}}}}},"telecom":{"type":"array","description":"List containing zero to five contact methods associated with the related person.\nThis is an optional field as there may be a `patient` reference which can be used to retrieve any details about the related person.\n","maxItems":5,"items":{"description":"A contact point, such as a phone number or email address","type":"object","required":["system","value"],"properties":{"id":{"type":"string","description":"Unique object identifier for this contact point.","example":"789"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"system":{"description":"Means of communication, such as phone or email.","type":"string","enum":["phone","fax","email","other"],"example":"phone"},"value":{"description":"Phone number, email address, or other identifier for use with contact system.","type":"string","example":"01632960587"},"use":{"type":"string","description":"Location associated with communication system.","enum":["home","work","temp","mobile"],"example":"home"},"extension":{"type":"array","maxItems":1,"description":"Extension that is returned when the communication type is `textphone`. The only code returned is `textphone`, which means `Minicom (Textphone)`.\n\nThe `system` is `other` when the extension is included.\n","items":{"type":"object","description":"Wrapped object for other contact system details.","properties":{"url":{"type":"string","description":"Definition of other contact system extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem"]},"valueCoding":{"type":"object","description":"URL of specification of other contact systems.","properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem"},"code":{"type":"string","description":"Coded value for the other contact system in place.","example":"textphone"},"display":{"description":"Display-friendly representation of the other contact system code.","type":"string","example":"Minicom (Textphone)"}}}}}}}}},"relationship":{"type":"array","description":"The relationship of the related person to the patient.\n","minItems":1,"maxItems":1,"items":{"type":"object","required":["coding"],"properties":{"coding":{"type":"array","description":"Coded values for three relationship types:\n* Role\n* Type\n* Next-of-Kin\n\nThe codes used can be found at:\n* http://hl7.org/fhir/ValueSet/relatedperson-relationshiptype\n* https://fhir.nhs.uk/R4/CodeSystem/UKCore-AdditionalRelatedPersonRole\n\nThe allowed values for `Role` are:\n* Agent - Agent of patient\n* Guardian - Guardian of patient\n* Personal - Personal relationship with the patient\n\nThe allowed values for `Type` are:\n* SPS - spouse\n* DOMPART - domestic partner\n* PRN - parent\n* PRNFOST - foster parent\n* STPPRN - step parent\n* CHILD - child\n* MTH - mother\n* FTH - father\n* SIS - sister\n* BRO - brother\n* FAMMEMB - family member\n* ONESELF - self\n* N - Next-of-Kin\n* U - Unknown\n* PolygamousPartner - Polygamous Partner of patient\n* Dependant - Dependant of patient\n* NonDependant - Non Dependant of patient\n* ProxyContact - Proxy Contact for patient\n* ProxyCommunication - Proxy Communication for patient\n* ProxyContactCommunication - Proxy Contact and Communication for patient\n* Carer - Carer of patient\n* Guardian - Guardian of patient\n* NotSpecified - Not Specified\n\nThe allowed values for `Next-of-Kin` are:\n* N - Next-of-Kin\n\n`Role` and `Type` are mandatory, so both should be present - however they both contain the `Guardian` code - so a single response is possible.\n\n`Next-of-Kin` is optional and will be absent from the response when the related person is not the Next-of-Kin.\n","minItems":1,"maxItems":3,"items":{"type":"object","required":["system","code"],"properties":{"system":{"type":"string","description":"URI of the coding system specification.","format":"url","default":"https://fhir.nhs.uk/R4/CodeSystem/UKCore-AdditionalRelatedPersonRole","enum":["http://hl7.org/fhir/ValueSet/relatedperson-relationshiptype","https://fhir.nhs.uk/R4/CodeSystem/UKCore-AdditionalRelatedPersonRole"]},"code":{"type":"string","description":"Symbol in syntax defined by the system.","example":"Guardian"},"display":{"type":"string","description":"Human-friendly display representation defined by the system.","example":"Guardian of patient"}}}}}}},"extension":{"type":"array","description":"Wrapper array for copy correspondence, contact rank, contact preferences and communication details; these are all FHIR extensions. Always contains zero or one of each extension type.\n","items":{"anyOf":[{"type":"object","description":"Flag indicating if this person should be copied in on any contact with the Patient. This will only be returned if the value is true and the person should be copied in on correspondence, otherwise it will be omitted. \n","properties":{"url":{"type":"string","format":"url","description":"URL to FHIR Extension Specification.","default":"https://fhir.nhs.uk/R4/StructureDefinition/Extension-UKCore-CopyCorrespondenceIndicator","enum":["https://fhir.nhs.uk/R4/StructureDefinition/Extension-UKCore-CopyCorrespondenceIndicator"]},"valueBoolean":{"type":"boolean","description":"Flag indicating if this person should be copied in on correspondence. This will only be returned if the value is `true` otherwise it will not be returned and can be assumed `false`","example":true}}},{"type":"object","description":"Rank indicating order in which contacts should be tried.","properties":{"url":{"type":"string","format":"url","description":"URL to FHIR Extension Specification.","default":"https://fhir.nhs.uk/R4/StructureDefinition/Extension-UKCore-ContactRank","enum":["https://fhir.nhs.uk/R4/StructureDefinition/Extension-UKCore-ContactRank"]},"valuePositiveInt":{"type":"integer","minimum":1,"maximum":99,"description":"Rank expressed as positive integer (1 being the highest).","example":1}}},{"type":"object","description":"Wrapper object for preferred contact details; the written communication format, preferred contact time and method. This will only be populated on a retrieval and not a search.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of the contact preference extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-ContactPreference","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-ContactPreference"]},"extension":{"description":"Wrapper array containing zero or one preferred contact method, zero or one preferred written communication format; and zero or one preferred contact time.","type":"array","maxItems":3,"items":{"oneOf":[{"type":"object","description":"Wrapper object for preferred written communication format.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredWrittenCommunicationFormat`.","default":"PreferredWrittenCommunicationFormat"},"valueCodeableConcept":{"type":"object","description":"Preferred Written Communication Format.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","format":"url","description":"Definition of the preferred written communication extension.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredWrittenCommunicationFormat","enum":["https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredWrittenCommunicationFormat"]},"code":{"type":"string","description":"A code to identify the preferred written communication format of a patient, contact or related person.\n* 11 - Large print\n* 12 - Braille\n* 13 - Audio tape\n","example":"12"},"display":{"type":"string","description":"Display-friendly representation of the preferred written communication format code.","example":"Braille"}}}}}}}},{"type":"object","description":"Wrapper object for preferred contact method.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredContactMethod`.","default":"PreferredContactMethod","enum":["PreferredContactMethod"]},"valueCodeableConcept":{"type":"object","description":"Preferred Contact Method.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","format":"url","description":"Definition of the preferred contact method extension.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredContactMethod","enum":["https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredContactMethod"]},"code":{"type":"string","description":"A code to identify to identify the preferred contact method of a patient, contact or related person.\n* 1\t- Letter\n* 2\t- Visit\n* 3\t- Telephone\n* 4\t- E-mail\n* 5\t- Minicom (Textphone)\n* 6\t- Telephone contact via proxy\n* 7\t- Sign language\n* 8\t- No Telephone contact\n","example":"1"},"display":{"type":"string","description":"Display-friendly representation of the preferred contact method code.","example":"Letter"}}}}}}}},{"type":"object","description":"Wrapper object for preferred contact times.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredContactTimes`.","default":"PreferredContactTimes","enum":["PreferredContactTimes"]},"valueString":{"type":"string","maximum":40,"description":"A free-text description about the preferred contact times.","example":"Not after 7pm"}}}]}}}},{"type":"object","description":"Wrapper object for communication details. This will only be populated on a retrieval and not a search.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of communication extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSCommunication","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSCommunication"]},"extension":{"type":"array","description":"Definition of communication extension.\n\nThe array must have one item, a valueCodeableConcept for the language and can optionally include a valueBoolean for if an interpreter is required.","minItems":1,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Wrapper object for communication language.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `language`.","default":"language","enum":["language"]},"valueCodeableConcept":{"type":"object","description":"Human language.","required":["coding"],"properties":{"coding":{"type":"array","description":"Exactly one language code.","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URL of the Language Code System. Always uses the 'UKCore-HumanLanguage' Code System.","example":"https://fhir.hl7.org.uk/CodeSystem/UKCore-HumanLanguage"},"version":{"type":"string","description":"Version of the language code system.","example":"1.0.0"},"code":{"type":"string","description":"Language code based on [ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) standard plus extensions for braille, makaton and sign languages, which are:\n* `q1` - Braille\n* `q2` - American Sign Language\n* `q3` - Australian Sign Language\n* `q4` - British Sign Language\n* `q5` - Makaton\nAll valid codes combined can be found at https://fhir.hl7.org.uk/CodeSystem/UKCore-HumanLanguage.\n","example":"fr"},"display":{"type":"string","description":"Display-friendly representation of the language code (such as English). If there is a language code with no defined mapping, `Unknown` will be returned.","example":"French"}}}}}}}},{"type":"object","description":"Wrapper object for whether an interpreter is required.","required":["url","valueBoolean"],"properties":{"url":{"type":"string","description":"Key of this object. Always `interpreterRequired`.","default":"interpreterRequired","enum":["interpreterRequired"]},"valueBoolean":{"type":"boolean","description":"Whether an interpreter is required.","example":true}}}]}}}}]}}}}}}}}},"example":{"resourceType":"Bundle","type":"searchset","timestamp":"2019-12-25T12:00:00+00:00","total":1,"entry":[{"fullUrl":"https://api.service.nhs.uk/personal-demographics/FHIR/R4/Patient/9000000009/RelatedPerson/507B7621","resource":{"id":"507B7621","resourceType":"RelatedPerson","patient":{"type":"Patient","identifier":{"system":"https://api.service.nhs.uk/personal-demographics/FHIR/R4/Patient","value":"90000000009"},"reference":"https://api.service.nhs.uk/personal-demographics/FHIR/R4/Patient/90000000009"},"active":true,"period":{"start":"2020-01-01","end":"2021-12-31"},"name":[{"use":"usual","period":{"start":"2020-01-01","end":"2021-12-31"},"given":["Jane"],"family":"Smith","prefix":["Mrs"],"suffix":["MBE"]}],"relationship":[{"coding":[{"system":"https://fhir.nhs.uk/R4/CodeSystem/UKCore-AdditionalRelatedPersonRole","code":"Guardian","display":"Guardian of patient"}]}],"extension":[{"url":"https://fhir.nhs.uk/R4/StructureDefinition/Extension-UKCore-CopyCorrespondenceIndicator","valueBoolean":true},{"url":"https://fhir.nhs.uk/R4/StructureDefinition/Extension-UKCore-ContactRank","valuePositiveInt":1},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-ContactPreference","extension":[{"url":"PreferredWrittenCommunicationFormat","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredWrittenCommunicationFormat","code":"12","display":"Braille"}]}},{"url":"PreferredContactMethod","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredContactMethod","code":"1","display":"Letter"}]}},{"url":"PreferredContactTimes","valueString":"Not after 7pm"}]},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSCommunication","extension":[{"url":"language","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-HumanLanguage","version":"1.0.0","code":"fr","display":"French"}]}},{"url":"interpreterRequired","valueBoolean":true}]}],"telecom":[{"period":{"start":"2020-01-01","end":"2021-12-31"},"system":"phone","value":"01632960587","use":"home"}],"address":[{"period":{"start":"2020-01-01","end":"2021-12-31"},"use":"home","line":["1 Trevelyan Square","Boar Lane","City Centre","Leeds","West Yorkshire"],"postalCode":"LS1 6AE","extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","extension":[{"url":"type","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType","code":"PAF"}},{"url":"value","valueString":"12345678"}]},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","extension":[{"url":"type","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType","code":"UPRN"}},{"url":"value","valueString":"123456789012"}]}]}]}}]}}}},"4XX":{"description":"An error occurred as follows:\n\n| HTTP status | Error code | Description |\n| ----------- | -------------------------- | --------------------------------------------- |\n| 400 | INVALID_RESOURCE_ID | Invalid NHS number. |\n| 400 | MISSING_VALUE | Missing header parameter. For details, see the `diagnostics` field. |\n| 400 | INVALID_VALUE | Invalid header parameter. For details, see the `diagnostics` field. |\n| 401 | ACCESS_DENIED | Access token missing, invalid or expired, or calling application not configured for this operation. |\n| 404 | RESOURCE_NOT_FOUND | No related people exist for given NHS number. |\n| 404 | INVALIDATED_RESOURCE | Patient record for given NHS number has been invalidated and not superseded by another NHS number. |\n| 408 | UNABLE_TO_CALL_SERVICE | The downstream domain processing has not completed within the configured timeout period. |\n| 429 | TOO_MANY_REQUESTS | You have exceeded your application's [rate limit](https://digital.nhs.uk/developer/guides-and-documentation/reference-guide#rate-limits). |\n","content":{"application/fhir+json":{"schema":{"type":"object","description":"Outcome of an operation that does not result in a resource or bundle being returned, for example an error or an async/batch submission.\nThere are a number of possible error codes that can be returned along with a more detailed description in the `display` field.\n","properties":{"resourceType":{"type":"string","description":"FHIR Resource Type.","default":"OperationOutcome"},"issue":{"type":"array","description":"List of issues that have occurred.","minItems":1,"items":{"type":"object","required":["severity","code"],"properties":{"severity":{"type":"string","enum":["fatal","error","warning","information"],"description":"Severity of the error.","example":"error"},"code":{"type":"string","description":"FHIR error code.","example":"invalid","enum":["invalid","structure","required","value","invariant","security","login","unknown","expired","forbidden","suppressed","processing","not-supported","duplicate","multiple-matches","not-found","deleted","too-long","code-invalid","extension","too-costly","business-rule","conflict","transient","lock-error","no-store","exception","timeout","incomplete","throttled","informational"]},"details":{"type":"object","description":"Internal error code.","properties":{"coding":{"type":"array","items":{"type":"object","properties":{"system":{"type":"string","description":"URI of the coding system specification.","example":"https://fhir.nhs.uk/R4/CodeSystem/Spine-ErrorOrWarningCode"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1"},"code":{"type":"string","description":"Symbol in syntax defined by the system.","example":"INVALID_VALUE"},"display":{"type":"string","description":"Representation defined by the system.","example":"Provided value is invalid"}}}}}},"diagnostics":{"type":"string","description":"Additional diagnostic information about the issue. This information is subject to change.","example":"Invalid value - 2019-01 in field 'birthDate'"},"expression":{"type":"string","description":"FHIRPath of element(s) related to the error.","example":"Patient.name.given"}}}}}},"example":{"resourceType":"OperationOutcome","issue":[{"severity":"error","code":"structure","details":{"coding":[{"system":"https://fhir.nhs.uk/R4/CodeSystem/Spine-ErrorOrWarningCode","version":"1","code":"PRECONDITION_FAILED","display":"Required condition was not fulfilled"}]},"diagnostics":"Invalid request with error - X-Request-ID header must be supplied to access this resource"}]}}}}}}}},"components":{"headers":{"ETag":{"schema":{"type":"string","pattern":"^W/\"[0-9]+\"$","example":"W/\"2\""},"description":"Record version identifier enclosed in quotes and preceded by 'W/'. For example, `W/\"2\"`.\n\nCorresponds to `meta.versionId` attribute in the patient resource body.\n\nWhen you retrieve a patient resource, you get a version number for the resource (in the `ETag` response header and in the `versionId` field in the response).\nYou must then pass the resource's version number in any update request (in the `If-Match` response header) made for the patient.\n"},"X-Correlation-Id":{"schema":{"type":"string","example":"11C46F5F-CDEF-4865-94B2-0EE0EDCC26DA"},"description":"The X-Correlation-ID from the request header, if supplied, mirrored back.\n"},"X-Request-Id":{"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","example":"60E0B220-8136-4CA5-AE46-1D97EF59D068"},"description":"The X-Request-ID from the request header, if supplied, mirrored back.\n"},"RetryAfter":{"description":"Time to wait between polls in seconds","schema":{"type":"string","example":"5"}}},"parameters":{"Id":{"name":"id","in":"path","description":"The patient's NHS number. The primary identifier of a patient, unique within NHS England and Wales. Always 10 digits and must be a [valid NHS number](https://www.datadictionary.nhs.uk/attributes/nhs_number.html).","required":true,"schema":{"type":"string","example":"9000000009"}},"MessageId":{"name":"message_id","in":"path","description":"The message ID of the accepted update that needs to be submitted to confirm the resource a successfully updated.","required":true,"schema":{"type":"string","example":"20200522091633363041_000001A"}},"ObjectId":{"name":"object_id","in":"path","description":"A resource Object ID. The primary identifier of a resource.","required":true,"schema":{"type":"string","example":"507B7621"}},"IfMatch":{"in":"header","name":"If-Match","description":"Latest known version identifier enclosed in quotes preceded by `W/`.\n\nSend the value of the patient's `ETag` response header on patient retrieval when updating a patient.\nThis is to ensure that any updates are applied against an up-to-date version of the patient resource.\n","required":true,"schema":{"type":"string","pattern":"^W/\"[0-9]+\"$","example":"W/\"2\""}},"RoleId":{"in":"header","name":"NHSD-Session-URID","description":"\nThe user role ID (URID) for the current session. Also known as a user role profile ID (URPID).\n\nThis header is optional.\n\nIn Application-restricted access mode this header is ignored.\n\nIn Healthcare worker access mode if you send this header it must be valid for the logged-in user. See [determine the user's role](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation/user-restricted-restful-apis-nhs-cis2-separate-authentication-and-authorisation#step-9-determine-the-user-s-role) for guidance.\n","required":false,"schema":{"type":"string","pattern":"^[0-9]+$","example":"555254240100"}},"BearerAuthorization":{"in":"header","name":"Authorization","description":"An [OAuth 2.0 bearer token](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation#user-restricted-apis).\n\nRequired in all environments except sandbox.\n","required":false,"schema":{"type":"string","format":"^Bearer\\ [[:ascii:]]+$","example":"Bearer g1112R_ccQ1Ebbb4gtHBP1aaaNM"}},"ContentType":{"in":"header","name":"Content-Type","description":"For a PATCH request, this must be set to `application/json-patch+json`.\n","required":true,"schema":{"type":"string","example":"application/json-patch+json"}},"RequestID":{"in":"header","name":"X-Request-ID","required":false,"description":"A globally unique identifier (GUID) for the request, which we use to de-duplicate repeated requests and to trace the request if you contact our helpdesk.\n\nMust be a universally unique identifier (UUID) (ideally version 4).\n\nMirrored back in a response header.\n\nIf you re-send a failed request, use the same value in this header.\n","schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","example":"60E0B220-8136-4CA5-AE46-1D97EF59D068"}},"CorrelationID":{"in":"header","name":"X-Correlation-ID","required":false,"description":"An optional ID which you can use to track transactions across multiple systems. It can take any value, but we recommend avoiding `.` characters.\n\nMirrored back in a response header.\n","schema":{"type":"string","example":"11C46F5F-CDEF-4865-94B2-0EE0EDCC26DA"}},"NHSD-End-User-Organisation-ODS":{"in":"header","name":"NHSD-End-User-Organisation-ODS","required":false,"description":"The ODS code of the user.\n\nMandatory for client applications which service multiple end user organisations (EUO). This will allow the calls to be attributed to the correct EUO.\n","schema":{"type":"string","example":"Y12345"}},"FuzzyMatch":{"name":"_fuzzy-match","description":"A fuzzy search is performed, including checks for homophones, transposed names and historic information.\n\nYou cannot use wildcards with a fuzzy search.\n","example":false,"in":"query","required":false,"schema":{"type":"boolean","default":false}},"ExactMatch":{"name":"_exact-match","description":"The search only returns results where the `score` field is 1.0. Use this with care - it is unlikely to work with fuzzy search or wildcards.","example":false,"in":"query","required":false,"schema":{"type":"boolean","default":false}},"History":{"name":"_history","description":"The search looks for matches in historic information such as previous names and addresses.\n\nThis parameter has no effect for a fuzzy search, which always includes historic information.\n","example":true,"in":"query","required":false,"schema":{"type":"boolean","default":false}},"MaxResults":{"name":"_max-results","description":"The maximum number of matching patients to return. For healthcare worker access, this must be between 1 and 50, and the default is 50.\nFor application-restricted access, this must be 1, and the default is 1.\nIf too many patients match the search criteria, we return a `TOO_MANY_MATCHES` error.\n","example":1,"in":"query","required":false,"schema":{"type":"integer","format":"int32"}},"Family":{"name":"family","description":"The patient's family name (surname).\n\nNot case sensitive. Max 35 characters.\nUse `*` as a wildcard but not in the first two characters and not in fuzzy search mode.\nMust be [URL encoded](https://en.wikipedia.org/wiki/Percent-encoding), for example a space must be represented by either `%20` or `+` and a wildcard must be encoded as `%2A`.\n","examples":{"simple":{"value":"Smith","summary":"Matches Smythe if `_fuzzy-match` is specified."},"wildcarded":{"value":"Sm*t*","summary":"Wildcards must contain at least two characters, this matches Smith, Smythe"}},"in":"query","required":false,"schema":{"type":"string"}},"Given":{"name":"given","description":"The patient's given names.\n\nNot case sensitive. Max 35 characters.\nUse `*` as a wildcard but not in the first two characters and not in fuzzy search mode.\nWildcard searches will match the start of the first given name and not subsequent given names, for example the given names \"Alan Michael\" can be searched with \"Ala*\" but not \"Mic*\".\nMust be [URL encoded](https://en.wikipedia.org/wiki/Percent-encoding), for example a space must be represented by either `%20` or `+` and a wildcard must be encoded as `%2A`.\n\nA patient may have more than one given name. Subsequent given names are commonly referred to as 'middle names'.\nSpecify multiple given names by repeating this parameter.\nTo search for `Jane Anne Smith` use `given=Jane&given=Anne&family=Smith`.\n\nThe first given name may be a [compound name](https://en.wikipedia.org/wiki/Given_name#Compound), for example `John Paul`.\nTo search for `John Paul James Smith` (where `John Paul` is the first given name, `James` is the second given name, and `Smith` the family name) use `given=John%20Paul&given=James&family=Smith`.\n\nNote that it is not necessary to specify subsequent given (middle) names, and that doing so may impact your search results in the case they are not recorded in the demographics system.\n","example":"Jane","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"}}},"Gender":{"name":"gender","description":"Gender with which the patient most strongly identifies.","example":"female","in":"query","required":false,"schema":{"type":"string","enum":["male","female","other","unknown"],"example":"female"}},"Birthdate":{"name":"birthdate","in":"query","description":"Date of birth in the format `yyyy-mm-dd`. To specify a range, use `birthdate=geyyyy-mm-dd&birthdate=leyyyy-mm-dd`.","examples":{"simple":{"value":["eq2010-10-22"],"description":"Exact match date"},"rangege":{"value":["ge2010-10-22"],"description":"Greater than or equals match, which matches 2010-10-22 or 2010-10-23"},"rangele":{"value":["le2010-10-22"],"description":"Less than or equals match, which matches 2010-10-22 or 2010-10-21"}},"required":false,"schema":{"type":"array","items":{"type":"string"}}},"DeathDate":{"name":"death-date","in":"query","description":"Date of death in the format `yyyy-mm-dd`. To specify a range, use `death-date=geyyyy-mm-dd&death-date=leyyyy-mm-dd`.\n\nFor a fuzzy search, this is ignored for matching but included in the score calculation.\n","examples":{"simple":{"value":"eq2010-10-22","description":"Exact match date"},"rangege":{"value":"ge2010-10-22","description":"Greater than or equals match which matches 2010-10-22 or 2010-10-23"},"rangele":{"value":"le2010-10-22","description":"Less than or equals match, which matches 2010-10-22 or 2010-10-21"}},"required":false,"schema":{"type":"string","format":"date"}},"AddressPostalcode":{"name":"address-postalcode","description":"The postcode of any of the patient’s known addresses.\n\nNot case sensitive.\nSpaces are ignored, for example `LS16AE` and `LS1 6AE` both match `LS1 6AE`.\nUse `*` as a wildcard but not in the first two characters and not in fuzzy search mode.\nMust be [URL encoded](https://en.wikipedia.org/wiki/Percent-encoding), for example a space must be represented by either `%20` or `+` and a wildcard must be encoded as `%2A`.\n","examples":{"simple":{"value":"LS1 6AE","summary":"Spaces ignored, would match LS16AE"},"wildcarded":{"value":"LS1*","summary":"Matches 'LS16AE', 'LS1 6AE' and 'LS1 6AB'"}},"in":"query","required":false,"schema":{"type":"string"}},"AddressPostcode":{"name":"address-postcode","description":"**N.B. that address-postcode will be deprecated in the future, address-postalcode should be used instead. \nIf both address-postcode and address-postalcode are provided, an INVALID_SEARCH_DATA error will be returned.**\nThe postcode of any of the patient’s known addresses.\n\nNot case sensitive.\nSpaces are ignored, for example `LS16AE` and `LS1 6AE` both match `LS1 6AE`.\nUse `*` as a wildcard but not in the first two characters and not in fuzzy search mode.\nMust be [URL encoded](https://en.wikipedia.org/wiki/Percent-encoding), for example a space must be represented by either `%20` or `+` and a wildcard must be encoded as `%2A`.\n","examples":{"simple":{"value":"LS1 6AE","summary":"Spaces ignored, would match LS16AE"},"wildcarded":{"value":"LS1*","summary":"Matches 'LS16AE', 'LS1 6AE' and 'LS1 6AB'"}},"in":"query","required":false,"schema":{"type":"string"}},"GeneralPractitioner":{"name":"general-practitioner","description":"The Organisation Data Service (ODS) code of the patient's registered GP practice.\n\nNot case sensitive.\nFor a fuzzy search, this is ignored for matching but included in the score calculation.\n","example":"Y12345","in":"query","required":false,"schema":{"type":"string"}},"ManagingOrganization":{"name":"managing-organization","description":"**This field is for internal-use only**.\n\nThe Organisation Data Service (ODS) code of the patient's current managing organization.\nNot case sensitive.\nFor a fuzzy search, this is ignored for matching but included in the score calculation.\n","example":"Y12345","in":"query","required":false,"schema":{"type":"string"}},"ETag":{"name":"etag","schema":{"type":"string","pattern":"^W/\"[0-9]+\"$","example":"W/\"2\""},"in":"header","description":"Record version identifier enclosed in quotes and preceded by 'W/'. For example, `W/\"2\"`.\n\nCorresponds to `meta.versionId` attribute in the patient resource body.\n\nWhen you retrieve a patient resource, you get a version number for the resource (in the `ETag` response header and in the `versionId` field in the response).\nYou must then pass the resource's version number in any update request (in the `If-Match` response header) made for the patient.\n"},"XCorrelationId":{"name":"x-correlation-id","schema":{"type":"string","example":"11C46F5F-CDEF-4865-94B2-0EE0EDCC26DA"},"in":"header","description":"The X-Correlation-ID from the request header, if supplied, mirrored back.\n"},"XRequestID":{"name":"x-request-id","schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","example":"60E0B220-8136-4CA5-AE46-1D97EF59D068"},"in":"header","description":"The X-Request-ID from the request header, if supplied, mirrored back.\n"},"RetryAfter":{"name":"retry-after","description":"Time to wait before retrying your request in seconds","in":"header","schema":{"type":"string","example":"5"}},"EmailAddress":{"name":"email","description":"Email address\n","example":"jane.smith@example.com","in":"query","required":false,"schema":{"type":"string"}},"PhoneNumber":{"name":"phone","description":"Phone number\n","example":"01632960587","in":"query","required":false,"schema":{"type":"string"}}},"schemas":{"Patient":{"type":"object","required":["id"],"additionalProperties":false,"properties":{"resourceType":{"type":"string","description":"FHIR resource type.","default":"Patient"},"id":{"description":"The patient's NHS number. The primary identifier of a patient, unique within NHS England and Wales. Always 10 digits and must be a [valid NHS number](https://www.datadictionary.nhs.uk/attributes/nhs_number.html).","type":"string","pattern":"^\\d{10}$","example":"9000000009"},"identifier":{"type":"array","description":"Identifier and system of identification used for this Patient.","items":{"type":"object","maxItems":1,"required":["value"],"properties":{"system":{"type":"string","format":"url","description":"System identifier belongs to.","default":"https://fhir.nhs.uk/Id/nhs-number"},"value":{"description":"The patient's NHS number. The primary identifier of a patient, unique within NHS England and Wales. Always 10 digits and must be a [valid NHS number](https://www.datadictionary.nhs.uk/attributes/nhs_number.html).","type":"string","pattern":"^\\d{10}$","example":"9000000009"},"extension":{"type":"array","description":"FHIR extensions.","items":{"type":"object","description":"Status indicating if NHS number is present and verified.","properties":{"url":{"type":"string","description":"URL of the extension definition.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSNumberVerificationStatus","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSNumberVerificationStatus"]},"valueCodeableConcept":{"type":"object","description":"NHS Number Verification Status Indicator.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URI of the coding system specification.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-NHSNumberVerificationStatus"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1.0.0"},"code":{"type":"string","description":"Symbol in syntax defined by the system.","example":"01"},"display":{"type":"string","description":"Representation defined by the system.","example":"Number present and verified"}}}}}}}}}}}},"meta":{"type":"object","description":"Metadata about this resource.","properties":{"versionId":{"type":"string","description":"The NHS Digital assigned version of the patient resource.","example":"2"},"security":{"type":"array","description":"The level of security on the patients record, which affects which fields are populated on retrieval. The possible responses are:\n* U - unrestricted. All available data is returned.\n* R - restricted. Any sensitive data around the patient's location, so `address`, `generalPractitioner` and `telecom`, are removed from the response.\n* REDACTED - redacted. The patient record has been marked as invalid, so the data should not be used. This code is never returned; you receive a 404, and appropriate error response, if an invalidated patient retrieval is attempted.\n","maxItems":1,"items":{"type":"object","properties":{"system":{"type":"string","description":"URI of the value set specification.","example":"http://terminology.hl7.org/CodeSystem/v3-Confidentiality"},"code":{"type":"string","description":"Code defined by the system value set.","enum":["U","R","V","REDACTED"],"example":"U"},"display":{"type":"string","description":"Representation defined by the system.","enum":["unrestricted","restricted","redacted"],"example":"unrestricted"}}}}}},"name":{"type":"array","description":"List of names associated with the patient. \n","minItems":1,"items":{"type":"object","required":["use","family"],"additionalProperties":false,"properties":{"id":{"type":"string","description":"Unique object identifier for this name.","example":"123"},"use":{"type":"string","description":"How this name should be used.\n* usual - Known as, conventional or the one patient normally uses. A patient always has a usual name.\n* temp - An alias or temporary name. This may also be used for temporary names assigned at birth or in emergency situations.\n* nickname - A name that the patient prefers to be addressed by, but is not part of their usual name.\n* old - This name is no longer in use (or was never correct, but retained for records).\n* maiden - Name changed for Marriage. A name used prior to changing name because of marriage. This term is not gender specific. The use of this term does not imply any particular history for a person's name.\n\nThe following use codes are included in the [name-use](https://www.hl7.org/fhir/valueset-name-use.html) value set, but should not be used and is not be returned as part of a retrieval.\n* official - The formal name as registered in an official (government) registry, but which name might not be commonly used. May be called \"legal name\".\n* anonymous - Anonymous assigned name, alias, or pseudonym (used to protect a person's identity for privacy reasons).\n","enum":["usual","temp","nickname","old","maiden"],"example":"usual"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"given":{"type":"array","maxItems":5,"description":"Given names, including any middle names.\n\nEach name(s) should be a separate item in the list. The first given name may include multiple names, separated by a space.\nSubsequent names must be broken down into list items. For example, the input `[Jane Marie Anne, Jo Adele]` returns `[Jane Marie Anne, Jo, Adele]`.\n","example":["Jane Marie Anne","Jo","Adele"],"items":{"type":"string","maxLength":35,"example":"Jane"}},"family":{"type":"string","maxLength":35,"description":"Family name (often called Surname).","example":"Smith"},"prefix":{"type":"array","description":"Name prefixes, titles, and prenominals.","example":["Mrs"],"items":{"type":"string","example":"Mrs"}},"suffix":{"type":"array","description":"Name suffices and postnominals.","example":["MBE","PhD"],"items":{"type":"string","example":"MBE"}}}}},"gender":{"type":"string","description":"Classification of the gender of a patient. The classification is phenotypical rather than genotypical, i.e. it does not provide codes for medical or scientific purposes.\nIt is the administrative gender that the patient wishes to be known as. In some cases, this may not be the same as the patient’s registered birth gender, or their current clinical gender.\n","enum":["male","female","other","unknown"],"example":"female"},"birthDate":{"description":"The date on which the patient was born or is officially deemed to have been born.\n\nIt is a date in the format `yyyy-mm-dd`. Due to data quality issues on a small number of patients `yyyy-mm` and `yyyy` format may also be returned. \n","example":"2010-10-22","type":"string","format":"date"},"multipleBirthInteger":{"type":"integer","minimum":1,"maximum":9,"description":"The order in which the patient was born, with 1 indicating the first or only birth in the sequence, 2 indicating the second birth in the sequence, 3 indicating the third, and so on up to 7.\n\nThere are two other valid values; `8` meaning `Not applicable` and `9` meaning `Not known`.\n","example":1},"deceasedDateTime":{"description":"The date and time on which a person died or is officially deemed to have died, if applicable and known.\n\nIt is a datetime in the format `yyyy-mm-ddTHH:MM:SS+HH:MM` or `yyyy-mm-dd`. Due to data quality issues on a small number of patients `yyyy-mm` and `yyyy` format may also be returned.\n","example":"2010-10-22T00:00:00+00:00","type":"string","format":"date-time","pattern":"^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2}\\+\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2}\\+\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01]))$"},"address":{"type":"array","description":"List of addresses associated with the patient.\n\nThese are fully populated on a retrieval or a successful update, only the `home` address is returned on a search.\nWhen a patient tagged as `restricted` is retrieved, all addresses are removed from the response.\n","items":{"type":"object","description":"An address associated with the patient.","required":["use"],"properties":{"id":{"type":"string","description":"Unique system identifier for this address.","example":"456"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"use":{"type":"string","description":"Purpose of this address:\n * `home` - the home address is the patient's normal residence. Home address is also known as usual, main, registered, current or permanent address\n * `temp` - a temporary address is an address used for a set period of time, but where the patient's home, permanent address remains unchanged\n * `billing` - an address used for correspondence purposes only\n * `work` - an office address. This can be returned due to legacy data but cannot be added or replaced on update\n\n A patient should have no more than one current `temp` and/or `billing` address.\n However, historically this was constrained only by the integration requirements and was not enforced so theoretically more than one can exist for a patient when retrieving.\n Where multiple instances already exist for the patient it is not expected that local systems should manage those, but should choose the most appropriate one to maintain (e.g. by examining period dates).\n\n A `home` address is the patient's main residential address and should normally be used for all clinical and demographic purposes, including clinical and appointment correspondence.\n However additionally, `temp` and `billing` addresses may be provided by a patient when there is a requirement to record an alternative location for the purposes of unbroken care.\n When sending correspondence to a patient:\n *\ta present and valid `billing` address may take precedence over `home` and `temp` addresses. A patient should have only a single current `billing` address. An address is considered 'valid' according to its period start and end dates.\n *\tif no current `billing` address is provided, a `temp` address may take precedence over the `home` address, again if it is valid according to its period start and end dates.\n * if there is no valid, current `billing` and/or `temp` address, the `home` address must be used.\n","enum":["home","work","temp","billing"],"example":"home"},"text":{"type":"string","description":"Where a `temp` address is provided a descriptor text must be sent.\nThe list of possible values are:\n* `Second Home` - a patient's second home\n* `Student Accommodation` - a patient's place of residence while at university\n* `Respite Care Address` - where the patient resides during respite care\n* `Temporary Residence Address` - where the patient resides for a specific period of time\n* `Convalescence Home` - the address for a patient during a period of recovery\n* `Mobile Home` - the address of a patient's mobile home, parked for a specific period of time, e.g. the address of a caravan park\n* `Holiday Home` - the address for a patient during a holiday\n\nA patient can also register temporarily at a GP practice using a temporary address. Temporary GP registration information does not appear on the PDS, but the address used for it may.\n","enum":["Second Home","Student Accommodation","Respite Care Address","Temporary Residence Address","Convalescence Home","Mobile Home","Holiday Home"],"example":"Student Accommodation"},"line":{"type":"array","description":"All lines of the address except the postal code.\n\nSystems must apply the following formatting convention when adding or replacing addresses lines:\n*\tline 1 - premises ID and/or house name, e.g. `Flat 1` or `The Old Schoolhouse`\n*\tline 2 - house number, dependent thoroughfare name and descriptor (if present), thoroughfare name and descriptor, e.g. `23 Mill Lane`\n*\tline 3 - dependent locality/village, locality (if present), e.g. `Boxgrove`\n*\tline 4 - post town, e.g. `Leeds`\n*\tline 5 - county (if present), e.g. `West Yorkshire`\n\nIf any of the lines are blank, they are not returned due to FHIR conformance constraints.\n","maxItems":5,"items":{"type":"string"},"example":["1 Trevelyan Square","Boar Lane","City Centre","Leeds","West Yorkshire"]},"postalCode":{"type":"string","description":"Postal code of the address.","example":"LS1 6AE"},"extension":{"type":"array","description":"List of address keys formatted as a FHIR extension. This can include up to one Unique Property Reference Number (UPRN), and up to one Postal Address File (PAF) key. If no keys for the address are known, the array will be empty. Otherwise it will be a list of objects which specify the value of the address key and the code system for it","items":{"anyOf":[{"type":"object","description":"Unique identifier for an address.","properties":{"url":{"type":"string","description":"URL of specification of the AddressKey extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey"]},"extension":{"type":"array","description":"Specification of address key system and address key value. Contains exactly two items: one describing the code system the Address Key uses, and the other specifying the value of the Address Key.","minItems":2,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Coding system of the address key.","required":["url","valueCoding"],"properties":{"url":{"type":"string","description":"Always 'type'.","default":"type"},"valueCoding":{"type":"object","description":"URL of specification of address key format.","required":["system","code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available Address Key formats.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType"},"code":{"type":"string","description":"Address Key system. Always 'PAF'.","enum":["PAF"],"example":"PAF"}}}}},{"type":"object","description":"Value of the address key.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Always 'value'.","default":"value","example":"value"},"valueString":{"type":"string","description":"Address key in PAF format. An 8 digit number including leading zeroes, formatted as a string.","minLength":8,"maxLength":8,"pattern":"^[0-9]{8}$","example":"12345678"}}}]}}}},{"type":"object","description":"Unique identifier for an address.","properties":{"url":{"type":"string","description":"URL of specification of the AddressKey extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey"]},"extension":{"type":"array","description":"Specification of address key system and address key value. Contains exactly two items: one describing the code system the Address Key uses, and the other specifying the value of the Address Key.","minItems":2,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Coding system of the address key.","required":["url","valueCoding"],"properties":{"url":{"type":"string","description":"Always 'type'.","default":"type"},"valueCoding":{"type":"object","description":"URL of specification of address key format.","required":["system","code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available Address Key formats.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType"},"code":{"type":"string","description":"Address Key system. Always 'UPRN'.","enum":["UPRN"],"example":"UPRN"}}}}},{"type":"object","description":"Value of the address key.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Always 'value'.","default":"value","example":"value"},"valueString":{"type":"string","description":"Address key in UPRN format. A number containing from 1 up to 12 digits.","minLength":1,"maxLength":12,"pattern":"^[0-9]{1,12}$","example":"123456789012"}}}]}}}}]}}}}},"telecom":{"type":"array","description":"List of contact points for the patient; for example, phone numbers or email addresses.\nWhen a patient tagged as `restricted` is retrieved, all contact points are removed from the response.\n","items":{"description":"A contact point, such as a phone number or email address","type":"object","required":["system","value"],"properties":{"id":{"type":"string","description":"Unique object identifier for this contact point.","example":"789"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"system":{"description":"Means of communication, such as phone or email.","type":"string","enum":["phone","fax","email","other"],"example":"phone"},"value":{"description":"Phone number, email address, or other identifier for use with contact system.","type":"string","example":"01632960587"},"use":{"type":"string","description":"Location associated with communication system.","enum":["home","work","temp","mobile"],"example":"home"},"extension":{"type":"array","maxItems":1,"description":"Extension that is returned when the communication type is `textphone`. The only code returned is `textphone`, which means `Minicom (Textphone)`.\n\nThe `system` is `other` when the extension is included.\n","items":{"type":"object","description":"Wrapped object for other contact system details.","properties":{"url":{"type":"string","description":"Definition of other contact system extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem"]},"valueCoding":{"type":"object","description":"URL of specification of other contact systems.","properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem"},"code":{"type":"string","description":"Coded value for the other contact system in place.","example":"textphone"},"display":{"description":"Display-friendly representation of the other contact system code.","type":"string","example":"Minicom (Textphone)"}}}}}}}}},"contact":{"type":"array","description":"A list of patient contacts. Only emergency contacts are returned and only emergency contacts should be added. Any other contacts should be added to the patients `Related Person`.\nPatients designate here any contact number they desire to be used in case of an emergency.\nNote, while a patient may also desire to record various related persons telecom details, these do not separately allow for a concept of emergency contact; only ranking. See RelatedPerson endpoint.\nWhen a patient tagged as `restricted` is retrieved, all contacts are removed from the response.\n","items":{"title":"Schema for a patient contact.","type":"object","additionalProperties":false,"required":["relationship","telecom"],"properties":{"id":{"type":"string","example":"C123"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"relationship":{"type":"array","description":"The contact relationship wrapper object that holds the details of the relationship to the patient.\n\nThis is only returned when an Emergency Contact number has been set on `telecom`. The only valid code is `C`, which means `Emergency Contact`.\n","minItems":1,"maxItems":1,"items":{"type":"object","required":["coding"],"properties":{"coding":{"type":"array","description":"Exactly one contact relationship.","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","format":"url","default":"http://terminology.hl7.org/CodeSystem/v2-0131"},"code":{"type":"string","description":"Coded value for contact relationship.","example":"C"},"display":{"type":"string","description":"Display-friendly representation of the contact relationship code.","example":"Emergency Contact"}}}}}}},"telecom":{"type":"array","description":"List of Telecom objects on the contact only contains `system` and `value`.\n","items":{"description":"A contact point, such as a phone number or email address","type":"object","required":["system","value"],"properties":{"id":{"type":"string","description":"Unique object identifier for this contact point.","example":"789"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"system":{"description":"Means of communication, such as phone or email.","type":"string","enum":["phone","fax","email","other"],"example":"phone"},"value":{"description":"Phone number, email address, or other identifier for use with contact system.","type":"string","example":"01632960587"},"use":{"type":"string","description":"Location associated with communication system.","enum":["home","work","temp","mobile"],"example":"home"},"extension":{"type":"array","maxItems":1,"description":"Extension that is returned when the communication type is `textphone`. The only code returned is `textphone`, which means `Minicom (Textphone)`.\n\nThe `system` is `other` when the extension is included.\n","items":{"type":"object","description":"Wrapped object for other contact system details.","properties":{"url":{"type":"string","description":"Definition of other contact system extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem"]},"valueCoding":{"type":"object","description":"URL of specification of other contact systems.","properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem"},"code":{"type":"string","description":"Coded value for the other contact system in place.","example":"textphone"},"display":{"description":"Display-friendly representation of the other contact system code.","type":"string","example":"Minicom (Textphone)"}}}}}}}}}}}},"generalPractitioner":{"type":"array","maxItems":1,"description":"General Practice (not practitioner) with which the patient is, or was, registered. Always contains zero or one general practitioner object.\nWhen a patient tagged as `restricted` is retrieved, the General Practice is removed from the response.\n","items":{"description":"General practice (not practitioner) with which the patient is or was registered.","type":"object","required":["identifier"],"properties":{"id":{"description":"Object identifier (OID) specific to the returned details - this should be return exactly the same in any update.","type":"string","example":"254406A3"},"type":{"description":"Type of Reference being returned.","type":"string","example":"Organization"},"identifier":{"description":"Identifier and system of identification used for this Organisation.","type":"object","required":["value"],"properties":{"system":{"description":"URL for the Organisation Data Service - who are responsible for publishing codes that identify organisations and individuals across health and social care.","type":"string","example":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"description":"Organisation code for the registered general practice, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","type":"string","pattern":"^[0-9A-Z]+$","example":"Y12345"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}}}}}}},"managingOrganization":{"description":"The managing organization of a de-registered patient. This will not be returned when the reason for de-registration is death.","type":"object","required":["identifier"],"properties":{"type":{"description":"Type of Reference being returned.","type":"string","example":"Organization"},"identifier":{"description":"Identifier and system of identification used for this Organisation.","type":"object","required":["value"],"properties":{"system":{"description":"URL for the Organisation Data Service - who are responsible for publishing codes that identify organisations and individuals across health and social care.","type":"string","example":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"description":"Organisation code for the registered general practice, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","type":"string","pattern":"^[0-9A-Z]+$","example":"Y12345"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}}}}}},"extension":{"type":"array","description":"Wrapper array for the patient's pharmacies, death notification status, communication details, contact preferences and place of birth; these are all FHIR extensions.\nAlways contains zero or one of each pharmacy object, zero or one death notification status object, zero or one communication details object, zero or one contact preference and zero or one place of birth object.\nWhen a patient tagged as `restricted` is retrieved, the pharmacy and birth place extensions are removed from the response.\n","items":{"anyOf":[{"type":"object","description":"Wrapper object for the patient's nominated pharmacy. This will only be populated on a retrieval and not a search.","required":["url","valueReference"],"properties":{"url":{"type":"string","description":"URL of specification of UKCore-NominatedPharmacy FHIR extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NominatedPharmacy","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NominatedPharmacy"]},"valueReference":{"type":"object","description":"Reference to a pharmacy `Organization` resource.","required":["identifier"],"properties":{"identifier":{"type":"object","description":"Wrapper object for the patient's nominated pharmacy organisation code.","required":["value"],"properties":{"system":{"type":"string","description":"URL for the FHIR code system for the ODS organisation code.","default":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"type":"string","description":"Organisation code for the nominated pharmacy, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","pattern":"^[A-Za-z0-9]{3,10}$","example":"Y12345"}}}}}}},{"type":"object","description":"Wrapper object for the patient's dispensing doctor. This will only be populated on a retrieval and not a search.","required":["url","valueReference"],"properties":{"url":{"type":"string","description":"URL of specification of UKCore-DispensingDoctor FHIR extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-PreferredDispenserOrganization","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-PreferredDispenserOrganization"]},"valueReference":{"type":"object","description":"Reference to a GP practice pharmacy `Organization` resource.","required":["identifier"],"properties":{"identifier":{"type":"object","description":"Wrapper object for the patient's dispensing doctor organisation code.","required":["value"],"properties":{"system":{"type":"string","description":"URL for the FHIR code system for the ODS organisation code.","default":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"type":"string","description":"Organisation code for the dispensing doctor, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","pattern":"^[A-Za-z0-9]{3,10}$","example":"Y23456"}}}}}}},{"type":"object","description":"Wrapper object for the patient's medical appliance supplier. This will only be populated on a retrieval and not a search.","required":["url","valueReference"],"properties":{"url":{"type":"string","description":"URL of specification of UKCore-MedicalApplianceSupplier FHIR extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-MedicalApplianceSupplier","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-MedicalApplianceSupplier"]},"valueReference":{"type":"object","description":"Reference to medical appliance supplier pharmacy `Organization` resource.","required":["identifier"],"properties":{"identifier":{"type":"object","description":"Wrapper object for the patient's medical appliance supplier organisation code.","required":["value"],"properties":{"system":{"type":"string","description":"URL for the FHIR code system for the ODS organisation code.","default":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"type":"string","description":"Organisation code for the medical appliance supplier, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","pattern":"^[A-Za-z0-9]{3,10}$","example":"Y34567"}}}}}}},{"type":"object","description":"Wrapper object for death notification details.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of death notification extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus"]},"extension":{"type":"array","description":"Array containing exactly one death notification status code object and exactly one effective date object.","minItems":1,"maxItems":2,"items":{"oneOf":[{"type":"object","description":"Wrapper object for death notification status code.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `deathNotificationStatus`.","default":"deathNotificationStatus","enum":["deathNotificationStatus"]},"valueCodeableConcept":{"type":"object","description":"Death Notification Status.","properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["system","code"],"properties":{"system":{"type":"string","description":"URI of the coding system specification.","example":"https://fhir.hl7.org.uk/CodeSystem/UKCore-DeathNotificationStatus"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1.0.0"},"code":{"type":"string","description":"Symbol, in syntax, defined by the system:\n* `1` - Informal - death notice received via an update from a local NHS Organisation such as GP or Trust\n* `2` - Formal - death notice received from Registrar of Deaths. Only these endpoints are allowed to add a Formal death:\n - National Back Office using the Demographic Spine Application (DSA)\n - Office of National Statistics (ONS)\n - Maternity sites\n* `U` - Removed. This is a possible response, but it cannot be used on an update because Spine will reject it\n","example":"2","enum":["1","2","U"]},"display":{"type":"string","description":"Representation defined by the system.","example":"Formal - death notice received from Registrar of Deaths","enum":["Informal - death notice received via an update from a local NHS Organisation such as GP or Trust","Formal - death notice received from Registrar of Deaths","Removed"]}}}}}}}},{"type":"object","description":"Wrapper object for death notification effective date.","required":["url","valueDateTime"],"properties":{"url":{"type":"string","description":"Key of this object. Always `systemEffectiveDate`.","default":"systemEffectiveDate","enum":["systemEffectiveDate"]},"valueDateTime":{"type":"string","description":"Date and time at which death notification status took effect.","format":"date-time","example":"2010-10-22T00:00:00+00:00"}}}]}}}},{"type":"object","description":"Wrapper object for communication details. This will only be populated on a retrieval and not a search.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of communication extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSCommunication","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSCommunication"]},"extension":{"type":"array","description":"Definition of communication extension.\n\nThe array must have one item, a valueCodeableConcept for the language and can optionally include a valueBoolean for if an interpreter is required.","minItems":1,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Wrapper object for communication language.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `language`.","default":"language","enum":["language"]},"valueCodeableConcept":{"type":"object","description":"Human language.","required":["coding"],"properties":{"coding":{"type":"array","description":"Exactly one language code.","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URL of the Language Code System. Always uses the 'UKCore-HumanLanguage' Code System.","example":"https://fhir.hl7.org.uk/CodeSystem/UKCore-HumanLanguage"},"version":{"type":"string","description":"Version of the language code system.","example":"1.0.0"},"code":{"type":"string","description":"Language code based on [ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) standard plus extensions for braille, makaton and sign languages, which are:\n* `q1` - Braille\n* `q2` - American Sign Language\n* `q3` - Australian Sign Language\n* `q4` - British Sign Language\n* `q5` - Makaton\nAll valid codes combined can be found at https://fhir.hl7.org.uk/CodeSystem/UKCore-HumanLanguage.\n","example":"fr"},"display":{"type":"string","description":"Display-friendly representation of the language code (such as English). If there is a language code with no defined mapping, `Unknown` will be returned.","example":"French"}}}}}}}},{"type":"object","description":"Wrapper object for whether an interpreter is required.","required":["url","valueBoolean"],"properties":{"url":{"type":"string","description":"Key of this object. Always `interpreterRequired`.","default":"interpreterRequired","enum":["interpreterRequired"]},"valueBoolean":{"type":"boolean","description":"Whether an interpreter is required.","example":true}}}]}}}},{"type":"object","description":"Wrapper object for preferred contact details; the written communication format, preferred contact time and method. This will only be populated on a retrieval and not a search.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of the contact preference extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-ContactPreference","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-ContactPreference"]},"extension":{"description":"Wrapper array containing zero or one preferred contact method, zero or one preferred written communication format; and zero or one preferred contact time.","type":"array","maxItems":3,"items":{"oneOf":[{"type":"object","description":"Wrapper object for preferred written communication format.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredWrittenCommunicationFormat`.","default":"PreferredWrittenCommunicationFormat"},"valueCodeableConcept":{"type":"object","description":"Preferred Written Communication Format.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","format":"url","description":"Definition of the preferred written communication extension.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredWrittenCommunicationFormat","enum":["https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredWrittenCommunicationFormat"]},"code":{"type":"string","description":"A code to identify the preferred written communication format of a patient, contact or related person.\n* 11 - Large print\n* 12 - Braille\n* 13 - Audio tape\n","example":"12"},"display":{"type":"string","description":"Display-friendly representation of the preferred written communication format code.","example":"Braille"}}}}}}}},{"type":"object","description":"Wrapper object for preferred contact method.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredContactMethod`.","default":"PreferredContactMethod","enum":["PreferredContactMethod"]},"valueCodeableConcept":{"type":"object","description":"Preferred Contact Method.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","format":"url","description":"Definition of the preferred contact method extension.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredContactMethod","enum":["https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredContactMethod"]},"code":{"type":"string","description":"A code to identify to identify the preferred contact method of a patient, contact or related person.\n* 1\t- Letter\n* 2\t- Visit\n* 3\t- Telephone\n* 4\t- E-mail\n* 5\t- Minicom (Textphone)\n* 6\t- Telephone contact via proxy\n* 7\t- Sign language\n* 8\t- No Telephone contact\n","example":"1"},"display":{"type":"string","description":"Display-friendly representation of the preferred contact method code.","example":"Letter"}}}}}}}},{"type":"object","description":"Wrapper object for preferred contact times.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredContactTimes`.","default":"PreferredContactTimes","enum":["PreferredContactTimes"]},"valueString":{"type":"string","maximum":40,"description":"A free-text description about the preferred contact times.","example":"Not after 7pm"}}}]}}}},{"type":"object","description":"Wrapper object for place of birth details. This will not be returned on a restricted patient.","required":["url","valueAddress"],"properties":{"url":{"type":"string","description":"Definition of place of birth extension.","default":"http://hl7.org/fhir/StructureDefinition/patient-birthPlace","enum":["http://hl7.org/fhir/StructureDefinition/patient-birthPlace"]},"valueAddress":{"type":"object","additionalProperties":false,"properties":{"city":{"type":"string","description":"Town or city of birth.","example":"Manchester"},"district":{"type":"string","description":"County or metropolitan district of birth.","example":"Greater Manchester"},"country":{"type":"string","description":"A coded value for a patient's country of birth.\n\nFrom [ISO 3166-1](http://hl7.org/fhir/valueset-iso3166-1-3.html) plus codes from the UK Internal Code list which do not have entries in ISO 3166-1.\n\nUK Internal Codes:\n* `1` - England\n* `2` - Scotland\n* `3` - Wales\n* `4` - Northern Ireland\n* `7` - Sark\n* `9` - Alderney\n* `10` - Channel Islands\n","example":"GBR"}}}}},{"type":"object","description":"An extension to carry the reason a PDS record has been removed from the Patient Demographic Service. This will only be populated on a retrieval and not a search.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of the removal from registration extension.","default":"https://fhir.nhs.uk/StructureDefinition/Extension-PDS-RemovalFromRegistration","enum":["https://fhir.nhs.uk/StructureDefinition/Extension-PDS-RemovalFromRegistration"],"readOnly":true},"extension":{"type":"array","description":"An extension reason a PDS record has been removed from the Patient Demographic Service.","minItems":1,"maxItems":2,"items":{"oneOf":[{"type":"object","description":"Wrapper object for removalFromRegistrationCode.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"To identify the removal reason code.","default":"removalFromRegistrationCode","enum":["removalFromRegistrationCode"],"readOnly":true},"valueCodeableConcept":{"type":"object","description":"PDS Removal Reason Exit Code","required":["coding"],"properties":{"coding":{"type":"array","description":"Array containing exactly one removal reason exit code object","items":{"type":"object","required":["system","code","display"],"properties":{"system":{"type":"string","format":"url","description":"URL of the Removal Reason Exit Code. Always uses the 'PDS-RemovalReasonExitCode' Code System.","example":"https://fhir.nhs.uk/CodeSystem/PDS-RemovalReasonExitCode","readOnly":true},"code":{"type":"string","description":"A CodeSystem that identifies the reason a PDS record has been removed.","example":"SCT","enum":["DEA","EMB","SCT","NIT","TRA","ORR"]},"display":{"type":"string","description":"Display-friendly representation of the removal reason exit code.","example":"Transferred to Scotland"}}}}}}}},{"type":"object","description":"Wrapper object for removal from registration effective time.","required":["url","valuePeriod"],"properties":{"url":{"type":"string","description":"Key of this object. Always `effectiveTime`.","default":"effectiveTime","enum":["effectiveTime"],"readOnly":true},"valuePeriod":{"type":"object","description":"The effective time of removal of the Patient record from PDS.","required":["start"],"properties":{"start":{"type":"string","format":"date-time","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01T00:00:00+00:00"},"end":{"type":"string","format":"date-time","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31T00:00:00+00:00"}}}}}]}}}}]}}}},"PatientSearch":{"type":"object","properties":{"resourceType":{"type":"string","description":"FHIR Resource Type.","default":"Bundle"},"type":{"type":"string","description":"FHIR Bundle Type.","default":"searchset"},"timestamp":{"type":"string","description":"Time the search was performed.","format":"datetime","example":"2019-12-25T12:00:00+00:00"},"total":{"type":"integer","description":"Number of resources returned in search.","example":1},"entry":{"type":"array","description":"A list of matched patients. Empty if none found. The patients are ordered by match score, best first. A maximum of 50 patients are returned.\n","items":{"type":"object","properties":{"fullUrl":{"type":"string","description":"Absolute URL of the resource described in this item.","example":"https://api.service.nhs.uk/personal-demographics/FHIR/R4/Patient/9000000009"},"search":{"type":"object","properties":{"score":{"description":"Search score from 0.0 to 1.0.","type":"number","minimum":0,"maximum":1,"example":0.75}}},"resource":{"type":"object","additionalProperties":false,"properties":{"resourceType":{"type":"string","description":"FHIR resource type.","default":"Patient"},"id":{"description":"The patient's NHS number. The primary identifier of a patient, unique within NHS England and Wales. Always 10 digits and must be a [valid NHS number](https://www.datadictionary.nhs.uk/attributes/nhs_number.html).","type":"string","pattern":"^\\d{10}$","example":"9000000009"},"identifier":{"type":"array","description":"Identifier and system of identification used for this Patient.","items":{"type":"object","maxItems":1,"required":["value"],"properties":{"system":{"type":"string","format":"url","description":"System identifier belongs to.","default":"https://fhir.nhs.uk/Id/nhs-number"},"value":{"description":"The patient's NHS number. The primary identifier of a patient, unique within NHS England and Wales. Always 10 digits and must be a [valid NHS number](https://www.datadictionary.nhs.uk/attributes/nhs_number.html).","type":"string","pattern":"^\\d{10}$","example":"9000000009"},"extension":{"type":"array","description":"FHIR extensions.","items":{"type":"object","description":"Status indicating if NHS number is present and verified.","properties":{"url":{"type":"string","description":"URL of the extension definition.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSNumberVerificationStatus","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSNumberVerificationStatus"]},"valueCodeableConcept":{"type":"object","description":"NHS Number Verification Status Indicator.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URI of the coding system specification.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-NHSNumberVerificationStatus"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1.0.0"},"code":{"type":"string","description":"Symbol in syntax defined by the system.","example":"01"},"display":{"type":"string","description":"Representation defined by the system.","example":"Number present and verified"}}}}}}}}}}}},"meta":{"type":"object","description":"Metadata about this resource.","properties":{"versionId":{"type":"string","description":"The NHS Digital assigned version of the patient resource.","example":"2"},"security":{"type":"array","description":"The level of security on the patients record, which affects which fields are populated on retrieval. The possible responses are:\n* U - unrestricted. All available data is returned.\n* R - restricted. Any sensitive data around the patient's location, so `address`, `generalPractitioner` and `telecom`, are removed from the response.\n* REDACTED - redacted. The patient record has been marked as invalid, so the data should not be used. This code is never returned; you receive a 404, and appropriate error response, if an invalidated patient retrieval is attempted.\n","maxItems":1,"items":{"type":"object","properties":{"system":{"type":"string","description":"URI of the value set specification.","example":"http://terminology.hl7.org/CodeSystem/v3-Confidentiality"},"code":{"type":"string","description":"Code defined by the system value set.","enum":["U","R","V","REDACTED"],"example":"U"},"display":{"type":"string","description":"Representation defined by the system.","enum":["unrestricted","restricted","redacted"],"example":"unrestricted"}}}}}},"name":{"type":"array","description":"List of names associated with the patient.\nThis is only fully populated on a retrieval or a successful update, only the `usual`, `nickname` and `temp` names are returned on a search. \n","minItems":1,"items":{"type":"object","required":["use","family"],"additionalProperties":false,"properties":{"id":{"type":"string","description":"Unique object identifier for this name.","example":"123"},"use":{"type":"string","description":"How this name should be used.\n* usual - Known as, conventional or the one patient normally uses. A patient always has a usual name.\n* temp - An alias or temporary name. This may also be used for temporary names assigned at birth or in emergency situations.\n* nickname - A name that the patient prefers to be addressed by, but is not part of their usual name.\n* old - This name is no longer in use (or was never correct, but retained for records).\n* maiden - Name changed for Marriage. A name used prior to changing name because of marriage. This term is not gender specific. The use of this term does not imply any particular history for a person's name.\n\nThe following use codes are included in the [name-use](https://www.hl7.org/fhir/valueset-name-use.html) value set, but should not be used and is not be returned as part of a retrieval.\n* official - The formal name as registered in an official (government) registry, but which name might not be commonly used. May be called \"legal name\".\n* anonymous - Anonymous assigned name, alias, or pseudonym (used to protect a person's identity for privacy reasons).\n","enum":["usual","temp","nickname","old","maiden"],"example":"usual"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"given":{"type":"array","maxItems":5,"description":"Given names, including any middle names.\n\nEach name(s) should be a separate item in the list. The first given name may include multiple names, separated by a space.\nSubsequent names must be broken down into list items. For example, the input `[Jane Marie Anne, Jo Adele]` returns `[Jane Marie Anne, Jo, Adele]`.\n","example":["Jane Marie Anne","Jo","Adele"],"items":{"type":"string","maxLength":35,"example":"Jane"}},"family":{"type":"string","maxLength":35,"description":"Family name (often called Surname).","example":"Smith"},"prefix":{"type":"array","description":"Name prefixes, titles, and prenominals.","example":["Mrs"],"items":{"type":"string","example":"Mrs"}},"suffix":{"type":"array","description":"Name suffices and postnominals.","example":["MBE","PhD"],"items":{"type":"string","example":"MBE"}}}}},"gender":{"type":"string","description":"Classification of the gender of a patient. The classification is phenotypical rather than genotypical, i.e. it does not provide codes for medical or scientific purposes.\nIt is the administrative gender that the patient wishes to be known as. In some cases, this may not be the same as the patient’s registered birth gender, or their current clinical gender.\n","enum":["male","female","other","unknown"],"example":"female"},"birthDate":{"description":"The date on which the patient was born or is officially deemed to have been born.\n\nIt is a date in the format `yyyy-mm-dd`. Due to data quality issues on a small number of patients `yyyy-mm` and `yyyy` format may also be returned. \n","example":"2010-10-22","type":"string","format":"date"},"multipleBirthInteger":{"type":"integer","minimum":1,"maximum":9,"description":"The order in which the patient was born, with 1 indicating the first or only birth in the sequence, 2 indicating the second birth in the sequence, 3 indicating the third, and so on up to 7.\n\nThere are two other valid values; `8` meaning `Not applicable` and `9` meaning `Not known`.\n","example":1},"deceasedDateTime":{"description":"The date and time on which a person died or is officially deemed to have died, if applicable and known.\n\nIt is a datetime in the format `yyyy-mm-ddTHH:MM:SS+HH:MM` or `yyyy-mm-dd`. Due to data quality issues on a small number of patients `yyyy-mm` and `yyyy` format may also be returned.\n","example":"2010-10-22T00:00:00+00:00","type":"string","format":"date-time","pattern":"^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2}\\+\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2}\\+\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01]))$"},"address":{"type":"array","description":"List of addresses associated with the patient.\n\nThis is only fully populated on a retrieval or a successful update, only the `home` address is returned on a search.\nWhen a patient tagged as `restricted` is retrieved, all addresses are removed from the response.\n","items":{"type":"object","description":"An address associated with the patient.","required":["use"],"properties":{"id":{"type":"string","description":"Unique system identifier for this address.","example":"456"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"use":{"type":"string","description":"Purpose of this address:\n * `home` - the home address is the patient's normal residence. Home address is also known as usual, main, registered, current or permanent address\n * `temp` - a temporary address is an address used for a set period of time, but where the patient's home, permanent address remains unchanged\n * `billing` - an address used for correspondence purposes only\n * `work` - an office address. This can be returned due to legacy data but cannot be added or replaced on update\n\n A patient should have no more than one current `temp` and/or `billing` address.\n However, historically this was constrained only by the integration requirements and was not enforced so theoretically more than one can exist for a patient when retrieving.\n Where multiple instances already exist for the patient it is not expected that local systems should manage those, but should choose the most appropriate one to maintain (e.g. by examining period dates).\n\n A `home` address is the patient's main residential address and should normally be used for all clinical and demographic purposes, including clinical and appointment correspondence.\n However additionally, `temp` and `billing` addresses may be provided by a patient when there is a requirement to record an alternative location for the purposes of unbroken care.\n When sending correspondence to a patient:\n *\ta present and valid `billing` address may take precedence over `home` and `temp` addresses. A patient should have only a single current `billing` address. An address is considered 'valid' according to its period start and end dates.\n *\tif no current `billing` address is provided, a `temp` address may take precedence over the `home` address, again if it is valid according to its period start and end dates.\n * if there is no valid, current `billing` and/or `temp` address, the `home` address must be used.\n","enum":["home","work","temp","billing"],"example":"home"},"text":{"type":"string","description":"Where a `temp` address is provided a descriptor text must be sent.\nThe list of possible values are:\n* `Second Home` - a patient's second home\n* `Student Accommodation` - a patient's place of residence while at university\n* `Respite Care Address` - where the patient resides during respite care\n* `Temporary Residence Address` - where the patient resides for a specific period of time\n* `Convalescence Home` - the address for a patient during a period of recovery\n* `Mobile Home` - the address of a patient's mobile home, parked for a specific period of time, e.g. the address of a caravan park\n* `Holiday Home` - the address for a patient during a holiday\n\nA patient can also register temporarily at a GP practice using a temporary address. Temporary GP registration information does not appear on the PDS, but the address used for it may.\n","enum":["Second Home","Student Accommodation","Respite Care Address","Temporary Residence Address","Convalescence Home","Mobile Home","Holiday Home"],"example":"Student Accommodation"},"line":{"type":"array","description":"All lines of the address except the postal code.\n\nSystems must apply the following formatting convention when adding or replacing addresses lines:\n*\tline 1 - premises ID and/or house name, e.g. `Flat 1` or `The Old Schoolhouse`\n*\tline 2 - house number, dependent thoroughfare name and descriptor (if present), thoroughfare name and descriptor, e.g. `23 Mill Lane`\n*\tline 3 - dependent locality/village, locality (if present), e.g. `Boxgrove`\n*\tline 4 - post town, e.g. `Leeds`\n*\tline 5 - county (if present), e.g. `West Yorkshire`\n\nIf any of the lines are blank, they are not returned due to FHIR conformance constraints.\n","maxItems":5,"items":{"type":"string"},"example":["1 Trevelyan Square","Boar Lane","City Centre","Leeds","West Yorkshire"]},"postalCode":{"type":"string","description":"Postal code of the address.","example":"LS1 6AE"},"extension":{"type":"array","description":"List of address keys formatted as a FHIR extension. This can include up to one Unique Property Reference Number (UPRN), and up to one Postal Address File (PAF) key. If no keys for the address are known, the array will be empty. Otherwise it will be a list of objects which specify the value of the address key and the code system for it","items":{"anyOf":[{"type":"object","description":"Unique identifier for an address.","properties":{"url":{"type":"string","description":"URL of specification of the AddressKey extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey"]},"extension":{"type":"array","description":"Specification of address key system and address key value. Contains exactly two items: one describing the code system the Address Key uses, and the other specifying the value of the Address Key.","minItems":2,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Coding system of the address key.","required":["url","valueCoding"],"properties":{"url":{"type":"string","description":"Always 'type'.","default":"type"},"valueCoding":{"type":"object","description":"URL of specification of address key format.","required":["system","code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available Address Key formats.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType"},"code":{"type":"string","description":"Address Key system. Always 'PAF'.","enum":["PAF"],"example":"PAF"}}}}},{"type":"object","description":"Value of the address key.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Always 'value'.","default":"value","example":"value"},"valueString":{"type":"string","description":"Address key in PAF format. An 8 digit number including leading zeroes, formatted as a string.","minLength":8,"maxLength":8,"pattern":"^[0-9]{8}$","example":"12345678"}}}]}}}},{"type":"object","description":"Unique identifier for an address.","properties":{"url":{"type":"string","description":"URL of specification of the AddressKey extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey"]},"extension":{"type":"array","description":"Specification of address key system and address key value. Contains exactly two items: one describing the code system the Address Key uses, and the other specifying the value of the Address Key.","minItems":2,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Coding system of the address key.","required":["url","valueCoding"],"properties":{"url":{"type":"string","description":"Always 'type'.","default":"type"},"valueCoding":{"type":"object","description":"URL of specification of address key format.","required":["system","code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available Address Key formats.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType"},"code":{"type":"string","description":"Address Key system. Always 'UPRN'.","enum":["UPRN"],"example":"UPRN"}}}}},{"type":"object","description":"Value of the address key.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Always 'value'.","default":"value","example":"value"},"valueString":{"type":"string","description":"Address key in UPRN format. A number containing from 1 up to 12 digits.","minLength":1,"maxLength":12,"pattern":"^[0-9]{1,12}$","example":"123456789012"}}}]}}}}]}}}}},"telecom":{"type":"array","description":"List of contact points for the patient; for example, phone numbers or email addresses.\nWhen a patient tagged as `restricted` is retrieved, all contact points are removed from the response.\n","items":{"description":"A contact point, such as a phone number or email address","type":"object","required":["system","value"],"properties":{"id":{"type":"string","description":"Unique object identifier for this contact point.","example":"789"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"system":{"description":"Means of communication, such as phone or email.","type":"string","enum":["phone","fax","email","other"],"example":"phone"},"value":{"description":"Phone number, email address, or other identifier for use with contact system.","type":"string","example":"01632960587"},"use":{"type":"string","description":"Location associated with communication system.","enum":["home","work","temp","mobile"],"example":"home"},"extension":{"type":"array","maxItems":1,"description":"Extension that is returned when the communication type is `textphone`. The only code returned is `textphone`, which means `Minicom (Textphone)`.\n\nThe `system` is `other` when the extension is included.\n","items":{"type":"object","description":"Wrapped object for other contact system details.","properties":{"url":{"type":"string","description":"Definition of other contact system extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem"]},"valueCoding":{"type":"object","description":"URL of specification of other contact systems.","properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem"},"code":{"type":"string","description":"Coded value for the other contact system in place.","example":"textphone"},"display":{"description":"Display-friendly representation of the other contact system code.","type":"string","example":"Minicom (Textphone)"}}}}}}}}},"contact":{"type":"array","description":"A list of patient contacts. Only emergency contacts are returned. Any other contacts are returned on the patients `Related Person`.\nWhen a patient tagged as `restricted` is retrieved, all contacts are removed from the response.\n","items":{"title":"Schema for a patient contact.","type":"object","additionalProperties":false,"required":["relationship","telecom"],"properties":{"id":{"type":"string","example":"C123"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"relationship":{"type":"array","description":"The contact relationship wrapper object that holds the details of the relationship to the patient.\n\nThis is only returned when an Emergency Contact number has been set on `telecom`. The only valid code is `C`, which means `Emergency Contact`.\n","minItems":1,"maxItems":1,"items":{"type":"object","required":["coding"],"properties":{"coding":{"type":"array","description":"Exactly one contact relationship.","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","format":"url","default":"http://terminology.hl7.org/CodeSystem/v2-0131"},"code":{"type":"string","description":"Coded value for contact relationship.","example":"C"},"display":{"type":"string","description":"Display-friendly representation of the contact relationship code.","example":"Emergency Contact"}}}}}}},"telecom":{"type":"array","description":"List of Telecom objects on the contact only contains `system` and `value`.\n","items":{"description":"A contact point, such as a phone number or email address","type":"object","required":["system","value"],"properties":{"id":{"type":"string","description":"Unique object identifier for this contact point.","example":"789"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"system":{"description":"Means of communication, such as phone or email.","type":"string","enum":["phone","fax","email","other"],"example":"phone"},"value":{"description":"Phone number, email address, or other identifier for use with contact system.","type":"string","example":"01632960587"},"use":{"type":"string","description":"Location associated with communication system.","enum":["home","work","temp","mobile"],"example":"home"},"extension":{"type":"array","maxItems":1,"description":"Extension that is returned when the communication type is `textphone`. The only code returned is `textphone`, which means `Minicom (Textphone)`.\n\nThe `system` is `other` when the extension is included.\n","items":{"type":"object","description":"Wrapped object for other contact system details.","properties":{"url":{"type":"string","description":"Definition of other contact system extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem"]},"valueCoding":{"type":"object","description":"URL of specification of other contact systems.","properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem"},"code":{"type":"string","description":"Coded value for the other contact system in place.","example":"textphone"},"display":{"description":"Display-friendly representation of the other contact system code.","type":"string","example":"Minicom (Textphone)"}}}}}}}}}}}},"generalPractitioner":{"type":"array","maxItems":1,"description":"General Practice (not practitioner) with which the patient is, or was, registered. Always contains zero or one general practitioner object.\nWhen a patient tagged as `restricted` is retrieved, the General Practice is removed from the response.\n","items":{"description":"General practice (not practitioner) with which the patient is or was registered.","type":"object","required":["identifier"],"properties":{"id":{"description":"Object identifier (OID) specific to the returned details - this should be return exactly the same in any update.","type":"string","example":"254406A3"},"type":{"description":"Type of Reference being returned.","type":"string","example":"Organization"},"identifier":{"description":"Identifier and system of identification used for this Organisation.","type":"object","required":["value"],"properties":{"system":{"description":"URL for the Organisation Data Service - who are responsible for publishing codes that identify organisations and individuals across health and social care.","type":"string","example":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"description":"Organisation code for the registered general practice, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","type":"string","pattern":"^[0-9A-Z]+$","example":"Y12345"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}}}}}}},"extension":{"type":"array","description":"Wrapper array for the patient's death notification status; this is a FHIR extension. Always contains zero or one death notification status object.\n","items":{"anyOf":[{"type":"object","description":"Wrapper object for death notification details.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of death notification extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus"]},"extension":{"type":"array","description":"Array containing exactly one death notification status code object and exactly one effective date object.","minItems":1,"maxItems":2,"items":{"oneOf":[{"type":"object","description":"Wrapper object for death notification status code.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `deathNotificationStatus`.","default":"deathNotificationStatus","enum":["deathNotificationStatus"]},"valueCodeableConcept":{"type":"object","description":"Death Notification Status.","properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["system","code"],"properties":{"system":{"type":"string","description":"URI of the coding system specification.","example":"https://fhir.hl7.org.uk/CodeSystem/UKCore-DeathNotificationStatus"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1.0.0"},"code":{"type":"string","description":"Symbol, in syntax, defined by the system:\n* `1` - Informal - death notice received via an update from a local NHS Organisation such as GP or Trust\n* `2` - Formal - death notice received from Registrar of Deaths. Only these endpoints are allowed to add a Formal death:\n - National Back Office using the Demographic Spine Application (DSA)\n - Office of National Statistics (ONS)\n - Maternity sites\n* `U` - Removed. This is a possible response, but it cannot be used on an update because Spine will reject it\n","example":"2","enum":["1","2","U"]},"display":{"type":"string","description":"Representation defined by the system.","example":"Formal - death notice received from Registrar of Deaths","enum":["Informal - death notice received via an update from a local NHS Organisation such as GP or Trust","Formal - death notice received from Registrar of Deaths","Removed"]}}}}}}}},{"type":"object","description":"Wrapper object for death notification effective date.","required":["url","valueDateTime"],"properties":{"url":{"type":"string","description":"Key of this object. Always `systemEffectiveDate`.","default":"systemEffectiveDate","enum":["systemEffectiveDate"]},"valueDateTime":{"type":"string","description":"Date and time at which death notification status took effect.","format":"date-time","example":"2010-10-22T00:00:00+00:00"}}}]}}}}]}}}}}}}}},"RelatedPersonBundle":{"type":"object","properties":{"resourceType":{"type":"string","description":"FHIR Resource Type.","default":"Bundle"},"type":{"type":"string","description":"FHIR Bundle Type.","default":"searchset"},"timestamp":{"type":"string","description":"Time the search was performed.","format":"datetime","example":"2019-12-25T12:00:00+00:00"},"total":{"type":"integer","description":"Number of resources returned in search.","example":1},"entry":{"type":"array","description":"A list of related people details attached to the patient. \n","items":{"type":"object","properties":{"fullUrl":{"type":"string","description":"Absolute URL of the resource described in this item.","example":"https://api.service.nhs.uk/personal-demographics/FHIR/R4/Patient/9000000009/RelatedPerson/507B7621"},"resource":{"type":"object","additionalProperties":false,"required":["patient","relationship"],"properties":{"id":{"type":"string","description":"Unique object identifier for this name.","example":"507B7621"},"resourceType":{"type":"string","description":"FHIR resource type.","default":"RelatedPerson"},"patient":{"type":"object","required":["type"],"properties":{"type":{"type":"string","default":"Patient","enum":["Patient"]},"identifier":{"type":"object","description":"Identifier and system of identification used for this Patient.\n\nThis is an optional field as related person details are either a reference to another NHS number, or the details, such as name and adress, stored directly on the resource.\n","properties":{"system":{"type":"string","description":"URL for the Patient retrieval API.","format":"url","example":"https://api.service.nhs.uk/personal-demographics/FHIR/R4/Patient"},"value":{"type":"string","description":"NHS number for the related person","example":"90000000009","pattern":"^\\d{10}$"}}},"reference":{"type":"string","description":"URL for the FHIR Patient resource.","format":"url","example":"https://api.service.nhs.uk/personal-demographics/FHIR/R4/Patient/90000000009"}}},"active":{"type":"boolean","default":true},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"name":{"type":"array","description":"List containing zero or one name associated with the related person.\nThis is an optional field as there may be a `patient` reference which can be used to retrieve any details about the related person.\nIf no `patient` reference is available `name` and `address` must be provided at the minimum.\n","maxItems":1,"items":{"type":"object","required":["use","family"],"additionalProperties":false,"properties":{"id":{"type":"string","description":"Unique object identifier for this name.","example":"123"},"use":{"type":"string","description":"How this name should be used.\n* usual - Known as, conventional or the one patient normally uses. A patient always has a usual name.\n* temp - An alias or temporary name. This may also be used for temporary names assigned at birth or in emergency situations.\n* nickname - A name that the patient prefers to be addressed by, but is not part of their usual name.\n* old - This name is no longer in use (or was never correct, but retained for records).\n* maiden - Name changed for Marriage. A name used prior to changing name because of marriage. This term is not gender specific. The use of this term does not imply any particular history for a person's name.\n\nThe following use codes are included in the [name-use](https://www.hl7.org/fhir/valueset-name-use.html) value set, but should not be used and is not be returned as part of a retrieval.\n* official - The formal name as registered in an official (government) registry, but which name might not be commonly used. May be called \"legal name\".\n* anonymous - Anonymous assigned name, alias, or pseudonym (used to protect a person's identity for privacy reasons).\n","enum":["usual","temp","nickname","old","maiden"],"example":"usual"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"given":{"type":"array","maxItems":5,"description":"Given names, including any middle names.\n\nEach name(s) should be a separate item in the list. The first given name may include multiple names, separated by a space.\nSubsequent names must be broken down into list items. For example, the input `[Jane Marie Anne, Jo Adele]` returns `[Jane Marie Anne, Jo, Adele]`.\n","example":["Jane Marie Anne","Jo","Adele"],"items":{"type":"string","maxLength":35,"example":"Jane"}},"family":{"type":"string","maxLength":35,"description":"Family name (often called Surname).","example":"Smith"},"prefix":{"type":"array","description":"Name prefixes, titles, and prenominals.","example":["Mrs"],"items":{"type":"string","example":"Mrs"}},"suffix":{"type":"array","description":"Name suffices and postnominals.","example":["MBE","PhD"],"items":{"type":"string","example":"MBE"}}}}},"address":{"type":"array","description":"List containing zero or one address associated with the related person.\nThis is an optional field as there may be a `patient` reference which can be used to retrieve any details about the related person.\nIf no `patient` reference is available `name` and `address` must be provided at the minimum.\n","maxItems":1,"items":{"type":"object","description":"An address associated with the patient.","required":["use"],"properties":{"id":{"type":"string","description":"Unique system identifier for this address.","example":"456"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"use":{"type":"string","description":"Purpose of this address:\n * `home` - the home address is the patient's normal residence. Home address is also known as usual, main, registered, current or permanent address\n * `temp` - a temporary address is an address used for a set period of time, but where the patient's home, permanent address remains unchanged\n * `billing` - an address used for correspondence purposes only\n * `work` - an office address. This can be returned due to legacy data but cannot be added or replaced on update\n\n A patient should have no more than one current `temp` and/or `billing` address.\n However, historically this was constrained only by the integration requirements and was not enforced so theoretically more than one can exist for a patient when retrieving.\n Where multiple instances already exist for the patient it is not expected that local systems should manage those, but should choose the most appropriate one to maintain (e.g. by examining period dates).\n\n A `home` address is the patient's main residential address and should normally be used for all clinical and demographic purposes, including clinical and appointment correspondence.\n However additionally, `temp` and `billing` addresses may be provided by a patient when there is a requirement to record an alternative location for the purposes of unbroken care.\n When sending correspondence to a patient:\n *\ta present and valid `billing` address may take precedence over `home` and `temp` addresses. A patient should have only a single current `billing` address. An address is considered 'valid' according to its period start and end dates.\n *\tif no current `billing` address is provided, a `temp` address may take precedence over the `home` address, again if it is valid according to its period start and end dates.\n * if there is no valid, current `billing` and/or `temp` address, the `home` address must be used.\n","enum":["home","work","temp","billing"],"example":"home"},"text":{"type":"string","description":"Where a `temp` address is provided a descriptor text must be sent.\nThe list of possible values are:\n* `Second Home` - a patient's second home\n* `Student Accommodation` - a patient's place of residence while at university\n* `Respite Care Address` - where the patient resides during respite care\n* `Temporary Residence Address` - where the patient resides for a specific period of time\n* `Convalescence Home` - the address for a patient during a period of recovery\n* `Mobile Home` - the address of a patient's mobile home, parked for a specific period of time, e.g. the address of a caravan park\n* `Holiday Home` - the address for a patient during a holiday\n\nA patient can also register temporarily at a GP practice using a temporary address. Temporary GP registration information does not appear on the PDS, but the address used for it may.\n","enum":["Second Home","Student Accommodation","Respite Care Address","Temporary Residence Address","Convalescence Home","Mobile Home","Holiday Home"],"example":"Student Accommodation"},"line":{"type":"array","description":"All lines of the address except the postal code.\n\nSystems must apply the following formatting convention when adding or replacing addresses lines:\n*\tline 1 - premises ID and/or house name, e.g. `Flat 1` or `The Old Schoolhouse`\n*\tline 2 - house number, dependent thoroughfare name and descriptor (if present), thoroughfare name and descriptor, e.g. `23 Mill Lane`\n*\tline 3 - dependent locality/village, locality (if present), e.g. `Boxgrove`\n*\tline 4 - post town, e.g. `Leeds`\n*\tline 5 - county (if present), e.g. `West Yorkshire`\n\nIf any of the lines are blank, they are not returned due to FHIR conformance constraints.\n","maxItems":5,"items":{"type":"string"},"example":["1 Trevelyan Square","Boar Lane","City Centre","Leeds","West Yorkshire"]},"postalCode":{"type":"string","description":"Postal code of the address.","example":"LS1 6AE"},"extension":{"type":"array","description":"List of address keys formatted as a FHIR extension. This can include up to one Unique Property Reference Number (UPRN), and up to one Postal Address File (PAF) key. If no keys for the address are known, the array will be empty. Otherwise it will be a list of objects which specify the value of the address key and the code system for it","items":{"anyOf":[{"type":"object","description":"Unique identifier for an address.","properties":{"url":{"type":"string","description":"URL of specification of the AddressKey extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey"]},"extension":{"type":"array","description":"Specification of address key system and address key value. Contains exactly two items: one describing the code system the Address Key uses, and the other specifying the value of the Address Key.","minItems":2,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Coding system of the address key.","required":["url","valueCoding"],"properties":{"url":{"type":"string","description":"Always 'type'.","default":"type"},"valueCoding":{"type":"object","description":"URL of specification of address key format.","required":["system","code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available Address Key formats.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType"},"code":{"type":"string","description":"Address Key system. Always 'PAF'.","enum":["PAF"],"example":"PAF"}}}}},{"type":"object","description":"Value of the address key.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Always 'value'.","default":"value","example":"value"},"valueString":{"type":"string","description":"Address key in PAF format. An 8 digit number including leading zeroes, formatted as a string.","minLength":8,"maxLength":8,"pattern":"^[0-9]{8}$","example":"12345678"}}}]}}}},{"type":"object","description":"Unique identifier for an address.","properties":{"url":{"type":"string","description":"URL of specification of the AddressKey extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey"]},"extension":{"type":"array","description":"Specification of address key system and address key value. Contains exactly two items: one describing the code system the Address Key uses, and the other specifying the value of the Address Key.","minItems":2,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Coding system of the address key.","required":["url","valueCoding"],"properties":{"url":{"type":"string","description":"Always 'type'.","default":"type"},"valueCoding":{"type":"object","description":"URL of specification of address key format.","required":["system","code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available Address Key formats.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType"},"code":{"type":"string","description":"Address Key system. Always 'UPRN'.","enum":["UPRN"],"example":"UPRN"}}}}},{"type":"object","description":"Value of the address key.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Always 'value'.","default":"value","example":"value"},"valueString":{"type":"string","description":"Address key in UPRN format. A number containing from 1 up to 12 digits.","minLength":1,"maxLength":12,"pattern":"^[0-9]{1,12}$","example":"123456789012"}}}]}}}}]}}}}},"telecom":{"type":"array","description":"List containing zero to five contact methods associated with the related person.\nThis is an optional field as there may be a `patient` reference which can be used to retrieve any details about the related person.\n","maxItems":5,"items":{"description":"A contact point, such as a phone number or email address","type":"object","required":["system","value"],"properties":{"id":{"type":"string","description":"Unique object identifier for this contact point.","example":"789"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"system":{"description":"Means of communication, such as phone or email.","type":"string","enum":["phone","fax","email","other"],"example":"phone"},"value":{"description":"Phone number, email address, or other identifier for use with contact system.","type":"string","example":"01632960587"},"use":{"type":"string","description":"Location associated with communication system.","enum":["home","work","temp","mobile"],"example":"home"},"extension":{"type":"array","maxItems":1,"description":"Extension that is returned when the communication type is `textphone`. The only code returned is `textphone`, which means `Minicom (Textphone)`.\n\nThe `system` is `other` when the extension is included.\n","items":{"type":"object","description":"Wrapped object for other contact system details.","properties":{"url":{"type":"string","description":"Definition of other contact system extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem"]},"valueCoding":{"type":"object","description":"URL of specification of other contact systems.","properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem"},"code":{"type":"string","description":"Coded value for the other contact system in place.","example":"textphone"},"display":{"description":"Display-friendly representation of the other contact system code.","type":"string","example":"Minicom (Textphone)"}}}}}}}}},"relationship":{"type":"array","description":"The relationship of the related person to the patient.\n","minItems":1,"maxItems":1,"items":{"type":"object","required":["coding"],"properties":{"coding":{"type":"array","description":"Coded values for three relationship types:\n* Role\n* Type\n* Next-of-Kin\n\nThe codes used can be found at:\n* http://hl7.org/fhir/ValueSet/relatedperson-relationshiptype\n* https://fhir.nhs.uk/R4/CodeSystem/UKCore-AdditionalRelatedPersonRole\n\nThe allowed values for `Role` are:\n* Agent - Agent of patient\n* Guardian - Guardian of patient\n* Personal - Personal relationship with the patient\n\nThe allowed values for `Type` are:\n* SPS - spouse\n* DOMPART - domestic partner\n* PRN - parent\n* PRNFOST - foster parent\n* STPPRN - step parent\n* CHILD - child\n* MTH - mother\n* FTH - father\n* SIS - sister\n* BRO - brother\n* FAMMEMB - family member\n* ONESELF - self\n* N - Next-of-Kin\n* U - Unknown\n* PolygamousPartner - Polygamous Partner of patient\n* Dependant - Dependant of patient\n* NonDependant - Non Dependant of patient\n* ProxyContact - Proxy Contact for patient\n* ProxyCommunication - Proxy Communication for patient\n* ProxyContactCommunication - Proxy Contact and Communication for patient\n* Carer - Carer of patient\n* Guardian - Guardian of patient\n* NotSpecified - Not Specified\n\nThe allowed values for `Next-of-Kin` are:\n* N - Next-of-Kin\n\n`Role` and `Type` are mandatory, so both should be present - however they both contain the `Guardian` code - so a single response is possible.\n\n`Next-of-Kin` is optional and will be absent from the response when the related person is not the Next-of-Kin.\n","minItems":1,"maxItems":3,"items":{"type":"object","required":["system","code"],"properties":{"system":{"type":"string","description":"URI of the coding system specification.","format":"url","default":"https://fhir.nhs.uk/R4/CodeSystem/UKCore-AdditionalRelatedPersonRole","enum":["http://hl7.org/fhir/ValueSet/relatedperson-relationshiptype","https://fhir.nhs.uk/R4/CodeSystem/UKCore-AdditionalRelatedPersonRole"]},"code":{"type":"string","description":"Symbol in syntax defined by the system.","example":"Guardian"},"display":{"type":"string","description":"Human-friendly display representation defined by the system.","example":"Guardian of patient"}}}}}}},"extension":{"type":"array","description":"Wrapper array for copy correspondence, contact rank, contact preferences and communication details; these are all FHIR extensions. Always contains zero or one of each extension type.\n","items":{"anyOf":[{"type":"object","description":"Flag indicating if this person should be copied in on any contact with the Patient. This will only be returned if the value is true and the person should be copied in on correspondence, otherwise it will be omitted. \n","properties":{"url":{"type":"string","format":"url","description":"URL to FHIR Extension Specification.","default":"https://fhir.nhs.uk/R4/StructureDefinition/Extension-UKCore-CopyCorrespondenceIndicator","enum":["https://fhir.nhs.uk/R4/StructureDefinition/Extension-UKCore-CopyCorrespondenceIndicator"]},"valueBoolean":{"type":"boolean","description":"Flag indicating if this person should be copied in on correspondence. This will only be returned if the value is `true` otherwise it will not be returned and can be assumed `false`","example":true}}},{"type":"object","description":"Rank indicating order in which contacts should be tried.","properties":{"url":{"type":"string","format":"url","description":"URL to FHIR Extension Specification.","default":"https://fhir.nhs.uk/R4/StructureDefinition/Extension-UKCore-ContactRank","enum":["https://fhir.nhs.uk/R4/StructureDefinition/Extension-UKCore-ContactRank"]},"valuePositiveInt":{"type":"integer","minimum":1,"maximum":99,"description":"Rank expressed as positive integer (1 being the highest).","example":1}}},{"type":"object","description":"Wrapper object for preferred contact details; the written communication format, preferred contact time and method. This will only be populated on a retrieval and not a search.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of the contact preference extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-ContactPreference","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-ContactPreference"]},"extension":{"description":"Wrapper array containing zero or one preferred contact method, zero or one preferred written communication format; and zero or one preferred contact time.","type":"array","maxItems":3,"items":{"oneOf":[{"type":"object","description":"Wrapper object for preferred written communication format.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredWrittenCommunicationFormat`.","default":"PreferredWrittenCommunicationFormat"},"valueCodeableConcept":{"type":"object","description":"Preferred Written Communication Format.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","format":"url","description":"Definition of the preferred written communication extension.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredWrittenCommunicationFormat","enum":["https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredWrittenCommunicationFormat"]},"code":{"type":"string","description":"A code to identify the preferred written communication format of a patient, contact or related person.\n* 11 - Large print\n* 12 - Braille\n* 13 - Audio tape\n","example":"12"},"display":{"type":"string","description":"Display-friendly representation of the preferred written communication format code.","example":"Braille"}}}}}}}},{"type":"object","description":"Wrapper object for preferred contact method.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredContactMethod`.","default":"PreferredContactMethod","enum":["PreferredContactMethod"]},"valueCodeableConcept":{"type":"object","description":"Preferred Contact Method.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","format":"url","description":"Definition of the preferred contact method extension.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredContactMethod","enum":["https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredContactMethod"]},"code":{"type":"string","description":"A code to identify to identify the preferred contact method of a patient, contact or related person.\n* 1\t- Letter\n* 2\t- Visit\n* 3\t- Telephone\n* 4\t- E-mail\n* 5\t- Minicom (Textphone)\n* 6\t- Telephone contact via proxy\n* 7\t- Sign language\n* 8\t- No Telephone contact\n","example":"1"},"display":{"type":"string","description":"Display-friendly representation of the preferred contact method code.","example":"Letter"}}}}}}}},{"type":"object","description":"Wrapper object for preferred contact times.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredContactTimes`.","default":"PreferredContactTimes","enum":["PreferredContactTimes"]},"valueString":{"type":"string","maximum":40,"description":"A free-text description about the preferred contact times.","example":"Not after 7pm"}}}]}}}},{"type":"object","description":"Wrapper object for communication details. This will only be populated on a retrieval and not a search.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of communication extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSCommunication","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSCommunication"]},"extension":{"type":"array","description":"Definition of communication extension.\n\nThe array must have one item, a valueCodeableConcept for the language and can optionally include a valueBoolean for if an interpreter is required.","minItems":1,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Wrapper object for communication language.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `language`.","default":"language","enum":["language"]},"valueCodeableConcept":{"type":"object","description":"Human language.","required":["coding"],"properties":{"coding":{"type":"array","description":"Exactly one language code.","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URL of the Language Code System. Always uses the 'UKCore-HumanLanguage' Code System.","example":"https://fhir.hl7.org.uk/CodeSystem/UKCore-HumanLanguage"},"version":{"type":"string","description":"Version of the language code system.","example":"1.0.0"},"code":{"type":"string","description":"Language code based on [ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) standard plus extensions for braille, makaton and sign languages, which are:\n* `q1` - Braille\n* `q2` - American Sign Language\n* `q3` - Australian Sign Language\n* `q4` - British Sign Language\n* `q5` - Makaton\nAll valid codes combined can be found at https://fhir.hl7.org.uk/CodeSystem/UKCore-HumanLanguage.\n","example":"fr"},"display":{"type":"string","description":"Display-friendly representation of the language code (such as English). If there is a language code with no defined mapping, `Unknown` will be returned.","example":"French"}}}}}}}},{"type":"object","description":"Wrapper object for whether an interpreter is required.","required":["url","valueBoolean"],"properties":{"url":{"type":"string","description":"Key of this object. Always `interpreterRequired`.","default":"interpreterRequired","enum":["interpreterRequired"]},"valueBoolean":{"type":"boolean","description":"Whether an interpreter is required.","example":true}}}]}}}}]}}}}}}}}},"OperationOutcome":{"type":"object","description":"Outcome of an operation that does not result in a resource or bundle being returned, for example an error or an async/batch submission.\nThere are a number of possible error codes that can be returned along with a more detailed description in the `display` field.\n","properties":{"resourceType":{"type":"string","description":"FHIR Resource Type.","default":"OperationOutcome"},"issue":{"type":"array","description":"List of issues that have occurred.","minItems":1,"items":{"type":"object","required":["severity","code"],"properties":{"severity":{"type":"string","enum":["fatal","error","warning","information"],"description":"Severity of the error.","example":"error"},"code":{"type":"string","description":"FHIR error code.","example":"invalid","enum":["invalid","structure","required","value","invariant","security","login","unknown","expired","forbidden","suppressed","processing","not-supported","duplicate","multiple-matches","not-found","deleted","too-long","code-invalid","extension","too-costly","business-rule","conflict","transient","lock-error","no-store","exception","timeout","incomplete","throttled","informational"]},"details":{"type":"object","description":"Internal error code.","properties":{"coding":{"type":"array","items":{"type":"object","properties":{"system":{"type":"string","description":"URI of the coding system specification.","example":"https://fhir.nhs.uk/R4/CodeSystem/Spine-ErrorOrWarningCode"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1"},"code":{"type":"string","description":"Symbol in syntax defined by the system.","example":"INVALID_VALUE"},"display":{"type":"string","description":"Representation defined by the system.","example":"Provided value is invalid"}}}}}},"diagnostics":{"type":"string","description":"Additional diagnostic information about the issue. This information is subject to change.","example":"Invalid value - 2019-01 in field 'birthDate'"},"expression":{"type":"string","description":"FHIRPath of element(s) related to the error.","example":"Patient.name.given"}}}}}}},"examples":{"OperationOutcome":{"summary":"OperationOutcome example","value":{"resourceType":"OperationOutcome","issue":[{"severity":"error","code":"value","details":{"coding":[{"system":"https://fhir.nhs.uk/R4/CodeSystem/Spine-ErrorOrWarningCode","version":"1","code":"INVALID_RESOURCE_ID","display":"Resource Id is invalid"}]}}]}}}}} \ No newline at end of file +{"openapi":"3.0.0","info":{"version":"v1.2.2156-beta","title":"Personal Demographics Service (FHIR) API","description":"## Overview \nUse this API to access the [Personal Demographics Service (PDS)](https://digital.nhs.uk/services/demographics) - the national electronic database of NHS patient details such as name, address, date of birth, related people, registered GP and NHS number.\n\nYou can:\n* search for patients\n* get patient details\n* update patient details\n* verify an NHS number for a patient\n\nYou cannot currently use this API to:\n* create a new record for a birth - use [PDS HL7 V3 API](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-hl7-v3)\n* receive birth notifications - use [PDS HL7 V3 API](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-hl7-v3) or [PDS Notifications FHIR API](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-notifications-fhir) \n* create a record for a new patient - use [PDS HL7 V3 API](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-hl7-v3)\n* register a new patient at a GP Practice - use [NHAIS GP Links API](https://digital.nhs.uk/developer/api-catalogue/nhais-gp-links)\n* receive patient death notifications - use [PDS Notifications FHIR API](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-notifications-fhir) \n* receive notifications about a patient's change of address - use [PDS Notifications FHIR API](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-notifications-fhir) \n* receive notifications about a patient's change of GP - use [PDS Notifications FHIR API](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-notifications-fhir) \n* receive notifications about any PDS record change - use [PDS Notifications FHIR API](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-notifications-fhir) \n\nYou can read and update the following data:\n* NHS number (read only)\n* name\n* gender\n* addresses and contact details\n* birth information\n* death information\n* registered GP\n* nominated pharmacy\n* dispensing doctor pharmacy\n* medical appliance supplier pharmacy\n* related people, such as next of kin (read only - update coming soon)\n\n### Patients included in PDS\nRegardless of nationality, or where they live now, PDS includes all patients who have ever been registered with a GP practice, or treated by a health or care organisation (even as a visitor or migrant) in England, Wales, the Isle of Man, or in a UK Defence Medical Services unit anywhere in the world. \n\nAll patients in PDS have an NHS number which is unique. The 10-digit NHS number is used in England, Wales, the Isle of Man, Scotland and Northern Ireland, but not the Channel Islands. Scotland and Northern Ireland have their own distinct number ranges.\n\n### Access modes\nThis API has three access modes:\n\n| Access mode | Functions | Availability |\n| ------------------------------ | ------------------ | ------------ |\n| [Application-restricted access](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation#application-restricted-apis) |Search for a patient (single result).
Get patient details. | Available in production ([stable](https://digital.nhs.uk/developer/guides-and-documentation/reference-guide#api-status)) |\n| [Healthcare worker access](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation#user-restricted-apis) |Search for patients (multiple results).
Get patient details.
Update patient details. | Available in production ([beta](https://digital.nhs.uk/developer/guides-and-documentation/reference-guide#api-status)) |\n| [Patient access](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation#user-restricted-apis) |Get own details.
Update own details (limited). | Available in production ([beta](https://digital.nhs.uk/developer/guides-and-documentation/reference-guide#api-status)) |\n\nFor further details about the access modes for this API, see [Security and authorisation](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-fhir#api-description__security-and-authorisation) below.\n\n## Who can use this API\nThis API can only be used where there is a [legal basis](http://digital.nhs.uk/services/demographics/access-data-on-the-personal-demographics-service) to do so. Make sure you have a valid use case before you go too far with your development. You must demonstrate you have a [valid use case](https://digital.nhs.uk/services/demographics/access-data-on-the-personal-demographics-service) as part of digital onboarding. \n\nYou must do this before you can go live (see ‘Onboarding’ below).\n\n### Who can access PDS records\nHealth and care organisations in England and the Isle of Man can access PDS records. Legitimate direct care examples include NHS organisations delivering healthcare, local authorities delivering care, third sector and private sector health and care organisations, and developers delivering systems to health and care organisations. \n\nHealth and care organisations in Wales access their own version of PDS called the Welsh Demographics Service (WDS) which is connected to PDS behind the scenes. \n\nHealth and care organisations in Scotland, Northern Ireland and the Channel Islands access their own equivalents of PDS.\n\nPatients who receive health and social care or make use of NHS services in England, Wales, the Isle of Man, Scotland, Northern Ireland and the Channel Islands.\n\n### Existing API users\nTo find out which healthcare software development organisations and products are already using this API, see [PDS FHIR API - integrated products](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-fhir/integrated-products).\n\n## Related APIs\nThe following APIs also give access to the Personal Demographics Service:\n- [Personal Demographics Service (SMSP) API](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-smsp) - this API is now deprecated.\n- [Personal Demographics Service (HL7 V3) API](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-hl7-v3) - use this if you want to use functions that are not yet available on the FHIR API, such as creating a new record for a birth, receiving birth notifications, or creating a record for a new patient (except when registering a new patient at a GP Practice, use [NHAIS](https://digital.nhs.uk/services/nhais)). For birth notifications, another option is [PDS Notifications - FHIR API](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-notifications-fhir).\n\nOnce our roadmap is complete, the above APIs will become redundant.\n\nThe following APIs are also related to this API:\n- [Personal Demographics Service Notifications - FHIR API](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-notifications-fhir) - use this to subscribe to be notified of a set of patient record changes, including any record update, birth, death, change of address and change of GP.\n- [Organisation Data Service FHIR API](https://developer.nhs.uk/apis/ods/) - use this to get full details for the organisations related to the patient, such as their registered GP or nominated pharmacy.\n- [Ordnance Survey (OS Places) API](https://digital.nhs.uk/developer/api-catalogue/ordnance-survey-places-api) - use this to identify, look up and verify addresses prior to a PDS update.\n\n## API status and roadmap\n### Application-restricted access\nThis access mode is [in production](https://digital.nhs.uk/developer/guides-and-documentation/reference-guide#statuses):\n* you should strongly consider it as the primary choice for PDS integration\n* we do not make routine breaking changes, if it cannot be avoided, for example, for security reasons, we will give advance notice\n \n### Healthcare worker access\nThis access mode is [in production, beta](https://digital.nhs.uk/developer/guides-and-documentation/reference-guide#statuses), meaning:\n- we might make breaking changes, but only if we cannot avoid it, and we will give advance notice\n\nIf you would like to be involved in our beta programme, [contact us](https://digital.nhs.uk/developer/help-and-support).\n \n### Patient access\nThis access mode is [in production, beta](https://digital.nhs.uk/developer/guides-and-documentation/reference-guide#statuses), meaning:\n- we might make breaking changes, but only if we cannot avoid it, and we will give advance notice\n\nIf you would like to be involved in our beta programme, [contact us](https://digital.nhs.uk/developer/help-and-support).\n\n### Roadmap\nTo see our roadmap, or to suggest, comment or vote on features for this API, see our [interactive product backlog](https://nhs-digital-api-management.featureupvote.com/?order=popular&filter=allexceptdone&tag=pds-fhir-api).\n\nIf you have any other queries, please [contact us](https://digital.nhs.uk/developer/help-and-support).\n\n## Service level\n\nThis API is a platinum service, meaning it is operational and supported 24 hours a day, 365 days a year.\n\nFor more details, see [service levels](https://digital.nhs.uk/developer/guides-and-documentation/reference-guide#service-levels).\n\n## Technology\nThis API is [RESTful](https://digital.nhs.uk/developer/guides-and-documentation/our-api-technologies#basic-rest).\n\nIt conforms to the [FHIR](https://digital.nhs.uk/developer/guides-and-documentation/our-api-technologies#fhir) global standard for health care data exchange, specifically to [FHIR R4 (v4.0.1)](https://hl7.org/fhir/r4/), except that it does not support the [capabilities](http://hl7.org/fhir/R4/http.html#capabilities) interaction.\n\nIt includes some country-specific FHIR extensions, which are built against [FHIR UK Core](https://digital.nhs.uk/services/fhir-uk-core), specifically [UK.core.r4 1.0.0](https://simplifier.net/packages/uk.core.r4/1.0.0).\n\nYou do not need to know much about FHIR to use this API - FHIR APIs are just RESTful APIs that follow specific rules.\nIn particular:\n- resource names are capitalised and singular, for example `/Patient` not `/patients`\n- array names are singular, for example `line` not `lines` for address lines\n- data items that are country-specific and thus not included in the FHIR global base resources are usually wrapped in an `extension` object\n\nThere are [libraries and SDKs available](https://digital.nhs.uk/developer/guides-and-documentation/api-technologies-at-nhs-digital#fhir-libraries-and-sdks) to help with FHIR API integration.\n\n## Network access\nThis API is available on the internet and, indirectly, on the [Health and Social Care Network (HSCN)](https://digital.nhs.uk/services/health-and-social-care-network).\n\nTo use this API with [NHS smartcards](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation/nhs-smartcards-for-developers), the end user needs an HSCN connection, although internet-facing alternatives to smartcards are available.\n\nFor more details see [Network access for APIs](https://digital.nhs.uk/developer/guides-and-documentation/network-access-for-apis).\n\n## Security and authorisation\n\nThis API has three access modes:\n- application-restricted access\n- healthcare worker access\n- patient access\n\n### Application-restricted access\nUse this access mode if you need to:\n* search for a patient – and only get a result if there is a unique match\n* get a single patient's details\n\nThis access mode is [application-restricted](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation#application-restricted-apis), meaning we authenticate the calling application but not the end user.\n\nThe end user could be:\n* a healthcare worker - in which case you must ensure they are authenticated and suitably authorised locally\n* a patient - in which case you must ensure they are authenticated locally\n* not present at all - for example as part of a back end process to check NHS numbers for data flowing from one system to another\n\nTo use this access mode, use the following security pattern:\n* [Application-restricted RESTful API - signed JWT authentication](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation/application-restricted-restful-apis-signed-jwt-authentication)\n\n### Healthcare worker access\nUse this access mode if the end user is a healthcare worker and you need to: \n* search for patients – and be able to present a list of matches for the user to choose from \n* get patient details \n* update patient details \n\nThis access mode is [user-restricted](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation#user-restricted-apis), meaning an end user must be present, authenticated and authorised.\n\nThe end user must be:\n* a healthcare worker\n* strongly authenticated, using either an [NHS smartcard or a modern alternative](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation/nhs-smartcards-for-developers)\n* authorised, using [national role-based access control (RBAC)](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation/national-rbac-for-developers)\n\nTo use this access mode, use one of the following security patterns:\n\n|\tSecurity pattern\t\t |\tTechnical details\t |\tAdvantages | Disadvantages |\n|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ---------------------------------------------------------| -------------------------------------------------------------------------|---------------------------------------------------------------------------|\n|[NHS CIS2 - combined authentication and authorisation](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation/user-restricted-restful-apis-nhs-cis2-combined-authentication-and-authorisation) |OAuth 2.0 authorisation code flow with API key and secret |No need to integrate and onboard separately with NHS CIS2. |No access to user information.
Not recommended for use in GP software. |\n|[NHS CIS2 - separate authentication and authorisation](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation/user-restricted-restful-apis-nhs-cis2-separate-authentication-and-authorisation) |OAuth 2.0 token exchange with signed JWT |Gives access to user information.
Recommended for use in GP software. |Need to integrate and onboard separately with NHS CIS2. |\n\n### Patient access\nUse this access mode if the end user is a patient and you need to: \n* get the patient’s own details\n* update the patient’s own details\n\nThis access mode is [user-restricted](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation#user-restricted-apis), meaning an end user must be present, authenticated and authorised.\n\nThe end user must be:\n* a patient who receives health and social care or makes use of NHS services\n* strongly authenticated, using [NHS login](https://digital.nhs.uk/services/nhs-login)\n\nTo use this access mode, use one of the following security patterns:\n\n|\tSecurity pattern\t\t |\tTechnical details\t |\tAdvantages\t | Disadvantages |\n|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ----------------------------------------------------| ------------------------------------------------------------|---------------------------------------------------------|\n|[NHS login - combined authentication and authorisation](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation/user-restricted-restful-apis-nhs-login-combined-authentication-and-authorisation) |OAuth 2.0 authorisation code with API key and secret |No need to integrate and onboard separately with NHS login. |No access to user information. |\n|[NHS login - separate authentication and authorisation](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation/user-restricted-restful-apis-nhs-login-separate-authentication-and-authorisation) |OAuth 2.0 token exchange with signed JWT |Gives access to user information. |Need to integrate and onboard separately with NHS login. |\n\n## Errors\nWe use standard HTTP status codes to show whether an API request succeeded or not. They are usually in the range:\n\n* 200 to 299 if it succeeded, including code 202 if it was accepted by an API that needs to wait for further action\n* 400 to 499 if it failed because of a client error by your application\n* 500 to 599 if it failed because of an error on our server\n\nErrors specific to each API are shown in the Endpoints section, under Response. See our [reference guide](https://digital.nhs.uk/developer/guides-and-documentation/reference-guide#http-status-codes) for more on errors.\n\n## Open source\nYou might find the following [open source](https://digital.nhs.uk/developer/guides-and-documentation/reference-guide#open-source) resources useful:\n\n| Resource | Description | Links |\n|---------------------------|----------------------------------------------------------------------|--------------------------------------------------------------------------------|\n| PDS FHIR API | Source code for the API proxy, sandbox and specification. | [GitHub repo](https://github.com/NHSDigital/personal-demographics-service-api) |\n| FHIR libraries and SDKs | Various open source libraries for integrating with FHIR APIs. | [FHIR libraries and SDKs](https://digital.nhs.uk/developer/guides-and-documentation/api-technologies-at-nhs-digital#fhir-libraries-and-sdks) |\n| nhs-number | Python package containing utilities for NHS numbers including validity checks, normalisation and generation. | [GitHub repo](https://github.com/uk-fci/nhs-number) \\| [Python Package index](https://pypi.org/project/nhs-number/) \\| [Docs](https://nhs-number.uk-fci.tech/) |\n\nWe currently don't have any open source client libraries or sample code for this API. If you think this would be useful, you can [upvote the suggestion on our Interactive Product Backlog](https://nhs-digital-api-management.featureupvote.com/suggestions/107439/client-libraries-and-reference-implementations).\n\nThe source code for the PDS FHIR back end (the Core Spine source code) is not currently in the open. If you think this would be useful, you can [upvote the suggestion on our Interactive Product Backlog](https://nhs-digital-api-management.featureupvote.com/suggestions/466692/open-source-core-spine-including-pds-eps-scr-and-more).\n\n## Environments and testing\n\n| Environment | Base URL |\n| ----------------- | ---------------------------------------------------------------------- |\n| Sandbox | `https://sandbox.api.service.nhs.uk/personal-demographics/FHIR/R4/` |\n| Integration test | `https://int.api.service.nhs.uk/personal-demographics/FHIR/R4/` |\n| Production | `https://api.service.nhs.uk/personal-demographics/FHIR/R4/` |\n\n### Sandbox testing\nOur [sandbox environment](https://digital.nhs.uk/developer/guides-and-documentation/testing#sandbox-testing):\n* is for early developer testing\n* only covers a limited set of scenarios\n* is stateless, so does not actually persist any updates\n* is open access, so does not allow you to test authorisation\n\nFor details of sandbox test scenarios, or to try out the sandbox using our 'Try this API' feature, see the documentation for each endpoint.\n\nAlternatively, you can try out the sandbox using our Postman collection:\n\n[![Run in Postman](https://run.pstmn.io/button.svg)](https://app.getpostman.com/run-collection/14719036-953f067f-30b9-4552-8252-7cc10b21dad3)\n\n### Integration testing\nOur [integration test environment](https://digital.nhs.uk/developer/guides-and-documentation/testing#integration-testing):\n* is for formal integration testing\n* is stateful, so persists updates\n* includes authorisation, with options for user-restricted access (with or without [smartcards](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation/nhs-smartcards-for-developers) and application-restricted access\n \nFor read-only testing, you can either use our [PDS FHIR API test data packs](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-fhir/pds-fhir-api-test-data) or set up your own test data.\n\nTo test updating patient details, you must set up your own test data.\n\nFor more details see [integration testing with our RESTful APIs](https://digital.nhs.uk/developer/guides-and-documentation/testing#integration-testing-with-our-restful-apis).\n\n### Production smoke testing\nYou must not use real patient data for smoke testing in the production environment.\n\nRather, use our [production test patient](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-fhir/pds-fhir-api-test-data#production-smoke-testing).\n\n## Onboarding\nYou need to get your software approved by us before it can go live with this API. We call this onboarding. The onboarding process can sometimes be quite long, so it’s worth planning well ahead.\n\nAs part of this process, you need to demonstrate your technical conformance to the requirements for this API. For more details according to your access mode, see:\n* [PDS FHIR API technical conformance - application-restricted access mode](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-fhir/pds-fhir-technical-conformance---application-restricted-access-mode)\n* [PDS FHIR API technical conformance - healthcare worker access mode](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-fhir/pds-fhir-technical-conformance---healthcare-worker-access-mode)\n\nYou also need to demonstrate that you can manage risks. This might impact the design of your software. For details, see [Onboarding support information](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-fhir/onboarding-support-information).\n\nTo understand how our online digital onboarding process works, see [digital onboarding](https://digital.nhs.uk/developer/guides-and-documentation/digital-onboarding). \n\n
\n
\n
\n
\n \n \"\"\n \n
\n
\n
\n

To get started, sign in or create a developer account, then select 'product onboarding'.

\n
\n
\n
\n","contact":{"name":"Personal Demographics Service FHIR API Support","url":"https://digital.nhs.uk/developer/help-and-support","email":"ssd.nationalservicedesk@nhs.net"}},"servers":[{"url":"https://sandbox.api.service.nhs.uk/personal-demographics/FHIR/R4","description":"Sandbox environment."},{"url":"https://int.api.service.nhs.uk/personal-demographics/FHIR/R4","description":"Integration test environment."},{"url":"https://api.service.nhs.uk/personal-demographics/FHIR/R4","description":"Production environment."}],"paths":{"/Patient":{"parameters":[{"in":"header","name":"Authorization","description":"An [OAuth 2.0 bearer token](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation#user-restricted-apis).\n\nRequired in all environments except sandbox.\n","required":false,"schema":{"type":"string","format":"^Bearer\\ [[:ascii:]]+$","example":"Bearer g1112R_ccQ1Ebbb4gtHBP1aaaNM"}},{"in":"header","name":"NHSD-Session-URID","description":"\nThe user role ID (URID) for the current session. Also known as a user role profile ID (URPID).\n\nThis header is optional.\n\nIn Application-restricted access mode this header is ignored.\n\nIn Healthcare worker access mode if you send this header it must be valid for the logged-in user. See [determine the user's role](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation/user-restricted-restful-apis-nhs-cis2-separate-authentication-and-authorisation#step-9-determine-the-user-s-role) for guidance.\n","required":false,"schema":{"type":"string","pattern":"^[0-9]+$","example":"555254240100"}},{"in":"header","name":"X-Request-ID","required":false,"description":"A globally unique identifier (GUID) for the request, which we use to de-duplicate repeated requests and to trace the request if you contact our helpdesk.\n\nMust be a universally unique identifier (UUID) (ideally version 4).\n\nMirrored back in a response header.\n\nIf you re-send a failed request, use the same value in this header.\n","schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","example":"60E0B220-8136-4CA5-AE46-1D97EF59D068"}},{"in":"header","name":"X-Correlation-ID","required":false,"description":"An optional ID which you can use to track transactions across multiple systems. It can take any value, but we recommend avoiding `.` characters.\n\nMirrored back in a response header.\n","schema":{"type":"string","example":"11C46F5F-CDEF-4865-94B2-0EE0EDCC26DA"}},{"in":"header","name":"NHSD-End-User-Organisation-ODS","required":false,"description":"The ODS code of the user.\n\nMandatory for client applications which service multiple end user organisations (EUO). This will allow the calls to be attributed to the correct EUO.\n","schema":{"type":"string","example":"Y12345"}}],"get":{"summary":"Search for a patient","operationId":"search-patient","externalDocs":{"description":"ODS codes and documentation.","url":"https://fhir.nhs.uk/Id/ods-organization-code"},"description":"## Overview\nUse this endpoint to search for a patient in PDS.\n\nYou can search using various combinations of:\n * given name\n * family name\n * gender\n * postcode\n * date of birth - which can be a range\n * date of death - which can be a range\n * registered GP practice\n * email address\n * phone number\n\n \nThere are various search options, such as fuzzy search, exact match, history and wildcards.\n\nThe behaviour of this endpoint depends on which access mode you are using:\n\n| Access mode | Behaviour |\n| ------------------------------ | ------------------------------------------ |\n| Application-restricted access | Only a single unique match returned |\n| Healthcare worker access | Up to 50 matching patient records returned |\n| Patient access | Not yet available |\n\n## Search options\nThe following sections explain the various search options.\nWhich options you choose depends very much on your use case, and getting it right is really important.\nIf you need help, [contact us](https://digital.nhs.uk/developer/help-and-support).\n\n### Application-restricted access mode\nIn this access mode, you only get a single matching patient record, and only if it's a unique match.\n\nUse search options that are likely to find a unique match. In our experience, the following is a good starting point:\n * search on given name, family name, postcode and date of birth - this combination should uniquely identify a patient\n * for given name, use the first three characters and a wildcard, for example to search for `Annabel`, use `Ann*` - this caters for different name spellings and abbreviations\n * for postcode, use the first two characters and a wildcard, for example to search for `LS11 6AD`, use `LS*` - this caters for people who have moved locally but not updated PDS\n * use a non-fuzzy search - this reduces the chance of multiple matches\n * use a non-exact match - an exact match does not work with wildcards\n * include history - this increases the chance of a match\n\nFor more details, see the following sections.\n\n### Healthcare worker access mode\nIn this access mode - where the end user is a strongly authenticated healthcare worker - you can get up to 50 matching patient records.\nThis allows the end user to choose the best match.\n\nUse search parameters that are relevant to your use case - for example date of death is not always appropriate.\n\nTo protect patient privacy, design your search to minimise the number of matching patients.\nFor example, you could:\n * encourage users to enter as many search parameters as they can\n * force users to try a non-fuzzy search first and then only offer a fuzzy search if they cannot find the patient\n\nFor more details, see the following sections.\n\n### Non-fuzzy search\nA non-fuzzy search:\n * allows wildcards in names and postcodes\n * does not match homophones or transposed names\n * can optionally search history, such as previous names and addresses\n\nIt is less likely to return multiple matches than a fuzzy search, so is more suitable for finding a unique match.\n\nThe minimum search parameters are:\n * family name - which can include wildcards\n * date of birth - which can be a range\n\n \n### Fuzzy search\nA fuzzy search:\n * matches common homophones, such as `Smith` and `Smythe`, using the [Soundex](https://en.wikipedia.org/wiki/Soundex) algorithm\n * checks for transposed names, such as `Adam Thomas` and `Thomas Adam`\n * always searches history, such as previous names and addresses\n\nIt is more likely to include multiple matches than a non-fuzzy search, so is not ideal for finding a unique match.\n\nIt is also more likely to include false positives - other patients that match the search criteria.\nTherefore, for privacy reasons, it is better to use it only if a non-fuzzy match has failed.\n\nYou must use one of the following search parameter combinations:\n * given name, family name and date of birth\n * family name, date of birth, gender and postcode\n * given name, date of birth, gender and postcode\n\nIf you include the date of death or registered GP practice query parameters, they are not used in the search. However they do affect the patient's matching score - a mismatch reduces the returned score.\n\n### History\nPDS holds historic information, including previous names and addresses.\n\nA fuzzy search always includes history. For a non-fuzzy search, you can request to include history.\n\nSearching history can match patients when only a previous name or address is known, or if a patient provides a previous name or address on the assumption that their record hasn’t been updated. When a search done on historic data results in a match, the patient's current data will be returned in the response message, not the historic data used to identify the match.\n\n### Exact match\nYou can request an exact match.\nThis might be useful if you are verifying an NHS number against details you already believe to be correct.\nIt is unlikely to work well with wildcards or fuzzy search.\n\n### Names\nMatching names can be difficult due to:\n * multiple given names, such as in `Jane Anne Smith`\n * [compound given names](https://en.wikipedia.org/wiki/Given_name#Compound), such as in `John Paul Smith`\n * multiple or double-barrelled surnames, such as in `Michael Smith-Jones`\n * homophones, such as `Smith` and `Smythe` or `Ann` and `Anne`\n * abbreviated names, such as `Bob` instead of `Robert`\n * transposed names, such as `Adam Thomas` instead of `Thomas Adam`\n * previous names, such as maiden names\n * special characters such as in `O'Reilly`, `Jones-Smith` or `Kociński`\n * spelling mistakes, either in the search criteria or in PDS\n\nTo deal with some of these issues:\n * we search across all types of name - usual, nickname and temporary\n * a fuzzy search matches homophones, transposed names and previous names\n * for a non fuzzy search, you can optionally search previous names and use wildcards. Wildcards will match against the start of the name string, for example the start of a compound name.\n\n### Gender\nPDS has four options for gender - `male`, `female`, `other` and `unknown`.\nFor some people, the gender held in PDS might not match the gender they identify with.\n\nIn these cases, searching by gender might not find the patient.\nThese are edge cases but are important to consider because gender can be a sensitive issue for the people in question.\n\nIn general, we recommend not including gender as a search parameter.\n \n### Date of birth and death\nSometimes, the exact date of birth or death is not known when doing a search.\nSometimes, the date of birth or death is not accurate in PDS.\nFor example, if only the year of birth is known, the day and month of birth might be recorded as the first of January - for example, `01/01/1932`.\n\nIn such cases, searching a range of dates can help. This can result in multiple matches, so might not work well when searching for a unique match.\n\n### Postcode\nPeople sometimes move locally, meaning the postcode in PDS is out of date, but does at least match on the first two characters.\n\nSearching for the first two characters of the postcode and a wildcard can work well. For example, to search for `LS11 6AD`, use `LS*`.\nThis is only possible for a non-fuzzy search.\n\nThis can result in multiple matches, but it has been known to work well in some cases - even for unique matches.\n\n### General practitioner\nThis is an ODS code. If you use it, it must match exactly.\n\n### Phone number and email address\nIf you use phone number and/or email address, only exact matches will be returned.\n * Wildcards are not supported\n * Only current data will be searched, unless a history search is also requested in which case the match will take into account both current and historic data\n * Email addresses are not case-sensitive.\n\n## Patient data returned\nThe patient data returned on a search is not the full set of data that is returned on a retrieval by NHS number. The following data is included:\n* NHS number\n* names - usual, nickname and temporary\n* gender\n* birth information, apart from place of birth\n* death information\n* address - home address\n* contact details\n* registered GP\n* restricted patient flag\n\nThe following data is excluded:\n* place of birth\n* names, apart from usual, nickname and temporary \n* addresses, apart from home address\n* pharmacy details\n* communication details\n* contact preferences\n\n### Restricted patients\nSome patients are tagged as [restricted](https://digital.nhs.uk/services/demographics/restricting-access-to-a-patients-demographic-record) and are sometimes known as sensitive patients. When performing a search, restricted patients can be returned; however, location sensitive fields such as `address`, `telecom`, `contact` and `generalPractitioner` are removed.\n\nIf `address-postalcode`, `address-postcode`, or `general-practitioner` are included in the search parameters, no restricted patients are returned even if a match is identified.\n\nThe restricted flag can be found in the data under `meta/security` on the patient resource.\n\n### Invalidated patients\nSome patients are marked as invalidated in PDS - also known as `redacted` in FHIR terminology. Invalidated patient records are not returned in search results.\nIf an invalidated patient record has been superseded, the superseding record is returned.\n\n## Scoring\nEvery matched patient in the result list includes a score to indicate how closely the patient matched the search parameters.\n\nA score of 1.0 indicates an exact match. A score of less than 1.0 indicates a partial match.\n\nThe result list is sorted in descending score order - best match first.\n\nUse the `_exact-match` query parameter to return exact matches only - where the score is 1.0.\n\n## Clinical safety and privacy\nThis endpoint can return multiple matching patients for a given search, including partial matches.\n\nEnsure that you design your software to minimise the following risks:\n* an end user selects the wrong patient from the results presented, so there is a risk of clinical harm; for example due to retrieval of the wrong clinical data\n* the end user has access to patients’ personal data, so there is a risk to patient privacy\n\nNote that:\n* we record an access request in our audit trail for all patients matched in a PDS search\n* it is almost certainly a good idea to display search results in descending score order - best match first\n\nPlease consider the information your application returns to users. For example a patient's temporary address can be used to perform a successful search. The home address will be included in the response. For citizen facing services please be aware of this behaviour and do not present a different address to the patient, unless they are logged in at a sufficiently high proof point.\n\n## Sandbox testing\nYou can test the following scenarios in our sandbox environment:\n\n| Scenario | Request | Response |\n| ----------------------------------------| ----------------------------------------------------------------------------------------------------------------------------------------------------------------| ------------------------------------------------------------------------|\n| Basic search with phone & email positive| `family`=`Smith`, `gender`=`female`, `birthdate`=`eq2010-10-22`, `email`=`jane.smith@example.com`, `phone`=`01632960587` | HTTP Status 200 with single search result. |\n| Basic search with phone & email negative| `family`=`Smith`, `gender`=`female`, `birthdate`=`eq2010-10-22`, `email`=`deb.trotter@example.com`, `phone`=`0121111111` | HTTP Status 200 with no search results\n| Wildcard search without phone/email | `family`=`Sm*`, `gender`=`female`, `birthdate`=`eq2010-10-22` | HTTP Status 200 with search result of two. |\n| Wildcard search with email and phone | `family`=`Sm*`, `gender`=`female`, `birthdate`=`eq2010-10-22`, `email`=`jane.smith@example.com`, `phone`=`01632960587` | HTTP Status 200 with single search result. |\n| Search with limited results | `family`=`Sm*`, `gender`=`female`, `birthdate`=`eq2010-10-22`, `email`=`jane.smith@example.com`, `phone`=`01632960587`, `_max-results`=`1` | HTTP Status 200 with single search result. |\n| Search with date range | `family`=`Smith`, `gender`=`female`, `birthdate`=`ge2010-10-21`, `birthdate`=`le2010-10-23`, `email`=`jane.smith@example.com`, `phone`=`01632960587` | HTTP Status 200 with single search result. |\n| Fuzzy search with phone and email | `family`=`Smith`, `given`=`Jane`, `gender`=`female`, `birthdate`=`eq2010-10-22`, `email`=`jane.smith@example.com`, `phone`=`01632960587`, `_fuzzy-match`=`true` | HTTP Status 200 with single search result. |\n| Fuzzy search without phone or email | `family`=`Smith`, `given`=`Jane`, `gender`=`female`, `birthdate`=`eq2010-10-22` | HTTP Status 200 with search result of two.\n| Restricted patient search | `family`=`Smythe`, `given`=`Janet`, `gender`=`female`, `birthdate`=`eq2005-06-16`, `email`=`janet.smythe@example.com`, `phone`=`01632960587` | HTTP Status 200 with single search result with restricted data omitted. |\n| Compound name search | `family`=`Smith`, `given`=`John Paul`, `given`=`James`, `gender`=`female`, `birthdate`=`eq2010-10-22`, `email`=`johnp.smith@example.com`, `phone`=`01632960587` | HTTP Status 200 with single search result. |\n| Unsuccessful search | Any other valid search query parameters | HTTP Status 200 with no search results |\n| Valid/invalid search criteria | `family`=`Sm*`, `gender`=`female`, 'invalidParam'='123', `birthdate`=`eq2010-10-22`, `email`=`j.smith@example.com`, `phone`=`0163` | HTTP Status 400 with problem description |\n| Unsuccessful search on email/phone only | `email`=`j.smith@example.com`, `phone`=`0163` | HTTP Status 400 with problem description |\n| Invalid date format | `birthdate` or `death-date` query parameters with values not in format `YYYY-MM-DD` | HTTP Status 400 with problem description |\n| Too few search parameters | Any invalid combination of query parameters | HTTP Status 400 with problem description |\n| Missing X-Request-ID | `id`=`9000000009` (or any other valid NHS number) | HTTP Status 412 with problem description |\n\nYou can try out the sandbox using the 'Try this API' feature on this page.\n\nAlternatively, you can try out the sandbox using our Postman collection:\n\n\n[![Run in Postman](https://run.pstmn.io/button.svg)](https://app.getpostman.com/run-collection/a1ce1b055839caa384a8?action=collection%2Fimport)\n","parameters":[{"name":"_fuzzy-match","description":"A fuzzy search is performed, including checks for homophones, transposed names and historic information.\n\nYou cannot use wildcards with a fuzzy search.\n","example":false,"in":"query","required":false,"schema":{"type":"boolean","default":false}},{"name":"_exact-match","description":"The search only returns results where the `score` field is 1.0. Use this with care - it is unlikely to work with fuzzy search or wildcards.","example":false,"in":"query","required":false,"schema":{"type":"boolean","default":false}},{"name":"_history","description":"The search looks for matches in historic information such as previous names and addresses.\n\nThis parameter has no effect for a fuzzy search, which always includes historic information.\n","example":true,"in":"query","required":false,"schema":{"type":"boolean","default":false}},{"name":"_max-results","description":"The maximum number of matching patients to return. For healthcare worker access, this must be between 1 and 50, and the default is 50.\nFor application-restricted access, this must be 1, and the default is 1.\nIf too many patients match the search criteria, we return a `TOO_MANY_MATCHES` error.\n","example":1,"in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"family","description":"The patient's family name (surname).\n\nNot case sensitive. Max 35 characters.\nUse `*` as a wildcard but not in the first two characters and not in fuzzy search mode.\nMust be [URL encoded](https://en.wikipedia.org/wiki/Percent-encoding), for example a space must be represented by either `%20` or `+` and a wildcard must be encoded as `%2A`.\n","examples":{"simple":{"value":"Smith","summary":"Matches Smythe if `_fuzzy-match` is specified."},"wildcarded":{"value":"Sm*t*","summary":"Wildcards must contain at least two characters, this matches Smith, Smythe"}},"in":"query","required":false,"schema":{"type":"string"}},{"name":"given","description":"The patient's given names.\n\nNot case sensitive. Max 35 characters.\nUse `*` as a wildcard but not in the first two characters and not in fuzzy search mode.\nWildcard searches will match the start of the first given name and not subsequent given names, for example the given names \"Alan Michael\" can be searched with \"Ala*\" but not \"Mic*\".\nMust be [URL encoded](https://en.wikipedia.org/wiki/Percent-encoding), for example a space must be represented by either `%20` or `+` and a wildcard must be encoded as `%2A`.\n\nA patient may have more than one given name. Subsequent given names are commonly referred to as 'middle names'.\nSpecify multiple given names by repeating this parameter.\nTo search for `Jane Anne Smith` use `given=Jane&given=Anne&family=Smith`.\n\nThe first given name may be a [compound name](https://en.wikipedia.org/wiki/Given_name#Compound), for example `John Paul`.\nTo search for `John Paul James Smith` (where `John Paul` is the first given name, `James` is the second given name, and `Smith` the family name) use `given=John%20Paul&given=James&family=Smith`.\n\nNote that it is not necessary to specify subsequent given (middle) names, and that doing so may impact your search results in the case they are not recorded in the demographics system.\n","example":"Jane","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"}}},{"name":"gender","description":"Gender with which the patient most strongly identifies.","example":"female","in":"query","required":false,"schema":{"type":"string","enum":["male","female","other","unknown"],"example":"female"}},{"name":"birthdate","in":"query","description":"Date of birth in the format `yyyy-mm-dd`. To specify a range, use `birthdate=geyyyy-mm-dd&birthdate=leyyyy-mm-dd`.","examples":{"simple":{"value":["eq2010-10-22"],"description":"Exact match date"},"rangege":{"value":["ge2010-10-22"],"description":"Greater than or equals match, which matches 2010-10-22 or 2010-10-23"},"rangele":{"value":["le2010-10-22"],"description":"Less than or equals match, which matches 2010-10-22 or 2010-10-21"}},"required":false,"schema":{"type":"array","items":{"type":"string"}}},{"name":"death-date","in":"query","description":"Date of death in the format `yyyy-mm-dd`. To specify a range, use `death-date=geyyyy-mm-dd&death-date=leyyyy-mm-dd`.\n\nFor a fuzzy search, this is ignored for matching but included in the score calculation.\n","examples":{"simple":{"value":"eq2010-10-22","description":"Exact match date"},"rangege":{"value":"ge2010-10-22","description":"Greater than or equals match which matches 2010-10-22 or 2010-10-23"},"rangele":{"value":"le2010-10-22","description":"Less than or equals match, which matches 2010-10-22 or 2010-10-21"}},"required":false,"schema":{"type":"string","format":"date"}},{"name":"address-postalcode","description":"The postcode of any of the patient’s known addresses.\n\nNot case sensitive.\nSpaces are ignored, for example `LS16AE` and `LS1 6AE` both match `LS1 6AE`.\nUse `*` as a wildcard but not in the first two characters and not in fuzzy search mode.\nMust be [URL encoded](https://en.wikipedia.org/wiki/Percent-encoding), for example a space must be represented by either `%20` or `+` and a wildcard must be encoded as `%2A`.\n","examples":{"simple":{"value":"LS1 6AE","summary":"Spaces ignored, would match LS16AE"},"wildcarded":{"value":"LS1*","summary":"Matches 'LS16AE', 'LS1 6AE' and 'LS1 6AB'"}},"in":"query","required":false,"schema":{"type":"string"}},{"name":"address-postcode","description":"**N.B. that address-postcode will be deprecated in the future, address-postalcode should be used instead. \nIf both address-postcode and address-postalcode are provided, an INVALID_SEARCH_DATA error will be returned.**\nThe postcode of any of the patient’s known addresses.\n\nNot case sensitive.\nSpaces are ignored, for example `LS16AE` and `LS1 6AE` both match `LS1 6AE`.\nUse `*` as a wildcard but not in the first two characters and not in fuzzy search mode.\nMust be [URL encoded](https://en.wikipedia.org/wiki/Percent-encoding), for example a space must be represented by either `%20` or `+` and a wildcard must be encoded as `%2A`.\n","examples":{"simple":{"value":"LS1 6AE","summary":"Spaces ignored, would match LS16AE"},"wildcarded":{"value":"LS1*","summary":"Matches 'LS16AE', 'LS1 6AE' and 'LS1 6AB'"}},"in":"query","required":false,"schema":{"type":"string"}},{"name":"general-practitioner","description":"The Organisation Data Service (ODS) code of the patient's registered GP practice.\n\nNot case sensitive.\nFor a fuzzy search, this is ignored for matching but included in the score calculation.\n","example":"Y12345","in":"query","required":false,"schema":{"type":"string"}},{"name":"email","description":"Email address\n","example":"jane.smith@example.com","in":"query","required":false,"schema":{"type":"string"}},{"name":"phone","description":"Phone number\n","example":"01632960587","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"A completed search. This might contain zero, one or many matching patients, or it might contain a 'TOO_MANY_MATCHES' error.\n","headers":{"X-Correlation-Id":{"schema":{"type":"string","example":"11C46F5F-CDEF-4865-94B2-0EE0EDCC26DA"},"description":"The X-Correlation-ID from the request header, if supplied, mirrored back.\n"},"X-Request-Id":{"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","example":"60E0B220-8136-4CA5-AE46-1D97EF59D068"},"description":"The X-Request-ID from the request header, if supplied, mirrored back.\n"}},"content":{"application/fhir+json":{"schema":{"type":"object","properties":{"resourceType":{"type":"string","description":"FHIR Resource Type.","default":"Bundle"},"type":{"type":"string","description":"FHIR Bundle Type.","default":"searchset"},"timestamp":{"type":"string","description":"Time the search was performed.","format":"datetime","example":"2019-12-25T12:00:00+00:00"},"total":{"type":"integer","description":"Number of resources returned in search.","example":1},"entry":{"type":"array","description":"A list of matched patients. Empty if none found. The patients are ordered by match score, best first. A maximum of 50 patients are returned.\n","items":{"type":"object","properties":{"fullUrl":{"type":"string","description":"Absolute URL of the resource described in this item.","example":"https://api.service.nhs.uk/personal-demographics/FHIR/R4/Patient/9000000009"},"search":{"type":"object","properties":{"score":{"description":"Search score from 0.0 to 1.0.","type":"number","minimum":0,"maximum":1,"example":0.75}}},"resource":{"type":"object","additionalProperties":false,"properties":{"resourceType":{"type":"string","description":"FHIR resource type.","default":"Patient"},"id":{"description":"The patient's NHS number. The primary identifier of a patient, unique within NHS England and Wales. Always 10 digits and must be a [valid NHS number](https://www.datadictionary.nhs.uk/attributes/nhs_number.html).","type":"string","pattern":"^\\d{10}$","example":"9000000009"},"identifier":{"type":"array","description":"Identifier and system of identification used for this Patient.","items":{"type":"object","maxItems":1,"required":["value"],"properties":{"system":{"type":"string","format":"url","description":"System identifier belongs to.","default":"https://fhir.nhs.uk/Id/nhs-number"},"value":{"description":"The patient's NHS number. The primary identifier of a patient, unique within NHS England and Wales. Always 10 digits and must be a [valid NHS number](https://www.datadictionary.nhs.uk/attributes/nhs_number.html).","type":"string","pattern":"^\\d{10}$","example":"9000000009"},"extension":{"type":"array","description":"FHIR extensions.","items":{"type":"object","description":"Status indicating if NHS number is present and verified.","properties":{"url":{"type":"string","description":"URL of the extension definition.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSNumberVerificationStatus","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSNumberVerificationStatus"]},"valueCodeableConcept":{"type":"object","description":"NHS Number Verification Status Indicator.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URI of the coding system specification.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-NHSNumberVerificationStatus"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1.0.0"},"code":{"type":"string","description":"Symbol in syntax defined by the system.","example":"01"},"display":{"type":"string","description":"Representation defined by the system.","example":"Number present and verified"}}}}}}}}}}}},"meta":{"type":"object","description":"Metadata about this resource.","properties":{"versionId":{"type":"string","description":"The NHS England assigned version of the patient resource.","example":"2"},"security":{"type":"array","description":"The level of security on the patients record, which affects which fields are populated on retrieval. The possible responses are:\n* U - unrestricted. All available data is returned.\n* R - restricted. Any sensitive data around the patient's location, so `address`, `generalPractitioner` and `telecom`, are removed from the response.\n* REDACTED - redacted. The patient record has been marked as invalid, so the data should not be used. This code is never returned; you receive a 404, and appropriate error response, if an invalidated patient retrieval is attempted.\n","maxItems":1,"items":{"type":"object","properties":{"system":{"type":"string","description":"URI of the value set specification.","example":"http://terminology.hl7.org/CodeSystem/v3-Confidentiality"},"code":{"type":"string","description":"Code defined by the system value set.","enum":["U","R","V","REDACTED"],"example":"U"},"display":{"type":"string","description":"Representation defined by the system.","enum":["unrestricted","restricted","redacted"],"example":"unrestricted"}}}}}},"name":{"type":"array","description":"List of names associated with the patient.\nThis is only fully populated on a retrieval or a successful update, only the `usual`, `nickname` and `temp` names are returned on a search. \n","minItems":1,"items":{"type":"object","required":["use","family"],"additionalProperties":false,"properties":{"id":{"type":"string","description":"Unique object identifier for this name.","example":"123"},"use":{"type":"string","description":"How this name should be used.\n* usual - Known as, conventional or the one patient normally uses. A patient always has a usual name.\n* temp - An alias or temporary name. This may also be used for temporary names assigned at birth or in emergency situations.\n* nickname - A name that the patient prefers to be addressed by, but is not part of their usual name.\n* old - This name is no longer in use (or was never correct, but retained for records).\n* maiden - Name changed for Marriage. A name used prior to changing name because of marriage. This term is not gender specific. The use of this term does not imply any particular history for a person's name.\n\nThe following use codes are included in the [name-use](https://www.hl7.org/fhir/valueset-name-use.html) value set, but should not be used and is not be returned as part of a retrieval.\n* official - The formal name as registered in an official (government) registry, but which name might not be commonly used. May be called \"legal name\".\n* anonymous - Anonymous assigned name, alias, or pseudonym (used to protect a person's identity for privacy reasons).\n","enum":["usual","temp","nickname","old","maiden"],"example":"usual"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"given":{"type":"array","maxItems":5,"description":"Given names, including any middle names.\n\nEach name(s) should be a separate item in the list. The first given name may include multiple names, separated by a space.\nSubsequent names must be broken down into list items. For example, the input `[Jane Marie Anne, Jo Adele]` returns `[Jane Marie Anne, Jo, Adele]`.\n","example":["Jane Marie Anne","Jo","Adele"],"items":{"type":"string","maxLength":35,"example":"Jane"}},"family":{"type":"string","maxLength":35,"description":"Family name (often called Surname).","example":"Smith"},"prefix":{"type":"array","description":"Name prefixes, titles, and prenominals.","example":["Mrs"],"items":{"type":"string","example":"Mrs"}},"suffix":{"type":"array","description":"Name suffices and postnominals.","example":["MBE","PhD"],"items":{"type":"string","example":"MBE"}}}}},"gender":{"type":"string","description":"Classification of the gender of a patient. The classification is phenotypical rather than genotypical, i.e. it does not provide codes for medical or scientific purposes.\nIt is the administrative gender that the patient wishes to be known as. In some cases, this may not be the same as the patient’s registered birth gender, or their current clinical gender.\n","enum":["male","female","other","unknown"],"example":"female"},"birthDate":{"description":"The date on which the patient was born or is officially deemed to have been born.\n\nIt is a date in the format `yyyy-mm-dd`. Due to data quality issues on a small number of patients `yyyy-mm` and `yyyy` format may also be returned. \n","example":"2010-10-22","type":"string","format":"date"},"multipleBirthInteger":{"type":"integer","minimum":1,"maximum":9,"description":"The order in which the patient was born, with 1 indicating the first or only birth in the sequence, 2 indicating the second birth in the sequence, 3 indicating the third, and so on up to 7.\n\nThere are two other valid values; `8` meaning `Not applicable` and `9` meaning `Not known`.\n","example":1},"deceasedDateTime":{"description":"The date and time on which a person died or is officially deemed to have died, if applicable and known.\n\nIt is a datetime in the format `yyyy-mm-ddTHH:MM:SS+HH:MM` or `yyyy-mm-dd`. Due to data quality issues on a small number of patients `yyyy-mm` and `yyyy` format may also be returned.\n","example":"2010-10-22T00:00:00+00:00","type":"string","format":"date-time","pattern":"^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2}\\+\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2}\\+\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01]))$"},"address":{"type":"array","description":"List of addresses associated with the patient.\n\nThis is only fully populated on a retrieval or a successful update, only the `home` address is returned on a search.\nWhen a patient tagged as `restricted` is retrieved, all addresses are removed from the response.\n","items":{"type":"object","description":"An address associated with the patient.","required":["use"],"properties":{"id":{"type":"string","description":"Unique system identifier for this address.","example":"456"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"use":{"type":"string","description":"Purpose of this address:\n * `home` - the home address is the patient's normal residence. Home address is also known as usual, main, registered, current or permanent address\n * `temp` - a temporary address is an address used for a set period of time, but where the patient's home, permanent address remains unchanged\n * `billing` - an address used for correspondence purposes only\n * `work` - an office address. This can be returned due to legacy data but cannot be added or replaced on update\n\n A patient should have no more than one current `temp` and/or `billing` address.\n However, historically this was constrained only by the integration requirements and was not enforced so theoretically more than one can exist for a patient when retrieving.\n Where multiple instances already exist for the patient it is not expected that local systems should manage those, but should choose the most appropriate one to maintain (e.g. by examining period dates).\n\n A `home` address is the patient's main residential address and should normally be used for all clinical and demographic purposes, including clinical and appointment correspondence.\n However additionally, `temp` and `billing` addresses may be provided by a patient when there is a requirement to record an alternative location for the purposes of unbroken care.\n When sending correspondence to a patient:\n *\ta present and valid `billing` address may take precedence over `home` and `temp` addresses. A patient should have only a single current `billing` address. An address is considered 'valid' according to its period start and end dates.\n *\tif no current `billing` address is provided, a `temp` address may take precedence over the `home` address, again if it is valid according to its period start and end dates.\n * if there is no valid, current `billing` and/or `temp` address, the `home` address must be used.\n","enum":["home","work","temp","billing"],"example":"home"},"text":{"type":"string","description":"Where a `temp` address is provided a descriptor text must be sent.\nThe list of possible values are:\n* `Second Home` - a patient's second home\n* `Student Accommodation` - a patient's place of residence while at university\n* `Respite Care Address` - where the patient resides during respite care\n* `Temporary Residence Address` - where the patient resides for a specific period of time\n* `Convalescence Home` - the address for a patient during a period of recovery\n* `Mobile Home` - the address of a patient's mobile home, parked for a specific period of time, e.g. the address of a caravan park\n* `Holiday Home` - the address for a patient during a holiday\n\nA patient can also register temporarily at a GP practice using a temporary address. Temporary GP registration information does not appear on the PDS, but the address used for it may.\n","enum":["Second Home","Student Accommodation","Respite Care Address","Temporary Residence Address","Convalescence Home","Mobile Home","Holiday Home"],"example":"Student Accommodation"},"line":{"type":"array","description":"All lines of the address except the postal code.\n\nSystems must apply the following formatting convention when adding or replacing addresses lines:\n*\tline 1 - premises ID and/or house name, e.g. `Flat 1` or `The Old Schoolhouse`\n*\tline 2 - house number, dependent thoroughfare name and descriptor (if present), thoroughfare name and descriptor, e.g. `23 Mill Lane`\n*\tline 3 - dependent locality/village, locality (if present), e.g. `Boxgrove`\n*\tline 4 - post town, e.g. `Leeds`\n*\tline 5 - county (if present), e.g. `West Yorkshire`\n\nIf any of the lines are blank, they are not returned due to FHIR conformance constraints.\n","maxItems":5,"items":{"type":"string"},"example":["1 Trevelyan Square","Boar Lane","City Centre","Leeds","West Yorkshire"]},"postalCode":{"type":"string","description":"Postal code of the address.","example":"LS1 6AE"},"extension":{"type":"array","description":"List of address keys formatted as a FHIR extension. This can include up to one Unique Property Reference Number (UPRN), and up to one Postal Address File (PAF) key. If no keys for the address are known, the array will be empty. Otherwise it will be a list of objects which specify the value of the address key and the code system for it","items":{"anyOf":[{"type":"object","description":"Unique identifier for an address.","properties":{"url":{"type":"string","description":"URL of specification of the AddressKey extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey"]},"extension":{"type":"array","description":"Specification of address key system and address key value. Contains exactly two items: one describing the code system the Address Key uses, and the other specifying the value of the Address Key.","minItems":2,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Coding system of the address key.","required":["url","valueCoding"],"properties":{"url":{"type":"string","description":"Always 'type'.","default":"type"},"valueCoding":{"type":"object","description":"URL of specification of address key format.","required":["system","code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available Address Key formats.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType"},"code":{"type":"string","description":"Address Key system. Always 'PAF'.","enum":["PAF"],"example":"PAF"}}}}},{"type":"object","description":"Value of the address key.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Always 'value'.","default":"value","example":"value"},"valueString":{"type":"string","description":"Address key in PAF format. An 8 digit number including leading zeroes, formatted as a string.","minLength":8,"maxLength":8,"pattern":"^[0-9]{8}$","example":"12345678"}}}]}}}},{"type":"object","description":"Unique identifier for an address.","properties":{"url":{"type":"string","description":"URL of specification of the AddressKey extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey"]},"extension":{"type":"array","description":"Specification of address key system and address key value. Contains exactly two items: one describing the code system the Address Key uses, and the other specifying the value of the Address Key.","minItems":2,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Coding system of the address key.","required":["url","valueCoding"],"properties":{"url":{"type":"string","description":"Always 'type'.","default":"type"},"valueCoding":{"type":"object","description":"URL of specification of address key format.","required":["system","code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available Address Key formats.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType"},"code":{"type":"string","description":"Address Key system. Always 'UPRN'.","enum":["UPRN"],"example":"UPRN"}}}}},{"type":"object","description":"Value of the address key.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Always 'value'.","default":"value","example":"value"},"valueString":{"type":"string","description":"Address key in UPRN format. A number containing from 1 up to 12 digits.","minLength":1,"maxLength":12,"pattern":"^[0-9]{1,12}$","example":"123456789012"}}}]}}}}]}}}}},"telecom":{"type":"array","description":"List of contact points for the patient; for example, phone numbers or email addresses.\nWhen a patient tagged as `restricted` is retrieved, all contact points are removed from the response.\n","items":{"description":"A contact point, such as a phone number or email address","type":"object","required":["system","value"],"properties":{"id":{"type":"string","description":"Unique object identifier for this contact point.","example":"789"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"system":{"description":"Means of communication, such as phone or email.","type":"string","enum":["phone","fax","email","other"],"example":"phone"},"value":{"description":"Phone number, email address, or other identifier for use with contact system.","type":"string","example":"01632960587"},"use":{"type":"string","description":"Location associated with communication system.","enum":["home","work","temp","mobile"],"example":"home"},"extension":{"type":"array","maxItems":1,"description":"Extension that is returned when the communication type is `textphone`. The only code returned is `textphone`, which means `Minicom (Textphone)`.\n\nThe `system` is `other` when the extension is included.\n","items":{"type":"object","description":"Wrapped object for other contact system details.","properties":{"url":{"type":"string","description":"Definition of other contact system extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem"]},"valueCoding":{"type":"object","description":"URL of specification of other contact systems.","properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem"},"code":{"type":"string","description":"Coded value for the other contact system in place.","example":"textphone"},"display":{"description":"Display-friendly representation of the other contact system code.","type":"string","example":"Minicom (Textphone)"}}}}}}}}},"contact":{"type":"array","description":"A list of patient contacts. Only emergency contacts are returned. Any other contacts are returned on the patients `Related Person`.\nWhen a patient tagged as `restricted` is retrieved, all contacts are removed from the response.\n","items":{"title":"Schema for a patient contact.","type":"object","additionalProperties":false,"required":["relationship","telecom"],"properties":{"id":{"type":"string","example":"C123"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"relationship":{"type":"array","description":"The contact relationship wrapper object that holds the details of the relationship to the patient.\n\nThis is only returned when an Emergency Contact number has been set on `telecom`. The only valid code is `C`, which means `Emergency Contact`.\n","minItems":1,"maxItems":1,"items":{"type":"object","required":["coding"],"properties":{"coding":{"type":"array","description":"Exactly one contact relationship.","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","format":"url","default":"http://terminology.hl7.org/CodeSystem/v2-0131"},"code":{"type":"string","description":"Coded value for contact relationship.","example":"C"},"display":{"type":"string","description":"Display-friendly representation of the contact relationship code.","example":"Emergency Contact"}}}}}}},"telecom":{"type":"array","description":"List of Telecom objects on the contact only contains `system` and `value`.\n","items":{"description":"A contact point, such as a phone number or email address","type":"object","required":["system","value"],"properties":{"id":{"type":"string","description":"Unique object identifier for this contact point.","example":"789"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"system":{"description":"Means of communication, such as phone or email.","type":"string","enum":["phone","fax","email","other"],"example":"phone"},"value":{"description":"Phone number, email address, or other identifier for use with contact system.","type":"string","example":"01632960587"},"use":{"type":"string","description":"Location associated with communication system.","enum":["home","work","temp","mobile"],"example":"home"},"extension":{"type":"array","maxItems":1,"description":"Extension that is returned when the communication type is `textphone`. The only code returned is `textphone`, which means `Minicom (Textphone)`.\n\nThe `system` is `other` when the extension is included.\n","items":{"type":"object","description":"Wrapped object for other contact system details.","properties":{"url":{"type":"string","description":"Definition of other contact system extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem"]},"valueCoding":{"type":"object","description":"URL of specification of other contact systems.","properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem"},"code":{"type":"string","description":"Coded value for the other contact system in place.","example":"textphone"},"display":{"description":"Display-friendly representation of the other contact system code.","type":"string","example":"Minicom (Textphone)"}}}}}}}}}}}},"generalPractitioner":{"type":"array","maxItems":1,"description":"General Practice (not practitioner) with which the patient is, or was, registered. Always contains zero or one general practitioner object.\nWhen a patient tagged as `restricted` is retrieved, the General Practice is removed from the response.\n","items":{"description":"General practice (not practitioner) with which the patient is or was registered.","type":"object","required":["identifier"],"properties":{"id":{"description":"Object identifier (OID) specific to the returned details - this should be return exactly the same in any update.","type":"string","example":"254406A3"},"type":{"description":"Type of Reference being returned.","type":"string","example":"Organization"},"identifier":{"description":"Identifier and system of identification used for this Organisation.","type":"object","required":["value"],"properties":{"system":{"description":"URL for the Organisation Data Service - who are responsible for publishing codes that identify organisations and individuals across health and social care.","type":"string","example":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"description":"Organisation code for the registered general practice, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","type":"string","pattern":"^[0-9A-Z]+$","example":"Y12345"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}}}}}}},"extension":{"type":"array","description":"Wrapper array for the patient's death notification status; this is a FHIR extension. Always contains zero or one death notification status object.\n","items":{"anyOf":[{"type":"object","description":"Wrapper object for death notification details.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of death notification extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus"]},"extension":{"type":"array","description":"Array containing exactly one death notification status code object and exactly one effective date object.","minItems":1,"maxItems":2,"items":{"oneOf":[{"type":"object","description":"Wrapper object for death notification status code.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `deathNotificationStatus`.","default":"deathNotificationStatus","enum":["deathNotificationStatus"]},"valueCodeableConcept":{"type":"object","description":"Death Notification Status.","properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["system","code"],"properties":{"system":{"type":"string","description":"URI of the coding system specification.","example":"https://fhir.hl7.org.uk/CodeSystem/UKCore-DeathNotificationStatus"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1.0.0"},"code":{"type":"string","description":"Symbol, in syntax, defined by the system:\n* `1` - Informal - death notice received via an update from a local NHS Organisation such as GP or Trust\n* `2` - Formal - death notice received from Registrar of Deaths. Only these endpoints are allowed to add a Formal death:\n - National Back Office using the Demographic Spine Application (DSA)\n - Office of National Statistics (ONS)\n - Maternity sites\n* `U` - Removed. This is a possible response, but it cannot be used on an update because Spine will reject it\n","example":"2","enum":["1","2","U"]},"display":{"type":"string","description":"Representation defined by the system.","example":"Formal - death notice received from Registrar of Deaths","enum":["Informal - death notice received via an update from a local NHS Organisation such as GP or Trust","Formal - death notice received from Registrar of Deaths","Removed"]}}}}}}}},{"type":"object","description":"Wrapper object for death notification effective date.","required":["url","valueDateTime"],"properties":{"url":{"type":"string","description":"Key of this object. Always `systemEffectiveDate`.","default":"systemEffectiveDate","enum":["systemEffectiveDate"]},"valueDateTime":{"type":"string","description":"Date and time at which death notification status took effect.","format":"date-time","example":"2010-10-22T00:00:00+00:00"}}}]}}}}]}}}}}}}}},"example":{"resourceType":"Bundle","type":"searchset","timestamp":"2019-12-25T12:00:00+00:00","total":1,"entry":[{"fullUrl":"https://api.service.nhs.uk/personal-demographics/FHIR/R4/Patient/9000000009","search":{"score":0.75},"resource":{"resourceType":"Patient","id":"9000000009","identifier":[{"system":"https://fhir.nhs.uk/Id/nhs-number","value":"9000000009","extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSNumberVerificationStatus","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-NHSNumberVerificationStatus","version":"1.0.0","code":"01","display":"Number present and verified"}]}}]}],"meta":{"versionId":"2","security":[{"system":"http://terminology.hl7.org/CodeSystem/v3-Confidentiality","code":"U","display":"unrestricted"}]},"name":[{"id":"123","use":"usual","period":{"start":"2020-01-01","end":"2021-12-31"},"given":["Jane"],"family":"Smith","prefix":["Mrs"],"suffix":["MBE"]}],"gender":"female","birthDate":"2010-10-22","multipleBirthInteger":1,"deceasedDateTime":"2010-10-22T00:00:00+00:00","address":[{"id":"456","period":{"start":"2020-01-01","end":"2021-12-31"},"use":"home","line":["1 Trevelyan Square","Boar Lane","City Centre","Leeds","West Yorkshire"],"postalCode":"LS1 6AE","extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","extension":[{"url":"type","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType","code":"PAF"}},{"url":"value","valueString":"12345678"}]},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","extension":[{"url":"type","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType","code":"UPRN"}},{"url":"value","valueString":"123456789012"}]}]}],"telecom":[{"id":"789","period":{"start":"2020-01-01","end":"2021-12-31"},"system":"phone","value":"01632960587","use":"home"},{"id":"790","period":{"start":"2019-01-01","end":"2022-12-31"},"system":"email","value":"jane.smith@example.com","use":"home"},{"id":"OC789","period":{"start":"2020-01-01","end":"2021-12-31"},"system":"other","value":"01632960587","use":"home","extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem","code":"textphone","display":"Minicom (Textphone)"}}]}],"contact":[{"id":"C123","period":{"start":"2020-01-01","end":"2021-12-31"},"relationship":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0131","code":"C","display":"Emergency Contact"}]}],"telecom":[{"system":"phone","value":"01632960587"}]}],"generalPractitioner":[{"id":"254406A3","type":"Organization","identifier":{"system":"https://fhir.nhs.uk/Id/ods-organization-code","value":"Y12345","period":{"start":"2020-01-01","end":"2021-12-31"}}}],"extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus","extension":[{"url":"deathNotificationStatus","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-DeathNotificationStatus","version":"1.0.0","code":"2","display":"Formal - death notice received from Registrar of Deaths"}]}},{"url":"systemEffectiveDate","valueDateTime":"2010-10-22T00:00:00+00:00"}]}]}}]}}}},"4XX":{"description":"An error occurred as follows:\n\n| HTTP status | Error code | Description |\n| ----------- | -------------------------- | --------------------------------------------- |\n| 200 | TOO_MANY_MATCHES | Too many matches were found - user should be told to refine their search parameters.\t|\n| 400 | INVALID_SEARCH_DATA\t | Invalid combination of search parameters. For details, see the `diagnostics` field. |\n| 400 | UNSUPPORTED_SERVICE | No search parameters provided. |\n| 400 | MISSING_VALUE | Missing header or query parameter. For details, see the `diagnostics` field. |\n| 400 | INVALID_VALUE | Invalid header or query parameter. For details, see the `diagnostics` field. |\n| 400 | ADDITIONAL_PROPERTIES | Unrecognised query parameter. For details, see the `diagnostics` field. |\n| 401 | ACCESS_DENIED | Access token missing, invalid or expired, or calling application not configured for this operation. |\n| 403 | INVALID_VALUE | Multiple results requested when using the API in application-restricted mode. |\n| 408 | UNABLE_TO_CALL_SERVICE | The downstream domain processing has not completed within the configured timeout period. |\n| 429 | TOO_MANY_REQUESTS | You have exceeded your application's [rate limit](https://digital.nhs.uk/developer/guides-and-documentation/reference-guide#rate-limits). |\n","content":{"application/fhir+json":{"schema":{"type":"object","description":"Outcome of an operation that does not result in a resource or bundle being returned, for example an error or an async/batch submission.\nThere are a number of possible error codes that can be returned along with a more detailed description in the `display` field.\n","properties":{"resourceType":{"type":"string","description":"FHIR Resource Type.","default":"OperationOutcome"},"issue":{"type":"array","description":"List of issues that have occurred.","minItems":1,"items":{"type":"object","required":["severity","code"],"properties":{"severity":{"type":"string","enum":["fatal","error","warning","information"],"description":"Severity of the error.","example":"error"},"code":{"type":"string","description":"FHIR error code.","example":"invalid","enum":["invalid","structure","required","value","invariant","security","login","unknown","expired","forbidden","suppressed","processing","not-supported","duplicate","multiple-matches","not-found","deleted","too-long","code-invalid","extension","too-costly","business-rule","conflict","transient","lock-error","no-store","exception","timeout","incomplete","throttled","informational"]},"details":{"type":"object","description":"Internal error code.","properties":{"coding":{"type":"array","items":{"type":"object","properties":{"system":{"type":"string","description":"URI of the coding system specification.","example":"https://fhir.nhs.uk/R4/CodeSystem/Spine-ErrorOrWarningCode"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1"},"code":{"type":"string","description":"Symbol in syntax defined by the system.","example":"INVALID_VALUE"},"display":{"type":"string","description":"Representation defined by the system.","example":"Provided value is invalid"}}}}}},"diagnostics":{"type":"string","description":"Additional diagnostic information about the issue. This information is subject to change.","example":"Invalid value - 2019-01 in field 'birthDate'"},"expression":{"type":"string","description":"FHIRPath of element(s) related to the error.","example":"Patient.name.given"}}}}}},"example":{"resourceType":"OperationOutcome","issue":[{"severity":"error","code":"value","details":{"coding":[{"system":"https://fhir.nhs.uk/R4/CodeSystem/Spine-ErrorOrWarningCode","version":"1","code":"INVALID_VALUE","display":"Provided value is invalid"}]},"diagnostics":"Invalid value - 'mal' in field 'gender'"}]}}}}}}},"/Patient/{id}":{"parameters":[{"name":"id","in":"path","description":"The patient's NHS number. The primary identifier of a patient, unique within NHS England and Wales. Always 10 digits and must be a [valid NHS number](https://www.datadictionary.nhs.uk/attributes/nhs_number.html).","required":true,"schema":{"type":"string","example":"9000000009"}},{"in":"header","name":"Authorization","description":"An [OAuth 2.0 bearer token](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation#user-restricted-apis).\n\nRequired in all environments except sandbox.\n","required":false,"schema":{"type":"string","format":"^Bearer\\ [[:ascii:]]+$","example":"Bearer g1112R_ccQ1Ebbb4gtHBP1aaaNM"}},{"in":"header","name":"NHSD-Session-URID","description":"\nThe user role ID (URID) for the current session. Also known as a user role profile ID (URPID).\n\nThis header is optional.\n\nIn Application-restricted access mode this header is ignored.\n\nIn Healthcare worker access mode if you send this header it must be valid for the logged-in user. See [determine the user's role](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation/user-restricted-restful-apis-nhs-cis2-separate-authentication-and-authorisation#step-9-determine-the-user-s-role) for guidance.\n","required":false,"schema":{"type":"string","pattern":"^[0-9]+$","example":"555254240100"}},{"in":"header","name":"X-Request-ID","required":false,"description":"A globally unique identifier (GUID) for the request, which we use to de-duplicate repeated requests and to trace the request if you contact our helpdesk.\n\nMust be a universally unique identifier (UUID) (ideally version 4).\n\nMirrored back in a response header.\n\nIf you re-send a failed request, use the same value in this header.\n","schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","example":"60E0B220-8136-4CA5-AE46-1D97EF59D068"}},{"in":"header","name":"X-Correlation-ID","required":false,"description":"An optional ID which you can use to track transactions across multiple systems. It can take any value, but we recommend avoiding `.` characters.\n\nMirrored back in a response header.\n","schema":{"type":"string","example":"11C46F5F-CDEF-4865-94B2-0EE0EDCC26DA"}},{"in":"header","name":"NHSD-End-User-Organisation-ODS","required":false,"description":"The ODS code of the user.\n\nMandatory for client applications which service multiple end user organisations (EUO). This will allow the calls to be attributed to the correct EUO.\n","schema":{"type":"string","example":"Y12345"}}],"get":{"description":"## Overview\nUse this endpoint to get patient details from PDS for a given NHS number.\n\nYou cannot get a patient's related people details, use the RelatedPerson endpoint instead.\n\n## Superseded patients\nSome patients are marked as superseded, this means that for some reason the original resource is no longer valid and has been replaced with a different resource.\n\nOn retrieval of a superseded resource, the new resource is automatically returned in place of the requested resource. You can spot a superseded resource when the `id` is not the same as the one requested.\n\nWhen retrieving a superseding resource you must update your system with the new resource and remove the superseded resource, ensuring that the same `id` does not exist against another resource in your system.\n\n## Restricted patients\nSome patients are tagged as [restricted](https://digital.nhs.uk/services/demographics/restricting-access-to-a-patients-demographic-record) and are sometimes known as sensitive patients. Restricted patients can be retrieved; however, location sensitive fields such as `address`, `telecom` and `generalPractitioner` are removed.\n\nThe restricted flag can be found in the data under `meta/security` on the patient resource.\n\n## Sandbox test scenarios\nYou can test the following scenarios in our sandbox environment:\n\n| Scenario | Request | Response |\n| -------------------------------- | ------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |\n| Patient exists | `id`=`9000000009` | HTTP Status 200 with patient data in response |\n| Sensitive patient exists | `id`=`9000000025` | HTTP Status 200 with patient data in response with the restricted data removed |\n| Patient exists with minimal data | `id`=`9000000033` | HTTP Status 200 with patient data in response, there will be very little data so can be used as an example of a patient with bad data quality |\n| Patient does not exist | `id`=`9111231130` (or any other valid NHS number) | HTTP Status 404 with problem description |\n| Invalid NHS number | `id`=`9000000000` (or any invalid NHS number) | HTTP Status 400 with problem description |\n| Missing X-Request-ID | `id`=`9000000009` (or any other valid NHS number) | HTTP Status 412 with problem description |\n\nYou can try out the sandbox using the 'Try this API' feature on this page.\n\nAlternatively, you can try out the sandbox using our Postman collection:\n\n[![Run in Postman](https://run.pstmn.io/button.svg)](https://app.getpostman.com/run-collection/14719036-953f067f-30b9-4552-8252-7cc10b21dad3)\n","summary":"Get patient details","operationId":"get-patient","responses":{"200":{"description":"Information successfully returned.","headers":{"ETag":{"schema":{"type":"string","pattern":"^W/\"[0-9]+\"$","example":"W/\"2\""},"description":"Record version identifier enclosed in quotes and preceded by 'W/'. For example, `W/\"2\"`.\n\nCorresponds to `meta.versionId` attribute in the patient resource body.\n\nWhen you retrieve a patient resource, you get a version number for the resource (in the `ETag` response header and in the `versionId` field in the response).\nYou must then pass the resource's version number in any update request (in the `If-Match` response header) made for the patient.\n"},"X-Correlation-Id":{"schema":{"type":"string","example":"11C46F5F-CDEF-4865-94B2-0EE0EDCC26DA"},"description":"The X-Correlation-ID from the request header, if supplied, mirrored back.\n"},"X-Request-Id":{"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","example":"60E0B220-8136-4CA5-AE46-1D97EF59D068"},"description":"The X-Request-ID from the request header, if supplied, mirrored back.\n"}},"content":{"application/fhir+json":{"schema":{"type":"object","required":["id"],"additionalProperties":false,"properties":{"resourceType":{"type":"string","description":"FHIR resource type.","default":"Patient"},"id":{"description":"The patient's NHS number. The primary identifier of a patient, unique within NHS England and Wales. Always 10 digits and must be a [valid NHS number](https://www.datadictionary.nhs.uk/attributes/nhs_number.html).","type":"string","pattern":"^\\d{10}$","example":"9000000009"},"identifier":{"type":"array","description":"Identifier and system of identification used for this Patient.","items":{"type":"object","maxItems":1,"required":["value"],"properties":{"system":{"type":"string","format":"url","description":"System identifier belongs to.","default":"https://fhir.nhs.uk/Id/nhs-number"},"value":{"description":"The patient's NHS number. The primary identifier of a patient, unique within NHS England and Wales. Always 10 digits and must be a [valid NHS number](https://www.datadictionary.nhs.uk/attributes/nhs_number.html).","type":"string","pattern":"^\\d{10}$","example":"9000000009"},"extension":{"type":"array","description":"FHIR extensions.","items":{"type":"object","description":"Status indicating if NHS number is present and verified.","properties":{"url":{"type":"string","description":"URL of the extension definition.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSNumberVerificationStatus","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSNumberVerificationStatus"]},"valueCodeableConcept":{"type":"object","description":"NHS Number Verification Status Indicator.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URI of the coding system specification.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-NHSNumberVerificationStatus"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1.0.0"},"code":{"type":"string","description":"Symbol in syntax defined by the system.","example":"01"},"display":{"type":"string","description":"Representation defined by the system.","example":"Number present and verified"}}}}}}}}}}}},"meta":{"type":"object","description":"Metadata about this resource.","properties":{"versionId":{"type":"string","description":"The NHS England assigned version of the patient resource.","example":"2"},"security":{"type":"array","description":"The level of security on the patients record, which affects which fields are populated on retrieval. The possible responses are:\n* U - unrestricted. All available data is returned.\n* R - restricted. Any sensitive data around the patient's location, so `address`, `generalPractitioner` and `telecom`, are removed from the response.\n* REDACTED - redacted. The patient record has been marked as invalid, so the data should not be used. This code is never returned; you receive a 404, and appropriate error response, if an invalidated patient retrieval is attempted.\n","maxItems":1,"items":{"type":"object","properties":{"system":{"type":"string","description":"URI of the value set specification.","example":"http://terminology.hl7.org/CodeSystem/v3-Confidentiality"},"code":{"type":"string","description":"Code defined by the system value set.","enum":["U","R","V","REDACTED"],"example":"U"},"display":{"type":"string","description":"Representation defined by the system.","enum":["unrestricted","restricted","redacted"],"example":"unrestricted"}}}}}},"name":{"type":"array","description":"List of names associated with the patient. \n","minItems":1,"items":{"type":"object","required":["use","family"],"additionalProperties":false,"properties":{"id":{"type":"string","description":"Unique object identifier for this name.","example":"123"},"use":{"type":"string","description":"How this name should be used.\n* usual - Known as, conventional or the one patient normally uses. A patient always has a usual name.\n* temp - An alias or temporary name. This may also be used for temporary names assigned at birth or in emergency situations.\n* nickname - A name that the patient prefers to be addressed by, but is not part of their usual name.\n* old - This name is no longer in use (or was never correct, but retained for records).\n* maiden - Name changed for Marriage. A name used prior to changing name because of marriage. This term is not gender specific. The use of this term does not imply any particular history for a person's name.\n\nThe following use codes are included in the [name-use](https://www.hl7.org/fhir/valueset-name-use.html) value set, but should not be used and is not be returned as part of a retrieval.\n* official - The formal name as registered in an official (government) registry, but which name might not be commonly used. May be called \"legal name\".\n* anonymous - Anonymous assigned name, alias, or pseudonym (used to protect a person's identity for privacy reasons).\n","enum":["usual","temp","nickname","old","maiden"],"example":"usual"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"given":{"type":"array","maxItems":5,"description":"Given names, including any middle names.\n\nEach name(s) should be a separate item in the list. The first given name may include multiple names, separated by a space.\nSubsequent names must be broken down into list items. For example, the input `[Jane Marie Anne, Jo Adele]` returns `[Jane Marie Anne, Jo, Adele]`.\n","example":["Jane Marie Anne","Jo","Adele"],"items":{"type":"string","maxLength":35,"example":"Jane"}},"family":{"type":"string","maxLength":35,"description":"Family name (often called Surname).","example":"Smith"},"prefix":{"type":"array","description":"Name prefixes, titles, and prenominals.","example":["Mrs"],"items":{"type":"string","example":"Mrs"}},"suffix":{"type":"array","description":"Name suffices and postnominals.","example":["MBE","PhD"],"items":{"type":"string","example":"MBE"}}}}},"gender":{"type":"string","description":"Classification of the gender of a patient. The classification is phenotypical rather than genotypical, i.e. it does not provide codes for medical or scientific purposes.\nIt is the administrative gender that the patient wishes to be known as. In some cases, this may not be the same as the patient’s registered birth gender, or their current clinical gender.\n","enum":["male","female","other","unknown"],"example":"female"},"birthDate":{"description":"The date on which the patient was born or is officially deemed to have been born.\n\nIt is a date in the format `yyyy-mm-dd`. Due to data quality issues on a small number of patients `yyyy-mm` and `yyyy` format may also be returned. \n","example":"2010-10-22","type":"string","format":"date"},"multipleBirthInteger":{"type":"integer","minimum":1,"maximum":9,"description":"The order in which the patient was born, with 1 indicating the first or only birth in the sequence, 2 indicating the second birth in the sequence, 3 indicating the third, and so on up to 7.\n\nThere are two other valid values; `8` meaning `Not applicable` and `9` meaning `Not known`.\n","example":1},"deceasedDateTime":{"description":"The date and time on which a person died or is officially deemed to have died, if applicable and known.\n\nIt is a datetime in the format `yyyy-mm-ddTHH:MM:SS+HH:MM` or `yyyy-mm-dd`. Due to data quality issues on a small number of patients `yyyy-mm` and `yyyy` format may also be returned.\n","example":"2010-10-22T00:00:00+00:00","type":"string","format":"date-time","pattern":"^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2}\\+\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2}\\+\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01]))$"},"address":{"type":"array","description":"List of addresses associated with the patient.\n\nThese are fully populated on a retrieval or a successful update, only the `home` address is returned on a search.\nWhen a patient tagged as `restricted` is retrieved, all addresses are removed from the response.\n","items":{"type":"object","description":"An address associated with the patient.","required":["use"],"properties":{"id":{"type":"string","description":"Unique system identifier for this address.","example":"456"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"use":{"type":"string","description":"Purpose of this address:\n * `home` - the home address is the patient's normal residence. Home address is also known as usual, main, registered, current or permanent address\n * `temp` - a temporary address is an address used for a set period of time, but where the patient's home, permanent address remains unchanged\n * `billing` - an address used for correspondence purposes only\n * `work` - an office address. This can be returned due to legacy data but cannot be added or replaced on update\n\n A patient should have no more than one current `temp` and/or `billing` address.\n However, historically this was constrained only by the integration requirements and was not enforced so theoretically more than one can exist for a patient when retrieving.\n Where multiple instances already exist for the patient it is not expected that local systems should manage those, but should choose the most appropriate one to maintain (e.g. by examining period dates).\n\n A `home` address is the patient's main residential address and should normally be used for all clinical and demographic purposes, including clinical and appointment correspondence.\n However additionally, `temp` and `billing` addresses may be provided by a patient when there is a requirement to record an alternative location for the purposes of unbroken care.\n When sending correspondence to a patient:\n *\ta present and valid `billing` address may take precedence over `home` and `temp` addresses. A patient should have only a single current `billing` address. An address is considered 'valid' according to its period start and end dates.\n *\tif no current `billing` address is provided, a `temp` address may take precedence over the `home` address, again if it is valid according to its period start and end dates.\n * if there is no valid, current `billing` and/or `temp` address, the `home` address must be used.\n","enum":["home","work","temp","billing"],"example":"home"},"text":{"type":"string","description":"Where a `temp` address is provided a descriptor text must be sent.\nThe list of possible values are:\n* `Second Home` - a patient's second home\n* `Student Accommodation` - a patient's place of residence while at university\n* `Respite Care Address` - where the patient resides during respite care\n* `Temporary Residence Address` - where the patient resides for a specific period of time\n* `Convalescence Home` - the address for a patient during a period of recovery\n* `Mobile Home` - the address of a patient's mobile home, parked for a specific period of time, e.g. the address of a caravan park\n* `Holiday Home` - the address for a patient during a holiday\n\nA patient can also register temporarily at a GP practice using a temporary address. Temporary GP registration information does not appear on the PDS, but the address used for it may.\n","enum":["Second Home","Student Accommodation","Respite Care Address","Temporary Residence Address","Convalescence Home","Mobile Home","Holiday Home"],"example":"Student Accommodation"},"line":{"type":"array","description":"All lines of the address except the postal code.\n\nSystems must apply the following formatting convention when adding or replacing addresses lines:\n*\tline 1 - premises ID and/or house name, e.g. `Flat 1` or `The Old Schoolhouse`\n*\tline 2 - house number, dependent thoroughfare name and descriptor (if present), thoroughfare name and descriptor, e.g. `23 Mill Lane`\n*\tline 3 - dependent locality/village, locality (if present), e.g. `Boxgrove`\n*\tline 4 - post town, e.g. `Leeds`\n*\tline 5 - county (if present), e.g. `West Yorkshire`\n\nIf any of the lines are blank, they are not returned due to FHIR conformance constraints.\n","maxItems":5,"items":{"type":"string"},"example":["1 Trevelyan Square","Boar Lane","City Centre","Leeds","West Yorkshire"]},"postalCode":{"type":"string","description":"Postal code of the address.","example":"LS1 6AE"},"extension":{"type":"array","description":"List of address keys formatted as a FHIR extension. This can include up to one Unique Property Reference Number (UPRN), and up to one Postal Address File (PAF) key. If no keys for the address are known, the array will be empty. Otherwise it will be a list of objects which specify the value of the address key and the code system for it","items":{"anyOf":[{"type":"object","description":"Unique identifier for an address.","properties":{"url":{"type":"string","description":"URL of specification of the AddressKey extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey"]},"extension":{"type":"array","description":"Specification of address key system and address key value. Contains exactly two items: one describing the code system the Address Key uses, and the other specifying the value of the Address Key.","minItems":2,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Coding system of the address key.","required":["url","valueCoding"],"properties":{"url":{"type":"string","description":"Always 'type'.","default":"type"},"valueCoding":{"type":"object","description":"URL of specification of address key format.","required":["system","code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available Address Key formats.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType"},"code":{"type":"string","description":"Address Key system. Always 'PAF'.","enum":["PAF"],"example":"PAF"}}}}},{"type":"object","description":"Value of the address key.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Always 'value'.","default":"value","example":"value"},"valueString":{"type":"string","description":"Address key in PAF format. An 8 digit number including leading zeroes, formatted as a string.","minLength":8,"maxLength":8,"pattern":"^[0-9]{8}$","example":"12345678"}}}]}}}},{"type":"object","description":"Unique identifier for an address.","properties":{"url":{"type":"string","description":"URL of specification of the AddressKey extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey"]},"extension":{"type":"array","description":"Specification of address key system and address key value. Contains exactly two items: one describing the code system the Address Key uses, and the other specifying the value of the Address Key.","minItems":2,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Coding system of the address key.","required":["url","valueCoding"],"properties":{"url":{"type":"string","description":"Always 'type'.","default":"type"},"valueCoding":{"type":"object","description":"URL of specification of address key format.","required":["system","code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available Address Key formats.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType"},"code":{"type":"string","description":"Address Key system. Always 'UPRN'.","enum":["UPRN"],"example":"UPRN"}}}}},{"type":"object","description":"Value of the address key.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Always 'value'.","default":"value","example":"value"},"valueString":{"type":"string","description":"Address key in UPRN format. A number containing from 1 up to 12 digits.","minLength":1,"maxLength":12,"pattern":"^[0-9]{1,12}$","example":"123456789012"}}}]}}}}]}}}}},"telecom":{"type":"array","description":"List of contact points for the patient; for example, phone numbers or email addresses.\nWhen a patient tagged as `restricted` is retrieved, all contact points are removed from the response.\n","items":{"description":"A contact point, such as a phone number or email address","type":"object","required":["system","value"],"properties":{"id":{"type":"string","description":"Unique object identifier for this contact point.","example":"789"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"system":{"description":"Means of communication, such as phone or email.","type":"string","enum":["phone","fax","email","other"],"example":"phone"},"value":{"description":"Phone number, email address, or other identifier for use with contact system.","type":"string","example":"01632960587"},"use":{"type":"string","description":"Location associated with communication system.","enum":["home","work","temp","mobile"],"example":"home"},"extension":{"type":"array","maxItems":1,"description":"Extension that is returned when the communication type is `textphone`. The only code returned is `textphone`, which means `Minicom (Textphone)`.\n\nThe `system` is `other` when the extension is included.\n","items":{"type":"object","description":"Wrapped object for other contact system details.","properties":{"url":{"type":"string","description":"Definition of other contact system extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem"]},"valueCoding":{"type":"object","description":"URL of specification of other contact systems.","properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem"},"code":{"type":"string","description":"Coded value for the other contact system in place.","example":"textphone"},"display":{"description":"Display-friendly representation of the other contact system code.","type":"string","example":"Minicom (Textphone)"}}}}}}}}},"contact":{"type":"array","description":"A list of patient contacts. Only emergency contacts are returned and only emergency contacts should be added. Any other contacts should be added to the patients `Related Person`.\nPatients designate here any contact number they desire to be used in case of an emergency.\nNote, while a patient may also desire to record various related persons telecom details, these do not separately allow for a concept of emergency contact; only ranking. See RelatedPerson endpoint.\nWhen a patient tagged as `restricted` is retrieved, all contacts are removed from the response.\n","items":{"title":"Schema for a patient contact.","type":"object","additionalProperties":false,"required":["relationship","telecom"],"properties":{"id":{"type":"string","example":"C123"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"relationship":{"type":"array","description":"The contact relationship wrapper object that holds the details of the relationship to the patient.\n\nThis is only returned when an Emergency Contact number has been set on `telecom`. The only valid code is `C`, which means `Emergency Contact`.\n","minItems":1,"maxItems":1,"items":{"type":"object","required":["coding"],"properties":{"coding":{"type":"array","description":"Exactly one contact relationship.","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","format":"url","default":"http://terminology.hl7.org/CodeSystem/v2-0131"},"code":{"type":"string","description":"Coded value for contact relationship.","example":"C"},"display":{"type":"string","description":"Display-friendly representation of the contact relationship code.","example":"Emergency Contact"}}}}}}},"telecom":{"type":"array","description":"List of Telecom objects on the contact only contains `system` and `value`.\n","items":{"description":"A contact point, such as a phone number or email address","type":"object","required":["system","value"],"properties":{"id":{"type":"string","description":"Unique object identifier for this contact point.","example":"789"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"system":{"description":"Means of communication, such as phone or email.","type":"string","enum":["phone","fax","email","other"],"example":"phone"},"value":{"description":"Phone number, email address, or other identifier for use with contact system.","type":"string","example":"01632960587"},"use":{"type":"string","description":"Location associated with communication system.","enum":["home","work","temp","mobile"],"example":"home"},"extension":{"type":"array","maxItems":1,"description":"Extension that is returned when the communication type is `textphone`. The only code returned is `textphone`, which means `Minicom (Textphone)`.\n\nThe `system` is `other` when the extension is included.\n","items":{"type":"object","description":"Wrapped object for other contact system details.","properties":{"url":{"type":"string","description":"Definition of other contact system extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem"]},"valueCoding":{"type":"object","description":"URL of specification of other contact systems.","properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem"},"code":{"type":"string","description":"Coded value for the other contact system in place.","example":"textphone"},"display":{"description":"Display-friendly representation of the other contact system code.","type":"string","example":"Minicom (Textphone)"}}}}}}}}}}}},"generalPractitioner":{"type":"array","maxItems":1,"description":"General Practice (not practitioner) with which the patient is, or was, registered. Always contains zero or one general practitioner object.\nWhen a patient tagged as `restricted` is retrieved, the General Practice is removed from the response.\n","items":{"description":"General practice (not practitioner) with which the patient is or was registered.","type":"object","required":["identifier"],"properties":{"id":{"description":"Object identifier (OID) specific to the returned details - this should be return exactly the same in any update.","type":"string","example":"254406A3"},"type":{"description":"Type of Reference being returned.","type":"string","example":"Organization"},"identifier":{"description":"Identifier and system of identification used for this Organisation.","type":"object","required":["value"],"properties":{"system":{"description":"URL for the Organisation Data Service - who are responsible for publishing codes that identify organisations and individuals across health and social care.","type":"string","example":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"description":"Organisation code for the registered general practice, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","type":"string","pattern":"^[0-9A-Z]+$","example":"Y12345"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}}}}}}},"managingOrganization":{"description":"The managing organization of a de-registered patient. This will not be returned when the reason for de-registration is death.","type":"object","required":["identifier"],"properties":{"type":{"description":"Type of Reference being returned.","type":"string","example":"Organization"},"identifier":{"description":"Identifier and system of identification used for this Organisation.","type":"object","required":["value"],"properties":{"system":{"description":"URL for the Organisation Data Service - who are responsible for publishing codes that identify organisations and individuals across health and social care.","type":"string","example":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"description":"Organisation code for the registered general practice, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","type":"string","pattern":"^[0-9A-Z]+$","example":"Y12345"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}}}}}},"extension":{"type":"array","description":"Wrapper array for the patient's pharmacies, death notification status, communication details, contact preferences and place of birth; these are all FHIR extensions.\nAlways contains zero or one of each pharmacy object, zero or one death notification status object, zero or one communication details object, zero or one contact preference and zero or one place of birth object.\nWhen a patient tagged as `restricted` is retrieved, the pharmacy and birth place extensions are removed from the response.\n","items":{"anyOf":[{"type":"object","description":"Wrapper object for the patient's nominated pharmacy. This will only be populated on a retrieval and not a search.","required":["url","valueReference"],"properties":{"url":{"type":"string","description":"URL of specification of UKCore-NominatedPharmacy FHIR extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NominatedPharmacy","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NominatedPharmacy"]},"valueReference":{"type":"object","description":"Reference to a pharmacy `Organization` resource.","required":["identifier"],"properties":{"identifier":{"type":"object","description":"Wrapper object for the patient's nominated pharmacy organisation code.","required":["value"],"properties":{"system":{"type":"string","description":"URL for the FHIR code system for the ODS organisation code.","default":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"type":"string","description":"Organisation code for the nominated pharmacy, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","pattern":"^[A-Za-z0-9]{3,10}$","example":"Y12345"}}}}}}},{"type":"object","description":"Wrapper object for the patient's dispensing doctor. This will only be populated on a retrieval and not a search.","required":["url","valueReference"],"properties":{"url":{"type":"string","description":"URL of specification of UKCore-DispensingDoctor FHIR extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-PreferredDispenserOrganization","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-PreferredDispenserOrganization"]},"valueReference":{"type":"object","description":"Reference to a GP practice pharmacy `Organization` resource.","required":["identifier"],"properties":{"identifier":{"type":"object","description":"Wrapper object for the patient's dispensing doctor organisation code.","required":["value"],"properties":{"system":{"type":"string","description":"URL for the FHIR code system for the ODS organisation code.","default":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"type":"string","description":"Organisation code for the dispensing doctor, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","pattern":"^[A-Za-z0-9]{3,10}$","example":"Y23456"}}}}}}},{"type":"object","description":"Wrapper object for the patient's medical appliance supplier. This will only be populated on a retrieval and not a search.","required":["url","valueReference"],"properties":{"url":{"type":"string","description":"URL of specification of UKCore-MedicalApplianceSupplier FHIR extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-MedicalApplianceSupplier","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-MedicalApplianceSupplier"]},"valueReference":{"type":"object","description":"Reference to medical appliance supplier pharmacy `Organization` resource.","required":["identifier"],"properties":{"identifier":{"type":"object","description":"Wrapper object for the patient's medical appliance supplier organisation code.","required":["value"],"properties":{"system":{"type":"string","description":"URL for the FHIR code system for the ODS organisation code.","default":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"type":"string","description":"Organisation code for the medical appliance supplier, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","pattern":"^[A-Za-z0-9]{3,10}$","example":"Y34567"}}}}}}},{"type":"object","description":"Wrapper object for death notification details.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of death notification extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus"]},"extension":{"type":"array","description":"Array containing exactly one death notification status code object and exactly one effective date object.","minItems":1,"maxItems":2,"items":{"oneOf":[{"type":"object","description":"Wrapper object for death notification status code.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `deathNotificationStatus`.","default":"deathNotificationStatus","enum":["deathNotificationStatus"]},"valueCodeableConcept":{"type":"object","description":"Death Notification Status.","properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["system","code"],"properties":{"system":{"type":"string","description":"URI of the coding system specification.","example":"https://fhir.hl7.org.uk/CodeSystem/UKCore-DeathNotificationStatus"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1.0.0"},"code":{"type":"string","description":"Symbol, in syntax, defined by the system:\n* `1` - Informal - death notice received via an update from a local NHS Organisation such as GP or Trust\n* `2` - Formal - death notice received from Registrar of Deaths. Only these endpoints are allowed to add a Formal death:\n - National Back Office using the Demographic Spine Application (DSA)\n - Office of National Statistics (ONS)\n - Maternity sites\n* `U` - Removed. This is a possible response, but it cannot be used on an update because Spine will reject it\n","example":"2","enum":["1","2","U"]},"display":{"type":"string","description":"Representation defined by the system.","example":"Formal - death notice received from Registrar of Deaths","enum":["Informal - death notice received via an update from a local NHS Organisation such as GP or Trust","Formal - death notice received from Registrar of Deaths","Removed"]}}}}}}}},{"type":"object","description":"Wrapper object for death notification effective date.","required":["url","valueDateTime"],"properties":{"url":{"type":"string","description":"Key of this object. Always `systemEffectiveDate`.","default":"systemEffectiveDate","enum":["systemEffectiveDate"]},"valueDateTime":{"type":"string","description":"Date and time at which death notification status took effect.","format":"date-time","example":"2010-10-22T00:00:00+00:00"}}}]}}}},{"type":"object","description":"Wrapper object for communication details. This will only be populated on a retrieval and not a search.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of communication extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSCommunication","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSCommunication"]},"extension":{"type":"array","description":"Definition of communication extension.\n\nThe array must have one item, a valueCodeableConcept for the language and can optionally include a valueBoolean for if an interpreter is required.","minItems":1,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Wrapper object for communication language.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `language`.","default":"language","enum":["language"]},"valueCodeableConcept":{"type":"object","description":"Human language.","required":["coding"],"properties":{"coding":{"type":"array","description":"Exactly one language code.","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URL of the Language Code System. Always uses the 'UKCore-HumanLanguage' Code System.","example":"https://fhir.hl7.org.uk/CodeSystem/UKCore-HumanLanguage"},"version":{"type":"string","description":"Version of the language code system.","example":"1.0.0"},"code":{"type":"string","description":"Language code based on [ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) standard plus extensions for braille, makaton and sign languages, which are:\n* `q1` - Braille\n* `q2` - American Sign Language\n* `q3` - Australian Sign Language\n* `q4` - British Sign Language\n* `q5` - Makaton\nAll valid codes combined can be found at https://fhir.hl7.org.uk/CodeSystem/UKCore-HumanLanguage.\n","example":"fr"},"display":{"type":"string","description":"Display-friendly representation of the language code (such as English). If there is a language code with no defined mapping, `Unknown` will be returned.","example":"French"}}}}}}}},{"type":"object","description":"Wrapper object for whether an interpreter is required.","required":["url","valueBoolean"],"properties":{"url":{"type":"string","description":"Key of this object. Always `interpreterRequired`.","default":"interpreterRequired","enum":["interpreterRequired"]},"valueBoolean":{"type":"boolean","description":"Whether an interpreter is required.","example":true}}}]}}}},{"type":"object","description":"Wrapper object for preferred contact details; the written communication format, preferred contact time and method. This will only be populated on a retrieval and not a search.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of the contact preference extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-ContactPreference","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-ContactPreference"]},"extension":{"description":"Wrapper array containing zero or one preferred contact method, zero or one preferred written communication format; and zero or one preferred contact time.","type":"array","maxItems":3,"items":{"oneOf":[{"type":"object","description":"Wrapper object for preferred written communication format.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredWrittenCommunicationFormat`.","default":"PreferredWrittenCommunicationFormat"},"valueCodeableConcept":{"type":"object","description":"Preferred Written Communication Format.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","format":"url","description":"Definition of the preferred written communication extension.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredWrittenCommunicationFormat","enum":["https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredWrittenCommunicationFormat"]},"code":{"type":"string","description":"A code to identify the preferred written communication format of a patient, contact or related person.\n* 11 - Large print\n* 12 - Braille\n* 13 - Audio tape\n","example":"12"},"display":{"type":"string","description":"Display-friendly representation of the preferred written communication format code.","example":"Braille"}}}}}}}},{"type":"object","description":"Wrapper object for preferred contact method.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredContactMethod`.","default":"PreferredContactMethod","enum":["PreferredContactMethod"]},"valueCodeableConcept":{"type":"object","description":"Preferred Contact Method.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","format":"url","description":"Definition of the preferred contact method extension.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredContactMethod","enum":["https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredContactMethod"]},"code":{"type":"string","description":"A code to identify to identify the preferred contact method of a patient, contact or related person.\n* 1\t- Letter\n* 2\t- Visit\n* 3\t- Telephone\n* 4\t- E-mail\n* 5\t- Minicom (Textphone)\n* 6\t- Telephone contact via proxy\n* 7\t- Sign language\n* 8\t- No Telephone contact\n","example":"1"},"display":{"type":"string","description":"Display-friendly representation of the preferred contact method code.","example":"Letter"}}}}}}}},{"type":"object","description":"Wrapper object for preferred contact times.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredContactTimes`.","default":"PreferredContactTimes","enum":["PreferredContactTimes"]},"valueString":{"type":"string","maximum":40,"description":"A free-text description about the preferred contact times.","example":"Not after 7pm"}}}]}}}},{"type":"object","description":"Wrapper object for place of birth details. This will not be returned on a restricted patient.","required":["url","valueAddress"],"properties":{"url":{"type":"string","description":"Definition of place of birth extension.","default":"http://hl7.org/fhir/StructureDefinition/patient-birthPlace","enum":["http://hl7.org/fhir/StructureDefinition/patient-birthPlace"]},"valueAddress":{"type":"object","additionalProperties":false,"properties":{"city":{"type":"string","description":"Town or city of birth.","example":"Manchester"},"district":{"type":"string","description":"County or metropolitan district of birth.","example":"Greater Manchester"},"country":{"type":"string","description":"A coded value for a patient's country of birth.\n\nFrom [ISO 3166-1](http://hl7.org/fhir/valueset-iso3166-1-3.html) plus codes from the UK Internal Code list which do not have entries in ISO 3166-1.\n\nUK Internal Codes:\n* `1` - England\n* `2` - Scotland\n* `3` - Wales\n* `4` - Northern Ireland\n* `7` - Sark\n* `9` - Alderney\n* `10` - Channel Islands\n","example":"GBR"}}}}},{"type":"object","description":"An extension to carry the reason a PDS record has been removed from the Patient Demographic Service. This will only be populated on a retrieval and not a search.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of the removal from registration extension.","default":"https://fhir.nhs.uk/StructureDefinition/Extension-PDS-RemovalFromRegistration","enum":["https://fhir.nhs.uk/StructureDefinition/Extension-PDS-RemovalFromRegistration"],"readOnly":true},"extension":{"type":"array","description":"An extension reason a PDS record has been removed from the Patient Demographic Service.","minItems":1,"maxItems":2,"items":{"oneOf":[{"type":"object","description":"Wrapper object for removalFromRegistrationCode.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"To identify the removal reason code.","default":"removalFromRegistrationCode","enum":["removalFromRegistrationCode"],"readOnly":true},"valueCodeableConcept":{"type":"object","description":"PDS Removal Reason Exit Code","required":["coding"],"properties":{"coding":{"type":"array","description":"Array containing exactly one removal reason exit code object","items":{"type":"object","required":["system","code","display"],"properties":{"system":{"type":"string","format":"url","description":"URL of the Removal Reason Exit Code. Always uses the 'PDS-RemovalReasonExitCode' Code System.","example":"https://fhir.nhs.uk/CodeSystem/PDS-RemovalReasonExitCode","readOnly":true},"code":{"type":"string","description":"A CodeSystem that identifies the reason a PDS record has been removed.","example":"SCT","enum":["DEA","EMB","SCT","NIT","TRA","ORR"]},"display":{"type":"string","description":"Display-friendly representation of the removal reason exit code.","example":"Transferred to Scotland"}}}}}}}},{"type":"object","description":"Wrapper object for removal from registration effective time.","required":["url","valuePeriod"],"properties":{"url":{"type":"string","description":"Key of this object. Always `effectiveTime`.","default":"effectiveTime","enum":["effectiveTime"],"readOnly":true},"valuePeriod":{"type":"object","description":"The effective time of removal of the Patient record from PDS.","required":["start"],"properties":{"start":{"type":"string","format":"date-time","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01T00:00:00+00:00"},"end":{"type":"string","format":"date-time","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31T00:00:00+00:00"}}}}}]}}}}]}}}},"example":{"resourceType":"Patient","id":"9000000009","identifier":[{"system":"https://fhir.nhs.uk/Id/nhs-number","value":"9000000009","extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSNumberVerificationStatus","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-NHSNumberVerificationStatus","version":"1.0.0","code":"01","display":"Number present and verified"}]}}]}],"meta":{"versionId":"2","security":[{"system":"http://terminology.hl7.org/CodeSystem/v3-Confidentiality","code":"U","display":"unrestricted"}]},"name":[{"id":"123","use":"usual","period":{"start":"2020-01-01","end":"2021-12-31"},"given":["Jane"],"family":"Smith","prefix":["Mrs"],"suffix":["MBE"]}],"gender":"female","birthDate":"2010-10-22","multipleBirthInteger":1,"deceasedDateTime":"2010-10-22T00:00:00+00:00","generalPractitioner":[{"id":"254406A3","type":"Organization","identifier":{"system":"https://fhir.nhs.uk/Id/ods-organization-code","value":"Y12345","period":{"start":"2020-01-01","end":"2021-12-31"}}}],"managingOrganization":{"type":"Organization","identifier":{"system":"https://fhir.nhs.uk/Id/ods-organization-code","value":"Y12345","period":{"start":"2020-01-01","end":"2021-12-31"}}},"extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NominatedPharmacy","valueReference":{"identifier":{"system":"https://fhir.nhs.uk/Id/ods-organization-code","value":"Y12345"}}},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-PreferredDispenserOrganization","valueReference":{"identifier":{"system":"https://fhir.nhs.uk/Id/ods-organization-code","value":"Y23456"}}},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-MedicalApplianceSupplier","valueReference":{"identifier":{"system":"https://fhir.nhs.uk/Id/ods-organization-code","value":"Y34567"}}},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus","extension":[{"url":"deathNotificationStatus","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-DeathNotificationStatus","version":"1.0.0","code":"2","display":"Formal - death notice received from Registrar of Deaths"}]}},{"url":"systemEffectiveDate","valueDateTime":"2010-10-22T00:00:00+00:00"}]},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSCommunication","extension":[{"url":"language","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-HumanLanguage","version":"1.0.0","code":"fr","display":"French"}]}},{"url":"interpreterRequired","valueBoolean":true}]},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-ContactPreference","extension":[{"url":"PreferredWrittenCommunicationFormat","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredWrittenCommunicationFormat","code":"12","display":"Braille"}]}},{"url":"PreferredContactMethod","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredContactMethod","code":"1","display":"Letter"}]}},{"url":"PreferredContactTimes","valueString":"Not after 7pm"}]},{"url":"http://hl7.org/fhir/StructureDefinition/patient-birthPlace","valueAddress":{"city":"Manchester","district":"Greater Manchester","country":"GBR"}},{"url":"https://fhir.nhs.uk/StructureDefinition/Extension-PDS-RemovalFromRegistration","extension":[{"url":"removalFromRegistrationCode","valueCodeableConcept":{"coding":[{"system":"https://fhir.nhs.uk/CodeSystem/PDS-RemovalReasonExitCode","code":"SCT","display":"Transferred to Scotland"}]}},{"url":"effectiveTime","valuePeriod":{"start":"2020-01-01T00:00:00+00:00","end":"2021-12-31T00:00:00+00:00"}}]}],"telecom":[{"id":"789","period":{"start":"2020-01-01","end":"2021-12-31"},"system":"phone","value":"01632960587","use":"home"},{"id":"790","period":{"start":"2019-01-01","end":"2022-12-31"},"system":"email","value":"jane.smith@example.com","use":"home"},{"id":"OC789","period":{"start":"2020-01-01","end":"2021-12-31"},"system":"other","value":"01632960587","use":"home","extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem","code":"textphone","display":"Minicom (Textphone)"}}]}],"contact":[{"id":"C123","period":{"start":"2020-01-01","end":"2021-12-31"},"relationship":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0131","code":"C","display":"Emergency Contact"}]}],"telecom":[{"system":"phone","value":"01632960587"}]}],"address":[{"id":"456","period":{"start":"2020-01-01","end":"2021-12-31"},"use":"home","line":["1 Trevelyan Square","Boar Lane","City Centre","Leeds","West Yorkshire"],"postalCode":"LS1 6AE","extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","extension":[{"url":"type","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType","code":"PAF"}},{"url":"value","valueString":"12345678"}]},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","extension":[{"url":"type","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType","code":"UPRN"}},{"url":"value","valueString":"123456789012"}]}]},{"id":"T456","period":{"start":"2020-01-01","end":"2021-12-31"},"use":"temp","text":"Student Accommodation","line":["1 Trevelyan Square","Boar Lane","City Centre","Leeds","West Yorkshire"],"postalCode":"LS1 6AE","extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","extension":[{"url":"type","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType","code":"PAF"}},{"url":"value","valueString":"12345678"}]},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","extension":[{"url":"type","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType","code":"UPRN"}},{"url":"value","valueString":"123456789012"}]}]}]}}}},"4XX":{"description":"An error occurred as follows:\n\n| HTTP status | Error code | Description |\n| ----------- | -------------------------- | --------------------------------------------- |\n| 400 | INVALID_RESOURCE_ID | Invalid NHS number. |\n| 400 | UNSUPPORTED_SERVICE | Missing NHS number. |\n| 400 | MISSING_VALUE | Missing header parameter. For details, see the `diagnostics` field. |\n| 400 | INVALID_VALUE | Invalid header parameter. For details, see the `diagnostics` field. |\n| 401 | ACCESS_DENIED | Access token missing, invalid or expired, or calling application not configured for this operation. |\n| 403 | ACCESS_DENIED | Patient cannot perform this action. |\n| 404 | RESOURCE_NOT_FOUND | Patient does not exist for given NHS number. |\n| 404 | INVALIDATED_RESOURCE | Patient did exist for given NHS number, but has been invalidated and not superseded by another NHS number. |\n| 408 | UNABLE_TO_CALL_SERVICE | The downstream domain processing has not completed within the configured timeout period. |\n| 429 | TOO_MANY_REQUESTS | You have exceeded your application's [rate limit](https://digital.nhs.uk/developer/guides-and-documentation/reference-guide#rate-limits). |\n","content":{"application/fhir+json":{"schema":{"type":"object","description":"Outcome of an operation that does not result in a resource or bundle being returned, for example an error or an async/batch submission.\nThere are a number of possible error codes that can be returned along with a more detailed description in the `display` field.\n","properties":{"resourceType":{"type":"string","description":"FHIR Resource Type.","default":"OperationOutcome"},"issue":{"type":"array","description":"List of issues that have occurred.","minItems":1,"items":{"type":"object","required":["severity","code"],"properties":{"severity":{"type":"string","enum":["fatal","error","warning","information"],"description":"Severity of the error.","example":"error"},"code":{"type":"string","description":"FHIR error code.","example":"invalid","enum":["invalid","structure","required","value","invariant","security","login","unknown","expired","forbidden","suppressed","processing","not-supported","duplicate","multiple-matches","not-found","deleted","too-long","code-invalid","extension","too-costly","business-rule","conflict","transient","lock-error","no-store","exception","timeout","incomplete","throttled","informational"]},"details":{"type":"object","description":"Internal error code.","properties":{"coding":{"type":"array","items":{"type":"object","properties":{"system":{"type":"string","description":"URI of the coding system specification.","example":"https://fhir.nhs.uk/R4/CodeSystem/Spine-ErrorOrWarningCode"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1"},"code":{"type":"string","description":"Symbol in syntax defined by the system.","example":"INVALID_VALUE"},"display":{"type":"string","description":"Representation defined by the system.","example":"Provided value is invalid"}}}}}},"diagnostics":{"type":"string","description":"Additional diagnostic information about the issue. This information is subject to change.","example":"Invalid value - 2019-01 in field 'birthDate'"},"expression":{"type":"string","description":"FHIRPath of element(s) related to the error.","example":"Patient.name.given"}}}}}},"example":{"resourceType":"OperationOutcome","issue":[{"severity":"error","code":"structure","details":{"coding":[{"system":"https://fhir.nhs.uk/R4/CodeSystem/Spine-ErrorOrWarningCode","version":"1","code":"MISSING_VALUE","display":"Required value is missing"}]},"diagnostics":"Missing value - 'birth_date/birth_date_range_start/birth_date_range_end'"}]}}}}}},"patch":{"description":"## Overview\nUse this endpoint to update patient details in PDS.\n\nThis is a 'PATCH' operation - you can update specific parts of the patient record, such as name or gender, without having to update the entire record.\n\nWhen you make a PATCH request with your application, the endpoint will respond with a successful (200) response code, along with the updated patient resource, or, an unsuccessful (4xx/5xx) response. \n\n99.99% of all updates complete in under 10 seconds. If an update takes longer than 10 seconds, the endpoint responds with an HTTP status of 503 (Gateway Timeout). \n\nYou can alter the timeout period using the `X-Sync-Wait` header. If you re-submit the update, use the same `X-Request-ID` header.\n\nThe behaviour of this endpoint depends on which access mode you are using:\n\n| Access mode | Behaviour restrictions |\n| ------------------------------ | ----------------------------------- |\n| Application-restricted access | Updates not allowed |\n| Healthcare worker access | Updates allowed |\n| Patient access | Updates allowed |\n\n## Patient resource versioning\nTo update a patient's resource you must have retrieved it first, to ensure you are working against an up-to-date patient resource.\n\nWhen you retrieve a patient resource, you get a version number for the resource (in the `ETag` response header in the form `W/\"2\"` and in the `versionId` field in the response, in the form `\"2\"`).\n\nYou must then pass the patient's version number in the update request (in the `If-Match` response header).\n\nIt is recommended you use the value from the `Etag` header as this is in the correct form the `If-Match` header is expected, for example `W/\"2\"` and can be mirrored back in the request.\n\nThe update only succeeds, if the patient resource has not been updated in our database between your first retrieval and the update request.\n\nIf the update succeeds, you will receive the updated patient resource, this will contain the new resource version number.\n\nIf you make a subsequent update you must use the new version number.\n\n## JSON Patch\nTo update a patient record, a [JSON Patch](https://tools.ietf.org/html/rfc6902) should be sent. A JSON Patch consists of one or more patch objects within a list.\n\nIt is recommended that all desired updates are sent together in a single request as a list of patches.\nThis is the most efficient approach and reduces the danger of race conditions occurring when updating the patient record multiple times in a short period of time.\n\nWhen processing the list of patch objects, each patch must be valid and pass all the business rules against the data. If one patch object fails, none of the patch objects are applied.\n\nA patch object consists of:\n* an operation, `op` - this is required.\n* a path to the data that you want to change, `path` - this is required.\n* the value that is assigned, `value` - this is required for `add`, `replace` and `test`; but should not be included for a `remove`.\n\nThe following operations are supported:\n* `add` - to add a new value.\n* `replace` - to replace an existing value.\n* `remove` - to remove an existing value.\n* `test` - to test the state of a value is as expected before continuing with the update.\n\nPaths point to a single value, list or object, for example:\n* `/gender` - pointing to the gender value.\n* `/name` - point to the name list.\n* `/name/0` - pointing to the 1st object in the name list.\n* `/address/0/line/1` - pointing to the 2nd line string in the 1st address object.\n\nThe value can be set to any valid value for that path, so could be a null, a string, an object or a list.\n\n### Addition\n\n`add` should be used to add new items to a patient.\n\nAdding a simple data item such as the date of death can be done using a patch such as:\n\n```json\n{\n \"patches\": [\n { \"op\": \"add\", \"path\": \"/deceasedDate\", \"value\": \"2020-01-01\" }\n ]\n}\n```\n\nAdding to a list such as a `name` should be done by including the whole object in the value field. Note, the list index is `-` this is because when adding to a list, the index is not known:\n\n```json\n{\n \"patches\": [\n {\n \"op\": \"add\",\n \"path\": \"/name/-\",\n \"value\": {\n \"use\": \"usual\",\n \"period\": { \"start\": \"2019-12-31\" },\n \"prefix\": [\"Dr\"],\n \"given\": [\n \"Joe\",\n \"Horation\",\n \"Maximus\"\n ],\n \"family\": \"Bloggs\",\n \"suffix\": [\"PhD\"]\n }\n }\n ]\n}\n```\n\nWhen adding a base level list item such as a new name or address, ensure the index is always `-`, otherwise the request is rejected. For example, `/name/-`.\nThe reason for this is because the backend system makes the decision on the ordering of the listed objects to ensure they are always returned in the same order.\n\nIf you are adding to a sub-element that is a list, such as an additional given name, it is valid to provide an exact index. So the following is valid:\n\n```json\n{\n \"patches\": [\n {\n \"op\": \"add\", \"path\": \"/name/0/id\", \"value\": \"8F8B957D\"\n },\n {\n \"op\": \"add\", \"path\": \"/name/0/given/0\", \"value\": \"Rose\"\n }\n ]\n}\n```\n\nIt is possible to `add` a sub-element to an existing object in a patch request. If the object already exists and you have the object `id`, you must supply it or the update is rejected.\nThe following patch is allowed:\n\n```json\n{\n \"patches\": [\n {\n \"op\": \"add\", \"path\": \"/name/0/id\", \"value\": \"8F8B957D\"\n },\n {\n \"op\": \"add\", \"path\": \"/name/0/given/0\", \"value\": \"Rose\"\n }\n ]\n}\n```\n\nbut the following is not allowed:\n\n```json\n{\n \"patches\": [\n {\n \"op\": \"add\", \"path\": \"/name/0/given/-\", \"value\": \"Rose\"\n }\n ]\n}\n```\n\n### Replacing\n\n`replace` should be used to alter existing items on the patient.\n\nReplacing a simple data item such as the gender can be done using a patch such as:\n\n```json\n{\n \"patches\": [\n { \"op\": \"replace\", \"path\": \"/gender\", \"value\": \"male\" }\n ]\n}\n```\n\nReplacing a list item can be done in two ways which may be dependent on any external development libraries that can be used to create the patch.\n\nThe first approach is to replace the whole list item:\n\n```json\n{\n \"patches\": [\n {\n \"op\": \"replace\",\n \"path\": \"/name/0\",\n \"value\": {\n \"id\": \"123\",\n \"use\": \"usual\",\n \"period\": { \"start\": \"2019-12-31\" },\n \"prefix\": [\"Dr\"],\n \"given\": [\n \"Joe\",\n \"Horation\",\n \"Maximus\"\n ],\n \"family\": \"Bloggs\",\n \"suffix\": [\"PhD\"]\n }\n }\n ]\n}\n```\n\nThe second approach is to replace just a part, or parts, of the list object keys if all others remain the same:\n\n```json\n{\n \"patches\": [\n { \"op\": \"replace\", \"path\": \"/name/0/id\", \"value\": \"123\" },\n { \"op\": \"replace\", \"path\": \"/name/0/prefix/0\", \"value\": \"Mr\" },\n { \"op\": \"replace\", \"path\": \"/name/0/family\", \"value\": \"Smith\" }\n ]\n}\n```\n\nAn added requirement to ensure no accidental data loss or replacement of the wrong list item, you must always include the list `id` or `url`. This is in the object on retrieval so just needs to be mirrored back. You should not include an ID on an addition as this is automatically generated by the system and is a unique object ID, so only our system can guarantee that.\n\n### Removal\n\n`remove` should be used to delete existing items on a patient.\n\nRemoving a simple data item such as the gender can be done using a patch such as:\n\n```json\n{\n \"patches\": [\n { \"op\": \"remove\", \"path\": \"/gender\" }\n ]\n}\n```\n\nNote, that in this scenario, although the patch is perfectly valid, the update is still rejected as a patients gender cannot be removed.\n\nRemoving a list item should only be done on the whole item object, not individual sub-items; instead use the replace operation.\n\nTo remove a list item, a `test` operation must immediately proceed the `remove` . This is an added requirement to ensure no accidental data loss occurs or the wrong item is removed. The test operation should be used to assert either:\n\n* the `id` - the object ID for items that have one - for example `name`, `address` or `telecom`.\n* the `url` - the URL for the extension being removed.\n* the whole object being removed.\n\nAn example of a list item removal using the `id` would be:\n\n```json\n{\n \"patches\": [\n { \"op\": \"test\", \"path\": \"/name/0/id\", \"value\": \"123\" },\n { \"op\": \"remove\", \"path\": \"/name/0\" }\n ]\n}\n```\n\nAn example of a extension list item removal using the `url` would be:\n\n```json\n{\n \"patches\": [\n { \"op\": \"test\", \"path\": \"/extension/0/url\", \"value\": \"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus\" },\n { \"op\": \"remove\", \"path\": \"/extension/0\" }\n ]\n}\n```\n\nAn example of a list item removal using the whole object would be:\n\n```json\n{\n \"patches\": [\n { \n \"op\": \"test\",\n \"path\": \"/name/0\",\n \"value\": {\n \"id\": \"123\",\n \"use\": \"usual\",\n \"period\": { \"start\": \"2019-12-31\" },\n \"prefix\": [\"Dr\"],\n \"given\": [\n \"Joe\",\n \"Horation\",\n \"Maximus\"\n ],\n \"family\": \"Bloggs\",\n \"suffix\": [\"PhD\"]\n }\n },\n { \"op\": \"remove\", \"path\": \"/name/0\" }\n ]\n}\n```\n\nSpecial care should be taken when performing multiple removals in the same list; as removing a particular index could affect all subsequent index positions. The next two examples perform **exactly** the same operation.\n\nUsing the following initial (simplified) data, with the intention of removing the names in index 1 (Irwin) and 2 (Bruce):\n\n```json\n{\n \"name\": [\n {\"id\": \"2\", \"family\": \"Parker\"},\n {\"id\": \"3\", \"family\": \"Irwin\"},\n {\"id\": \"4\", \"family\": \"Bruce\"},\n {\"id\": \"5\", \"family\": \"Sharpe\"}\n ]\n}\n```\n\n**Example 1**:\n\n```json\n{\n \"patches\": [\n { \"op\": \"test\", \"path\": \"/name/1/id\", \"value\": \"3\" },\n { \"op\": \"remove\", \"path\": \"/name/1\" },\n { \"op\": \"test\", \"path\": \"/name/1/id\", \"value\": \"4\" },\n { \"op\": \"remove\", \"path\": \"/name/1\" }\n ]\n}\n```\n\nAfter the 1st removal the data looks like:\n\n```json\n{\n \"name\": [\n {\"id\": \"2\", \"family\": \"Parker\"},\n {\"id\": \"4\", \"family\": \"Bruce\"},\n {\"id\": \"5\", \"family\": \"Sharpe\"}\n ]\n}\n```\n\nmeaning Irwin has been removed, Bruce has moved from index 2 -> 1 and Sharpe from 3 -> 2.\n\nSo after applying the 2nd removal the data looks like:\n\n```json\n{\n \"name\": [\n {\"id\": \"2\", \"family\": \"Parker\"},\n {\"id\": \"5\", \"family\": \"Sharpe\"}\n ]\n}\n```\n\nWhich is the intended outcome. Using the same index 1 for both removals may look unexpected, but the way JSON Patch works is iterating over each patch operation in turn and making the change to the list index positions. This means a developer needs to account for lists changing from one operation to the next.\n\n**Example 2**:\n\n```json\n{\n \"patches\": [\n { \"op\": \"test\", \"path\": \"/name/2/id\", \"value\": \"4\" },\n { \"op\": \"remove\", \"path\": \"/name/2\" },\n { \"op\": \"test\", \"path\": \"/name/1/id\", \"value\": \"3\" },\n { \"op\": \"remove\", \"path\": \"/name/1\" }\n ]\n}\n```\n\nAfter the 1st removal the data looks like:\n\n```json\n{\n \"name\": [\n {\"id\": \"2\", \"family\": \"Parker\"},\n {\"id\": \"3\", \"family\": \"Irwin\"},\n {\"id\": \"5\", \"family\": \"Sharpe\"}\n ]\n}\n```\n\nApplying the 2nd removal the data looks like:\n\n```json\n{\n \"name\": [\n {\"id\": \"2\", \"family\": \"Parker\"},\n {\"id\": \"5\", \"family\": \"Sharpe\"}\n ]\n}\n```\n\nWhich is the intended outcome. Providing the patches with the indexes descending means that the list stays in a stable format the whole way through as the only changes to the index positions are items have been passed over already.\n\n**Example 3 - a failure**\n\n```json\n{\n \"patches\": [\n { \"op\": \"test\", \"path\": \"/name/1/id\", \"value\": \"3\" },\n { \"op\": \"remove\", \"path\": \"/name/1\" },\n { \"op\": \"test\", \"path\": \"/name/2/id\", \"value\": \"4\" },\n { \"op\": \"remove\", \"path\": \"/name/2\" }\n ]\n}\n```\n\nAfter the 1st removal the data looks like:\n\n```json\n{\n \"name\": [\n {\"id\": \"2\", \"family\": \"Parker\"},\n {\"id\": \"4\", \"family\": \"Bruce\"},\n {\"id\": \"5\", \"family\": \"Sharpe\"}\n ]\n}\n```\n\nWhen applying the 2nd test, it fails as the index 2 ID is `5`, but the test was looking for `4`. An error is returned and none of the updates provided would be made to the database.\n\nThis failure example is a good reason for forcing the use of the `test` operation. If there was no test, index 2 would have been blindly removed, meaning the final state of the data would look like:\n\n```json\n{\n \"name\": [\n {\"id\": \"2\", \"family\": \"Parker\"},\n {\"id\": \"4\", \"family\": \"Bruce\"}\n ]\n}\n```\n\nWhich is incorrect, as Irwin and Sharpe were removed instead of Irwin and Bruce.\n\n\n## Patient data fields\n\n### Address\n\nList item found under `address` field.\n\nIn a JSON Patch request the path should be:\n* `/address/0` if the address to be replaced or removed is the first item in the list. If it is the second item in the list the path is `/address/1`, and so on.\n* `/address/-` when adding a new address.\n\nAn address consists of 5 lines of unstructured text, postcode, and address keys. Address keys can include a PAF and a UPRN.\n\nPostcode is optional but strongly encouraged.\nIf the address has no postcode, use a [pseudo postcode from the list defined by the Office for National Statistics](https://digital.nhs.uk/services/organisation-data-service/data-downloads/office-for-national-statistics-data) (see the ‘look_ups’ file).\n\nIn particular, for a patient at no fixed abode, use the pseudo postcode `ZZ99 3VZ`.\n\nWe recommend you use the [OS Places API](https://digital.nhs.uk/developer/api-catalogue/ordnance-survey-places-api) for looking up and verifying addresses prior to a PDS update. The PDS FHIR API cannot yet handle UPRNs required by the OS Places API. We are planning to support these in future.\n\nWhen adding or replacing address lines, use the following rules:\n*\tline 1 - premises ID and/or house name, for example `Flat 1` or `The Old Schoolhouse`\n*\tline 2 - house number, dependent thoroughfare name and descriptor (if present), thoroughfare name and descriptor, for example `23 Mill Lane`\n*\tline 3 - dependent locality/village, locality (if present), for example `Boxgrove`\n*\tline 4 - post town, for example `Leeds`\n*\tline 5 - county (if present), for example `West Yorkshire`\n\nWhen updating an address, you should populate lines 1 or 2, and line 4. You should not include line 5 in manually created addresses but you may include it in PAF-derived addresses. The address ID must also be included in the update as shown in the below examples.\n\nThere are exceptions:\n* if you submit a postcode and PAF key, in which case the lines are automatically populated, however if there are no matches or too many matches the message is rejected due to missing address lines\n* if you use a pseudo postcode, for example `ZZ99 3VZ` meaning `no fixed abode`\n\nWhen creating the FHIR payload message, to be fully FHIR compliant all empty lines should be removed, so for example:\n\n```json\n{\n \"address\": {\n \"line\": [\n \"\",\n \"23 Mill Lane\",\n \"\",\n \"Leeds\",\n \"\"\n ]\n }\n\n}\n```\n\nshould be sent in as:\n\n```json\n {\n \"address\": {\n \"line\": [\n \"23 Mill Lane\",\n \"Leeds\"\n ]\n }\n\n }\n```\n\nhowever if you do not do this the message is not rejected; the response is in that form though.\n\nTo ensure consistent data across all patient addresses, you should match addresses to the PAF and send them in PAF format including the PAF key.\nIf you do not include the PAF key it is added to the address if a match is found\nAdditionally the provided address lines and post code are enriched and reformatted if necessary.\n\nThe following address types are supported:\n* `home` - the home address is the patient's normal residence. Home address is also known as usual, main, registered, current or permanent address\n* `temp` - a temporary address is an address used for a set period of time, but where the patient's home, permanent address remains unchanged\n* `billing` - an address used for correspondence purposes only\n\nA patient must have no more than one current `temp` and/or `billing` address.\nHowever, historically this was constrained only by the integration requirements and was not enforced so theoretically more than one can exist for a patient when retrieving.\nWhere multiple instances already exist for the patient it is not expected that local systems should manage those, but should choose the most appropriate one to maintain (for example by examining period dates).\n\nA `home` address is the patient's main residential address and should normally be used for all clinical and demographic purposes, including clinical and appointment correspondence.\nHowever additionally, `temp` and `billing` addresses may be provided by a patient when there is a requirement to record an alternative location for the purposes of unbroken care.\nWhen sending correspondence to a patient:\n*\ta present and valid `billing` address may take precedence over `home` and `temp` addresses. A patient should have only a single current `billing` address. An address is considered 'valid' according to its period start and to dates.\n*\tif no current `billing` address is provided, a `temp` address may take precedence over the `home` address, again if it is valid according to its period start and to dates.\n* if there is no valid, current `billing` and/or `temp` address, the `home` address must be used.\n\nNot all local systems support `temp` and `billing` addresses, so these are not uniformly maintained. Therefore, where the patient contact has clinical or business significance, the precedence of these addresses over the `home` address should be determined by a user wherever possible.\nWhen the end date for a `temp` or `billing` address passes, local systems should use the patient’s `home` address. It is extremely rare that no home address is present on a patient record.\n\nBe aware of the following business rules:\n* you cannot add more than one of each address use types; `home`, `temp` or `billing`\n* `work` address `use` type is a valid response but cannot be added or replaced as it is a legacy value. An address with the `work` type can be removed though\n* any `temp` address must have both a `period start` and a `period end` date. The provision of a period end date has particular importance in order to avoid temporary addresses that are no longer relevant to the patient still being held as current data available to any system retrieving the patient record. A suggested default where no actual period end is known is 30 days later than the period start, up to a maximum of 3 months.\n* any `billing` address must have both a `period start` and a `period end` date. The provision of a period end date has particular importance in order to avoid correspondence addresses that are no longer relevant to the patient still being held as current data available to any system retrieving the patient record. A suggested default where no actual period end is known is 30 days later than the period start, up to a maximum of 12 months.\n* the date period is optional; where present they must be valid dates and the `end` date cannot be before the `start` date\n* the period `start` date is optional, however if provided cannot be a future date. If it is not provided it defaults to the date of update\n* where a `temp` address is provided a description must be sent using the `text` field, the list of possible values are:\n * `Second Home` - a patient's second home\n * `Student Accommodation` - a patient's place of residence while at university\n * `Respite Care Address` - where the patient resides during respite care\n * `Temporary Residence Address` - where the patient resides for a specific period of time\n * `Convalescence Home` - the address for a patient during a period of recovery\n * `Mobile Home` - the address of a patient's mobile home, parked for a specific period of time, e.g. the address of a caravan park\n * `Holiday Home` - the address for a patient during a holiday\n\n### Communication\n\nSingle item found under `extension` with the extension URL `https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSCommunication`.\n\nIn a JSON Patch request, where the communication extension does not exist the path should be:\n* `/extension/-` when adding a communication extension.\n\nWhere you are replacing/removing the full communication extension, the path should be:\n* `/extension/0` if the communication extension is the first item in the list. If it is the second item in the list the path is `/extension/1`, and so on.\n\nWhere the communication extension already exists and you wish to replace a specific sub-extension, then the path should be:\n* `/extension/0/extension/1` if the communication extension is the first item in the list and the sub-extension is the second item in the list.\n\nYou can find examples of the above requests in our sandbox Postman collection\n\nThere are a number of business rules that should be taken into account:\n* preferred language must not be supplied where it is English even though the [code list](https://simplifier.net/resolve?target=simplifier&scope=uk.nhsdigital.r4&canonical=https://fhir.hl7.org.uk/ValueSet/UKCore-HumanLanguage) contains a value for English (en).\n* any language codes outside the accepted list are rejected; such as local system `qa` codes.\n\n### Contact preferences\nSingle item found under `extension` with the extension URL `https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-ContactPreference`.\n\nIn a JSON Patch request, where the Contact Preference extension does not exist or you are replacing/removing the full list of Contact preferences, the path should be:\n* `/extension/0` if the contact preference is the first item in the list. If it is the second item in the list the path is `/extension/1`, and so on.\n* `/extension/-` when adding a contact preference.\n\nWhere the Contact Preference extension already exists and you wish to add, replace or remove a specific contact preference(s) sub-extension, then the path should be:\n* `/extension/0/extension/1` if the contact preference extension is the first item in the list and the method is the second item in the sub-extension list.\n\nYou can find examples of the above requests in our sandbox Postman collection \n\nThere are a number of business rules that should be taken into account:\n* a patient can have `0` or `1` contact preference.\n* preferred contact time is a free-text field limited to 40 characters.\n* where a contact time is specified a contact method must also exist.\n\n### Date of birth\n\nSingle item found under `birthDate` field.\n\nIn a JSON Patch request the path should be `/birthDate`.\n\nWhen adding or updating the birth date, the update should be in the format `yyyy-mm-dd`.\n\nThere are a number of business rules that should be taken into account:\n* cannot be removed.\n* cannot be a date in the future.\n* cannot be after the deceased date, if present.\n\n### Date of death\n\nSingle item found under `deceasedDateTime` field.\n\nIn a JSON Patch request the path should be `/deceasedDateTime`.\n\nWhen adding or updating the deceased date time, the update should be in the format `yyyy-mm-ddTHH:MM:SS+HH:MM`.\n\nThere are a number of business rules that should be taken into account:\n* cannot be removed.\n* cannot be a date in the future.\n* cannot be before the birth date.\n* cannot be replaced if the death notification status is 2 (formal).\n* when adding date of death, a death notification status must also be added.\n\n### Death notification\n\nSingle item found under `extension` with the extension URL `https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus`.\n\nIn a JSON Patch request the path should be:\n* `/extension/0` if the death notification is the first item in the list. If it is the second item in the list the path is `/extension/1`, and so on.\n* `/extension/-` when adding a death notification.\n\nYou can find examples of the above requests in our sandbox Postman collection\n\nThere are a number of business rules that should be taken into account:\n* cannot be removed.\n* cannot be replaced if the death notification status is formal (2).\n* only certain endpoints can set a death notification of formal (2).\n* when adding a death notification, a deceased date time must also be added.\n\n### Emergency contact\n\nList item found under `contact` field.\n\nIn a JSON Patch request the path should be:\n* `/contact/0` if the contact to be replaced or removed is the first item in the list. If it is the second item in the list the path is `/contact/1`, and so on.\n* `/contact/-` when adding a new contact.\n\nOnly emergency contact details should be added to `contact`, regular telecommunication methods such as home phone should be added to the `telecom` field.\nAny other contact relationship types are rejected.\n\nThere are a number of business rules that should be taken into account:\n* in any telecom child object the `use` key should not be present.\n* in any telecom child object the system cannot be `fax`.\n* the date period is optional; where present they must be valid dates and the `end` date cannot be before the `start` date.\n* the period `start` date is optional, however if provided cannot be a future date. If it is not provided it defaults to the date of update.\n* the date period, if present, should be on the parent `contact` object and not any `telecom` child objects.\n* if the system is email, the value must be a valid email format, for example john.smith@example.com; and must be more than 6 characters and less than 90 characters\n* the relationship can only be `C` meaning `Emergency Contact`\n\n### Gender\n\nSingle item found under `gender` field.\n\nIn a JSON Patch request the path should be `/gender`.\n\nWhen setting a gender, the local system should encourage the user to select `male` or `female` rather than `unknown`.\nThe fourth value of gender, `other`, meaning indeterminate; i.e. unable to be classified as either male or female; should never pro-actively be set by local systems - although this value can be retrieved due to legacy data or data quality issues.\n\nThere are a number of business rules that should be taken into account:\n * cannot be removed.\n * can only be `male`, `female` or `unknown`.\n * cannot set gender to `other`.\n\n### General practice\n\nList item found under `generalPractitioner` field. Although only a single general practice is allowed.\n\nIn a JSON Patch request the path should be:\n* `/generalPractitioner/0` for replacing or removing the general practice.\n* `/generalPractitioner/-` when adding a new general practice.\n\nThere are a number of business rules that should be taken into account:\n* only valid GP Practice codes may be used, see [Organisation Data Service FHIR API](https://developer.nhs.uk/apis/ods/) for more details on valid codes.\n* the period `start` date is optional, however if provided cannot be a future date. If it is not provided it defaults to the date of update.\n* do not provide a period `end` date.\n* the general practice should only be updated by primary care systems, [NHAIS](https://digital.nhs.uk/services/nhais) or by the National Back Office.\n* removal of a general practice can only be done by [NHAIS](https://digital.nhs.uk/services/nhais) or by the National Back Office.\n* only a single general practice is supported; emergency, temporary and additional practices must be maintained in the local system only.\n\n### Managing Organisation (internal-use only)\n\nSingle item found under `managingOrganization` field.\n\nIn a JSON Patch request the path should be `/managingOrganization`.\n\nThe following business rules should be observed:\n* only valid GP Practice codes may be used, see [Organisation Data Service FHIR API](https://developer.nhs.uk/apis/ods/) for more details on valid codes.\n* the period `start` date is optional, however if provided cannot be a future date. If it is not provided it defaults to the date of update.\n* only a single general practice is supported; emergency, temporary and additional practices must be maintained in the local system only.\n\n### Multiple birth order\n\nSingle item found under `multipleBirthInteger` field.\n\nIn a JSON Patch request the path should be `/multipleBirthInteger`.\n\nWhen adding or updating the birth order, the update should be an integer in the range `1` - `9` inclusive. These values have differing meanings:\n* 1 - 7 indicates the order of birth, with 1 indicating the first or only birth in the sequence, 2 indicating the second birth in the sequence, 3 indicating the third, and so on up to 7.\n* 8 - `Not applicable`\n* 9 - `Not known`\n\n### Name\n\nList item found under `name` field.\n\nIn a JSON Patch request the path should be:\n* `/name/0` if the name to be replaced or removed is the first item in the list. If it is the second item in the list the path is `/name/1`, and so on.\n* `/name/-` when adding a new name.\n\nThere are a number of business rules that should be taken into account:\n* cannot add more than one `usual` name.\n* cannot remove the `usual` name.\n* cannot add more than one `nickname`.\n* can have multiple instances of all other name use types.\n* cannot replace the use type on an existing name. For example, once a name is a nickname, it cannot be changed directly to an alias. You must instead remove the nickname and add the alias.\n* the first character of each `suffix` item must be `A-Z`.\n* the date period is optional; where present they must be valid dates and the `end` date cannot be before the `start` date.\n* the period `start` date is optional, however if provided cannot be a future date. If it is not provided it defaults to the date of update.\n* supplied name data can only contain characters from the following ranges:\n\n| Character Code/Range | Examples |\n|----------------------|---------------|\n| 65-90 | A-Z |\n| 97-122 | a-z |\n| 45 | Apostrophe |\n| 39 | Hyphen |\n| 32 | Space |\n| 192-214 | À, Æ, Ö, ... |\n| 216-246 | Ø, ß, ö, ... |\n| 248-383 | ø, ü, ÿ, ... |\n| 46 | Full-stop |\n| 48-57\t | Numbers |\n\n* the `period` is optional, but if included the `end` date cannot be before the `start` date. They can however be in the past, present or future.\n* the full available range of generally recognised titles are permitted, however, if any of the following are used then the value input must conform to the following format:\n * Mr\n * Mrs\n * Ms\n * Dr\n * Rev\n * Sir\n * Lady\n * Lord\n* any trailing full stops at the end of a prefix are automatically removed; for example `Mrs.` changes to `Mrs`.\n\n### Pharmacy\n\nSingle item found under `extension` with one of the extension urls:\n* `https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NominatedPharmacy`\n* `https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-MedicalApplianceSupplier`\n* `https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-PreferredDispenserOrganization`\n\nIn a JSON Patch request the path should be:\n* `/extension/0` if the pharmacy is the first item in the list. If it is the second item in the list the path is `/extension/1`, and so on\n* `/extension/-` when adding a pharmacy\n\nThere are a number of business rules that should be taken into account:\n* multiple pharmacies are allowed, however only one of each type\n* there are no effective date periods, only a single current instance of each type is supported\n* only valid National Pharmacy codes may be used for the pharmacy identifier, see [Organisation Data Service FHIR API](https://developer.nhs.uk/apis/ods/) for more details on valid codes\n\n### Place of birth\n\nSingle item found under `extension` with the extension URL `http://hl7.org/fhir/StructureDefinition/patient-birthPlace`.\n\nIn a JSON Patch request the path should be:\n* `/extension/0` if the place of birth is the first item in the list. If it is the second item in the list the path is `/extension/1`, and so on\n* `/extension/-` when adding a place of birth\n\nThere are a number of business rules that should be taken into account:\n* the three fields, `city`, `district` and `country` are all optional, however at least one of them must be provided\n* country is a coded value and must be in the set of valid values\n\n### Telecom\n\nList item found under `telecom` field.\n\nIn a JSON Patch request the path should be:\n* `/telecom/0` if the telecom to be replaced or removed is the first item in the list. If it is the second item in the list the path is `/telecom/1`, and so on\n* `/telecom/-` when adding a new telecom\n\nEmergency contact details should not be added to the `telecom` field, instead they should be added to the `contact` field.\n\nThere are a number of business rules that should be taken into account:\n* the date period is optional; where present they must be valid dates and the `end` date cannot be before the `start` date\n* the period `start` date is optional, however if provided cannot be a future date. If it is not provided it defaults to the date of update.\n* if the telecom system is email, the value must be a valid email format, for example john.smith@example.com; and must be more than 6 characters and less than 90 characters\n\n## Access Mode\n\n### Healthcare worker access\n\nA user with Healthcare worker access will be able to update the following fields:\n* Address\n* Communication\n* Contact preferences\n* Date of birth\n* Date of death\n* Death notification\n* Emergency contact\n* Gender\n* General practice\n* Managing Organisation (internal use only)\n* Multiple birth order\n* Name\n* Pharmacy\n* Place of birth\n* Telecom\n\n### Patient access\n\nA user with Patient access will be able to update the following fields:\n* Address\n* Pharmacy\n* Telecom (mobile and email only)\n\n## Sandbox test scenarios\n\nYou can test the following scenarios in our sandbox environment.\n\nThings to note when using the sandbox for PATCH:\n* Your changes are not persisted.\n* JSON Patch operations themselves are validated, but the resulting resource is not validated for correctness; meaning any business rules are not applied.\n* You can use the patient with minimal data, `9000000033` to test adding all data types (as most of them are missing on this patient), that would normally be present (e.g. gender).\n\n| Scenario | Request | Response |\n| ----------------------------------- | ------------------------------------------------------------------------- | ------------------------------------------------ |\n| Successful update | `id`=`9000000009`

Body: One of the provided examples or your own combination of patches

Headers: `If-Match`=`W/\"2\"`, `Content-Type`=`application/json-patch+json` | HTTP Status 200 with updated patient resource. |\n| Patient does not exist | `id`=`9111231130` (or any other valid NHS number) | HTTP Status 404 with problem description |\n| Invalid NHS number | `id`=`9000000000` (or any invalid NHS number) | HTTP Status 400 with problem description |\n| Missing resource version identifier | `If-Match` header missing or set to format other than `W/\"\"` | HTTP Status 412 with problem description |\n| Incorrect resource version | `If-Match`=`W/\"1\"` | HTTP Status 412 with problem description |\n| Wrong content type | `Content-Type` header missing or other than `application/json-patch+json` | HTTP Status 400 with problem description |\n| No patches sent | Send body with no `patches` attribute | HTTP Status 400 with problem description |\n| Invalid patch operations | Send body with invalid JSON patches in `patches` attribute | HTTP Status 400 with problem description |\n| Missing X-Request-ID | `id`=`9000000009` (or any other valid NHS number) | HTTP Status 412 with problem description |\n\nYou can try out the sandbox using the 'Try this API' feature on this page.\n\nAlternatively, you can try out the sandbox using our Postman collection:\n\n[![Run in Postman](https://run.pstmn.io/button.svg)](https://app.getpostman.com/run-collection/14719036-953f067f-30b9-4552-8252-7cc10b21dad3)\n","summary":"Update patient details","operationId":"update-patient-partial","externalDocs":{"description":"IETF RFC 6902, which defines json-patch.","url":"https://tools.ietf.org/html/rfc6902"},"parameters":[{"in":"header","name":"If-Match","description":"Latest known version identifier enclosed in quotes preceded by `W/`.\n\nSend the value of the patient's `ETag` response header on patient retrieval when updating a patient.\nThis is to ensure that any updates are applied against an up-to-date version of the patient resource.\n","required":true,"schema":{"type":"string","pattern":"^W/\"[0-9]+\"$","example":"W/\"2\""}},{"in":"header","name":"Content-Type","description":"For a PATCH request, this must be set to `application/json-patch+json`.\n","required":true,"schema":{"type":"string","example":"application/json-patch+json"}}],"requestBody":{"required":true,"content":{"application/json-patch+json":{"schema":{"type":"object","required":["patches"],"properties":{"patches":{"type":"array","items":{"type":"object","required":["op","path"],"properties":{"op":{"type":"string","enum":["remove","add","replace","test"]},"path":{"description":"The location of the information to remove, add or replace. The '-' character must be used to add new items to arrays, e.g. names, addresses.","type":"string","format":"jsonpointer","externalDocs":{"description":"IETF RFC 6901 JavaScript Object Notation (JSON) Pointer.","url":"https://tools.ietf.org/html/rfc6901"}},"value":{"description":"The information to be added or replaced. Should not be included on a remove.","oneOf":[{"type":"string"},{"type":"integer"},{"type":"object"}]}}}}}},"examples":{"add-deceased-date-time":{"summary":"Add a new single item (deceasedDateTime) to the patient","value":{"patches":[{"op":"add","path":"/deceasedDateTime","value":"2010-10-22T00:00:00+00:00"}]}},"add-name":{"summary":"Add a new list item (name) to the patient","value":{"patches":[{"op":"add","path":"/name/-","value":{"use":"usual","period":{"start":"2019-12-31"},"prefix":["Dr"],"given":["Joe","Horation","Maximus"],"family":"Bloggs","suffix":["PhD"]}}]}},"add-extension":{"summary":"Add a an extension (nominated pharmacy) to the Patient","value":{"patches":[{"op":"add","path":"/extension/-","value":{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NominatedPharmacy","valueReference":{"identifier":{"system":"https://fhir.nhs.uk/Id/ods-organization-code","value":"Y12345","period":{"start":"2020-01-01","end":"2021-12-31"}}}}}]}},"update-gender":{"summary":"Update the simple item (gender)","value":{"patches":[{"op":"replace","path":"/gender","value":"male"}]}},"update-address":{"summary":"Update specific fields on a list item (address)","value":{"patches":[{"op":"replace","path":"/address/0/id","value":"456"},{"op":"replace","path":"/address/0/line/0","value":"2 Whitehall Quay"},{"op":"replace","path":"/address/0/postalCode","value":"LS1 4BU"}]}},"update-address-alternative":{"summary":"Update whole object on a list item (address)","value":{"patches":[{"op":"replace","path":"/address/0","value":{"id":"456","period":{"start":"2020-01-01","end":"2021-12-31"},"use":"home","line":["2 Whitehall Quay","Leeds","West Yorkshire"],"postalCode":"LS1 4BU","extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","extension":[{"url":"type","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType","code":"PAF"}},{"url":"value","valueString":"9876543"}]}]}}]}},"update-extension":{"summary":"Update an extension (death notification)","value":{"patches":[{"op":"replace","path":"/extension/3","value":{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus","extension":[{"url":"deathNotificationStatus","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-DeathNotificationStatus","version":"1.0.0","code":"1","display":"Informal - death notice received via an update from a local NHS Organisation such as GP or Trust"}]}}]}}]}},"delete-gender":{"summary":"Remove a single item (gender) no longer in use","value":{"patches":[{"op":"remove","path":"/gender"}]}},"delete-name":{"summary":"Remove a list item (name) no longer in use, using test pointing to the name items id","value":{"patches":[{"op":"test","path":"/name/0/id","value":"123"},{"op":"remove","path":"/name/0"}]}},"delete-name-alternative":{"summary":"Remove a list item (name) no longer in use, using test pointing to the name object","value":{"patches":[{"op":"test","path":"/name/0","value":{"id":"123","use":"usual","period":{"start":"2020-01-01","end":"2021-12-31"},"given":["Jane"],"family":"Smith","prefix":["Mrs"],"suffix":["MBE"]}},{"op":"remove","path":"/name/0"}]}},"delete-extension":{"summary":"Remove an extension (dispensing doctor pharmacy) no longer in use","value":{"patches":[{"op":"test","path":"/extension/1/url","value":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-PreferredDispenserOrganization"},{"op":"remove","path":"/extension/1"}]}}}}}},"responses":{"200":{"description":"Patient updated.","headers":{"ETag":{"schema":{"type":"string","pattern":"^W/\"[0-9]+\"$","example":"W/\"2\""},"description":"Record version identifier enclosed in quotes and preceded by 'W/'. For example, `W/\"2\"`.\n\nCorresponds to `meta.versionId` attribute in the patient resource body.\n\nWhen you retrieve a patient resource, you get a version number for the resource (in the `ETag` response header and in the `versionId` field in the response).\nYou must then pass the resource's version number in any update request (in the `If-Match` response header) made for the patient.\n"},"X-Correlation-Id":{"schema":{"type":"string","example":"11C46F5F-CDEF-4865-94B2-0EE0EDCC26DA"},"description":"The X-Correlation-ID from the request header, if supplied, mirrored back.\n"},"X-Request-Id":{"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","example":"60E0B220-8136-4CA5-AE46-1D97EF59D068"},"description":"The X-Request-ID from the request header, if supplied, mirrored back.\n"}},"content":{"application/fhir+json":{"schema":{"type":"object","required":["id"],"additionalProperties":false,"properties":{"resourceType":{"type":"string","description":"FHIR resource type.","default":"Patient"},"id":{"description":"The patient's NHS number. The primary identifier of a patient, unique within NHS England and Wales. Always 10 digits and must be a [valid NHS number](https://www.datadictionary.nhs.uk/attributes/nhs_number.html).","type":"string","pattern":"^\\d{10}$","example":"9000000009"},"identifier":{"type":"array","description":"Identifier and system of identification used for this Patient.","items":{"type":"object","maxItems":1,"required":["value"],"properties":{"system":{"type":"string","format":"url","description":"System identifier belongs to.","default":"https://fhir.nhs.uk/Id/nhs-number"},"value":{"description":"The patient's NHS number. The primary identifier of a patient, unique within NHS England and Wales. Always 10 digits and must be a [valid NHS number](https://www.datadictionary.nhs.uk/attributes/nhs_number.html).","type":"string","pattern":"^\\d{10}$","example":"9000000009"},"extension":{"type":"array","description":"FHIR extensions.","items":{"type":"object","description":"Status indicating if NHS number is present and verified.","properties":{"url":{"type":"string","description":"URL of the extension definition.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSNumberVerificationStatus","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSNumberVerificationStatus"]},"valueCodeableConcept":{"type":"object","description":"NHS Number Verification Status Indicator.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URI of the coding system specification.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-NHSNumberVerificationStatus"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1.0.0"},"code":{"type":"string","description":"Symbol in syntax defined by the system.","example":"01"},"display":{"type":"string","description":"Representation defined by the system.","example":"Number present and verified"}}}}}}}}}}}},"meta":{"type":"object","description":"Metadata about this resource.","properties":{"versionId":{"type":"string","description":"The NHS England assigned version of the patient resource.","example":"2"},"security":{"type":"array","description":"The level of security on the patients record, which affects which fields are populated on retrieval. The possible responses are:\n* U - unrestricted. All available data is returned.\n* R - restricted. Any sensitive data around the patient's location, so `address`, `generalPractitioner` and `telecom`, are removed from the response.\n* REDACTED - redacted. The patient record has been marked as invalid, so the data should not be used. This code is never returned; you receive a 404, and appropriate error response, if an invalidated patient retrieval is attempted.\n","maxItems":1,"items":{"type":"object","properties":{"system":{"type":"string","description":"URI of the value set specification.","example":"http://terminology.hl7.org/CodeSystem/v3-Confidentiality"},"code":{"type":"string","description":"Code defined by the system value set.","enum":["U","R","V","REDACTED"],"example":"U"},"display":{"type":"string","description":"Representation defined by the system.","enum":["unrestricted","restricted","redacted"],"example":"unrestricted"}}}}}},"name":{"type":"array","description":"List of names associated with the patient. \n","minItems":1,"items":{"type":"object","required":["use","family"],"additionalProperties":false,"properties":{"id":{"type":"string","description":"Unique object identifier for this name.","example":"123"},"use":{"type":"string","description":"How this name should be used.\n* usual - Known as, conventional or the one patient normally uses. A patient always has a usual name.\n* temp - An alias or temporary name. This may also be used for temporary names assigned at birth or in emergency situations.\n* nickname - A name that the patient prefers to be addressed by, but is not part of their usual name.\n* old - This name is no longer in use (or was never correct, but retained for records).\n* maiden - Name changed for Marriage. A name used prior to changing name because of marriage. This term is not gender specific. The use of this term does not imply any particular history for a person's name.\n\nThe following use codes are included in the [name-use](https://www.hl7.org/fhir/valueset-name-use.html) value set, but should not be used and is not be returned as part of a retrieval.\n* official - The formal name as registered in an official (government) registry, but which name might not be commonly used. May be called \"legal name\".\n* anonymous - Anonymous assigned name, alias, or pseudonym (used to protect a person's identity for privacy reasons).\n","enum":["usual","temp","nickname","old","maiden"],"example":"usual"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"given":{"type":"array","maxItems":5,"description":"Given names, including any middle names.\n\nEach name(s) should be a separate item in the list. The first given name may include multiple names, separated by a space.\nSubsequent names must be broken down into list items. For example, the input `[Jane Marie Anne, Jo Adele]` returns `[Jane Marie Anne, Jo, Adele]`.\n","example":["Jane Marie Anne","Jo","Adele"],"items":{"type":"string","maxLength":35,"example":"Jane"}},"family":{"type":"string","maxLength":35,"description":"Family name (often called Surname).","example":"Smith"},"prefix":{"type":"array","description":"Name prefixes, titles, and prenominals.","example":["Mrs"],"items":{"type":"string","example":"Mrs"}},"suffix":{"type":"array","description":"Name suffices and postnominals.","example":["MBE","PhD"],"items":{"type":"string","example":"MBE"}}}}},"gender":{"type":"string","description":"Classification of the gender of a patient. The classification is phenotypical rather than genotypical, i.e. it does not provide codes for medical or scientific purposes.\nIt is the administrative gender that the patient wishes to be known as. In some cases, this may not be the same as the patient’s registered birth gender, or their current clinical gender.\n","enum":["male","female","other","unknown"],"example":"female"},"birthDate":{"description":"The date on which the patient was born or is officially deemed to have been born.\n\nIt is a date in the format `yyyy-mm-dd`. Due to data quality issues on a small number of patients `yyyy-mm` and `yyyy` format may also be returned. \n","example":"2010-10-22","type":"string","format":"date"},"multipleBirthInteger":{"type":"integer","minimum":1,"maximum":9,"description":"The order in which the patient was born, with 1 indicating the first or only birth in the sequence, 2 indicating the second birth in the sequence, 3 indicating the third, and so on up to 7.\n\nThere are two other valid values; `8` meaning `Not applicable` and `9` meaning `Not known`.\n","example":1},"deceasedDateTime":{"description":"The date and time on which a person died or is officially deemed to have died, if applicable and known.\n\nIt is a datetime in the format `yyyy-mm-ddTHH:MM:SS+HH:MM` or `yyyy-mm-dd`. Due to data quality issues on a small number of patients `yyyy-mm` and `yyyy` format may also be returned.\n","example":"2010-10-22T00:00:00+00:00","type":"string","format":"date-time","pattern":"^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2}\\+\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2}\\+\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01]))$"},"address":{"type":"array","description":"List of addresses associated with the patient.\n\nThese are fully populated on a retrieval or a successful update, only the `home` address is returned on a search.\nWhen a patient tagged as `restricted` is retrieved, all addresses are removed from the response.\n","items":{"type":"object","description":"An address associated with the patient.","required":["use"],"properties":{"id":{"type":"string","description":"Unique system identifier for this address.","example":"456"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"use":{"type":"string","description":"Purpose of this address:\n * `home` - the home address is the patient's normal residence. Home address is also known as usual, main, registered, current or permanent address\n * `temp` - a temporary address is an address used for a set period of time, but where the patient's home, permanent address remains unchanged\n * `billing` - an address used for correspondence purposes only\n * `work` - an office address. This can be returned due to legacy data but cannot be added or replaced on update\n\n A patient should have no more than one current `temp` and/or `billing` address.\n However, historically this was constrained only by the integration requirements and was not enforced so theoretically more than one can exist for a patient when retrieving.\n Where multiple instances already exist for the patient it is not expected that local systems should manage those, but should choose the most appropriate one to maintain (e.g. by examining period dates).\n\n A `home` address is the patient's main residential address and should normally be used for all clinical and demographic purposes, including clinical and appointment correspondence.\n However additionally, `temp` and `billing` addresses may be provided by a patient when there is a requirement to record an alternative location for the purposes of unbroken care.\n When sending correspondence to a patient:\n *\ta present and valid `billing` address may take precedence over `home` and `temp` addresses. A patient should have only a single current `billing` address. An address is considered 'valid' according to its period start and end dates.\n *\tif no current `billing` address is provided, a `temp` address may take precedence over the `home` address, again if it is valid according to its period start and end dates.\n * if there is no valid, current `billing` and/or `temp` address, the `home` address must be used.\n","enum":["home","work","temp","billing"],"example":"home"},"text":{"type":"string","description":"Where a `temp` address is provided a descriptor text must be sent.\nThe list of possible values are:\n* `Second Home` - a patient's second home\n* `Student Accommodation` - a patient's place of residence while at university\n* `Respite Care Address` - where the patient resides during respite care\n* `Temporary Residence Address` - where the patient resides for a specific period of time\n* `Convalescence Home` - the address for a patient during a period of recovery\n* `Mobile Home` - the address of a patient's mobile home, parked for a specific period of time, e.g. the address of a caravan park\n* `Holiday Home` - the address for a patient during a holiday\n\nA patient can also register temporarily at a GP practice using a temporary address. Temporary GP registration information does not appear on the PDS, but the address used for it may.\n","enum":["Second Home","Student Accommodation","Respite Care Address","Temporary Residence Address","Convalescence Home","Mobile Home","Holiday Home"],"example":"Student Accommodation"},"line":{"type":"array","description":"All lines of the address except the postal code.\n\nSystems must apply the following formatting convention when adding or replacing addresses lines:\n*\tline 1 - premises ID and/or house name, e.g. `Flat 1` or `The Old Schoolhouse`\n*\tline 2 - house number, dependent thoroughfare name and descriptor (if present), thoroughfare name and descriptor, e.g. `23 Mill Lane`\n*\tline 3 - dependent locality/village, locality (if present), e.g. `Boxgrove`\n*\tline 4 - post town, e.g. `Leeds`\n*\tline 5 - county (if present), e.g. `West Yorkshire`\n\nIf any of the lines are blank, they are not returned due to FHIR conformance constraints.\n","maxItems":5,"items":{"type":"string"},"example":["1 Trevelyan Square","Boar Lane","City Centre","Leeds","West Yorkshire"]},"postalCode":{"type":"string","description":"Postal code of the address.","example":"LS1 6AE"},"extension":{"type":"array","description":"List of address keys formatted as a FHIR extension. This can include up to one Unique Property Reference Number (UPRN), and up to one Postal Address File (PAF) key. If no keys for the address are known, the array will be empty. Otherwise it will be a list of objects which specify the value of the address key and the code system for it","items":{"anyOf":[{"type":"object","description":"Unique identifier for an address.","properties":{"url":{"type":"string","description":"URL of specification of the AddressKey extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey"]},"extension":{"type":"array","description":"Specification of address key system and address key value. Contains exactly two items: one describing the code system the Address Key uses, and the other specifying the value of the Address Key.","minItems":2,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Coding system of the address key.","required":["url","valueCoding"],"properties":{"url":{"type":"string","description":"Always 'type'.","default":"type"},"valueCoding":{"type":"object","description":"URL of specification of address key format.","required":["system","code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available Address Key formats.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType"},"code":{"type":"string","description":"Address Key system. Always 'PAF'.","enum":["PAF"],"example":"PAF"}}}}},{"type":"object","description":"Value of the address key.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Always 'value'.","default":"value","example":"value"},"valueString":{"type":"string","description":"Address key in PAF format. An 8 digit number including leading zeroes, formatted as a string.","minLength":8,"maxLength":8,"pattern":"^[0-9]{8}$","example":"12345678"}}}]}}}},{"type":"object","description":"Unique identifier for an address.","properties":{"url":{"type":"string","description":"URL of specification of the AddressKey extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey"]},"extension":{"type":"array","description":"Specification of address key system and address key value. Contains exactly two items: one describing the code system the Address Key uses, and the other specifying the value of the Address Key.","minItems":2,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Coding system of the address key.","required":["url","valueCoding"],"properties":{"url":{"type":"string","description":"Always 'type'.","default":"type"},"valueCoding":{"type":"object","description":"URL of specification of address key format.","required":["system","code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available Address Key formats.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType"},"code":{"type":"string","description":"Address Key system. Always 'UPRN'.","enum":["UPRN"],"example":"UPRN"}}}}},{"type":"object","description":"Value of the address key.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Always 'value'.","default":"value","example":"value"},"valueString":{"type":"string","description":"Address key in UPRN format. A number containing from 1 up to 12 digits.","minLength":1,"maxLength":12,"pattern":"^[0-9]{1,12}$","example":"123456789012"}}}]}}}}]}}}}},"telecom":{"type":"array","description":"List of contact points for the patient; for example, phone numbers or email addresses.\nWhen a patient tagged as `restricted` is retrieved, all contact points are removed from the response.\n","items":{"description":"A contact point, such as a phone number or email address","type":"object","required":["system","value"],"properties":{"id":{"type":"string","description":"Unique object identifier for this contact point.","example":"789"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"system":{"description":"Means of communication, such as phone or email.","type":"string","enum":["phone","fax","email","other"],"example":"phone"},"value":{"description":"Phone number, email address, or other identifier for use with contact system.","type":"string","example":"01632960587"},"use":{"type":"string","description":"Location associated with communication system.","enum":["home","work","temp","mobile"],"example":"home"},"extension":{"type":"array","maxItems":1,"description":"Extension that is returned when the communication type is `textphone`. The only code returned is `textphone`, which means `Minicom (Textphone)`.\n\nThe `system` is `other` when the extension is included.\n","items":{"type":"object","description":"Wrapped object for other contact system details.","properties":{"url":{"type":"string","description":"Definition of other contact system extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem"]},"valueCoding":{"type":"object","description":"URL of specification of other contact systems.","properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem"},"code":{"type":"string","description":"Coded value for the other contact system in place.","example":"textphone"},"display":{"description":"Display-friendly representation of the other contact system code.","type":"string","example":"Minicom (Textphone)"}}}}}}}}},"contact":{"type":"array","description":"A list of patient contacts. Only emergency contacts are returned and only emergency contacts should be added. Any other contacts should be added to the patients `Related Person`.\nPatients designate here any contact number they desire to be used in case of an emergency.\nNote, while a patient may also desire to record various related persons telecom details, these do not separately allow for a concept of emergency contact; only ranking. See RelatedPerson endpoint.\nWhen a patient tagged as `restricted` is retrieved, all contacts are removed from the response.\n","items":{"title":"Schema for a patient contact.","type":"object","additionalProperties":false,"required":["relationship","telecom"],"properties":{"id":{"type":"string","example":"C123"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"relationship":{"type":"array","description":"The contact relationship wrapper object that holds the details of the relationship to the patient.\n\nThis is only returned when an Emergency Contact number has been set on `telecom`. The only valid code is `C`, which means `Emergency Contact`.\n","minItems":1,"maxItems":1,"items":{"type":"object","required":["coding"],"properties":{"coding":{"type":"array","description":"Exactly one contact relationship.","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","format":"url","default":"http://terminology.hl7.org/CodeSystem/v2-0131"},"code":{"type":"string","description":"Coded value for contact relationship.","example":"C"},"display":{"type":"string","description":"Display-friendly representation of the contact relationship code.","example":"Emergency Contact"}}}}}}},"telecom":{"type":"array","description":"List of Telecom objects on the contact only contains `system` and `value`.\n","items":{"description":"A contact point, such as a phone number or email address","type":"object","required":["system","value"],"properties":{"id":{"type":"string","description":"Unique object identifier for this contact point.","example":"789"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"system":{"description":"Means of communication, such as phone or email.","type":"string","enum":["phone","fax","email","other"],"example":"phone"},"value":{"description":"Phone number, email address, or other identifier for use with contact system.","type":"string","example":"01632960587"},"use":{"type":"string","description":"Location associated with communication system.","enum":["home","work","temp","mobile"],"example":"home"},"extension":{"type":"array","maxItems":1,"description":"Extension that is returned when the communication type is `textphone`. The only code returned is `textphone`, which means `Minicom (Textphone)`.\n\nThe `system` is `other` when the extension is included.\n","items":{"type":"object","description":"Wrapped object for other contact system details.","properties":{"url":{"type":"string","description":"Definition of other contact system extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem"]},"valueCoding":{"type":"object","description":"URL of specification of other contact systems.","properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem"},"code":{"type":"string","description":"Coded value for the other contact system in place.","example":"textphone"},"display":{"description":"Display-friendly representation of the other contact system code.","type":"string","example":"Minicom (Textphone)"}}}}}}}}}}}},"generalPractitioner":{"type":"array","maxItems":1,"description":"General Practice (not practitioner) with which the patient is, or was, registered. Always contains zero or one general practitioner object.\nWhen a patient tagged as `restricted` is retrieved, the General Practice is removed from the response.\n","items":{"description":"General practice (not practitioner) with which the patient is or was registered.","type":"object","required":["identifier"],"properties":{"id":{"description":"Object identifier (OID) specific to the returned details - this should be return exactly the same in any update.","type":"string","example":"254406A3"},"type":{"description":"Type of Reference being returned.","type":"string","example":"Organization"},"identifier":{"description":"Identifier and system of identification used for this Organisation.","type":"object","required":["value"],"properties":{"system":{"description":"URL for the Organisation Data Service - who are responsible for publishing codes that identify organisations and individuals across health and social care.","type":"string","example":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"description":"Organisation code for the registered general practice, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","type":"string","pattern":"^[0-9A-Z]+$","example":"Y12345"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}}}}}}},"managingOrganization":{"description":"The managing organization of a de-registered patient. This will not be returned when the reason for de-registration is death.","type":"object","required":["identifier"],"properties":{"type":{"description":"Type of Reference being returned.","type":"string","example":"Organization"},"identifier":{"description":"Identifier and system of identification used for this Organisation.","type":"object","required":["value"],"properties":{"system":{"description":"URL for the Organisation Data Service - who are responsible for publishing codes that identify organisations and individuals across health and social care.","type":"string","example":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"description":"Organisation code for the registered general practice, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","type":"string","pattern":"^[0-9A-Z]+$","example":"Y12345"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}}}}}},"extension":{"type":"array","description":"Wrapper array for the patient's pharmacies, death notification status, communication details, contact preferences and place of birth; these are all FHIR extensions.\nAlways contains zero or one of each pharmacy object, zero or one death notification status object, zero or one communication details object, zero or one contact preference and zero or one place of birth object.\nWhen a patient tagged as `restricted` is retrieved, the pharmacy and birth place extensions are removed from the response.\n","items":{"anyOf":[{"type":"object","description":"Wrapper object for the patient's nominated pharmacy. This will only be populated on a retrieval and not a search.","required":["url","valueReference"],"properties":{"url":{"type":"string","description":"URL of specification of UKCore-NominatedPharmacy FHIR extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NominatedPharmacy","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NominatedPharmacy"]},"valueReference":{"type":"object","description":"Reference to a pharmacy `Organization` resource.","required":["identifier"],"properties":{"identifier":{"type":"object","description":"Wrapper object for the patient's nominated pharmacy organisation code.","required":["value"],"properties":{"system":{"type":"string","description":"URL for the FHIR code system for the ODS organisation code.","default":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"type":"string","description":"Organisation code for the nominated pharmacy, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","pattern":"^[A-Za-z0-9]{3,10}$","example":"Y12345"}}}}}}},{"type":"object","description":"Wrapper object for the patient's dispensing doctor. This will only be populated on a retrieval and not a search.","required":["url","valueReference"],"properties":{"url":{"type":"string","description":"URL of specification of UKCore-DispensingDoctor FHIR extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-PreferredDispenserOrganization","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-PreferredDispenserOrganization"]},"valueReference":{"type":"object","description":"Reference to a GP practice pharmacy `Organization` resource.","required":["identifier"],"properties":{"identifier":{"type":"object","description":"Wrapper object for the patient's dispensing doctor organisation code.","required":["value"],"properties":{"system":{"type":"string","description":"URL for the FHIR code system for the ODS organisation code.","default":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"type":"string","description":"Organisation code for the dispensing doctor, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","pattern":"^[A-Za-z0-9]{3,10}$","example":"Y23456"}}}}}}},{"type":"object","description":"Wrapper object for the patient's medical appliance supplier. This will only be populated on a retrieval and not a search.","required":["url","valueReference"],"properties":{"url":{"type":"string","description":"URL of specification of UKCore-MedicalApplianceSupplier FHIR extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-MedicalApplianceSupplier","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-MedicalApplianceSupplier"]},"valueReference":{"type":"object","description":"Reference to medical appliance supplier pharmacy `Organization` resource.","required":["identifier"],"properties":{"identifier":{"type":"object","description":"Wrapper object for the patient's medical appliance supplier organisation code.","required":["value"],"properties":{"system":{"type":"string","description":"URL for the FHIR code system for the ODS organisation code.","default":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"type":"string","description":"Organisation code for the medical appliance supplier, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","pattern":"^[A-Za-z0-9]{3,10}$","example":"Y34567"}}}}}}},{"type":"object","description":"Wrapper object for death notification details.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of death notification extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus"]},"extension":{"type":"array","description":"Array containing exactly one death notification status code object and exactly one effective date object.","minItems":1,"maxItems":2,"items":{"oneOf":[{"type":"object","description":"Wrapper object for death notification status code.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `deathNotificationStatus`.","default":"deathNotificationStatus","enum":["deathNotificationStatus"]},"valueCodeableConcept":{"type":"object","description":"Death Notification Status.","properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["system","code"],"properties":{"system":{"type":"string","description":"URI of the coding system specification.","example":"https://fhir.hl7.org.uk/CodeSystem/UKCore-DeathNotificationStatus"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1.0.0"},"code":{"type":"string","description":"Symbol, in syntax, defined by the system:\n* `1` - Informal - death notice received via an update from a local NHS Organisation such as GP or Trust\n* `2` - Formal - death notice received from Registrar of Deaths. Only these endpoints are allowed to add a Formal death:\n - National Back Office using the Demographic Spine Application (DSA)\n - Office of National Statistics (ONS)\n - Maternity sites\n* `U` - Removed. This is a possible response, but it cannot be used on an update because Spine will reject it\n","example":"2","enum":["1","2","U"]},"display":{"type":"string","description":"Representation defined by the system.","example":"Formal - death notice received from Registrar of Deaths","enum":["Informal - death notice received via an update from a local NHS Organisation such as GP or Trust","Formal - death notice received from Registrar of Deaths","Removed"]}}}}}}}},{"type":"object","description":"Wrapper object for death notification effective date.","required":["url","valueDateTime"],"properties":{"url":{"type":"string","description":"Key of this object. Always `systemEffectiveDate`.","default":"systemEffectiveDate","enum":["systemEffectiveDate"]},"valueDateTime":{"type":"string","description":"Date and time at which death notification status took effect.","format":"date-time","example":"2010-10-22T00:00:00+00:00"}}}]}}}},{"type":"object","description":"Wrapper object for communication details. This will only be populated on a retrieval and not a search.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of communication extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSCommunication","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSCommunication"]},"extension":{"type":"array","description":"Definition of communication extension.\n\nThe array must have one item, a valueCodeableConcept for the language and can optionally include a valueBoolean for if an interpreter is required.","minItems":1,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Wrapper object for communication language.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `language`.","default":"language","enum":["language"]},"valueCodeableConcept":{"type":"object","description":"Human language.","required":["coding"],"properties":{"coding":{"type":"array","description":"Exactly one language code.","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URL of the Language Code System. Always uses the 'UKCore-HumanLanguage' Code System.","example":"https://fhir.hl7.org.uk/CodeSystem/UKCore-HumanLanguage"},"version":{"type":"string","description":"Version of the language code system.","example":"1.0.0"},"code":{"type":"string","description":"Language code based on [ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) standard plus extensions for braille, makaton and sign languages, which are:\n* `q1` - Braille\n* `q2` - American Sign Language\n* `q3` - Australian Sign Language\n* `q4` - British Sign Language\n* `q5` - Makaton\nAll valid codes combined can be found at https://fhir.hl7.org.uk/CodeSystem/UKCore-HumanLanguage.\n","example":"fr"},"display":{"type":"string","description":"Display-friendly representation of the language code (such as English). If there is a language code with no defined mapping, `Unknown` will be returned.","example":"French"}}}}}}}},{"type":"object","description":"Wrapper object for whether an interpreter is required.","required":["url","valueBoolean"],"properties":{"url":{"type":"string","description":"Key of this object. Always `interpreterRequired`.","default":"interpreterRequired","enum":["interpreterRequired"]},"valueBoolean":{"type":"boolean","description":"Whether an interpreter is required.","example":true}}}]}}}},{"type":"object","description":"Wrapper object for preferred contact details; the written communication format, preferred contact time and method. This will only be populated on a retrieval and not a search.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of the contact preference extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-ContactPreference","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-ContactPreference"]},"extension":{"description":"Wrapper array containing zero or one preferred contact method, zero or one preferred written communication format; and zero or one preferred contact time.","type":"array","maxItems":3,"items":{"oneOf":[{"type":"object","description":"Wrapper object for preferred written communication format.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredWrittenCommunicationFormat`.","default":"PreferredWrittenCommunicationFormat"},"valueCodeableConcept":{"type":"object","description":"Preferred Written Communication Format.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","format":"url","description":"Definition of the preferred written communication extension.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredWrittenCommunicationFormat","enum":["https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredWrittenCommunicationFormat"]},"code":{"type":"string","description":"A code to identify the preferred written communication format of a patient, contact or related person.\n* 11 - Large print\n* 12 - Braille\n* 13 - Audio tape\n","example":"12"},"display":{"type":"string","description":"Display-friendly representation of the preferred written communication format code.","example":"Braille"}}}}}}}},{"type":"object","description":"Wrapper object for preferred contact method.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredContactMethod`.","default":"PreferredContactMethod","enum":["PreferredContactMethod"]},"valueCodeableConcept":{"type":"object","description":"Preferred Contact Method.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","format":"url","description":"Definition of the preferred contact method extension.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredContactMethod","enum":["https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredContactMethod"]},"code":{"type":"string","description":"A code to identify to identify the preferred contact method of a patient, contact or related person.\n* 1\t- Letter\n* 2\t- Visit\n* 3\t- Telephone\n* 4\t- E-mail\n* 5\t- Minicom (Textphone)\n* 6\t- Telephone contact via proxy\n* 7\t- Sign language\n* 8\t- No Telephone contact\n","example":"1"},"display":{"type":"string","description":"Display-friendly representation of the preferred contact method code.","example":"Letter"}}}}}}}},{"type":"object","description":"Wrapper object for preferred contact times.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredContactTimes`.","default":"PreferredContactTimes","enum":["PreferredContactTimes"]},"valueString":{"type":"string","maximum":40,"description":"A free-text description about the preferred contact times.","example":"Not after 7pm"}}}]}}}},{"type":"object","description":"Wrapper object for place of birth details. This will not be returned on a restricted patient.","required":["url","valueAddress"],"properties":{"url":{"type":"string","description":"Definition of place of birth extension.","default":"http://hl7.org/fhir/StructureDefinition/patient-birthPlace","enum":["http://hl7.org/fhir/StructureDefinition/patient-birthPlace"]},"valueAddress":{"type":"object","additionalProperties":false,"properties":{"city":{"type":"string","description":"Town or city of birth.","example":"Manchester"},"district":{"type":"string","description":"County or metropolitan district of birth.","example":"Greater Manchester"},"country":{"type":"string","description":"A coded value for a patient's country of birth.\n\nFrom [ISO 3166-1](http://hl7.org/fhir/valueset-iso3166-1-3.html) plus codes from the UK Internal Code list which do not have entries in ISO 3166-1.\n\nUK Internal Codes:\n* `1` - England\n* `2` - Scotland\n* `3` - Wales\n* `4` - Northern Ireland\n* `7` - Sark\n* `9` - Alderney\n* `10` - Channel Islands\n","example":"GBR"}}}}},{"type":"object","description":"An extension to carry the reason a PDS record has been removed from the Patient Demographic Service. This will only be populated on a retrieval and not a search.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of the removal from registration extension.","default":"https://fhir.nhs.uk/StructureDefinition/Extension-PDS-RemovalFromRegistration","enum":["https://fhir.nhs.uk/StructureDefinition/Extension-PDS-RemovalFromRegistration"],"readOnly":true},"extension":{"type":"array","description":"An extension reason a PDS record has been removed from the Patient Demographic Service.","minItems":1,"maxItems":2,"items":{"oneOf":[{"type":"object","description":"Wrapper object for removalFromRegistrationCode.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"To identify the removal reason code.","default":"removalFromRegistrationCode","enum":["removalFromRegistrationCode"],"readOnly":true},"valueCodeableConcept":{"type":"object","description":"PDS Removal Reason Exit Code","required":["coding"],"properties":{"coding":{"type":"array","description":"Array containing exactly one removal reason exit code object","items":{"type":"object","required":["system","code","display"],"properties":{"system":{"type":"string","format":"url","description":"URL of the Removal Reason Exit Code. Always uses the 'PDS-RemovalReasonExitCode' Code System.","example":"https://fhir.nhs.uk/CodeSystem/PDS-RemovalReasonExitCode","readOnly":true},"code":{"type":"string","description":"A CodeSystem that identifies the reason a PDS record has been removed.","example":"SCT","enum":["DEA","EMB","SCT","NIT","TRA","ORR"]},"display":{"type":"string","description":"Display-friendly representation of the removal reason exit code.","example":"Transferred to Scotland"}}}}}}}},{"type":"object","description":"Wrapper object for removal from registration effective time.","required":["url","valuePeriod"],"properties":{"url":{"type":"string","description":"Key of this object. Always `effectiveTime`.","default":"effectiveTime","enum":["effectiveTime"],"readOnly":true},"valuePeriod":{"type":"object","description":"The effective time of removal of the Patient record from PDS.","required":["start"],"properties":{"start":{"type":"string","format":"date-time","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01T00:00:00+00:00"},"end":{"type":"string","format":"date-time","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31T00:00:00+00:00"}}}}}]}}}}]}}}},"example":{"resourceType":"Patient","id":"9000000009","identifier":[{"system":"https://fhir.nhs.uk/Id/nhs-number","value":"9000000009","extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSNumberVerificationStatus","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-NHSNumberVerificationStatus","version":"1.0.0","code":"01","display":"Number present and verified"}]}}]}],"meta":{"versionId":"2","security":[{"system":"http://terminology.hl7.org/CodeSystem/v3-Confidentiality","code":"U","display":"unrestricted"}]},"name":[{"id":"123","use":"usual","period":{"start":"2020-01-01","end":"2021-12-31"},"given":["Jane"],"family":"Smith","prefix":["Mrs"],"suffix":["MBE"]}],"gender":"female","birthDate":"2010-10-22","multipleBirthInteger":1,"deceasedDateTime":"2010-10-22T00:00:00+00:00","generalPractitioner":[{"id":"254406A3","type":"Organization","identifier":{"system":"https://fhir.nhs.uk/Id/ods-organization-code","value":"Y12345","period":{"start":"2020-01-01","end":"2021-12-31"}}}],"managingOrganization":{"type":"Organization","identifier":{"system":"https://fhir.nhs.uk/Id/ods-organization-code","value":"Y12345","period":{"start":"2020-01-01","end":"2021-12-31"}}},"extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NominatedPharmacy","valueReference":{"identifier":{"system":"https://fhir.nhs.uk/Id/ods-organization-code","value":"Y12345"}}},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-PreferredDispenserOrganization","valueReference":{"identifier":{"system":"https://fhir.nhs.uk/Id/ods-organization-code","value":"Y23456"}}},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-MedicalApplianceSupplier","valueReference":{"identifier":{"system":"https://fhir.nhs.uk/Id/ods-organization-code","value":"Y34567"}}},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus","extension":[{"url":"deathNotificationStatus","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-DeathNotificationStatus","version":"1.0.0","code":"2","display":"Formal - death notice received from Registrar of Deaths"}]}},{"url":"systemEffectiveDate","valueDateTime":"2010-10-22T00:00:00+00:00"}]},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSCommunication","extension":[{"url":"language","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-HumanLanguage","version":"1.0.0","code":"fr","display":"French"}]}},{"url":"interpreterRequired","valueBoolean":true}]},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-ContactPreference","extension":[{"url":"PreferredWrittenCommunicationFormat","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredWrittenCommunicationFormat","code":"12","display":"Braille"}]}},{"url":"PreferredContactMethod","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredContactMethod","code":"1","display":"Letter"}]}},{"url":"PreferredContactTimes","valueString":"Not after 7pm"}]},{"url":"http://hl7.org/fhir/StructureDefinition/patient-birthPlace","valueAddress":{"city":"Manchester","district":"Greater Manchester","country":"GBR"}},{"url":"https://fhir.nhs.uk/StructureDefinition/Extension-PDS-RemovalFromRegistration","extension":[{"url":"removalFromRegistrationCode","valueCodeableConcept":{"coding":[{"system":"https://fhir.nhs.uk/CodeSystem/PDS-RemovalReasonExitCode","code":"SCT","display":"Transferred to Scotland"}]}},{"url":"effectiveTime","valuePeriod":{"start":"2020-01-01T00:00:00+00:00","end":"2021-12-31T00:00:00+00:00"}}]}],"telecom":[{"id":"789","period":{"start":"2020-01-01","end":"2021-12-31"},"system":"phone","value":"01632960587","use":"home"},{"id":"790","period":{"start":"2019-01-01","end":"2022-12-31"},"system":"email","value":"jane.smith@example.com","use":"home"},{"id":"OC789","period":{"start":"2020-01-01","end":"2021-12-31"},"system":"other","value":"01632960587","use":"home","extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem","code":"textphone","display":"Minicom (Textphone)"}}]}],"contact":[{"id":"C123","period":{"start":"2020-01-01","end":"2021-12-31"},"relationship":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0131","code":"C","display":"Emergency Contact"}]}],"telecom":[{"system":"phone","value":"01632960587"}]}],"address":[{"id":"456","period":{"start":"2020-01-01","end":"2021-12-31"},"use":"home","line":["1 Trevelyan Square","Boar Lane","City Centre","Leeds","West Yorkshire"],"postalCode":"LS1 6AE","extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","extension":[{"url":"type","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType","code":"PAF"}},{"url":"value","valueString":"12345678"}]},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","extension":[{"url":"type","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType","code":"UPRN"}},{"url":"value","valueString":"123456789012"}]}]},{"id":"T456","period":{"start":"2020-01-01","end":"2021-12-31"},"use":"temp","text":"Student Accommodation","line":["1 Trevelyan Square","Boar Lane","City Centre","Leeds","West Yorkshire"],"postalCode":"LS1 6AE","extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","extension":[{"url":"type","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType","code":"PAF"}},{"url":"value","valueString":"12345678"}]},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","extension":[{"url":"type","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType","code":"UPRN"}},{"url":"value","valueString":"123456789012"}]}]}]}}}},"503":{"description":"The request timed out during processing. This does not imply the request has failed or been rejected. Error code: `SERVICE_UNAVAILABLE`.\n\nRe-send the request after the time specified in the `Retry-After` header using the same `X-Request-ID` value.\n","headers":{"RetryAfter":{"description":"Time to wait between polls in seconds","schema":{"type":"string","example":"5"}}},"content":{"application/fhir+json":{"schema":{"type":"object","description":"Outcome of an operation that does not result in a resource or bundle being returned, for example an error or an async/batch submission.\nThere are a number of possible error codes that can be returned along with a more detailed description in the `display` field.\n","properties":{"resourceType":{"type":"string","description":"FHIR Resource Type.","default":"OperationOutcome"},"issue":{"type":"array","description":"List of issues that have occurred.","minItems":1,"items":{"type":"object","required":["severity","code"],"properties":{"severity":{"type":"string","enum":["fatal","error","warning","information"],"description":"Severity of the error.","example":"error"},"code":{"type":"string","description":"FHIR error code.","example":"invalid","enum":["invalid","structure","required","value","invariant","security","login","unknown","expired","forbidden","suppressed","processing","not-supported","duplicate","multiple-matches","not-found","deleted","too-long","code-invalid","extension","too-costly","business-rule","conflict","transient","lock-error","no-store","exception","timeout","incomplete","throttled","informational"]},"details":{"type":"object","description":"Internal error code.","properties":{"coding":{"type":"array","items":{"type":"object","properties":{"system":{"type":"string","description":"URI of the coding system specification.","example":"https://fhir.nhs.uk/R4/CodeSystem/Spine-ErrorOrWarningCode"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1"},"code":{"type":"string","description":"Symbol in syntax defined by the system.","example":"INVALID_VALUE"},"display":{"type":"string","description":"Representation defined by the system.","example":"Provided value is invalid"}}}}}},"diagnostics":{"type":"string","description":"Additional diagnostic information about the issue. This information is subject to change.","example":"Invalid value - 2019-01 in field 'birthDate'"},"expression":{"type":"string","description":"FHIRPath of element(s) related to the error.","example":"Patient.name.given"}}}}}},"example":{"resourceType":"OperationOutcome","issue":[{"severity":"error","code":"timeout","details":{"coding":[{"system":"https://fhir.nhs.uk/R4/CodeSystem/Spine-ErrorOrWarningCode","version":"1","code":"SERVICE_UNAVAILABLE","display":"Service unavailable"}]},"diagnostics":"The downstream domain processing has not completed within the configured timeout period. Using the same 'X-Request-ID' header, retry your request after the time specified by the 'Retry-After' response header."}]}}}},"4XX":{"description":"An error occurred as follows:\n\n| HTTP status | Error code | Description |\n| ----------- | -------------------------- | --------------------------------------------- |\n| 400 | UNSUPPORTED_SERVICE | Missing NHS number. |\n| 400 | MISSING_VALUE | Missing header parameter. For details, see the `diagnostics` field. |\n| 400 | INVALID_VALUE | Invalid header parameter or invalid value in body of patch request. For details, see the `diagnostics` field. |\n| 400 | INVALID_UPDATE | Malformed patch request or client error after the patch was accepted and patient was not updated. For example, a start date was after the corresponding end date. |\n| 400 | INVALID_RESOURCE_ID | Invalid NHS number. |\n| 400 | VALIDATION_ERROR | This is the \"default\" error thrown when no others are applicable. |\n| 400 | UNSUPPORTED_CHARACTERS_IN_FIELD | Invalid value in body of patch request. For details, see the `diagnostics` field. |\n| 400 | ADDITIONAL_PROPERTIES | The user sent additional properties within the dictionary. For example sending a patient patch and attempting to add 'pets', which is not an allowed field within the patient resource. |\n| 400 | UNSUPPORTED_VALUE | There was an unsupported value in the request. The value may be valid in the schema - however it could be a legacy value that we do not allow to be set anymore. For example - setting the death notification status to 'removed'. The invalid value and field will be presented in the display. |\n| 400 | TOO_FEW_VALUES_SUBMITTED | The field in question has a minimum number of items and the user sent too few. |\n| 400 | TOO_MANY_VALUES_SUBMITTED | The field in question has a maximum number of items and the user sent too many. |\n| 401 | ACCESS_DENIED | Access token missing, invalid or expired, or calling application not configured for this operation. |\n| 403 | FORBIDDEN_UPDATE | The user is not permitted to update certain resources or elements, for example most users are not allowed to update the date of death once it has been set. A detailed description will be added to the display. For example - updating a sensitive patient or adding a formal death notification is only permitted from certain systems. |\n| 403 | ACCESS_DENIED | Patient cannot perform this action. |\n| 404 | RESOURCE_NOT_FOUND | Patient does not exist for given NHS number. |\n| 404 | INVALIDATED_RESOURCE | Patient record for given NHS number has been invalidated and not superseded by another NHS number. |\n| 408 | UNABLE_TO_CALL_SERVICE | The downstream domain processing has not completed within the configured timeout period. |\n| 409 | RESOURCE_VERSION_MISMATCH | The resource version in the `If-Match` header of the update request did not match the current version of the resource. See [Patient resource versioning](https://digital.nhs.uk/developer/api-catalogue/personal-demographics-service-fhir#patient-resource-versioning). |\n| 412 | PRECONDITION_FAILED | Problem with request, for example missing `If-Match` header. For details, see the `diagnostics` field. |\n| 429 | TOO_MANY_REQUESTS | You have exceeded your application's [rate limit](https://digital.nhs.uk/developer/guides-and-documentation/reference-guide#rate-limits). |\n","content":{"application/fhir+json":{"schema":{"type":"object","description":"Outcome of an operation that does not result in a resource or bundle being returned, for example an error or an async/batch submission.\nThere are a number of possible error codes that can be returned along with a more detailed description in the `display` field.\n","properties":{"resourceType":{"type":"string","description":"FHIR Resource Type.","default":"OperationOutcome"},"issue":{"type":"array","description":"List of issues that have occurred.","minItems":1,"items":{"type":"object","required":["severity","code"],"properties":{"severity":{"type":"string","enum":["fatal","error","warning","information"],"description":"Severity of the error.","example":"error"},"code":{"type":"string","description":"FHIR error code.","example":"invalid","enum":["invalid","structure","required","value","invariant","security","login","unknown","expired","forbidden","suppressed","processing","not-supported","duplicate","multiple-matches","not-found","deleted","too-long","code-invalid","extension","too-costly","business-rule","conflict","transient","lock-error","no-store","exception","timeout","incomplete","throttled","informational"]},"details":{"type":"object","description":"Internal error code.","properties":{"coding":{"type":"array","items":{"type":"object","properties":{"system":{"type":"string","description":"URI of the coding system specification.","example":"https://fhir.nhs.uk/R4/CodeSystem/Spine-ErrorOrWarningCode"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1"},"code":{"type":"string","description":"Symbol in syntax defined by the system.","example":"INVALID_VALUE"},"display":{"type":"string","description":"Representation defined by the system.","example":"Provided value is invalid"}}}}}},"diagnostics":{"type":"string","description":"Additional diagnostic information about the issue. This information is subject to change.","example":"Invalid value - 2019-01 in field 'birthDate'"},"expression":{"type":"string","description":"FHIRPath of element(s) related to the error.","example":"Patient.name.given"}}}}}},"example":{"resourceType":"OperationOutcome","issue":[{"severity":"error","code":"structure","details":{"coding":[{"system":"https://fhir.nhs.uk/R4/CodeSystem/Spine-ErrorOrWarningCode","version":"1","code":"INVALID_UPDATE","display":"Update is invalid"}]},"diagnostics":"Invalid update with error - Update unsupported for resource - 'pets'"}]}}}}}}},"/Patient/{id}/RelatedPerson":{"parameters":[{"name":"id","in":"path","description":"The patient's NHS number. The primary identifier of a patient, unique within NHS England and Wales. Always 10 digits and must be a [valid NHS number](https://www.datadictionary.nhs.uk/attributes/nhs_number.html).","required":true,"schema":{"type":"string","example":"9000000009"}},{"in":"header","name":"Authorization","description":"An [OAuth 2.0 bearer token](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation#user-restricted-apis).\n\nRequired in all environments except sandbox.\n","required":false,"schema":{"type":"string","format":"^Bearer\\ [[:ascii:]]+$","example":"Bearer g1112R_ccQ1Ebbb4gtHBP1aaaNM"}},{"in":"header","name":"NHSD-Session-URID","description":"\nThe user role ID (URID) for the current session. Also known as a user role profile ID (URPID).\n\nThis header is optional.\n\nIn Application-restricted access mode this header is ignored.\n\nIn Healthcare worker access mode if you send this header it must be valid for the logged-in user. See [determine the user's role](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation/user-restricted-restful-apis-nhs-cis2-separate-authentication-and-authorisation#step-9-determine-the-user-s-role) for guidance.\n","required":false,"schema":{"type":"string","pattern":"^[0-9]+$","example":"555254240100"}},{"in":"header","name":"X-Request-ID","required":false,"description":"A globally unique identifier (GUID) for the request, which we use to de-duplicate repeated requests and to trace the request if you contact our helpdesk.\n\nMust be a universally unique identifier (UUID) (ideally version 4).\n\nMirrored back in a response header.\n\nIf you re-send a failed request, use the same value in this header.\n","schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","example":"60E0B220-8136-4CA5-AE46-1D97EF59D068"}},{"in":"header","name":"X-Correlation-ID","required":false,"description":"An optional ID which you can use to track transactions across multiple systems. It can take any value, but we recommend avoiding `.` characters.\n\nMirrored back in a response header.\n","schema":{"type":"string","example":"11C46F5F-CDEF-4865-94B2-0EE0EDCC26DA"}},{"in":"header","name":"NHSD-End-User-Organisation-ODS","required":false,"description":"The ODS code of the user.\n\nMandatory for client applications which service multiple end user organisations (EUO). This will allow the calls to be attributed to the correct EUO.\n","schema":{"type":"string","example":"Y12345"}}],"get":{"description":"## Overview\nUse this endpoint to get a patient's related people details from PDS for a given NHS number. This is a list of people who can be contacted, and how, regarding the patient. These details may be useful for a practitioner to get in contact with a next of kin or guardian.\n\n## Restricted patients\nSome patients are tagged as [restricted](https://digital.nhs.uk/services/demographics/restricting-access-to-a-patients-demographic-record) and are sometimes known as sensitive patients. Related people are not returned for a restricted patient and an empty bundle is returned.\n\nIf a related person only contains a patient reference, and when the patient is retrieved, it is restricted; location sensitive fields such as `address` and `telecom` are removed.\n\n## Sandbox test scenarios\nYou can test the following scenarios in our sandbox environment:\n\n| Scenario | Request | Response |\n| ------------------------------- | --------------------------------------------- | ------------------------------------------------------------- |\n| Multiple related people exists | `id`=`9000000009` | HTTP Status 200 with related person data in a response Bundle |\n| Single related person exists | `id`=`9000000017` | HTTP Status 200 with related person data in a response Bundle |\n| Related people do not exist | `id`=`9000000025` | HTTP Status 200 with an empty bundle |\n| Missing X-Request-ID | `id`=`9000000009` (or any other valid NHS number) | HTTP Status 412 with problem description |\n\nYou can try out the sandbox using the 'Try this API' feature on this page.\n\nAlternatively, you can try out the sandbox using our Postman collection:\n\n[![Run in Postman](https://run.pstmn.io/button.svg)](https://app.getpostman.com/run-collection/14719036-953f067f-30b9-4552-8252-7cc10b21dad3)\n","summary":"Get a patient's related people","operationId":"get-related-people","responses":{"200":{"description":"Information successfully returned.","headers":{"ETag":{"schema":{"type":"string","pattern":"^W/\"[0-9]+\"$","example":"W/\"2\""},"description":"Record version identifier enclosed in quotes and preceded by 'W/'. For example, `W/\"2\"`.\n\nCorresponds to `meta.versionId` attribute in the patient resource body.\n\nWhen you retrieve a patient resource, you get a version number for the resource (in the `ETag` response header and in the `versionId` field in the response).\nYou must then pass the resource's version number in any update request (in the `If-Match` response header) made for the patient.\n"},"X-Correlation-Id":{"schema":{"type":"string","example":"11C46F5F-CDEF-4865-94B2-0EE0EDCC26DA"},"description":"The X-Correlation-ID from the request header, if supplied, mirrored back.\n"},"X-Request-Id":{"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","example":"60E0B220-8136-4CA5-AE46-1D97EF59D068"},"description":"The X-Request-ID from the request header, if supplied, mirrored back.\n"}},"content":{"application/fhir+json":{"schema":{"type":"object","properties":{"resourceType":{"type":"string","description":"FHIR Resource Type.","default":"Bundle"},"type":{"type":"string","description":"FHIR Bundle Type.","default":"searchset"},"timestamp":{"type":"string","description":"Time the search was performed.","format":"datetime","example":"2019-12-25T12:00:00+00:00"},"total":{"type":"integer","description":"Number of resources returned in search.","example":1},"entry":{"type":"array","description":"A list of related people details attached to the patient. \n","items":{"type":"object","properties":{"fullUrl":{"type":"string","description":"Absolute URL of the resource described in this item.","example":"https://api.service.nhs.uk/personal-demographics/FHIR/R4/Patient/9000000009/RelatedPerson/507B7621"},"resource":{"type":"object","additionalProperties":false,"required":["patient","relationship"],"properties":{"id":{"type":"string","description":"Unique object identifier for this name.","example":"507B7621"},"resourceType":{"type":"string","description":"FHIR resource type.","default":"RelatedPerson"},"patient":{"type":"object","required":["type"],"properties":{"type":{"type":"string","default":"Patient","enum":["Patient"]},"identifier":{"type":"object","description":"Identifier and system of identification used for this Patient.\n\nThis is an optional field as related person details are either a reference to another NHS number, or the details, such as name and adress, stored directly on the resource.\n","properties":{"system":{"type":"string","description":"URL for the Patient retrieval API.","format":"url","example":"https://api.service.nhs.uk/personal-demographics/FHIR/R4/Patient"},"value":{"type":"string","description":"NHS number for the related person","example":"90000000009","pattern":"^\\d{10}$"}}},"reference":{"type":"string","description":"URL for the FHIR Patient resource.","format":"url","example":"https://api.service.nhs.uk/personal-demographics/FHIR/R4/Patient/90000000009"}}},"active":{"type":"boolean","default":true},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"name":{"type":"array","description":"List containing zero or one name associated with the related person.\nThis is an optional field as there may be a `patient` reference which can be used to retrieve any details about the related person.\nIf no `patient` reference is available `name` and `address` must be provided at the minimum.\n","maxItems":1,"items":{"type":"object","required":["use","family"],"additionalProperties":false,"properties":{"id":{"type":"string","description":"Unique object identifier for this name.","example":"123"},"use":{"type":"string","description":"How this name should be used.\n* usual - Known as, conventional or the one patient normally uses. A patient always has a usual name.\n* temp - An alias or temporary name. This may also be used for temporary names assigned at birth or in emergency situations.\n* nickname - A name that the patient prefers to be addressed by, but is not part of their usual name.\n* old - This name is no longer in use (or was never correct, but retained for records).\n* maiden - Name changed for Marriage. A name used prior to changing name because of marriage. This term is not gender specific. The use of this term does not imply any particular history for a person's name.\n\nThe following use codes are included in the [name-use](https://www.hl7.org/fhir/valueset-name-use.html) value set, but should not be used and is not be returned as part of a retrieval.\n* official - The formal name as registered in an official (government) registry, but which name might not be commonly used. May be called \"legal name\".\n* anonymous - Anonymous assigned name, alias, or pseudonym (used to protect a person's identity for privacy reasons).\n","enum":["usual","temp","nickname","old","maiden"],"example":"usual"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"given":{"type":"array","maxItems":5,"description":"Given names, including any middle names.\n\nEach name(s) should be a separate item in the list. The first given name may include multiple names, separated by a space.\nSubsequent names must be broken down into list items. For example, the input `[Jane Marie Anne, Jo Adele]` returns `[Jane Marie Anne, Jo, Adele]`.\n","example":["Jane Marie Anne","Jo","Adele"],"items":{"type":"string","maxLength":35,"example":"Jane"}},"family":{"type":"string","maxLength":35,"description":"Family name (often called Surname).","example":"Smith"},"prefix":{"type":"array","description":"Name prefixes, titles, and prenominals.","example":["Mrs"],"items":{"type":"string","example":"Mrs"}},"suffix":{"type":"array","description":"Name suffices and postnominals.","example":["MBE","PhD"],"items":{"type":"string","example":"MBE"}}}}},"address":{"type":"array","description":"List containing zero or one address associated with the related person.\nThis is an optional field as there may be a `patient` reference which can be used to retrieve any details about the related person.\nIf no `patient` reference is available `name` and `address` must be provided at the minimum.\n","maxItems":1,"items":{"type":"object","description":"An address associated with the patient.","required":["use"],"properties":{"id":{"type":"string","description":"Unique system identifier for this address.","example":"456"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"use":{"type":"string","description":"Purpose of this address:\n * `home` - the home address is the patient's normal residence. Home address is also known as usual, main, registered, current or permanent address\n * `temp` - a temporary address is an address used for a set period of time, but where the patient's home, permanent address remains unchanged\n * `billing` - an address used for correspondence purposes only\n * `work` - an office address. This can be returned due to legacy data but cannot be added or replaced on update\n\n A patient should have no more than one current `temp` and/or `billing` address.\n However, historically this was constrained only by the integration requirements and was not enforced so theoretically more than one can exist for a patient when retrieving.\n Where multiple instances already exist for the patient it is not expected that local systems should manage those, but should choose the most appropriate one to maintain (e.g. by examining period dates).\n\n A `home` address is the patient's main residential address and should normally be used for all clinical and demographic purposes, including clinical and appointment correspondence.\n However additionally, `temp` and `billing` addresses may be provided by a patient when there is a requirement to record an alternative location for the purposes of unbroken care.\n When sending correspondence to a patient:\n *\ta present and valid `billing` address may take precedence over `home` and `temp` addresses. A patient should have only a single current `billing` address. An address is considered 'valid' according to its period start and end dates.\n *\tif no current `billing` address is provided, a `temp` address may take precedence over the `home` address, again if it is valid according to its period start and end dates.\n * if there is no valid, current `billing` and/or `temp` address, the `home` address must be used.\n","enum":["home","work","temp","billing"],"example":"home"},"text":{"type":"string","description":"Where a `temp` address is provided a descriptor text must be sent.\nThe list of possible values are:\n* `Second Home` - a patient's second home\n* `Student Accommodation` - a patient's place of residence while at university\n* `Respite Care Address` - where the patient resides during respite care\n* `Temporary Residence Address` - where the patient resides for a specific period of time\n* `Convalescence Home` - the address for a patient during a period of recovery\n* `Mobile Home` - the address of a patient's mobile home, parked for a specific period of time, e.g. the address of a caravan park\n* `Holiday Home` - the address for a patient during a holiday\n\nA patient can also register temporarily at a GP practice using a temporary address. Temporary GP registration information does not appear on the PDS, but the address used for it may.\n","enum":["Second Home","Student Accommodation","Respite Care Address","Temporary Residence Address","Convalescence Home","Mobile Home","Holiday Home"],"example":"Student Accommodation"},"line":{"type":"array","description":"All lines of the address except the postal code.\n\nSystems must apply the following formatting convention when adding or replacing addresses lines:\n*\tline 1 - premises ID and/or house name, e.g. `Flat 1` or `The Old Schoolhouse`\n*\tline 2 - house number, dependent thoroughfare name and descriptor (if present), thoroughfare name and descriptor, e.g. `23 Mill Lane`\n*\tline 3 - dependent locality/village, locality (if present), e.g. `Boxgrove`\n*\tline 4 - post town, e.g. `Leeds`\n*\tline 5 - county (if present), e.g. `West Yorkshire`\n\nIf any of the lines are blank, they are not returned due to FHIR conformance constraints.\n","maxItems":5,"items":{"type":"string"},"example":["1 Trevelyan Square","Boar Lane","City Centre","Leeds","West Yorkshire"]},"postalCode":{"type":"string","description":"Postal code of the address.","example":"LS1 6AE"},"extension":{"type":"array","description":"List of address keys formatted as a FHIR extension. This can include up to one Unique Property Reference Number (UPRN), and up to one Postal Address File (PAF) key. If no keys for the address are known, the array will be empty. Otherwise it will be a list of objects which specify the value of the address key and the code system for it","items":{"anyOf":[{"type":"object","description":"Unique identifier for an address.","properties":{"url":{"type":"string","description":"URL of specification of the AddressKey extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey"]},"extension":{"type":"array","description":"Specification of address key system and address key value. Contains exactly two items: one describing the code system the Address Key uses, and the other specifying the value of the Address Key.","minItems":2,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Coding system of the address key.","required":["url","valueCoding"],"properties":{"url":{"type":"string","description":"Always 'type'.","default":"type"},"valueCoding":{"type":"object","description":"URL of specification of address key format.","required":["system","code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available Address Key formats.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType"},"code":{"type":"string","description":"Address Key system. Always 'PAF'.","enum":["PAF"],"example":"PAF"}}}}},{"type":"object","description":"Value of the address key.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Always 'value'.","default":"value","example":"value"},"valueString":{"type":"string","description":"Address key in PAF format. An 8 digit number including leading zeroes, formatted as a string.","minLength":8,"maxLength":8,"pattern":"^[0-9]{8}$","example":"12345678"}}}]}}}},{"type":"object","description":"Unique identifier for an address.","properties":{"url":{"type":"string","description":"URL of specification of the AddressKey extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey"]},"extension":{"type":"array","description":"Specification of address key system and address key value. Contains exactly two items: one describing the code system the Address Key uses, and the other specifying the value of the Address Key.","minItems":2,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Coding system of the address key.","required":["url","valueCoding"],"properties":{"url":{"type":"string","description":"Always 'type'.","default":"type"},"valueCoding":{"type":"object","description":"URL of specification of address key format.","required":["system","code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available Address Key formats.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType"},"code":{"type":"string","description":"Address Key system. Always 'UPRN'.","enum":["UPRN"],"example":"UPRN"}}}}},{"type":"object","description":"Value of the address key.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Always 'value'.","default":"value","example":"value"},"valueString":{"type":"string","description":"Address key in UPRN format. A number containing from 1 up to 12 digits.","minLength":1,"maxLength":12,"pattern":"^[0-9]{1,12}$","example":"123456789012"}}}]}}}}]}}}}},"telecom":{"type":"array","description":"List containing zero to five contact methods associated with the related person.\nThis is an optional field as there may be a `patient` reference which can be used to retrieve any details about the related person.\n","maxItems":5,"items":{"description":"A contact point, such as a phone number or email address","type":"object","required":["system","value"],"properties":{"id":{"type":"string","description":"Unique object identifier for this contact point.","example":"789"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"system":{"description":"Means of communication, such as phone or email.","type":"string","enum":["phone","fax","email","other"],"example":"phone"},"value":{"description":"Phone number, email address, or other identifier for use with contact system.","type":"string","example":"01632960587"},"use":{"type":"string","description":"Location associated with communication system.","enum":["home","work","temp","mobile"],"example":"home"},"extension":{"type":"array","maxItems":1,"description":"Extension that is returned when the communication type is `textphone`. The only code returned is `textphone`, which means `Minicom (Textphone)`.\n\nThe `system` is `other` when the extension is included.\n","items":{"type":"object","description":"Wrapped object for other contact system details.","properties":{"url":{"type":"string","description":"Definition of other contact system extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem"]},"valueCoding":{"type":"object","description":"URL of specification of other contact systems.","properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem"},"code":{"type":"string","description":"Coded value for the other contact system in place.","example":"textphone"},"display":{"description":"Display-friendly representation of the other contact system code.","type":"string","example":"Minicom (Textphone)"}}}}}}}}},"relationship":{"type":"array","description":"The relationship of the related person to the patient.\n","minItems":1,"maxItems":1,"items":{"type":"object","required":["coding"],"properties":{"coding":{"type":"array","description":"Coded values for three relationship types:\n* Role\n* Type\n* Next-of-Kin\n\nThe codes used can be found at:\n* http://hl7.org/fhir/ValueSet/relatedperson-relationshiptype\n* https://fhir.nhs.uk/R4/CodeSystem/UKCore-AdditionalRelatedPersonRole\n\nThe allowed values for `Role` are:\n* Agent - Agent of patient\n* Guardian - Guardian of patient\n* Personal - Personal relationship with the patient\n\nThe allowed values for `Type` are:\n* SPS - spouse\n* DOMPART - domestic partner\n* PRN - parent\n* PRNFOST - foster parent\n* STPPRN - step parent\n* CHILD - child\n* MTH - mother\n* FTH - father\n* SIS - sister\n* BRO - brother\n* FAMMEMB - family member\n* ONESELF - self\n* N - Next-of-Kin\n* U - Unknown\n* PolygamousPartner - Polygamous Partner of patient\n* Dependant - Dependant of patient\n* NonDependant - Non Dependant of patient\n* ProxyContact - Proxy Contact for patient\n* ProxyCommunication - Proxy Communication for patient\n* ProxyContactCommunication - Proxy Contact and Communication for patient\n* Carer - Carer of patient\n* Guardian - Guardian of patient\n* NotSpecified - Not Specified\n\nThe allowed values for `Next-of-Kin` are:\n* N - Next-of-Kin\n\n`Role` and `Type` are mandatory, so both should be present - however they both contain the `Guardian` code - so a single response is possible.\n\n`Next-of-Kin` is optional and will be absent from the response when the related person is not the Next-of-Kin.\n","minItems":1,"maxItems":3,"items":{"type":"object","required":["system","code"],"properties":{"system":{"type":"string","description":"URI of the coding system specification.","format":"url","default":"https://fhir.nhs.uk/R4/CodeSystem/UKCore-AdditionalRelatedPersonRole","enum":["http://hl7.org/fhir/ValueSet/relatedperson-relationshiptype","https://fhir.nhs.uk/R4/CodeSystem/UKCore-AdditionalRelatedPersonRole"]},"code":{"type":"string","description":"Symbol in syntax defined by the system.","example":"Guardian"},"display":{"type":"string","description":"Human-friendly display representation defined by the system.","example":"Guardian of patient"}}}}}}},"extension":{"type":"array","description":"Wrapper array for copy correspondence, contact rank, contact preferences and communication details; these are all FHIR extensions. Always contains zero or one of each extension type.\n","items":{"anyOf":[{"type":"object","description":"Flag indicating if this person should be copied in on any contact with the Patient. This will only be returned if the value is true and the person should be copied in on correspondence, otherwise it will be omitted. \n","properties":{"url":{"type":"string","format":"url","description":"URL to FHIR Extension Specification.","default":"https://fhir.nhs.uk/R4/StructureDefinition/Extension-UKCore-CopyCorrespondenceIndicator","enum":["https://fhir.nhs.uk/R4/StructureDefinition/Extension-UKCore-CopyCorrespondenceIndicator"]},"valueBoolean":{"type":"boolean","description":"Flag indicating if this person should be copied in on correspondence. This will only be returned if the value is `true` otherwise it will not be returned and can be assumed `false`","example":true}}},{"type":"object","description":"Rank indicating order in which contacts should be tried.","properties":{"url":{"type":"string","format":"url","description":"URL to FHIR Extension Specification.","default":"https://fhir.nhs.uk/R4/StructureDefinition/Extension-UKCore-ContactRank","enum":["https://fhir.nhs.uk/R4/StructureDefinition/Extension-UKCore-ContactRank"]},"valuePositiveInt":{"type":"integer","minimum":1,"maximum":99,"description":"Rank expressed as positive integer (1 being the highest).","example":1}}},{"type":"object","description":"Wrapper object for preferred contact details; the written communication format, preferred contact time and method. This will only be populated on a retrieval and not a search.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of the contact preference extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-ContactPreference","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-ContactPreference"]},"extension":{"description":"Wrapper array containing zero or one preferred contact method, zero or one preferred written communication format; and zero or one preferred contact time.","type":"array","maxItems":3,"items":{"oneOf":[{"type":"object","description":"Wrapper object for preferred written communication format.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredWrittenCommunicationFormat`.","default":"PreferredWrittenCommunicationFormat"},"valueCodeableConcept":{"type":"object","description":"Preferred Written Communication Format.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","format":"url","description":"Definition of the preferred written communication extension.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredWrittenCommunicationFormat","enum":["https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredWrittenCommunicationFormat"]},"code":{"type":"string","description":"A code to identify the preferred written communication format of a patient, contact or related person.\n* 11 - Large print\n* 12 - Braille\n* 13 - Audio tape\n","example":"12"},"display":{"type":"string","description":"Display-friendly representation of the preferred written communication format code.","example":"Braille"}}}}}}}},{"type":"object","description":"Wrapper object for preferred contact method.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredContactMethod`.","default":"PreferredContactMethod","enum":["PreferredContactMethod"]},"valueCodeableConcept":{"type":"object","description":"Preferred Contact Method.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","format":"url","description":"Definition of the preferred contact method extension.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredContactMethod","enum":["https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredContactMethod"]},"code":{"type":"string","description":"A code to identify to identify the preferred contact method of a patient, contact or related person.\n* 1\t- Letter\n* 2\t- Visit\n* 3\t- Telephone\n* 4\t- E-mail\n* 5\t- Minicom (Textphone)\n* 6\t- Telephone contact via proxy\n* 7\t- Sign language\n* 8\t- No Telephone contact\n","example":"1"},"display":{"type":"string","description":"Display-friendly representation of the preferred contact method code.","example":"Letter"}}}}}}}},{"type":"object","description":"Wrapper object for preferred contact times.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredContactTimes`.","default":"PreferredContactTimes","enum":["PreferredContactTimes"]},"valueString":{"type":"string","maximum":40,"description":"A free-text description about the preferred contact times.","example":"Not after 7pm"}}}]}}}},{"type":"object","description":"Wrapper object for communication details. This will only be populated on a retrieval and not a search.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of communication extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSCommunication","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSCommunication"]},"extension":{"type":"array","description":"Definition of communication extension.\n\nThe array must have one item, a valueCodeableConcept for the language and can optionally include a valueBoolean for if an interpreter is required.","minItems":1,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Wrapper object for communication language.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `language`.","default":"language","enum":["language"]},"valueCodeableConcept":{"type":"object","description":"Human language.","required":["coding"],"properties":{"coding":{"type":"array","description":"Exactly one language code.","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URL of the Language Code System. Always uses the 'UKCore-HumanLanguage' Code System.","example":"https://fhir.hl7.org.uk/CodeSystem/UKCore-HumanLanguage"},"version":{"type":"string","description":"Version of the language code system.","example":"1.0.0"},"code":{"type":"string","description":"Language code based on [ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) standard plus extensions for braille, makaton and sign languages, which are:\n* `q1` - Braille\n* `q2` - American Sign Language\n* `q3` - Australian Sign Language\n* `q4` - British Sign Language\n* `q5` - Makaton\nAll valid codes combined can be found at https://fhir.hl7.org.uk/CodeSystem/UKCore-HumanLanguage.\n","example":"fr"},"display":{"type":"string","description":"Display-friendly representation of the language code (such as English). If there is a language code with no defined mapping, `Unknown` will be returned.","example":"French"}}}}}}}},{"type":"object","description":"Wrapper object for whether an interpreter is required.","required":["url","valueBoolean"],"properties":{"url":{"type":"string","description":"Key of this object. Always `interpreterRequired`.","default":"interpreterRequired","enum":["interpreterRequired"]},"valueBoolean":{"type":"boolean","description":"Whether an interpreter is required.","example":true}}}]}}}}]}}}}}}}}},"example":{"resourceType":"Bundle","type":"searchset","timestamp":"2019-12-25T12:00:00+00:00","total":1,"entry":[{"fullUrl":"https://api.service.nhs.uk/personal-demographics/FHIR/R4/Patient/9000000009/RelatedPerson/507B7621","resource":{"id":"507B7621","resourceType":"RelatedPerson","patient":{"type":"Patient","identifier":{"system":"https://api.service.nhs.uk/personal-demographics/FHIR/R4/Patient","value":"90000000009"},"reference":"https://api.service.nhs.uk/personal-demographics/FHIR/R4/Patient/90000000009"},"active":true,"period":{"start":"2020-01-01","end":"2021-12-31"},"name":[{"use":"usual","period":{"start":"2020-01-01","end":"2021-12-31"},"given":["Jane"],"family":"Smith","prefix":["Mrs"],"suffix":["MBE"]}],"relationship":[{"coding":[{"system":"https://fhir.nhs.uk/R4/CodeSystem/UKCore-AdditionalRelatedPersonRole","code":"Guardian","display":"Guardian of patient"}]}],"extension":[{"url":"https://fhir.nhs.uk/R4/StructureDefinition/Extension-UKCore-CopyCorrespondenceIndicator","valueBoolean":true},{"url":"https://fhir.nhs.uk/R4/StructureDefinition/Extension-UKCore-ContactRank","valuePositiveInt":1},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-ContactPreference","extension":[{"url":"PreferredWrittenCommunicationFormat","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredWrittenCommunicationFormat","code":"12","display":"Braille"}]}},{"url":"PreferredContactMethod","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredContactMethod","code":"1","display":"Letter"}]}},{"url":"PreferredContactTimes","valueString":"Not after 7pm"}]},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSCommunication","extension":[{"url":"language","valueCodeableConcept":{"coding":[{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-HumanLanguage","version":"1.0.0","code":"fr","display":"French"}]}},{"url":"interpreterRequired","valueBoolean":true}]}],"telecom":[{"period":{"start":"2020-01-01","end":"2021-12-31"},"system":"phone","value":"01632960587","use":"home"}],"address":[{"period":{"start":"2020-01-01","end":"2021-12-31"},"use":"home","line":["1 Trevelyan Square","Boar Lane","City Centre","Leeds","West Yorkshire"],"postalCode":"LS1 6AE","extension":[{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","extension":[{"url":"type","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType","code":"PAF"}},{"url":"value","valueString":"12345678"}]},{"url":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","extension":[{"url":"type","valueCoding":{"system":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType","code":"UPRN"}},{"url":"value","valueString":"123456789012"}]}]}]}}]}}}},"4XX":{"description":"An error occurred as follows:\n\n| HTTP status | Error code | Description |\n| ----------- | -------------------------- | --------------------------------------------- |\n| 400 | INVALID_RESOURCE_ID | Invalid NHS number. |\n| 400 | MISSING_VALUE | Missing header parameter. For details, see the `diagnostics` field. |\n| 400 | INVALID_VALUE | Invalid header parameter. For details, see the `diagnostics` field. |\n| 401 | ACCESS_DENIED | Access token missing, invalid or expired, or calling application not configured for this operation. |\n| 404 | RESOURCE_NOT_FOUND | No related people exist for given NHS number. |\n| 404 | INVALIDATED_RESOURCE | Patient record for given NHS number has been invalidated and not superseded by another NHS number. |\n| 408 | UNABLE_TO_CALL_SERVICE | The downstream domain processing has not completed within the configured timeout period. |\n| 429 | TOO_MANY_REQUESTS | You have exceeded your application's [rate limit](https://digital.nhs.uk/developer/guides-and-documentation/reference-guide#rate-limits). |\n","content":{"application/fhir+json":{"schema":{"type":"object","description":"Outcome of an operation that does not result in a resource or bundle being returned, for example an error or an async/batch submission.\nThere are a number of possible error codes that can be returned along with a more detailed description in the `display` field.\n","properties":{"resourceType":{"type":"string","description":"FHIR Resource Type.","default":"OperationOutcome"},"issue":{"type":"array","description":"List of issues that have occurred.","minItems":1,"items":{"type":"object","required":["severity","code"],"properties":{"severity":{"type":"string","enum":["fatal","error","warning","information"],"description":"Severity of the error.","example":"error"},"code":{"type":"string","description":"FHIR error code.","example":"invalid","enum":["invalid","structure","required","value","invariant","security","login","unknown","expired","forbidden","suppressed","processing","not-supported","duplicate","multiple-matches","not-found","deleted","too-long","code-invalid","extension","too-costly","business-rule","conflict","transient","lock-error","no-store","exception","timeout","incomplete","throttled","informational"]},"details":{"type":"object","description":"Internal error code.","properties":{"coding":{"type":"array","items":{"type":"object","properties":{"system":{"type":"string","description":"URI of the coding system specification.","example":"https://fhir.nhs.uk/R4/CodeSystem/Spine-ErrorOrWarningCode"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1"},"code":{"type":"string","description":"Symbol in syntax defined by the system.","example":"INVALID_VALUE"},"display":{"type":"string","description":"Representation defined by the system.","example":"Provided value is invalid"}}}}}},"diagnostics":{"type":"string","description":"Additional diagnostic information about the issue. This information is subject to change.","example":"Invalid value - 2019-01 in field 'birthDate'"},"expression":{"type":"string","description":"FHIRPath of element(s) related to the error.","example":"Patient.name.given"}}}}}},"example":{"resourceType":"OperationOutcome","issue":[{"severity":"error","code":"structure","details":{"coding":[{"system":"https://fhir.nhs.uk/R4/CodeSystem/Spine-ErrorOrWarningCode","version":"1","code":"PRECONDITION_FAILED","display":"Required condition was not fulfilled"}]},"diagnostics":"Invalid request with error - X-Request-ID header must be supplied to access this resource"}]}}}}}}}},"components":{"headers":{"ETag":{"schema":{"type":"string","pattern":"^W/\"[0-9]+\"$","example":"W/\"2\""},"description":"Record version identifier enclosed in quotes and preceded by 'W/'. For example, `W/\"2\"`.\n\nCorresponds to `meta.versionId` attribute in the patient resource body.\n\nWhen you retrieve a patient resource, you get a version number for the resource (in the `ETag` response header and in the `versionId` field in the response).\nYou must then pass the resource's version number in any update request (in the `If-Match` response header) made for the patient.\n"},"X-Correlation-Id":{"schema":{"type":"string","example":"11C46F5F-CDEF-4865-94B2-0EE0EDCC26DA"},"description":"The X-Correlation-ID from the request header, if supplied, mirrored back.\n"},"X-Request-Id":{"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","example":"60E0B220-8136-4CA5-AE46-1D97EF59D068"},"description":"The X-Request-ID from the request header, if supplied, mirrored back.\n"},"RetryAfter":{"description":"Time to wait between polls in seconds","schema":{"type":"string","example":"5"}}},"parameters":{"Id":{"name":"id","in":"path","description":"The patient's NHS number. The primary identifier of a patient, unique within NHS England and Wales. Always 10 digits and must be a [valid NHS number](https://www.datadictionary.nhs.uk/attributes/nhs_number.html).","required":true,"schema":{"type":"string","example":"9000000009"}},"MessageId":{"name":"message_id","in":"path","description":"The message ID of the accepted update that needs to be submitted to confirm the resource a successfully updated.","required":true,"schema":{"type":"string","example":"20200522091633363041_000001A"}},"ObjectId":{"name":"object_id","in":"path","description":"A resource Object ID. The primary identifier of a resource.","required":true,"schema":{"type":"string","example":"507B7621"}},"IfMatch":{"in":"header","name":"If-Match","description":"Latest known version identifier enclosed in quotes preceded by `W/`.\n\nSend the value of the patient's `ETag` response header on patient retrieval when updating a patient.\nThis is to ensure that any updates are applied against an up-to-date version of the patient resource.\n","required":true,"schema":{"type":"string","pattern":"^W/\"[0-9]+\"$","example":"W/\"2\""}},"RoleId":{"in":"header","name":"NHSD-Session-URID","description":"\nThe user role ID (URID) for the current session. Also known as a user role profile ID (URPID).\n\nThis header is optional.\n\nIn Application-restricted access mode this header is ignored.\n\nIn Healthcare worker access mode if you send this header it must be valid for the logged-in user. See [determine the user's role](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation/user-restricted-restful-apis-nhs-cis2-separate-authentication-and-authorisation#step-9-determine-the-user-s-role) for guidance.\n","required":false,"schema":{"type":"string","pattern":"^[0-9]+$","example":"555254240100"}},"BearerAuthorization":{"in":"header","name":"Authorization","description":"An [OAuth 2.0 bearer token](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation#user-restricted-apis).\n\nRequired in all environments except sandbox.\n","required":false,"schema":{"type":"string","format":"^Bearer\\ [[:ascii:]]+$","example":"Bearer g1112R_ccQ1Ebbb4gtHBP1aaaNM"}},"ContentType":{"in":"header","name":"Content-Type","description":"For a PATCH request, this must be set to `application/json-patch+json`.\n","required":true,"schema":{"type":"string","example":"application/json-patch+json"}},"RequestID":{"in":"header","name":"X-Request-ID","required":false,"description":"A globally unique identifier (GUID) for the request, which we use to de-duplicate repeated requests and to trace the request if you contact our helpdesk.\n\nMust be a universally unique identifier (UUID) (ideally version 4).\n\nMirrored back in a response header.\n\nIf you re-send a failed request, use the same value in this header.\n","schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","example":"60E0B220-8136-4CA5-AE46-1D97EF59D068"}},"CorrelationID":{"in":"header","name":"X-Correlation-ID","required":false,"description":"An optional ID which you can use to track transactions across multiple systems. It can take any value, but we recommend avoiding `.` characters.\n\nMirrored back in a response header.\n","schema":{"type":"string","example":"11C46F5F-CDEF-4865-94B2-0EE0EDCC26DA"}},"NHSD-End-User-Organisation-ODS":{"in":"header","name":"NHSD-End-User-Organisation-ODS","required":false,"description":"The ODS code of the user.\n\nMandatory for client applications which service multiple end user organisations (EUO). This will allow the calls to be attributed to the correct EUO.\n","schema":{"type":"string","example":"Y12345"}},"FuzzyMatch":{"name":"_fuzzy-match","description":"A fuzzy search is performed, including checks for homophones, transposed names and historic information.\n\nYou cannot use wildcards with a fuzzy search.\n","example":false,"in":"query","required":false,"schema":{"type":"boolean","default":false}},"ExactMatch":{"name":"_exact-match","description":"The search only returns results where the `score` field is 1.0. Use this with care - it is unlikely to work with fuzzy search or wildcards.","example":false,"in":"query","required":false,"schema":{"type":"boolean","default":false}},"History":{"name":"_history","description":"The search looks for matches in historic information such as previous names and addresses.\n\nThis parameter has no effect for a fuzzy search, which always includes historic information.\n","example":true,"in":"query","required":false,"schema":{"type":"boolean","default":false}},"MaxResults":{"name":"_max-results","description":"The maximum number of matching patients to return. For healthcare worker access, this must be between 1 and 50, and the default is 50.\nFor application-restricted access, this must be 1, and the default is 1.\nIf too many patients match the search criteria, we return a `TOO_MANY_MATCHES` error.\n","example":1,"in":"query","required":false,"schema":{"type":"integer","format":"int32"}},"Family":{"name":"family","description":"The patient's family name (surname).\n\nNot case sensitive. Max 35 characters.\nUse `*` as a wildcard but not in the first two characters and not in fuzzy search mode.\nMust be [URL encoded](https://en.wikipedia.org/wiki/Percent-encoding), for example a space must be represented by either `%20` or `+` and a wildcard must be encoded as `%2A`.\n","examples":{"simple":{"value":"Smith","summary":"Matches Smythe if `_fuzzy-match` is specified."},"wildcarded":{"value":"Sm*t*","summary":"Wildcards must contain at least two characters, this matches Smith, Smythe"}},"in":"query","required":false,"schema":{"type":"string"}},"Given":{"name":"given","description":"The patient's given names.\n\nNot case sensitive. Max 35 characters.\nUse `*` as a wildcard but not in the first two characters and not in fuzzy search mode.\nWildcard searches will match the start of the first given name and not subsequent given names, for example the given names \"Alan Michael\" can be searched with \"Ala*\" but not \"Mic*\".\nMust be [URL encoded](https://en.wikipedia.org/wiki/Percent-encoding), for example a space must be represented by either `%20` or `+` and a wildcard must be encoded as `%2A`.\n\nA patient may have more than one given name. Subsequent given names are commonly referred to as 'middle names'.\nSpecify multiple given names by repeating this parameter.\nTo search for `Jane Anne Smith` use `given=Jane&given=Anne&family=Smith`.\n\nThe first given name may be a [compound name](https://en.wikipedia.org/wiki/Given_name#Compound), for example `John Paul`.\nTo search for `John Paul James Smith` (where `John Paul` is the first given name, `James` is the second given name, and `Smith` the family name) use `given=John%20Paul&given=James&family=Smith`.\n\nNote that it is not necessary to specify subsequent given (middle) names, and that doing so may impact your search results in the case they are not recorded in the demographics system.\n","example":"Jane","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"}}},"Gender":{"name":"gender","description":"Gender with which the patient most strongly identifies.","example":"female","in":"query","required":false,"schema":{"type":"string","enum":["male","female","other","unknown"],"example":"female"}},"Birthdate":{"name":"birthdate","in":"query","description":"Date of birth in the format `yyyy-mm-dd`. To specify a range, use `birthdate=geyyyy-mm-dd&birthdate=leyyyy-mm-dd`.","examples":{"simple":{"value":["eq2010-10-22"],"description":"Exact match date"},"rangege":{"value":["ge2010-10-22"],"description":"Greater than or equals match, which matches 2010-10-22 or 2010-10-23"},"rangele":{"value":["le2010-10-22"],"description":"Less than or equals match, which matches 2010-10-22 or 2010-10-21"}},"required":false,"schema":{"type":"array","items":{"type":"string"}}},"DeathDate":{"name":"death-date","in":"query","description":"Date of death in the format `yyyy-mm-dd`. To specify a range, use `death-date=geyyyy-mm-dd&death-date=leyyyy-mm-dd`.\n\nFor a fuzzy search, this is ignored for matching but included in the score calculation.\n","examples":{"simple":{"value":"eq2010-10-22","description":"Exact match date"},"rangege":{"value":"ge2010-10-22","description":"Greater than or equals match which matches 2010-10-22 or 2010-10-23"},"rangele":{"value":"le2010-10-22","description":"Less than or equals match, which matches 2010-10-22 or 2010-10-21"}},"required":false,"schema":{"type":"string","format":"date"}},"AddressPostalcode":{"name":"address-postalcode","description":"The postcode of any of the patient’s known addresses.\n\nNot case sensitive.\nSpaces are ignored, for example `LS16AE` and `LS1 6AE` both match `LS1 6AE`.\nUse `*` as a wildcard but not in the first two characters and not in fuzzy search mode.\nMust be [URL encoded](https://en.wikipedia.org/wiki/Percent-encoding), for example a space must be represented by either `%20` or `+` and a wildcard must be encoded as `%2A`.\n","examples":{"simple":{"value":"LS1 6AE","summary":"Spaces ignored, would match LS16AE"},"wildcarded":{"value":"LS1*","summary":"Matches 'LS16AE', 'LS1 6AE' and 'LS1 6AB'"}},"in":"query","required":false,"schema":{"type":"string"}},"AddressPostcode":{"name":"address-postcode","description":"**N.B. that address-postcode will be deprecated in the future, address-postalcode should be used instead. \nIf both address-postcode and address-postalcode are provided, an INVALID_SEARCH_DATA error will be returned.**\nThe postcode of any of the patient’s known addresses.\n\nNot case sensitive.\nSpaces are ignored, for example `LS16AE` and `LS1 6AE` both match `LS1 6AE`.\nUse `*` as a wildcard but not in the first two characters and not in fuzzy search mode.\nMust be [URL encoded](https://en.wikipedia.org/wiki/Percent-encoding), for example a space must be represented by either `%20` or `+` and a wildcard must be encoded as `%2A`.\n","examples":{"simple":{"value":"LS1 6AE","summary":"Spaces ignored, would match LS16AE"},"wildcarded":{"value":"LS1*","summary":"Matches 'LS16AE', 'LS1 6AE' and 'LS1 6AB'"}},"in":"query","required":false,"schema":{"type":"string"}},"GeneralPractitioner":{"name":"general-practitioner","description":"The Organisation Data Service (ODS) code of the patient's registered GP practice.\n\nNot case sensitive.\nFor a fuzzy search, this is ignored for matching but included in the score calculation.\n","example":"Y12345","in":"query","required":false,"schema":{"type":"string"}},"ManagingOrganization":{"name":"managing-organization","description":"**This field is for internal-use only**.\n\nThe Organisation Data Service (ODS) code of the patient's current managing organization.\nNot case sensitive.\nFor a fuzzy search, this is ignored for matching but included in the score calculation.\n","example":"Y12345","in":"query","required":false,"schema":{"type":"string"}},"ETag":{"name":"etag","schema":{"type":"string","pattern":"^W/\"[0-9]+\"$","example":"W/\"2\""},"in":"header","description":"Record version identifier enclosed in quotes and preceded by 'W/'. For example, `W/\"2\"`.\n\nCorresponds to `meta.versionId` attribute in the patient resource body.\n\nWhen you retrieve a patient resource, you get a version number for the resource (in the `ETag` response header and in the `versionId` field in the response).\nYou must then pass the resource's version number in any update request (in the `If-Match` response header) made for the patient.\n"},"XCorrelationId":{"name":"x-correlation-id","schema":{"type":"string","example":"11C46F5F-CDEF-4865-94B2-0EE0EDCC26DA"},"in":"header","description":"The X-Correlation-ID from the request header, if supplied, mirrored back.\n"},"XRequestID":{"name":"x-request-id","schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","example":"60E0B220-8136-4CA5-AE46-1D97EF59D068"},"in":"header","description":"The X-Request-ID from the request header, if supplied, mirrored back.\n"},"RetryAfter":{"name":"retry-after","description":"Time to wait before retrying your request in seconds","in":"header","schema":{"type":"string","example":"5"}},"EmailAddress":{"name":"email","description":"Email address\n","example":"jane.smith@example.com","in":"query","required":false,"schema":{"type":"string"}},"PhoneNumber":{"name":"phone","description":"Phone number\n","example":"01632960587","in":"query","required":false,"schema":{"type":"string"}}},"schemas":{"Patient":{"type":"object","required":["id"],"additionalProperties":false,"properties":{"resourceType":{"type":"string","description":"FHIR resource type.","default":"Patient"},"id":{"description":"The patient's NHS number. The primary identifier of a patient, unique within NHS England and Wales. Always 10 digits and must be a [valid NHS number](https://www.datadictionary.nhs.uk/attributes/nhs_number.html).","type":"string","pattern":"^\\d{10}$","example":"9000000009"},"identifier":{"type":"array","description":"Identifier and system of identification used for this Patient.","items":{"type":"object","maxItems":1,"required":["value"],"properties":{"system":{"type":"string","format":"url","description":"System identifier belongs to.","default":"https://fhir.nhs.uk/Id/nhs-number"},"value":{"description":"The patient's NHS number. The primary identifier of a patient, unique within NHS England and Wales. Always 10 digits and must be a [valid NHS number](https://www.datadictionary.nhs.uk/attributes/nhs_number.html).","type":"string","pattern":"^\\d{10}$","example":"9000000009"},"extension":{"type":"array","description":"FHIR extensions.","items":{"type":"object","description":"Status indicating if NHS number is present and verified.","properties":{"url":{"type":"string","description":"URL of the extension definition.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSNumberVerificationStatus","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSNumberVerificationStatus"]},"valueCodeableConcept":{"type":"object","description":"NHS Number Verification Status Indicator.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URI of the coding system specification.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-NHSNumberVerificationStatus"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1.0.0"},"code":{"type":"string","description":"Symbol in syntax defined by the system.","example":"01"},"display":{"type":"string","description":"Representation defined by the system.","example":"Number present and verified"}}}}}}}}}}}},"meta":{"type":"object","description":"Metadata about this resource.","properties":{"versionId":{"type":"string","description":"The NHS England assigned version of the patient resource.","example":"2"},"security":{"type":"array","description":"The level of security on the patients record, which affects which fields are populated on retrieval. The possible responses are:\n* U - unrestricted. All available data is returned.\n* R - restricted. Any sensitive data around the patient's location, so `address`, `generalPractitioner` and `telecom`, are removed from the response.\n* REDACTED - redacted. The patient record has been marked as invalid, so the data should not be used. This code is never returned; you receive a 404, and appropriate error response, if an invalidated patient retrieval is attempted.\n","maxItems":1,"items":{"type":"object","properties":{"system":{"type":"string","description":"URI of the value set specification.","example":"http://terminology.hl7.org/CodeSystem/v3-Confidentiality"},"code":{"type":"string","description":"Code defined by the system value set.","enum":["U","R","V","REDACTED"],"example":"U"},"display":{"type":"string","description":"Representation defined by the system.","enum":["unrestricted","restricted","redacted"],"example":"unrestricted"}}}}}},"name":{"type":"array","description":"List of names associated with the patient. \n","minItems":1,"items":{"type":"object","required":["use","family"],"additionalProperties":false,"properties":{"id":{"type":"string","description":"Unique object identifier for this name.","example":"123"},"use":{"type":"string","description":"How this name should be used.\n* usual - Known as, conventional or the one patient normally uses. A patient always has a usual name.\n* temp - An alias or temporary name. This may also be used for temporary names assigned at birth or in emergency situations.\n* nickname - A name that the patient prefers to be addressed by, but is not part of their usual name.\n* old - This name is no longer in use (or was never correct, but retained for records).\n* maiden - Name changed for Marriage. A name used prior to changing name because of marriage. This term is not gender specific. The use of this term does not imply any particular history for a person's name.\n\nThe following use codes are included in the [name-use](https://www.hl7.org/fhir/valueset-name-use.html) value set, but should not be used and is not be returned as part of a retrieval.\n* official - The formal name as registered in an official (government) registry, but which name might not be commonly used. May be called \"legal name\".\n* anonymous - Anonymous assigned name, alias, or pseudonym (used to protect a person's identity for privacy reasons).\n","enum":["usual","temp","nickname","old","maiden"],"example":"usual"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"given":{"type":"array","maxItems":5,"description":"Given names, including any middle names.\n\nEach name(s) should be a separate item in the list. The first given name may include multiple names, separated by a space.\nSubsequent names must be broken down into list items. For example, the input `[Jane Marie Anne, Jo Adele]` returns `[Jane Marie Anne, Jo, Adele]`.\n","example":["Jane Marie Anne","Jo","Adele"],"items":{"type":"string","maxLength":35,"example":"Jane"}},"family":{"type":"string","maxLength":35,"description":"Family name (often called Surname).","example":"Smith"},"prefix":{"type":"array","description":"Name prefixes, titles, and prenominals.","example":["Mrs"],"items":{"type":"string","example":"Mrs"}},"suffix":{"type":"array","description":"Name suffices and postnominals.","example":["MBE","PhD"],"items":{"type":"string","example":"MBE"}}}}},"gender":{"type":"string","description":"Classification of the gender of a patient. The classification is phenotypical rather than genotypical, i.e. it does not provide codes for medical or scientific purposes.\nIt is the administrative gender that the patient wishes to be known as. In some cases, this may not be the same as the patient’s registered birth gender, or their current clinical gender.\n","enum":["male","female","other","unknown"],"example":"female"},"birthDate":{"description":"The date on which the patient was born or is officially deemed to have been born.\n\nIt is a date in the format `yyyy-mm-dd`. Due to data quality issues on a small number of patients `yyyy-mm` and `yyyy` format may also be returned. \n","example":"2010-10-22","type":"string","format":"date"},"multipleBirthInteger":{"type":"integer","minimum":1,"maximum":9,"description":"The order in which the patient was born, with 1 indicating the first or only birth in the sequence, 2 indicating the second birth in the sequence, 3 indicating the third, and so on up to 7.\n\nThere are two other valid values; `8` meaning `Not applicable` and `9` meaning `Not known`.\n","example":1},"deceasedDateTime":{"description":"The date and time on which a person died or is officially deemed to have died, if applicable and known.\n\nIt is a datetime in the format `yyyy-mm-ddTHH:MM:SS+HH:MM` or `yyyy-mm-dd`. Due to data quality issues on a small number of patients `yyyy-mm` and `yyyy` format may also be returned.\n","example":"2010-10-22T00:00:00+00:00","type":"string","format":"date-time","pattern":"^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2}\\+\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2}\\+\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01]))$"},"address":{"type":"array","description":"List of addresses associated with the patient.\n\nThese are fully populated on a retrieval or a successful update, only the `home` address is returned on a search.\nWhen a patient tagged as `restricted` is retrieved, all addresses are removed from the response.\n","items":{"type":"object","description":"An address associated with the patient.","required":["use"],"properties":{"id":{"type":"string","description":"Unique system identifier for this address.","example":"456"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"use":{"type":"string","description":"Purpose of this address:\n * `home` - the home address is the patient's normal residence. Home address is also known as usual, main, registered, current or permanent address\n * `temp` - a temporary address is an address used for a set period of time, but where the patient's home, permanent address remains unchanged\n * `billing` - an address used for correspondence purposes only\n * `work` - an office address. This can be returned due to legacy data but cannot be added or replaced on update\n\n A patient should have no more than one current `temp` and/or `billing` address.\n However, historically this was constrained only by the integration requirements and was not enforced so theoretically more than one can exist for a patient when retrieving.\n Where multiple instances already exist for the patient it is not expected that local systems should manage those, but should choose the most appropriate one to maintain (e.g. by examining period dates).\n\n A `home` address is the patient's main residential address and should normally be used for all clinical and demographic purposes, including clinical and appointment correspondence.\n However additionally, `temp` and `billing` addresses may be provided by a patient when there is a requirement to record an alternative location for the purposes of unbroken care.\n When sending correspondence to a patient:\n *\ta present and valid `billing` address may take precedence over `home` and `temp` addresses. A patient should have only a single current `billing` address. An address is considered 'valid' according to its period start and end dates.\n *\tif no current `billing` address is provided, a `temp` address may take precedence over the `home` address, again if it is valid according to its period start and end dates.\n * if there is no valid, current `billing` and/or `temp` address, the `home` address must be used.\n","enum":["home","work","temp","billing"],"example":"home"},"text":{"type":"string","description":"Where a `temp` address is provided a descriptor text must be sent.\nThe list of possible values are:\n* `Second Home` - a patient's second home\n* `Student Accommodation` - a patient's place of residence while at university\n* `Respite Care Address` - where the patient resides during respite care\n* `Temporary Residence Address` - where the patient resides for a specific period of time\n* `Convalescence Home` - the address for a patient during a period of recovery\n* `Mobile Home` - the address of a patient's mobile home, parked for a specific period of time, e.g. the address of a caravan park\n* `Holiday Home` - the address for a patient during a holiday\n\nA patient can also register temporarily at a GP practice using a temporary address. Temporary GP registration information does not appear on the PDS, but the address used for it may.\n","enum":["Second Home","Student Accommodation","Respite Care Address","Temporary Residence Address","Convalescence Home","Mobile Home","Holiday Home"],"example":"Student Accommodation"},"line":{"type":"array","description":"All lines of the address except the postal code.\n\nSystems must apply the following formatting convention when adding or replacing addresses lines:\n*\tline 1 - premises ID and/or house name, e.g. `Flat 1` or `The Old Schoolhouse`\n*\tline 2 - house number, dependent thoroughfare name and descriptor (if present), thoroughfare name and descriptor, e.g. `23 Mill Lane`\n*\tline 3 - dependent locality/village, locality (if present), e.g. `Boxgrove`\n*\tline 4 - post town, e.g. `Leeds`\n*\tline 5 - county (if present), e.g. `West Yorkshire`\n\nIf any of the lines are blank, they are not returned due to FHIR conformance constraints.\n","maxItems":5,"items":{"type":"string"},"example":["1 Trevelyan Square","Boar Lane","City Centre","Leeds","West Yorkshire"]},"postalCode":{"type":"string","description":"Postal code of the address.","example":"LS1 6AE"},"extension":{"type":"array","description":"List of address keys formatted as a FHIR extension. This can include up to one Unique Property Reference Number (UPRN), and up to one Postal Address File (PAF) key. If no keys for the address are known, the array will be empty. Otherwise it will be a list of objects which specify the value of the address key and the code system for it","items":{"anyOf":[{"type":"object","description":"Unique identifier for an address.","properties":{"url":{"type":"string","description":"URL of specification of the AddressKey extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey"]},"extension":{"type":"array","description":"Specification of address key system and address key value. Contains exactly two items: one describing the code system the Address Key uses, and the other specifying the value of the Address Key.","minItems":2,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Coding system of the address key.","required":["url","valueCoding"],"properties":{"url":{"type":"string","description":"Always 'type'.","default":"type"},"valueCoding":{"type":"object","description":"URL of specification of address key format.","required":["system","code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available Address Key formats.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType"},"code":{"type":"string","description":"Address Key system. Always 'PAF'.","enum":["PAF"],"example":"PAF"}}}}},{"type":"object","description":"Value of the address key.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Always 'value'.","default":"value","example":"value"},"valueString":{"type":"string","description":"Address key in PAF format. An 8 digit number including leading zeroes, formatted as a string.","minLength":8,"maxLength":8,"pattern":"^[0-9]{8}$","example":"12345678"}}}]}}}},{"type":"object","description":"Unique identifier for an address.","properties":{"url":{"type":"string","description":"URL of specification of the AddressKey extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey"]},"extension":{"type":"array","description":"Specification of address key system and address key value. Contains exactly two items: one describing the code system the Address Key uses, and the other specifying the value of the Address Key.","minItems":2,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Coding system of the address key.","required":["url","valueCoding"],"properties":{"url":{"type":"string","description":"Always 'type'.","default":"type"},"valueCoding":{"type":"object","description":"URL of specification of address key format.","required":["system","code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available Address Key formats.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType"},"code":{"type":"string","description":"Address Key system. Always 'UPRN'.","enum":["UPRN"],"example":"UPRN"}}}}},{"type":"object","description":"Value of the address key.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Always 'value'.","default":"value","example":"value"},"valueString":{"type":"string","description":"Address key in UPRN format. A number containing from 1 up to 12 digits.","minLength":1,"maxLength":12,"pattern":"^[0-9]{1,12}$","example":"123456789012"}}}]}}}}]}}}}},"telecom":{"type":"array","description":"List of contact points for the patient; for example, phone numbers or email addresses.\nWhen a patient tagged as `restricted` is retrieved, all contact points are removed from the response.\n","items":{"description":"A contact point, such as a phone number or email address","type":"object","required":["system","value"],"properties":{"id":{"type":"string","description":"Unique object identifier for this contact point.","example":"789"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"system":{"description":"Means of communication, such as phone or email.","type":"string","enum":["phone","fax","email","other"],"example":"phone"},"value":{"description":"Phone number, email address, or other identifier for use with contact system.","type":"string","example":"01632960587"},"use":{"type":"string","description":"Location associated with communication system.","enum":["home","work","temp","mobile"],"example":"home"},"extension":{"type":"array","maxItems":1,"description":"Extension that is returned when the communication type is `textphone`. The only code returned is `textphone`, which means `Minicom (Textphone)`.\n\nThe `system` is `other` when the extension is included.\n","items":{"type":"object","description":"Wrapped object for other contact system details.","properties":{"url":{"type":"string","description":"Definition of other contact system extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem"]},"valueCoding":{"type":"object","description":"URL of specification of other contact systems.","properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem"},"code":{"type":"string","description":"Coded value for the other contact system in place.","example":"textphone"},"display":{"description":"Display-friendly representation of the other contact system code.","type":"string","example":"Minicom (Textphone)"}}}}}}}}},"contact":{"type":"array","description":"A list of patient contacts. Only emergency contacts are returned and only emergency contacts should be added. Any other contacts should be added to the patients `Related Person`.\nPatients designate here any contact number they desire to be used in case of an emergency.\nNote, while a patient may also desire to record various related persons telecom details, these do not separately allow for a concept of emergency contact; only ranking. See RelatedPerson endpoint.\nWhen a patient tagged as `restricted` is retrieved, all contacts are removed from the response.\n","items":{"title":"Schema for a patient contact.","type":"object","additionalProperties":false,"required":["relationship","telecom"],"properties":{"id":{"type":"string","example":"C123"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"relationship":{"type":"array","description":"The contact relationship wrapper object that holds the details of the relationship to the patient.\n\nThis is only returned when an Emergency Contact number has been set on `telecom`. The only valid code is `C`, which means `Emergency Contact`.\n","minItems":1,"maxItems":1,"items":{"type":"object","required":["coding"],"properties":{"coding":{"type":"array","description":"Exactly one contact relationship.","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","format":"url","default":"http://terminology.hl7.org/CodeSystem/v2-0131"},"code":{"type":"string","description":"Coded value for contact relationship.","example":"C"},"display":{"type":"string","description":"Display-friendly representation of the contact relationship code.","example":"Emergency Contact"}}}}}}},"telecom":{"type":"array","description":"List of Telecom objects on the contact only contains `system` and `value`.\n","items":{"description":"A contact point, such as a phone number or email address","type":"object","required":["system","value"],"properties":{"id":{"type":"string","description":"Unique object identifier for this contact point.","example":"789"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"system":{"description":"Means of communication, such as phone or email.","type":"string","enum":["phone","fax","email","other"],"example":"phone"},"value":{"description":"Phone number, email address, or other identifier for use with contact system.","type":"string","example":"01632960587"},"use":{"type":"string","description":"Location associated with communication system.","enum":["home","work","temp","mobile"],"example":"home"},"extension":{"type":"array","maxItems":1,"description":"Extension that is returned when the communication type is `textphone`. The only code returned is `textphone`, which means `Minicom (Textphone)`.\n\nThe `system` is `other` when the extension is included.\n","items":{"type":"object","description":"Wrapped object for other contact system details.","properties":{"url":{"type":"string","description":"Definition of other contact system extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem"]},"valueCoding":{"type":"object","description":"URL of specification of other contact systems.","properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem"},"code":{"type":"string","description":"Coded value for the other contact system in place.","example":"textphone"},"display":{"description":"Display-friendly representation of the other contact system code.","type":"string","example":"Minicom (Textphone)"}}}}}}}}}}}},"generalPractitioner":{"type":"array","maxItems":1,"description":"General Practice (not practitioner) with which the patient is, or was, registered. Always contains zero or one general practitioner object.\nWhen a patient tagged as `restricted` is retrieved, the General Practice is removed from the response.\n","items":{"description":"General practice (not practitioner) with which the patient is or was registered.","type":"object","required":["identifier"],"properties":{"id":{"description":"Object identifier (OID) specific to the returned details - this should be return exactly the same in any update.","type":"string","example":"254406A3"},"type":{"description":"Type of Reference being returned.","type":"string","example":"Organization"},"identifier":{"description":"Identifier and system of identification used for this Organisation.","type":"object","required":["value"],"properties":{"system":{"description":"URL for the Organisation Data Service - who are responsible for publishing codes that identify organisations and individuals across health and social care.","type":"string","example":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"description":"Organisation code for the registered general practice, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","type":"string","pattern":"^[0-9A-Z]+$","example":"Y12345"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}}}}}}},"managingOrganization":{"description":"The managing organization of a de-registered patient. This will not be returned when the reason for de-registration is death.","type":"object","required":["identifier"],"properties":{"type":{"description":"Type of Reference being returned.","type":"string","example":"Organization"},"identifier":{"description":"Identifier and system of identification used for this Organisation.","type":"object","required":["value"],"properties":{"system":{"description":"URL for the Organisation Data Service - who are responsible for publishing codes that identify organisations and individuals across health and social care.","type":"string","example":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"description":"Organisation code for the registered general practice, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","type":"string","pattern":"^[0-9A-Z]+$","example":"Y12345"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}}}}}},"extension":{"type":"array","description":"Wrapper array for the patient's pharmacies, death notification status, communication details, contact preferences and place of birth; these are all FHIR extensions.\nAlways contains zero or one of each pharmacy object, zero or one death notification status object, zero or one communication details object, zero or one contact preference and zero or one place of birth object.\nWhen a patient tagged as `restricted` is retrieved, the pharmacy and birth place extensions are removed from the response.\n","items":{"anyOf":[{"type":"object","description":"Wrapper object for the patient's nominated pharmacy. This will only be populated on a retrieval and not a search.","required":["url","valueReference"],"properties":{"url":{"type":"string","description":"URL of specification of UKCore-NominatedPharmacy FHIR extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NominatedPharmacy","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NominatedPharmacy"]},"valueReference":{"type":"object","description":"Reference to a pharmacy `Organization` resource.","required":["identifier"],"properties":{"identifier":{"type":"object","description":"Wrapper object for the patient's nominated pharmacy organisation code.","required":["value"],"properties":{"system":{"type":"string","description":"URL for the FHIR code system for the ODS organisation code.","default":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"type":"string","description":"Organisation code for the nominated pharmacy, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","pattern":"^[A-Za-z0-9]{3,10}$","example":"Y12345"}}}}}}},{"type":"object","description":"Wrapper object for the patient's dispensing doctor. This will only be populated on a retrieval and not a search.","required":["url","valueReference"],"properties":{"url":{"type":"string","description":"URL of specification of UKCore-DispensingDoctor FHIR extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-PreferredDispenserOrganization","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-PreferredDispenserOrganization"]},"valueReference":{"type":"object","description":"Reference to a GP practice pharmacy `Organization` resource.","required":["identifier"],"properties":{"identifier":{"type":"object","description":"Wrapper object for the patient's dispensing doctor organisation code.","required":["value"],"properties":{"system":{"type":"string","description":"URL for the FHIR code system for the ODS organisation code.","default":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"type":"string","description":"Organisation code for the dispensing doctor, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","pattern":"^[A-Za-z0-9]{3,10}$","example":"Y23456"}}}}}}},{"type":"object","description":"Wrapper object for the patient's medical appliance supplier. This will only be populated on a retrieval and not a search.","required":["url","valueReference"],"properties":{"url":{"type":"string","description":"URL of specification of UKCore-MedicalApplianceSupplier FHIR extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-MedicalApplianceSupplier","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-MedicalApplianceSupplier"]},"valueReference":{"type":"object","description":"Reference to medical appliance supplier pharmacy `Organization` resource.","required":["identifier"],"properties":{"identifier":{"type":"object","description":"Wrapper object for the patient's medical appliance supplier organisation code.","required":["value"],"properties":{"system":{"type":"string","description":"URL for the FHIR code system for the ODS organisation code.","default":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"type":"string","description":"Organisation code for the medical appliance supplier, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","pattern":"^[A-Za-z0-9]{3,10}$","example":"Y34567"}}}}}}},{"type":"object","description":"Wrapper object for death notification details.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of death notification extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus"]},"extension":{"type":"array","description":"Array containing exactly one death notification status code object and exactly one effective date object.","minItems":1,"maxItems":2,"items":{"oneOf":[{"type":"object","description":"Wrapper object for death notification status code.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `deathNotificationStatus`.","default":"deathNotificationStatus","enum":["deathNotificationStatus"]},"valueCodeableConcept":{"type":"object","description":"Death Notification Status.","properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["system","code"],"properties":{"system":{"type":"string","description":"URI of the coding system specification.","example":"https://fhir.hl7.org.uk/CodeSystem/UKCore-DeathNotificationStatus"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1.0.0"},"code":{"type":"string","description":"Symbol, in syntax, defined by the system:\n* `1` - Informal - death notice received via an update from a local NHS Organisation such as GP or Trust\n* `2` - Formal - death notice received from Registrar of Deaths. Only these endpoints are allowed to add a Formal death:\n - National Back Office using the Demographic Spine Application (DSA)\n - Office of National Statistics (ONS)\n - Maternity sites\n* `U` - Removed. This is a possible response, but it cannot be used on an update because Spine will reject it\n","example":"2","enum":["1","2","U"]},"display":{"type":"string","description":"Representation defined by the system.","example":"Formal - death notice received from Registrar of Deaths","enum":["Informal - death notice received via an update from a local NHS Organisation such as GP or Trust","Formal - death notice received from Registrar of Deaths","Removed"]}}}}}}}},{"type":"object","description":"Wrapper object for death notification effective date.","required":["url","valueDateTime"],"properties":{"url":{"type":"string","description":"Key of this object. Always `systemEffectiveDate`.","default":"systemEffectiveDate","enum":["systemEffectiveDate"]},"valueDateTime":{"type":"string","description":"Date and time at which death notification status took effect.","format":"date-time","example":"2010-10-22T00:00:00+00:00"}}}]}}}},{"type":"object","description":"Wrapper object for communication details. This will only be populated on a retrieval and not a search.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of communication extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSCommunication","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSCommunication"]},"extension":{"type":"array","description":"Definition of communication extension.\n\nThe array must have one item, a valueCodeableConcept for the language and can optionally include a valueBoolean for if an interpreter is required.","minItems":1,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Wrapper object for communication language.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `language`.","default":"language","enum":["language"]},"valueCodeableConcept":{"type":"object","description":"Human language.","required":["coding"],"properties":{"coding":{"type":"array","description":"Exactly one language code.","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URL of the Language Code System. Always uses the 'UKCore-HumanLanguage' Code System.","example":"https://fhir.hl7.org.uk/CodeSystem/UKCore-HumanLanguage"},"version":{"type":"string","description":"Version of the language code system.","example":"1.0.0"},"code":{"type":"string","description":"Language code based on [ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) standard plus extensions for braille, makaton and sign languages, which are:\n* `q1` - Braille\n* `q2` - American Sign Language\n* `q3` - Australian Sign Language\n* `q4` - British Sign Language\n* `q5` - Makaton\nAll valid codes combined can be found at https://fhir.hl7.org.uk/CodeSystem/UKCore-HumanLanguage.\n","example":"fr"},"display":{"type":"string","description":"Display-friendly representation of the language code (such as English). If there is a language code with no defined mapping, `Unknown` will be returned.","example":"French"}}}}}}}},{"type":"object","description":"Wrapper object for whether an interpreter is required.","required":["url","valueBoolean"],"properties":{"url":{"type":"string","description":"Key of this object. Always `interpreterRequired`.","default":"interpreterRequired","enum":["interpreterRequired"]},"valueBoolean":{"type":"boolean","description":"Whether an interpreter is required.","example":true}}}]}}}},{"type":"object","description":"Wrapper object for preferred contact details; the written communication format, preferred contact time and method. This will only be populated on a retrieval and not a search.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of the contact preference extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-ContactPreference","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-ContactPreference"]},"extension":{"description":"Wrapper array containing zero or one preferred contact method, zero or one preferred written communication format; and zero or one preferred contact time.","type":"array","maxItems":3,"items":{"oneOf":[{"type":"object","description":"Wrapper object for preferred written communication format.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredWrittenCommunicationFormat`.","default":"PreferredWrittenCommunicationFormat"},"valueCodeableConcept":{"type":"object","description":"Preferred Written Communication Format.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","format":"url","description":"Definition of the preferred written communication extension.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredWrittenCommunicationFormat","enum":["https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredWrittenCommunicationFormat"]},"code":{"type":"string","description":"A code to identify the preferred written communication format of a patient, contact or related person.\n* 11 - Large print\n* 12 - Braille\n* 13 - Audio tape\n","example":"12"},"display":{"type":"string","description":"Display-friendly representation of the preferred written communication format code.","example":"Braille"}}}}}}}},{"type":"object","description":"Wrapper object for preferred contact method.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredContactMethod`.","default":"PreferredContactMethod","enum":["PreferredContactMethod"]},"valueCodeableConcept":{"type":"object","description":"Preferred Contact Method.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","format":"url","description":"Definition of the preferred contact method extension.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredContactMethod","enum":["https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredContactMethod"]},"code":{"type":"string","description":"A code to identify to identify the preferred contact method of a patient, contact or related person.\n* 1\t- Letter\n* 2\t- Visit\n* 3\t- Telephone\n* 4\t- E-mail\n* 5\t- Minicom (Textphone)\n* 6\t- Telephone contact via proxy\n* 7\t- Sign language\n* 8\t- No Telephone contact\n","example":"1"},"display":{"type":"string","description":"Display-friendly representation of the preferred contact method code.","example":"Letter"}}}}}}}},{"type":"object","description":"Wrapper object for preferred contact times.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredContactTimes`.","default":"PreferredContactTimes","enum":["PreferredContactTimes"]},"valueString":{"type":"string","maximum":40,"description":"A free-text description about the preferred contact times.","example":"Not after 7pm"}}}]}}}},{"type":"object","description":"Wrapper object for place of birth details. This will not be returned on a restricted patient.","required":["url","valueAddress"],"properties":{"url":{"type":"string","description":"Definition of place of birth extension.","default":"http://hl7.org/fhir/StructureDefinition/patient-birthPlace","enum":["http://hl7.org/fhir/StructureDefinition/patient-birthPlace"]},"valueAddress":{"type":"object","additionalProperties":false,"properties":{"city":{"type":"string","description":"Town or city of birth.","example":"Manchester"},"district":{"type":"string","description":"County or metropolitan district of birth.","example":"Greater Manchester"},"country":{"type":"string","description":"A coded value for a patient's country of birth.\n\nFrom [ISO 3166-1](http://hl7.org/fhir/valueset-iso3166-1-3.html) plus codes from the UK Internal Code list which do not have entries in ISO 3166-1.\n\nUK Internal Codes:\n* `1` - England\n* `2` - Scotland\n* `3` - Wales\n* `4` - Northern Ireland\n* `7` - Sark\n* `9` - Alderney\n* `10` - Channel Islands\n","example":"GBR"}}}}},{"type":"object","description":"An extension to carry the reason a PDS record has been removed from the Patient Demographic Service. This will only be populated on a retrieval and not a search.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of the removal from registration extension.","default":"https://fhir.nhs.uk/StructureDefinition/Extension-PDS-RemovalFromRegistration","enum":["https://fhir.nhs.uk/StructureDefinition/Extension-PDS-RemovalFromRegistration"],"readOnly":true},"extension":{"type":"array","description":"An extension reason a PDS record has been removed from the Patient Demographic Service.","minItems":1,"maxItems":2,"items":{"oneOf":[{"type":"object","description":"Wrapper object for removalFromRegistrationCode.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"To identify the removal reason code.","default":"removalFromRegistrationCode","enum":["removalFromRegistrationCode"],"readOnly":true},"valueCodeableConcept":{"type":"object","description":"PDS Removal Reason Exit Code","required":["coding"],"properties":{"coding":{"type":"array","description":"Array containing exactly one removal reason exit code object","items":{"type":"object","required":["system","code","display"],"properties":{"system":{"type":"string","format":"url","description":"URL of the Removal Reason Exit Code. Always uses the 'PDS-RemovalReasonExitCode' Code System.","example":"https://fhir.nhs.uk/CodeSystem/PDS-RemovalReasonExitCode","readOnly":true},"code":{"type":"string","description":"A CodeSystem that identifies the reason a PDS record has been removed.","example":"SCT","enum":["DEA","EMB","SCT","NIT","TRA","ORR"]},"display":{"type":"string","description":"Display-friendly representation of the removal reason exit code.","example":"Transferred to Scotland"}}}}}}}},{"type":"object","description":"Wrapper object for removal from registration effective time.","required":["url","valuePeriod"],"properties":{"url":{"type":"string","description":"Key of this object. Always `effectiveTime`.","default":"effectiveTime","enum":["effectiveTime"],"readOnly":true},"valuePeriod":{"type":"object","description":"The effective time of removal of the Patient record from PDS.","required":["start"],"properties":{"start":{"type":"string","format":"date-time","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01T00:00:00+00:00"},"end":{"type":"string","format":"date-time","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31T00:00:00+00:00"}}}}}]}}}}]}}}},"PatientSearch":{"type":"object","properties":{"resourceType":{"type":"string","description":"FHIR Resource Type.","default":"Bundle"},"type":{"type":"string","description":"FHIR Bundle Type.","default":"searchset"},"timestamp":{"type":"string","description":"Time the search was performed.","format":"datetime","example":"2019-12-25T12:00:00+00:00"},"total":{"type":"integer","description":"Number of resources returned in search.","example":1},"entry":{"type":"array","description":"A list of matched patients. Empty if none found. The patients are ordered by match score, best first. A maximum of 50 patients are returned.\n","items":{"type":"object","properties":{"fullUrl":{"type":"string","description":"Absolute URL of the resource described in this item.","example":"https://api.service.nhs.uk/personal-demographics/FHIR/R4/Patient/9000000009"},"search":{"type":"object","properties":{"score":{"description":"Search score from 0.0 to 1.0.","type":"number","minimum":0,"maximum":1,"example":0.75}}},"resource":{"type":"object","additionalProperties":false,"properties":{"resourceType":{"type":"string","description":"FHIR resource type.","default":"Patient"},"id":{"description":"The patient's NHS number. The primary identifier of a patient, unique within NHS England and Wales. Always 10 digits and must be a [valid NHS number](https://www.datadictionary.nhs.uk/attributes/nhs_number.html).","type":"string","pattern":"^\\d{10}$","example":"9000000009"},"identifier":{"type":"array","description":"Identifier and system of identification used for this Patient.","items":{"type":"object","maxItems":1,"required":["value"],"properties":{"system":{"type":"string","format":"url","description":"System identifier belongs to.","default":"https://fhir.nhs.uk/Id/nhs-number"},"value":{"description":"The patient's NHS number. The primary identifier of a patient, unique within NHS England and Wales. Always 10 digits and must be a [valid NHS number](https://www.datadictionary.nhs.uk/attributes/nhs_number.html).","type":"string","pattern":"^\\d{10}$","example":"9000000009"},"extension":{"type":"array","description":"FHIR extensions.","items":{"type":"object","description":"Status indicating if NHS number is present and verified.","properties":{"url":{"type":"string","description":"URL of the extension definition.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSNumberVerificationStatus","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSNumberVerificationStatus"]},"valueCodeableConcept":{"type":"object","description":"NHS Number Verification Status Indicator.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URI of the coding system specification.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-NHSNumberVerificationStatus"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1.0.0"},"code":{"type":"string","description":"Symbol in syntax defined by the system.","example":"01"},"display":{"type":"string","description":"Representation defined by the system.","example":"Number present and verified"}}}}}}}}}}}},"meta":{"type":"object","description":"Metadata about this resource.","properties":{"versionId":{"type":"string","description":"The NHS England assigned version of the patient resource.","example":"2"},"security":{"type":"array","description":"The level of security on the patients record, which affects which fields are populated on retrieval. The possible responses are:\n* U - unrestricted. All available data is returned.\n* R - restricted. Any sensitive data around the patient's location, so `address`, `generalPractitioner` and `telecom`, are removed from the response.\n* REDACTED - redacted. The patient record has been marked as invalid, so the data should not be used. This code is never returned; you receive a 404, and appropriate error response, if an invalidated patient retrieval is attempted.\n","maxItems":1,"items":{"type":"object","properties":{"system":{"type":"string","description":"URI of the value set specification.","example":"http://terminology.hl7.org/CodeSystem/v3-Confidentiality"},"code":{"type":"string","description":"Code defined by the system value set.","enum":["U","R","V","REDACTED"],"example":"U"},"display":{"type":"string","description":"Representation defined by the system.","enum":["unrestricted","restricted","redacted"],"example":"unrestricted"}}}}}},"name":{"type":"array","description":"List of names associated with the patient.\nThis is only fully populated on a retrieval or a successful update, only the `usual`, `nickname` and `temp` names are returned on a search. \n","minItems":1,"items":{"type":"object","required":["use","family"],"additionalProperties":false,"properties":{"id":{"type":"string","description":"Unique object identifier for this name.","example":"123"},"use":{"type":"string","description":"How this name should be used.\n* usual - Known as, conventional or the one patient normally uses. A patient always has a usual name.\n* temp - An alias or temporary name. This may also be used for temporary names assigned at birth or in emergency situations.\n* nickname - A name that the patient prefers to be addressed by, but is not part of their usual name.\n* old - This name is no longer in use (or was never correct, but retained for records).\n* maiden - Name changed for Marriage. A name used prior to changing name because of marriage. This term is not gender specific. The use of this term does not imply any particular history for a person's name.\n\nThe following use codes are included in the [name-use](https://www.hl7.org/fhir/valueset-name-use.html) value set, but should not be used and is not be returned as part of a retrieval.\n* official - The formal name as registered in an official (government) registry, but which name might not be commonly used. May be called \"legal name\".\n* anonymous - Anonymous assigned name, alias, or pseudonym (used to protect a person's identity for privacy reasons).\n","enum":["usual","temp","nickname","old","maiden"],"example":"usual"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"given":{"type":"array","maxItems":5,"description":"Given names, including any middle names.\n\nEach name(s) should be a separate item in the list. The first given name may include multiple names, separated by a space.\nSubsequent names must be broken down into list items. For example, the input `[Jane Marie Anne, Jo Adele]` returns `[Jane Marie Anne, Jo, Adele]`.\n","example":["Jane Marie Anne","Jo","Adele"],"items":{"type":"string","maxLength":35,"example":"Jane"}},"family":{"type":"string","maxLength":35,"description":"Family name (often called Surname).","example":"Smith"},"prefix":{"type":"array","description":"Name prefixes, titles, and prenominals.","example":["Mrs"],"items":{"type":"string","example":"Mrs"}},"suffix":{"type":"array","description":"Name suffices and postnominals.","example":["MBE","PhD"],"items":{"type":"string","example":"MBE"}}}}},"gender":{"type":"string","description":"Classification of the gender of a patient. The classification is phenotypical rather than genotypical, i.e. it does not provide codes for medical or scientific purposes.\nIt is the administrative gender that the patient wishes to be known as. In some cases, this may not be the same as the patient’s registered birth gender, or their current clinical gender.\n","enum":["male","female","other","unknown"],"example":"female"},"birthDate":{"description":"The date on which the patient was born or is officially deemed to have been born.\n\nIt is a date in the format `yyyy-mm-dd`. Due to data quality issues on a small number of patients `yyyy-mm` and `yyyy` format may also be returned. \n","example":"2010-10-22","type":"string","format":"date"},"multipleBirthInteger":{"type":"integer","minimum":1,"maximum":9,"description":"The order in which the patient was born, with 1 indicating the first or only birth in the sequence, 2 indicating the second birth in the sequence, 3 indicating the third, and so on up to 7.\n\nThere are two other valid values; `8` meaning `Not applicable` and `9` meaning `Not known`.\n","example":1},"deceasedDateTime":{"description":"The date and time on which a person died or is officially deemed to have died, if applicable and known.\n\nIt is a datetime in the format `yyyy-mm-ddTHH:MM:SS+HH:MM` or `yyyy-mm-dd`. Due to data quality issues on a small number of patients `yyyy-mm` and `yyyy` format may also be returned.\n","example":"2010-10-22T00:00:00+00:00","type":"string","format":"date-time","pattern":"^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2}\\+\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T\\d{2}:\\d{2}:\\d{2}\\+\\d{2}:\\d{2})$|^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01]))$"},"address":{"type":"array","description":"List of addresses associated with the patient.\n\nThis is only fully populated on a retrieval or a successful update, only the `home` address is returned on a search.\nWhen a patient tagged as `restricted` is retrieved, all addresses are removed from the response.\n","items":{"type":"object","description":"An address associated with the patient.","required":["use"],"properties":{"id":{"type":"string","description":"Unique system identifier for this address.","example":"456"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"use":{"type":"string","description":"Purpose of this address:\n * `home` - the home address is the patient's normal residence. Home address is also known as usual, main, registered, current or permanent address\n * `temp` - a temporary address is an address used for a set period of time, but where the patient's home, permanent address remains unchanged\n * `billing` - an address used for correspondence purposes only\n * `work` - an office address. This can be returned due to legacy data but cannot be added or replaced on update\n\n A patient should have no more than one current `temp` and/or `billing` address.\n However, historically this was constrained only by the integration requirements and was not enforced so theoretically more than one can exist for a patient when retrieving.\n Where multiple instances already exist for the patient it is not expected that local systems should manage those, but should choose the most appropriate one to maintain (e.g. by examining period dates).\n\n A `home` address is the patient's main residential address and should normally be used for all clinical and demographic purposes, including clinical and appointment correspondence.\n However additionally, `temp` and `billing` addresses may be provided by a patient when there is a requirement to record an alternative location for the purposes of unbroken care.\n When sending correspondence to a patient:\n *\ta present and valid `billing` address may take precedence over `home` and `temp` addresses. A patient should have only a single current `billing` address. An address is considered 'valid' according to its period start and end dates.\n *\tif no current `billing` address is provided, a `temp` address may take precedence over the `home` address, again if it is valid according to its period start and end dates.\n * if there is no valid, current `billing` and/or `temp` address, the `home` address must be used.\n","enum":["home","work","temp","billing"],"example":"home"},"text":{"type":"string","description":"Where a `temp` address is provided a descriptor text must be sent.\nThe list of possible values are:\n* `Second Home` - a patient's second home\n* `Student Accommodation` - a patient's place of residence while at university\n* `Respite Care Address` - where the patient resides during respite care\n* `Temporary Residence Address` - where the patient resides for a specific period of time\n* `Convalescence Home` - the address for a patient during a period of recovery\n* `Mobile Home` - the address of a patient's mobile home, parked for a specific period of time, e.g. the address of a caravan park\n* `Holiday Home` - the address for a patient during a holiday\n\nA patient can also register temporarily at a GP practice using a temporary address. Temporary GP registration information does not appear on the PDS, but the address used for it may.\n","enum":["Second Home","Student Accommodation","Respite Care Address","Temporary Residence Address","Convalescence Home","Mobile Home","Holiday Home"],"example":"Student Accommodation"},"line":{"type":"array","description":"All lines of the address except the postal code.\n\nSystems must apply the following formatting convention when adding or replacing addresses lines:\n*\tline 1 - premises ID and/or house name, e.g. `Flat 1` or `The Old Schoolhouse`\n*\tline 2 - house number, dependent thoroughfare name and descriptor (if present), thoroughfare name and descriptor, e.g. `23 Mill Lane`\n*\tline 3 - dependent locality/village, locality (if present), e.g. `Boxgrove`\n*\tline 4 - post town, e.g. `Leeds`\n*\tline 5 - county (if present), e.g. `West Yorkshire`\n\nIf any of the lines are blank, they are not returned due to FHIR conformance constraints.\n","maxItems":5,"items":{"type":"string"},"example":["1 Trevelyan Square","Boar Lane","City Centre","Leeds","West Yorkshire"]},"postalCode":{"type":"string","description":"Postal code of the address.","example":"LS1 6AE"},"extension":{"type":"array","description":"List of address keys formatted as a FHIR extension. This can include up to one Unique Property Reference Number (UPRN), and up to one Postal Address File (PAF) key. If no keys for the address are known, the array will be empty. Otherwise it will be a list of objects which specify the value of the address key and the code system for it","items":{"anyOf":[{"type":"object","description":"Unique identifier for an address.","properties":{"url":{"type":"string","description":"URL of specification of the AddressKey extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey"]},"extension":{"type":"array","description":"Specification of address key system and address key value. Contains exactly two items: one describing the code system the Address Key uses, and the other specifying the value of the Address Key.","minItems":2,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Coding system of the address key.","required":["url","valueCoding"],"properties":{"url":{"type":"string","description":"Always 'type'.","default":"type"},"valueCoding":{"type":"object","description":"URL of specification of address key format.","required":["system","code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available Address Key formats.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType"},"code":{"type":"string","description":"Address Key system. Always 'PAF'.","enum":["PAF"],"example":"PAF"}}}}},{"type":"object","description":"Value of the address key.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Always 'value'.","default":"value","example":"value"},"valueString":{"type":"string","description":"Address key in PAF format. An 8 digit number including leading zeroes, formatted as a string.","minLength":8,"maxLength":8,"pattern":"^[0-9]{8}$","example":"12345678"}}}]}}}},{"type":"object","description":"Unique identifier for an address.","properties":{"url":{"type":"string","description":"URL of specification of the AddressKey extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey"]},"extension":{"type":"array","description":"Specification of address key system and address key value. Contains exactly two items: one describing the code system the Address Key uses, and the other specifying the value of the Address Key.","minItems":2,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Coding system of the address key.","required":["url","valueCoding"],"properties":{"url":{"type":"string","description":"Always 'type'.","default":"type"},"valueCoding":{"type":"object","description":"URL of specification of address key format.","required":["system","code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available Address Key formats.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType"},"code":{"type":"string","description":"Address Key system. Always 'UPRN'.","enum":["UPRN"],"example":"UPRN"}}}}},{"type":"object","description":"Value of the address key.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Always 'value'.","default":"value","example":"value"},"valueString":{"type":"string","description":"Address key in UPRN format. A number containing from 1 up to 12 digits.","minLength":1,"maxLength":12,"pattern":"^[0-9]{1,12}$","example":"123456789012"}}}]}}}}]}}}}},"telecom":{"type":"array","description":"List of contact points for the patient; for example, phone numbers or email addresses.\nWhen a patient tagged as `restricted` is retrieved, all contact points are removed from the response.\n","items":{"description":"A contact point, such as a phone number or email address","type":"object","required":["system","value"],"properties":{"id":{"type":"string","description":"Unique object identifier for this contact point.","example":"789"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"system":{"description":"Means of communication, such as phone or email.","type":"string","enum":["phone","fax","email","other"],"example":"phone"},"value":{"description":"Phone number, email address, or other identifier for use with contact system.","type":"string","example":"01632960587"},"use":{"type":"string","description":"Location associated with communication system.","enum":["home","work","temp","mobile"],"example":"home"},"extension":{"type":"array","maxItems":1,"description":"Extension that is returned when the communication type is `textphone`. The only code returned is `textphone`, which means `Minicom (Textphone)`.\n\nThe `system` is `other` when the extension is included.\n","items":{"type":"object","description":"Wrapped object for other contact system details.","properties":{"url":{"type":"string","description":"Definition of other contact system extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem"]},"valueCoding":{"type":"object","description":"URL of specification of other contact systems.","properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem"},"code":{"type":"string","description":"Coded value for the other contact system in place.","example":"textphone"},"display":{"description":"Display-friendly representation of the other contact system code.","type":"string","example":"Minicom (Textphone)"}}}}}}}}},"contact":{"type":"array","description":"A list of patient contacts. Only emergency contacts are returned. Any other contacts are returned on the patients `Related Person`.\nWhen a patient tagged as `restricted` is retrieved, all contacts are removed from the response.\n","items":{"title":"Schema for a patient contact.","type":"object","additionalProperties":false,"required":["relationship","telecom"],"properties":{"id":{"type":"string","example":"C123"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"relationship":{"type":"array","description":"The contact relationship wrapper object that holds the details of the relationship to the patient.\n\nThis is only returned when an Emergency Contact number has been set on `telecom`. The only valid code is `C`, which means `Emergency Contact`.\n","minItems":1,"maxItems":1,"items":{"type":"object","required":["coding"],"properties":{"coding":{"type":"array","description":"Exactly one contact relationship.","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","format":"url","default":"http://terminology.hl7.org/CodeSystem/v2-0131"},"code":{"type":"string","description":"Coded value for contact relationship.","example":"C"},"display":{"type":"string","description":"Display-friendly representation of the contact relationship code.","example":"Emergency Contact"}}}}}}},"telecom":{"type":"array","description":"List of Telecom objects on the contact only contains `system` and `value`.\n","items":{"description":"A contact point, such as a phone number or email address","type":"object","required":["system","value"],"properties":{"id":{"type":"string","description":"Unique object identifier for this contact point.","example":"789"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"system":{"description":"Means of communication, such as phone or email.","type":"string","enum":["phone","fax","email","other"],"example":"phone"},"value":{"description":"Phone number, email address, or other identifier for use with contact system.","type":"string","example":"01632960587"},"use":{"type":"string","description":"Location associated with communication system.","enum":["home","work","temp","mobile"],"example":"home"},"extension":{"type":"array","maxItems":1,"description":"Extension that is returned when the communication type is `textphone`. The only code returned is `textphone`, which means `Minicom (Textphone)`.\n\nThe `system` is `other` when the extension is included.\n","items":{"type":"object","description":"Wrapped object for other contact system details.","properties":{"url":{"type":"string","description":"Definition of other contact system extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem"]},"valueCoding":{"type":"object","description":"URL of specification of other contact systems.","properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem"},"code":{"type":"string","description":"Coded value for the other contact system in place.","example":"textphone"},"display":{"description":"Display-friendly representation of the other contact system code.","type":"string","example":"Minicom (Textphone)"}}}}}}}}}}}},"generalPractitioner":{"type":"array","maxItems":1,"description":"General Practice (not practitioner) with which the patient is, or was, registered. Always contains zero or one general practitioner object.\nWhen a patient tagged as `restricted` is retrieved, the General Practice is removed from the response.\n","items":{"description":"General practice (not practitioner) with which the patient is or was registered.","type":"object","required":["identifier"],"properties":{"id":{"description":"Object identifier (OID) specific to the returned details - this should be return exactly the same in any update.","type":"string","example":"254406A3"},"type":{"description":"Type of Reference being returned.","type":"string","example":"Organization"},"identifier":{"description":"Identifier and system of identification used for this Organisation.","type":"object","required":["value"],"properties":{"system":{"description":"URL for the Organisation Data Service - who are responsible for publishing codes that identify organisations and individuals across health and social care.","type":"string","example":"https://fhir.nhs.uk/Id/ods-organization-code"},"value":{"description":"Organisation code for the registered general practice, as held in the [Organisation Data Service](https://developer.nhs.uk/apis/ods/).","type":"string","pattern":"^[0-9A-Z]+$","example":"Y12345"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}}}}}}},"extension":{"type":"array","description":"Wrapper array for the patient's death notification status; this is a FHIR extension. Always contains zero or one death notification status object.\n","items":{"anyOf":[{"type":"object","description":"Wrapper object for death notification details.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of death notification extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-DeathNotificationStatus"]},"extension":{"type":"array","description":"Array containing exactly one death notification status code object and exactly one effective date object.","minItems":1,"maxItems":2,"items":{"oneOf":[{"type":"object","description":"Wrapper object for death notification status code.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `deathNotificationStatus`.","default":"deathNotificationStatus","enum":["deathNotificationStatus"]},"valueCodeableConcept":{"type":"object","description":"Death Notification Status.","properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["system","code"],"properties":{"system":{"type":"string","description":"URI of the coding system specification.","example":"https://fhir.hl7.org.uk/CodeSystem/UKCore-DeathNotificationStatus"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1.0.0"},"code":{"type":"string","description":"Symbol, in syntax, defined by the system:\n* `1` - Informal - death notice received via an update from a local NHS Organisation such as GP or Trust\n* `2` - Formal - death notice received from Registrar of Deaths. Only these endpoints are allowed to add a Formal death:\n - National Back Office using the Demographic Spine Application (DSA)\n - Office of National Statistics (ONS)\n - Maternity sites\n* `U` - Removed. This is a possible response, but it cannot be used on an update because Spine will reject it\n","example":"2","enum":["1","2","U"]},"display":{"type":"string","description":"Representation defined by the system.","example":"Formal - death notice received from Registrar of Deaths","enum":["Informal - death notice received via an update from a local NHS Organisation such as GP or Trust","Formal - death notice received from Registrar of Deaths","Removed"]}}}}}}}},{"type":"object","description":"Wrapper object for death notification effective date.","required":["url","valueDateTime"],"properties":{"url":{"type":"string","description":"Key of this object. Always `systemEffectiveDate`.","default":"systemEffectiveDate","enum":["systemEffectiveDate"]},"valueDateTime":{"type":"string","description":"Date and time at which death notification status took effect.","format":"date-time","example":"2010-10-22T00:00:00+00:00"}}}]}}}}]}}}}}}}}},"RelatedPersonBundle":{"type":"object","properties":{"resourceType":{"type":"string","description":"FHIR Resource Type.","default":"Bundle"},"type":{"type":"string","description":"FHIR Bundle Type.","default":"searchset"},"timestamp":{"type":"string","description":"Time the search was performed.","format":"datetime","example":"2019-12-25T12:00:00+00:00"},"total":{"type":"integer","description":"Number of resources returned in search.","example":1},"entry":{"type":"array","description":"A list of related people details attached to the patient. \n","items":{"type":"object","properties":{"fullUrl":{"type":"string","description":"Absolute URL of the resource described in this item.","example":"https://api.service.nhs.uk/personal-demographics/FHIR/R4/Patient/9000000009/RelatedPerson/507B7621"},"resource":{"type":"object","additionalProperties":false,"required":["patient","relationship"],"properties":{"id":{"type":"string","description":"Unique object identifier for this name.","example":"507B7621"},"resourceType":{"type":"string","description":"FHIR resource type.","default":"RelatedPerson"},"patient":{"type":"object","required":["type"],"properties":{"type":{"type":"string","default":"Patient","enum":["Patient"]},"identifier":{"type":"object","description":"Identifier and system of identification used for this Patient.\n\nThis is an optional field as related person details are either a reference to another NHS number, or the details, such as name and adress, stored directly on the resource.\n","properties":{"system":{"type":"string","description":"URL for the Patient retrieval API.","format":"url","example":"https://api.service.nhs.uk/personal-demographics/FHIR/R4/Patient"},"value":{"type":"string","description":"NHS number for the related person","example":"90000000009","pattern":"^\\d{10}$"}}},"reference":{"type":"string","description":"URL for the FHIR Patient resource.","format":"url","example":"https://api.service.nhs.uk/personal-demographics/FHIR/R4/Patient/90000000009"}}},"active":{"type":"boolean","default":true},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"name":{"type":"array","description":"List containing zero or one name associated with the related person.\nThis is an optional field as there may be a `patient` reference which can be used to retrieve any details about the related person.\nIf no `patient` reference is available `name` and `address` must be provided at the minimum.\n","maxItems":1,"items":{"type":"object","required":["use","family"],"additionalProperties":false,"properties":{"id":{"type":"string","description":"Unique object identifier for this name.","example":"123"},"use":{"type":"string","description":"How this name should be used.\n* usual - Known as, conventional or the one patient normally uses. A patient always has a usual name.\n* temp - An alias or temporary name. This may also be used for temporary names assigned at birth or in emergency situations.\n* nickname - A name that the patient prefers to be addressed by, but is not part of their usual name.\n* old - This name is no longer in use (or was never correct, but retained for records).\n* maiden - Name changed for Marriage. A name used prior to changing name because of marriage. This term is not gender specific. The use of this term does not imply any particular history for a person's name.\n\nThe following use codes are included in the [name-use](https://www.hl7.org/fhir/valueset-name-use.html) value set, but should not be used and is not be returned as part of a retrieval.\n* official - The formal name as registered in an official (government) registry, but which name might not be commonly used. May be called \"legal name\".\n* anonymous - Anonymous assigned name, alias, or pseudonym (used to protect a person's identity for privacy reasons).\n","enum":["usual","temp","nickname","old","maiden"],"example":"usual"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"given":{"type":"array","maxItems":5,"description":"Given names, including any middle names.\n\nEach name(s) should be a separate item in the list. The first given name may include multiple names, separated by a space.\nSubsequent names must be broken down into list items. For example, the input `[Jane Marie Anne, Jo Adele]` returns `[Jane Marie Anne, Jo, Adele]`.\n","example":["Jane Marie Anne","Jo","Adele"],"items":{"type":"string","maxLength":35,"example":"Jane"}},"family":{"type":"string","maxLength":35,"description":"Family name (often called Surname).","example":"Smith"},"prefix":{"type":"array","description":"Name prefixes, titles, and prenominals.","example":["Mrs"],"items":{"type":"string","example":"Mrs"}},"suffix":{"type":"array","description":"Name suffices and postnominals.","example":["MBE","PhD"],"items":{"type":"string","example":"MBE"}}}}},"address":{"type":"array","description":"List containing zero or one address associated with the related person.\nThis is an optional field as there may be a `patient` reference which can be used to retrieve any details about the related person.\nIf no `patient` reference is available `name` and `address` must be provided at the minimum.\n","maxItems":1,"items":{"type":"object","description":"An address associated with the patient.","required":["use"],"properties":{"id":{"type":"string","description":"Unique system identifier for this address.","example":"456"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"use":{"type":"string","description":"Purpose of this address:\n * `home` - the home address is the patient's normal residence. Home address is also known as usual, main, registered, current or permanent address\n * `temp` - a temporary address is an address used for a set period of time, but where the patient's home, permanent address remains unchanged\n * `billing` - an address used for correspondence purposes only\n * `work` - an office address. This can be returned due to legacy data but cannot be added or replaced on update\n\n A patient should have no more than one current `temp` and/or `billing` address.\n However, historically this was constrained only by the integration requirements and was not enforced so theoretically more than one can exist for a patient when retrieving.\n Where multiple instances already exist for the patient it is not expected that local systems should manage those, but should choose the most appropriate one to maintain (e.g. by examining period dates).\n\n A `home` address is the patient's main residential address and should normally be used for all clinical and demographic purposes, including clinical and appointment correspondence.\n However additionally, `temp` and `billing` addresses may be provided by a patient when there is a requirement to record an alternative location for the purposes of unbroken care.\n When sending correspondence to a patient:\n *\ta present and valid `billing` address may take precedence over `home` and `temp` addresses. A patient should have only a single current `billing` address. An address is considered 'valid' according to its period start and end dates.\n *\tif no current `billing` address is provided, a `temp` address may take precedence over the `home` address, again if it is valid according to its period start and end dates.\n * if there is no valid, current `billing` and/or `temp` address, the `home` address must be used.\n","enum":["home","work","temp","billing"],"example":"home"},"text":{"type":"string","description":"Where a `temp` address is provided a descriptor text must be sent.\nThe list of possible values are:\n* `Second Home` - a patient's second home\n* `Student Accommodation` - a patient's place of residence while at university\n* `Respite Care Address` - where the patient resides during respite care\n* `Temporary Residence Address` - where the patient resides for a specific period of time\n* `Convalescence Home` - the address for a patient during a period of recovery\n* `Mobile Home` - the address of a patient's mobile home, parked for a specific period of time, e.g. the address of a caravan park\n* `Holiday Home` - the address for a patient during a holiday\n\nA patient can also register temporarily at a GP practice using a temporary address. Temporary GP registration information does not appear on the PDS, but the address used for it may.\n","enum":["Second Home","Student Accommodation","Respite Care Address","Temporary Residence Address","Convalescence Home","Mobile Home","Holiday Home"],"example":"Student Accommodation"},"line":{"type":"array","description":"All lines of the address except the postal code.\n\nSystems must apply the following formatting convention when adding or replacing addresses lines:\n*\tline 1 - premises ID and/or house name, e.g. `Flat 1` or `The Old Schoolhouse`\n*\tline 2 - house number, dependent thoroughfare name and descriptor (if present), thoroughfare name and descriptor, e.g. `23 Mill Lane`\n*\tline 3 - dependent locality/village, locality (if present), e.g. `Boxgrove`\n*\tline 4 - post town, e.g. `Leeds`\n*\tline 5 - county (if present), e.g. `West Yorkshire`\n\nIf any of the lines are blank, they are not returned due to FHIR conformance constraints.\n","maxItems":5,"items":{"type":"string"},"example":["1 Trevelyan Square","Boar Lane","City Centre","Leeds","West Yorkshire"]},"postalCode":{"type":"string","description":"Postal code of the address.","example":"LS1 6AE"},"extension":{"type":"array","description":"List of address keys formatted as a FHIR extension. This can include up to one Unique Property Reference Number (UPRN), and up to one Postal Address File (PAF) key. If no keys for the address are known, the array will be empty. Otherwise it will be a list of objects which specify the value of the address key and the code system for it","items":{"anyOf":[{"type":"object","description":"Unique identifier for an address.","properties":{"url":{"type":"string","description":"URL of specification of the AddressKey extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey"]},"extension":{"type":"array","description":"Specification of address key system and address key value. Contains exactly two items: one describing the code system the Address Key uses, and the other specifying the value of the Address Key.","minItems":2,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Coding system of the address key.","required":["url","valueCoding"],"properties":{"url":{"type":"string","description":"Always 'type'.","default":"type"},"valueCoding":{"type":"object","description":"URL of specification of address key format.","required":["system","code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available Address Key formats.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType"},"code":{"type":"string","description":"Address Key system. Always 'PAF'.","enum":["PAF"],"example":"PAF"}}}}},{"type":"object","description":"Value of the address key.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Always 'value'.","default":"value","example":"value"},"valueString":{"type":"string","description":"Address key in PAF format. An 8 digit number including leading zeroes, formatted as a string.","minLength":8,"maxLength":8,"pattern":"^[0-9]{8}$","example":"12345678"}}}]}}}},{"type":"object","description":"Unique identifier for an address.","properties":{"url":{"type":"string","description":"URL of specification of the AddressKey extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AddressKey"]},"extension":{"type":"array","description":"Specification of address key system and address key value. Contains exactly two items: one describing the code system the Address Key uses, and the other specifying the value of the Address Key.","minItems":2,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Coding system of the address key.","required":["url","valueCoding"],"properties":{"url":{"type":"string","description":"Always 'type'.","default":"type"},"valueCoding":{"type":"object","description":"URL of specification of address key format.","required":["system","code"],"properties":{"system":{"type":"string","description":"URL of Code System that describes available Address Key formats.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-AddressKeyType"},"code":{"type":"string","description":"Address Key system. Always 'UPRN'.","enum":["UPRN"],"example":"UPRN"}}}}},{"type":"object","description":"Value of the address key.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Always 'value'.","default":"value","example":"value"},"valueString":{"type":"string","description":"Address key in UPRN format. A number containing from 1 up to 12 digits.","minLength":1,"maxLength":12,"pattern":"^[0-9]{1,12}$","example":"123456789012"}}}]}}}}]}}}}},"telecom":{"type":"array","description":"List containing zero to five contact methods associated with the related person.\nThis is an optional field as there may be a `patient` reference which can be used to retrieve any details about the related person.\n","maxItems":5,"items":{"description":"A contact point, such as a phone number or email address","type":"object","required":["system","value"],"properties":{"id":{"type":"string","description":"Unique object identifier for this contact point.","example":"789"},"period":{"type":"object","description":"Business effective period when data item was, is, or will be in use.\n","required":["start"],"properties":{"start":{"type":"string","format":"date","description":"Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.","example":"2020-01-01"},"end":{"type":"string","format":"date","description":"End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.","example":"2021-12-31"}}},"system":{"description":"Means of communication, such as phone or email.","type":"string","enum":["phone","fax","email","other"],"example":"phone"},"value":{"description":"Phone number, email address, or other identifier for use with contact system.","type":"string","example":"01632960587"},"use":{"type":"string","description":"Location associated with communication system.","enum":["home","work","temp","mobile"],"example":"home"},"extension":{"type":"array","maxItems":1,"description":"Extension that is returned when the communication type is `textphone`. The only code returned is `textphone`, which means `Minicom (Textphone)`.\n\nThe `system` is `other` when the extension is included.\n","items":{"type":"object","description":"Wrapped object for other contact system details.","properties":{"url":{"type":"string","description":"Definition of other contact system extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-OtherContactSystem"]},"valueCoding":{"type":"object","description":"URL of specification of other contact systems.","properties":{"system":{"type":"string","description":"URL of Code System that describes available contact relationships.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-OtherContactSystem"},"code":{"type":"string","description":"Coded value for the other contact system in place.","example":"textphone"},"display":{"description":"Display-friendly representation of the other contact system code.","type":"string","example":"Minicom (Textphone)"}}}}}}}}},"relationship":{"type":"array","description":"The relationship of the related person to the patient.\n","minItems":1,"maxItems":1,"items":{"type":"object","required":["coding"],"properties":{"coding":{"type":"array","description":"Coded values for three relationship types:\n* Role\n* Type\n* Next-of-Kin\n\nThe codes used can be found at:\n* http://hl7.org/fhir/ValueSet/relatedperson-relationshiptype\n* https://fhir.nhs.uk/R4/CodeSystem/UKCore-AdditionalRelatedPersonRole\n\nThe allowed values for `Role` are:\n* Agent - Agent of patient\n* Guardian - Guardian of patient\n* Personal - Personal relationship with the patient\n\nThe allowed values for `Type` are:\n* SPS - spouse\n* DOMPART - domestic partner\n* PRN - parent\n* PRNFOST - foster parent\n* STPPRN - step parent\n* CHILD - child\n* MTH - mother\n* FTH - father\n* SIS - sister\n* BRO - brother\n* FAMMEMB - family member\n* ONESELF - self\n* N - Next-of-Kin\n* U - Unknown\n* PolygamousPartner - Polygamous Partner of patient\n* Dependant - Dependant of patient\n* NonDependant - Non Dependant of patient\n* ProxyContact - Proxy Contact for patient\n* ProxyCommunication - Proxy Communication for patient\n* ProxyContactCommunication - Proxy Contact and Communication for patient\n* Carer - Carer of patient\n* Guardian - Guardian of patient\n* NotSpecified - Not Specified\n\nThe allowed values for `Next-of-Kin` are:\n* N - Next-of-Kin\n\n`Role` and `Type` are mandatory, so both should be present - however they both contain the `Guardian` code - so a single response is possible.\n\n`Next-of-Kin` is optional and will be absent from the response when the related person is not the Next-of-Kin.\n","minItems":1,"maxItems":3,"items":{"type":"object","required":["system","code"],"properties":{"system":{"type":"string","description":"URI of the coding system specification.","format":"url","default":"https://fhir.nhs.uk/R4/CodeSystem/UKCore-AdditionalRelatedPersonRole","enum":["http://hl7.org/fhir/ValueSet/relatedperson-relationshiptype","https://fhir.nhs.uk/R4/CodeSystem/UKCore-AdditionalRelatedPersonRole"]},"code":{"type":"string","description":"Symbol in syntax defined by the system.","example":"Guardian"},"display":{"type":"string","description":"Human-friendly display representation defined by the system.","example":"Guardian of patient"}}}}}}},"extension":{"type":"array","description":"Wrapper array for copy correspondence, contact rank, contact preferences and communication details; these are all FHIR extensions. Always contains zero or one of each extension type.\n","items":{"anyOf":[{"type":"object","description":"Flag indicating if this person should be copied in on any contact with the Patient. This will only be returned if the value is true and the person should be copied in on correspondence, otherwise it will be omitted. \n","properties":{"url":{"type":"string","format":"url","description":"URL to FHIR Extension Specification.","default":"https://fhir.nhs.uk/R4/StructureDefinition/Extension-UKCore-CopyCorrespondenceIndicator","enum":["https://fhir.nhs.uk/R4/StructureDefinition/Extension-UKCore-CopyCorrespondenceIndicator"]},"valueBoolean":{"type":"boolean","description":"Flag indicating if this person should be copied in on correspondence. This will only be returned if the value is `true` otherwise it will not be returned and can be assumed `false`","example":true}}},{"type":"object","description":"Rank indicating order in which contacts should be tried.","properties":{"url":{"type":"string","format":"url","description":"URL to FHIR Extension Specification.","default":"https://fhir.nhs.uk/R4/StructureDefinition/Extension-UKCore-ContactRank","enum":["https://fhir.nhs.uk/R4/StructureDefinition/Extension-UKCore-ContactRank"]},"valuePositiveInt":{"type":"integer","minimum":1,"maximum":99,"description":"Rank expressed as positive integer (1 being the highest).","example":1}}},{"type":"object","description":"Wrapper object for preferred contact details; the written communication format, preferred contact time and method. This will only be populated on a retrieval and not a search.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of the contact preference extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-ContactPreference","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-ContactPreference"]},"extension":{"description":"Wrapper array containing zero or one preferred contact method, zero or one preferred written communication format; and zero or one preferred contact time.","type":"array","maxItems":3,"items":{"oneOf":[{"type":"object","description":"Wrapper object for preferred written communication format.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredWrittenCommunicationFormat`.","default":"PreferredWrittenCommunicationFormat"},"valueCodeableConcept":{"type":"object","description":"Preferred Written Communication Format.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","format":"url","description":"Definition of the preferred written communication extension.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredWrittenCommunicationFormat","enum":["https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredWrittenCommunicationFormat"]},"code":{"type":"string","description":"A code to identify the preferred written communication format of a patient, contact or related person.\n* 11 - Large print\n* 12 - Braille\n* 13 - Audio tape\n","example":"12"},"display":{"type":"string","description":"Display-friendly representation of the preferred written communication format code.","example":"Braille"}}}}}}}},{"type":"object","description":"Wrapper object for preferred contact method.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredContactMethod`.","default":"PreferredContactMethod","enum":["PreferredContactMethod"]},"valueCodeableConcept":{"type":"object","description":"Preferred Contact Method.","required":["coding"],"properties":{"coding":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","format":"url","description":"Definition of the preferred contact method extension.","default":"https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredContactMethod","enum":["https://fhir.hl7.org.uk/CodeSystem/UKCore-PreferredContactMethod"]},"code":{"type":"string","description":"A code to identify to identify the preferred contact method of a patient, contact or related person.\n* 1\t- Letter\n* 2\t- Visit\n* 3\t- Telephone\n* 4\t- E-mail\n* 5\t- Minicom (Textphone)\n* 6\t- Telephone contact via proxy\n* 7\t- Sign language\n* 8\t- No Telephone contact\n","example":"1"},"display":{"type":"string","description":"Display-friendly representation of the preferred contact method code.","example":"Letter"}}}}}}}},{"type":"object","description":"Wrapper object for preferred contact times.","required":["url","valueString"],"properties":{"url":{"type":"string","description":"Key of this object. Always `PreferredContactTimes`.","default":"PreferredContactTimes","enum":["PreferredContactTimes"]},"valueString":{"type":"string","maximum":40,"description":"A free-text description about the preferred contact times.","example":"Not after 7pm"}}}]}}}},{"type":"object","description":"Wrapper object for communication details. This will only be populated on a retrieval and not a search.","required":["url","extension"],"properties":{"url":{"type":"string","description":"Definition of communication extension.","default":"https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSCommunication","enum":["https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSCommunication"]},"extension":{"type":"array","description":"Definition of communication extension.\n\nThe array must have one item, a valueCodeableConcept for the language and can optionally include a valueBoolean for if an interpreter is required.","minItems":1,"maxItems":2,"items":{"anyOf":[{"type":"object","description":"Wrapper object for communication language.","required":["url","valueCodeableConcept"],"properties":{"url":{"type":"string","description":"Key of this object. Always `language`.","default":"language","enum":["language"]},"valueCodeableConcept":{"type":"object","description":"Human language.","required":["coding"],"properties":{"coding":{"type":"array","description":"Exactly one language code.","minItems":1,"maxItems":1,"items":{"type":"object","required":["code"],"properties":{"system":{"type":"string","description":"URL of the Language Code System. Always uses the 'UKCore-HumanLanguage' Code System.","example":"https://fhir.hl7.org.uk/CodeSystem/UKCore-HumanLanguage"},"version":{"type":"string","description":"Version of the language code system.","example":"1.0.0"},"code":{"type":"string","description":"Language code based on [ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) standard plus extensions for braille, makaton and sign languages, which are:\n* `q1` - Braille\n* `q2` - American Sign Language\n* `q3` - Australian Sign Language\n* `q4` - British Sign Language\n* `q5` - Makaton\nAll valid codes combined can be found at https://fhir.hl7.org.uk/CodeSystem/UKCore-HumanLanguage.\n","example":"fr"},"display":{"type":"string","description":"Display-friendly representation of the language code (such as English). If there is a language code with no defined mapping, `Unknown` will be returned.","example":"French"}}}}}}}},{"type":"object","description":"Wrapper object for whether an interpreter is required.","required":["url","valueBoolean"],"properties":{"url":{"type":"string","description":"Key of this object. Always `interpreterRequired`.","default":"interpreterRequired","enum":["interpreterRequired"]},"valueBoolean":{"type":"boolean","description":"Whether an interpreter is required.","example":true}}}]}}}}]}}}}}}}}},"OperationOutcome":{"type":"object","description":"Outcome of an operation that does not result in a resource or bundle being returned, for example an error or an async/batch submission.\nThere are a number of possible error codes that can be returned along with a more detailed description in the `display` field.\n","properties":{"resourceType":{"type":"string","description":"FHIR Resource Type.","default":"OperationOutcome"},"issue":{"type":"array","description":"List of issues that have occurred.","minItems":1,"items":{"type":"object","required":["severity","code"],"properties":{"severity":{"type":"string","enum":["fatal","error","warning","information"],"description":"Severity of the error.","example":"error"},"code":{"type":"string","description":"FHIR error code.","example":"invalid","enum":["invalid","structure","required","value","invariant","security","login","unknown","expired","forbidden","suppressed","processing","not-supported","duplicate","multiple-matches","not-found","deleted","too-long","code-invalid","extension","too-costly","business-rule","conflict","transient","lock-error","no-store","exception","timeout","incomplete","throttled","informational"]},"details":{"type":"object","description":"Internal error code.","properties":{"coding":{"type":"array","items":{"type":"object","properties":{"system":{"type":"string","description":"URI of the coding system specification.","example":"https://fhir.nhs.uk/R4/CodeSystem/Spine-ErrorOrWarningCode"},"version":{"type":"string","description":"Version of the coding system in use.","example":"1"},"code":{"type":"string","description":"Symbol in syntax defined by the system.","example":"INVALID_VALUE"},"display":{"type":"string","description":"Representation defined by the system.","example":"Provided value is invalid"}}}}}},"diagnostics":{"type":"string","description":"Additional diagnostic information about the issue. This information is subject to change.","example":"Invalid value - 2019-01 in field 'birthDate'"},"expression":{"type":"string","description":"FHIRPath of element(s) related to the error.","example":"Patient.name.given"}}}}}}},"examples":{"OperationOutcome":{"summary":"OperationOutcome example","value":{"resourceType":"OperationOutcome","issue":[{"severity":"error","code":"value","details":{"coding":[{"system":"https://fhir.nhs.uk/R4/CodeSystem/Spine-ErrorOrWarningCode","version":"1","code":"INVALID_RESOURCE_ID","display":"Resource Id is invalid"}]}}]}}}}} diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 850fccc..ae360c9 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -15,12 +15,15 @@ management: fhir: server: - name: IOPS FHIR Testing + name: NHS England Interoperability Standards FHIR Testing baseUrl: https://3cdzg7kbj4.execute-api.eu-west-2.amazonaws.com/poc/Conformance - version: 6.10.4 - - + version: 6.10.5 +services: + R4: true + STU3: true + LOINC: false + R4B: false ###Remote terminology validation: diff --git a/src/main/resources/fhir.r4.nhsengland.diagnostics-0.0.0-prerelease.tgz b/src/main/resources/fhir.r4.nhsengland.diagnostics-0.0.0-prerelease.tgz new file mode 100644 index 0000000000000000000000000000000000000000..8d31ef4ecd1bb5f31599639df11df6ab8cc670b2 GIT binary patch literal 15556 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 S?0!Dm&;JMet@@1sya52L5QBmM literal 0 HcmV?d00001 diff --git a/src/main/resources/manifest.json b/src/main/resources/manifest.json index 7fdc8d1..878dde2 100644 --- a/src/main/resources/manifest.json +++ b/src/main/resources/manifest.json @@ -4,7 +4,11 @@ "version": "0.0.8-pre-release" }, { - "packageName": "uk.pathology.r4", + "packageName": "hl7.fhir.uv.ips", + "version": "1.1.0" + }, + { + "packageName": "fhir.r4.nhsengland.diagnostics", "version": "0.0.0-prerelease" } ] \ No newline at end of file diff --git a/src/main/resources/uk.pathology.r4-0.0.0-prerelease.tgz b/src/main/resources/uk.pathology.r4-0.0.0-prerelease.tgz deleted file mode 100644 index 643df92028a0600fc5c76055f9e349795f889ed6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15689 zcmV-PJ+{IhiwFP!000023hjMca@!dP*b^;Sq@NcX+r@ zsP_lGX9s_J!XH_dEyE!AFZ?wB6@MtYp<9-&8-`9~MK*Pn{K@#!7x4duBD9j#jGn%n6i!$jnx*yTVm#%3xj7RbPLftq=yFw!7xk)!;v+Jll#H+k2VZDSO)PUOVTio0ID`n2QoZ~=$MsLnf0r8gDuUb zDKw*A7JkGhK8y%|tFo#}3jEK!ljTGHzd!T;LX*kV9fj$TCD88d!Xoc}#(pgIl5moV zNmNE53H$prO!#M{1fG)1v)g=DWHv2;@JATo+EtswQ(T<)vyamU@<73-2t3<6{B@5` zCZo`!I4)nvKO^Nqi@E2Y#-qL8_i+=k-#_=pv5y~`vIN#{Z-2JC{ADJ#_#~wFQJiL> zcf%%eg8Ms3;vgKc=JrLy6t^z_u7lewnR?kYVJ9pIqma*{2~4`6?%wD9*>j9sCvAhg`}sIdm{fyR8RN>u@8zqq(YI9KG(Y1OUW6XIfo;U4-ei=kNRWYR8l^~>2hoHe0Ayh{D%z7-2f}-hvI`M?h(tuU znN0B$8XyB;pC&9pBFiXzEPNBIiWyCk4N27-as_0B7zmzw@#HZH?}u65fy`bGIt9c` znB+_y1cIAp35dD9!+?%bm_j#?cWGMP)U`Np$ENtO5;^}pgb#~wP9awu{4fYu0*e&l zD*bbhjf6^p;z%G>1LA;v%2@n{~ zs_Xo@#$8kTZAn(Yn$q9)+1t?i+u&}X^3OAtQuiKL-c1L9N zfc;_7J%^P0B4G|aCouqdj$nGurEJd49|iuUpO9?#RvT}SKBgHPuQ+VkON_qam|S&P zam2jOTI2a)IvLT&RfjCQEgcp9V)tM=EgGWIW`#Wy)*JI{*21!8O(oHdLBpjHALk3` zja5x}e;sCc!$z=J{x$IFc@SS;)h{g7tr|2{qj7$JOD4Mn5tcbrubSlU^ z2tP6ZT@rSjGMxJd@S7A($1dQ(Y7_iOM^m=q{E9wH7lckT5VOp`S|}oGt(L+}#J^SV z#NtN9B7Ox=)czAP!sqS%*aDmG>Fj2BPPc^gXXwz6_}iN=#mpAJ+2TfD5+k=R!nTP` z+r{&C;#&!wz7{smT%F7C*^3i@84H}XS;d4(xCVQ?M8U4LS{?jNKPqfCeQHN@Jw#!h z?Tf*bo4F^uR{`z)B|@=m@&&m>n-2jY0>FF$IN(-r=i~9Tpy3<9z44d<=nd8qNa1=! z*X-R01zF-wpI`p_B%V&rTMqvEG+kvNFPW-xh)hu=#yemS`CuxLWcRKOOdzHrJqW?sMD7`t!$jXF4FXqFix(MO5EupjlZSw zSC#2M($VSne*RlU+I5e9`^0~mmZ~=He^{2P?aqI{f%D&nK-|XBZv*5Cr@oDz3lDr7 zZJ)_e@0d;|T(jm!rKt92kMR1V%Gb8=(N;_*{w7}#ytMF9C2w;WLdMKsz_)Y)(MljU z=Wn|ppaJVQVLUuM4C3)UhXbP4MR6+ygDm4pKXQ9^_3q+? zxQtBV$&{;mBox7zJ`xK16sB2PT2UQ?9>#up8)mHT&FP+D^-#XvRoHFv@)7SR$D=8_ zPS+W;*||8QpRE^$oC?nlgSBu-N@o{q9`GGatneREN+#PG=U8)W-?fD4d;yBj$W%B8VP29?jPJwJTaEUHPIF4);K)s znp($sQLXumr?hsB5#6op{k-j7kVKxjS{^2w0G1T!AJjph{2Oso(< z3`j6d_)_>Rqv0qmL%Y$(I%7hjYs#mb%&yP*`}i`#ubPGM5Ka}a6gh`1W|6N%xpKvO z_;o~GhVeBN$#@+5g8p3QQRqU#4A$;(ZYeqGiKz<7K^~yL2NUOe22)CsIO(D)E|=PI zDt}dD3r7T>!UWUU3;6)J=q>og2KNJUb#lwwzZ}#sv$i=L-tF1Z#YGL-_?{qG{vI}? zi80=gM)xe;=eQ9fl1!!<-gXd^ftBVxb9|tq5EmsLO~-%_an7$YjA_a-9|j*GF5$`! zlX!YRBq^hbHx!!ABFfBQ)8OkC5__}FB6z?Lv#X#3(Cp>hrG(n@z>0~>2pk7%uh4ZM zt|lZIN5h#j8oqsu3MRjzfG7`^Ip7%3BO<#1l5!w|@(KL>wkKxv+ukAhr+6eD&rSyM z&2KXf>jS-bIKUtU)rY0R4V@Mz^*8!K^>YtyZfx23ZEwE{xn!J;LB(sq=j)?3f&oBw zOVu^uyuCJx0L6DpKoS#~z5o1mT`!B=n=RwJureJ=~_|J-T1 zk?G&V{#P}$`Rn#SG&gqk|2JU&myY#qnEoZS6|DZU(?Wy4Z1&BCb(d4$hQV4w+rU;W zctaVu4eD?dddG9IrgJSDhS^-dZuUGsXu?L}ea%O{Y`98~!UW8_kjkru=7v&=+h!5> zcMDxOzn}OoX|-c<2stm}POEoF*Ai|s2vQ5_+!S+Y7jZzr>Dyc_&e5yKvJQ}_yO%b9 zz1$dF|7-e8l8eCF;p6;FD{UImcph-kv>@Aq(AuREwh{s(#-ztJu`z+_MmBFYx9lF;vJ@30p)lpkJ7ku|9 zV$%ey%vbCq*ply}kPH3nk(@C)0@L_a45&e_k8WpI!E58xdGsc*R{Q)pGhn_~e}@?d zUw4~LXezBgxrX)7GPe#px&^%J0r+G1Gohn(F<=pl0uf%ZEDgyq^Bw86k z=4ZKe?D)Vo#Ev!qt6~Sj*fMr30=fF4JT-Paur;t_ewN$B4v&7^K-FmLz2azFU2_3{ zZPDH~y{#^GHr`~hTYDEoc>FLXcQhbxxuZCGxZhB@+Zf)83$a~1;PBVSgO=%S6Ay;| z258XQxxj+6#|JhdCqCV9_t%EA+GlTd(>eIH_q=6t+uZU=w*HQ{^_}_A;)lnS+%f76 z@i1|XtzHAdN*}t_Jx1tjZ}I%pwzPxXzR1iZn>~cP!wAm!Lj}q&$g7)4$k)aH0b`q*~{hb zZJ&7z@4&Vm9n@bg2S$BB-!vUe;xwb9dTi>#HjP6@@lKpI!g7cA5#>Qylq3w#xd?C1 zeB$Ou1)_Z(2E?O^Uh~{mhs4GhFFZ+R38ACOkVexnOF|Fh<`}^+ZNMr|3?=emVc=Z; zyd2>Q7S!V*WS9KB1xL%^H%$GQk{4H(w=Z#2jtvzA`7Huk&iMTJ2>QXsqJk1_ZrQkD?$cP0QhPK_qg8sMPBCXOgjH(U!seYxU0m?~r zae1;@cSIwM%=7^gbj1rg z;%p-fbPnhWH9zM1E({9ITes!>{Wi*c%zf@QB1GqaZV)KiU?Od?R*RZ+%e6+YxwJ=} z@4rMzfi;o~t&lQlYm`+Lu#NQsw1 z(n`(Dc2Qk6nAa$O=zLX${m(v8bmpZ`Q3!nX`roQ<%DejCUuFL*6)@9m>SJOQQNLk* z2hg(m--abO{Xe?A%m4Lt{68&)LpjUU3|}`rsz`xqXp-(ZmgHKDNr7twp63Uqr^>wT z%z8)3m!GQ7Qat@)|74v=$fQTqg{?=A_CZn%Bu=?OP@Y~(=mV4$O_qRp*t*6OJrzbg zLN3#%AMQ<)=x{m>{X@mmY~PSA$)Ua_>8|cbE_D>i@+shyt*ajOIHZ}I2SgCX>uj?E zD7m~YvT!v&0L&J!8hLT=Ld+iEdG0N5ckofg`Rd&7!)5-((JSsI5!G7Y?^z{FUYogS zw{XlfipR_!;AzG|$_>sOxTPwNt-ye_Av!6TXYbrA%+|w>HKeX>Q7y0~#n)gBb?QjA ztTV}Aj;R`sO--iP#`|!3aeKB;eu~*>?=xOHOsC8*iml6vq{(-RdZ^pAV(T;QzH={O zAm27zTXJliN5FiEss{Y#1*&X0wykM)Z60?gvTSRnO0JLY&Il|#0R$7fU5NkA!Cb&b zMwurm%rhh%K2vf{QM-!uUO4Mk$AN-fh> ze8sT$mel0_s{H>A18fVuRLZr)SG)j<^fvT{l#PA@jX5nUm!FD0O9jJX{;z4e*{uH! zzwYY)eI5QU_PgNvy^)~7`Ws9P&44V9N9iDBS-_d*FdL5!lEBjyRjsgopfl6(Yz9;h zM5Nm?(2q$?$xxW1TbdTg%t0=b`@hF5O~nal1_TaUIiAcok0mL}o$MTPp7S?!9Te-JlE@0A&(g=J3 zdxB*jVRFauEDWo;c-1UC6>*b)zQntia$z(RGLop%@R>(&Wnom*HTq|9f-;Nj$?0BH zLJT8DN{0lC{7D=})rc-S2?s^wQ9i9VZ*Tefcnkyi@GF)eM4!w;70fUl=dUvVk{QRp z20em{Vk{6%ByxFm1DyZE>FphPa{(gY^n|?ng}gnwJU)YGr#Ix?<@x*5o7?ldU-&W1 z>#KK{Cr5YZSC{1O=H2bx-e)c?FrQP>DIXmg=$aAupkBBENF&dbYz6+~1gb5|p6VHj zwwxMP{P>$!@9UplhDb`}?(CEtpWU3_-kqOzd>4Gx3~gJs69X%}VS(Q3ldd zwF1LZElu$}dqHnYw@pKKB*Rct&{UWsQR*0y>8l!LvS*vNg|Zd_v`~CtIS%tIL$XaB zSd9yMqAP>8<64@lo4%`h@)C+~_@p?&_k`Nelcy=qB7p&SA=gKjAxsJg1Dz5n^ebrM z@E@+I2>NaVov}~2_ir&h*#(Ud%>p_OM?yX2f8PTM^YUldh7Xb-gvLIL9za<=88Vo0ZFWY$%qd8fL$Re9xFq$?FmQ z7*cZbFK^js6j#@@d^B5D-US|rP9j;y-=}mmi%_b#4L3DMG*d1m!`qX(sSsmAISc_T z*gmJ1&h0jtLTyGhNu!1%=`y7fY?UT~#CA-o$xPSi>f7BD>eFqvvkKi@Oua{PMn^Te z$^V{hFgE&jwiWm&(*m%vm<+sF2SZr`TNzlG!YtPUPHZdc;%#jl8SriG33ZXjU=2xm za{X7nk5%XUn#)`pCKKgw@&(6CF0~~u4|2%0$nuip27az+or6-rbEifbs8)P`TKa%A z|LNVU^NZ6{a&~%jad&onbaRUFA0mL9e?_kPx^XsyHzV9#z&KsuiqG5gORnkMTpgWY zIZIC@+djT}e|mX$^9!2ZWehqzf3Fbj%`3iQd49~TD{g=J@UE`ACATOrc6zCsEb_D10E^qjDb1i*{VccT@R?@29B(+ zPMJNSZkaN31^&rt)5p@WHQJ2R2?pen6NWg>1C(mCxph0D55WTPw?{X>+>*1a+w1eY zqYHRf8RF*Zm!k`Ee);?wYbLX;y&lKF5)$>1rTZ4Ofx% zK=T}HiGehWm*F(o6JVK_lAA8`LD)+|Ldv|1g~vAphIGq573)~wA7_MHfPdOd`#Kw? zS^$0ldbN#Q!L8O|PNVw~jrR zKlZHlvG0B+MO$GU&N23_;}kGXk%RI*OJ*kV6R*dDG3T&BR%$CG`jPw+A-`t%kpsaR zr((rccH6;k^Zo~C_QUylo|ZblYp~ppCk|x@Kb5KaB#H;6Gf%V>eu;jp({fbVGIUc_ zW~_4@yCLU+06F)R?~R4~!$qcXA}&WLj_pW_D#`qiHosH-Dvn2tMzdQCJP$a~Fh!8@C_at&0`Jw?rHQ zKaC7|J>~f^D#}Vu*svpejYGK(Svogr*NI!Xi5Jwp!oyod)pP@`QJP{>h)qu>#q1)y z-OMuzq&&sRueFIWAsLH#JxnBImGD6a)5$2NetMwFs(hd*2MTZx$)7y>(j*>*-lK$p zRs0IrVB!aRjhL-D?Yg)tC0&EXgLRisSA(xg_`_1&ZY$cri)0~t6i3|sL%2G_sdU+} zRb7^y+NQn%zJ#$<8KSyi*u3m+URE)lW?@tsF6)hKYPzH3(U6VduYt|MJ|!@N^OG~_ zAsqS0k;(lijNK6h9z3Qbn~s4#xr%ZR!U>r)`S9kJym%Ob$Rpf0fe8VCULy}?_p)Co zSTEz_Gn!CdJdHAenk^<&{#Lqz-%x4-WnvVS;9av_1`Oxb!3DZ>1#y(Ohq`91fx2SY z8kG#q^nezqFFB46^VfaPFf>P10v|`~5rfvtQ7Xd1F!)~xx;3#+10+yvxuJx<<*7#~ zCV_xG=4Uz+K`SYF0nIq_^X=^RA@^C2-iLO1adF{C?gx2AhY=oaCoqbXS4gNIaVtn7 zDhLClQLFn7lYm z-Luhw480;Q77PFKE(J$|o)Fg&i2O1~`MEf9E)9j9z2aWwFP$%#-s#EdMSXvnn^$+PLYa@jX0_c?8&A&`thV z+)a_a;$%M0;4&ZW%I3$^MZ@2xG%qeZzc*9R9@97&1K$L75_P?Dd&Ue#Vj5Z#VWIu^R5$gXxZC$Z|at`ZY*Vnv6+W=+EQ@ zj#K{qQm_bN0*8gEwJgG-2MzSFja6Bzc;Jq28*bi$szKe!DPj$RKDs@=dWlOK6k^yq+r0P4Qwfd`v@+j!4WoL%}CwSN3mSGI^)<}BuYCgeFh>2{9 zv+u%h;KfJ?yjt$THBG>J4#8;2qD)yXO{-FKTg1srD2Lgd6>_a?-(PI6Jk-j}(f(KZJN!dPAD1j&?H3i`24c+*FG{ zhH0)M=6>Y~@`Fr}PAGIPypfYFy2g>;E;EXk_Mzdx|M<>Op>-m;pryJIGi0AY7)vSh zrs(YvMrk9~h-MVN3VBVO)VLDQAy~fRJhHOT8#x?`Q=*Lpb&hX2tl3uy%c?~!+Y@*2 zw>}_hnzh5ploi(_M>IblYK~OPR#QlOzC9Iz(Q=!$?V@D+hfm&X#KU5{@LuG{7)3pJ=1?={wBbwX_H(`B8=HIS8P(4dTIYjk&c{BFc#oqfC zcQwz%mW#0{zuqL}B1%Fpu2fV~4{P7AD$by;o1a|&azci2mQLa<*H53()y=25|9M8) zIKCgbA?Q$wM@H-;8*Nwue98TPyzSY@|6nP~?*9MRx&K+GPH~5^&z9a_B9Hzn|{~^-_a8#`N zRdU=kbTEIS5LMIhI369q|2IQ^mN{LDZl9}32{y_}P|+%RHhmFGBLYWG&X3+)UfrJG zlB?GQ{&;nIcX~_So?cv>-@Us%{4F|j5r+Upbej}&Z))!Q5|KVjBsxzIYtzSa14d;|<;YlS1g3WRMzvq&kd#G` z;)IOi2bQ#fP^_1G--9kNC;#6bpPooZn2(?NcdKN1SXch5DwvZ^`EMG#{149||3eox z?C~=aio6SB5Z;N*{(_6klI%z-aB=xiRZA}Zc}p200?l+(iv^Np$r`XlVD!Kz4asDl zX{nkQ$bs3KA>xNg|1gbGbWero9;#?F>4G#6r=P&OLoYHp0!ztz#7j_Tx8(Hl&Bf8> z3Hyhq2^VLAJ0(846 z4t{|nIf120x@{?5z!cRFlm(~nz2?30y`7#=w|sBs=+&{JYLz?Fd$YA9VwS1UKrb@C zc|As`C*AG$$?H)J;#b)xXQ)WrfIhlUj-tmbeu&_gJA)W^cMBGpS+;BFsv_CGVPJeH z{N}lVoJ)thif!1b!TvB*+pOf|R#raV+IH6c3P}nv7L{&9Kb#&gS z%?Gm_{Lys>bklM)eA~LGcr}vOh3gq${AUGJZm{H3!_evz4d|y@J3NSkA6b?cU$XdI>*FzE?(jlj71oG+TL7`BBWarOKa zg$JtZ6-|>A!yq3((My0ilbe`A z!;3ibW1ybfQ-#>?-t3ciKQD?t^FibBd;=sE*tNQ2QpvV`S<)=qpo(Vr0gry|e?6`z zz-0?v)dCLkGq?IG!|F&!uM|}}KGF0=65as~K-UyWRVhr!RH@|XFsndujKK6v&7r|M z!Sy}iE)hMo@62Pr=DrhfR4XKVpRnrVz6{^av%49J33(e9SP4j|JsDVN9U*h?O)!F-k!gHb$S!Nid^;m zKhEK~H-7iu7bV8%vki+i?)metodtC~mit{7MxTQTD*ZBLOT9@mc)oF$vu`ntCG!`ULet zUIaV>eTj&B*}Qjof$#_95UbuTUb>m~Y%}Wz({C|nK_1sh7)?fxSfE(k4j{ZP{3w4g zJEMP6=GAHH_Tf0I5`9mg&s)~o7T$eqC)I_!i>KzIBzFuNM~G$D3o6bxK2E}WAYLHO zG4+NRvH{vzf}bjh;_EzMQmo9Er%|x@VAoXVYtbmGp>b3cAl+yWRZZ3`S+2*fysBNI z5(~UdzF=eUN>fLBmxNgAoVX+EV~Wt)_<1<)H};)|W!X;iCe+N#N7*$^Vz4zv;dHz> zb!{)jWmP8B6X^42LfTp)hT%Q19WVO9d6B8hn$~nW{T%ucYYe*}uXI1PV};A+Jt01w z8+=PQ!WG3)9ZO^+Y~BT(X>(tQW?FAdjHz_BOU-IB zD@Ot@tN*8}&H7L9#M;IGeU`+;K%x|cqo?V=o@;Mf_PAdWQ#jE-AQh#x+hfdr3ISGaOVti}2Jl<4~mEi3396zw_TTAm{Lk=lM4RLP zl`ueZKIVyTH@yD4od286`@g0o8$160tm=Q;vTw-LG$qVvEa{qROOC1rl41oOb9_1Q zENidDhq;WA=ZMEMq|7q<&1GONO8A_g3}y+!1Y?E>h z6<5n@`IuX?x{H)gmhGtZY8tn1&+qvC*I^{QFDp9+OP~LqW+{ehpeG$4&S#tu8AyC| zs^`%Oh9Mp#OglLb<_BI2+P&CH^Yq*PKCwWGhUxM}qHsuj&(geSUm*es_NL?slKt(9vYbCsI9;*3c;? zTj&(ijYD1eGxv_|HG;e@G58AaXh-oZ^WXF3|9Bf(xibCLg)1_qQGU&VusupK3@}a74 z|1K!iEGjeRNEX#pNw<7iq811x+cMEDZZbocSHBAyC^l79)s#G$x>$qUmt0$>l4}~K z5->Y(JbjJ3pgqBUwNl{i2@z_SKJQ)~_qpfUD;Gnbd!Cx7Yp&q}pN0LDfI9>dWe$bK z^Nm0@{6H5+7_Ij_ak9&AbSj<(z`zP~s1GxAbw_fkqezxdRav)n)uY~`8!i3PPONyv zt0&YgU-A0I{>eJ2Uh?X~h_+i@*yQTs>di0M?yFqo>V+(;*UIb%b<11v%2s8qcDeTY z{P^cno+9Jz>B;%=(FM7_IRXXc__Sj~Zm-_moxM4_tFHPCNPXo+z01y}|K&=tiT&zg zVL?J$GpH9xJ}9J;?qit~AO55^CZ{xYuoBqn*XVje-O4pO&Mg+!f1Xv|d2@98GhlYL z_RbruV#6~WvLO6~Pfn6Wb<=xh&FOy;t|!12;Dygif zV6|c1Ips^-anv=3 zoiAwT3)=aDcD|s+zMx)O<$Afc`axboL|oOwN>f816<8G!G*t{#Qp|NuF`5h%W5I^@ zOPA5}fc5DLI$$+I+0siY6iVq66>oTwWL@83k%g_1-SXUAz3P|je7QYKDtB>=j-g=B zt3%n2YCTDfdX)iNXON&)Rk0qsfw?MeadN&(H4 z0{S)+Ai*!_yBRAJgs4R82Hgm zsc=bQ>o5%qZ}C%(S$EVw$%(jXI)>fMcznjN7KulK!rd^T5xNM!(qXuUcl>3i;fVYW z55qf+2Gf*TU{c96SRm=L9Y~JqG0D|^)0Z{hvbD8HxF_82h=kSek%SEu6ZXtyEzkXe ztl}5^fk^l{(eGD}K-mrjx2EIjLBlHsxM-j@;X!pytXm3j>8iZbiwEw)W4`3UV~4x? zdkv4#G-}(5;z*|NdVs%v0ITOv$y0n=Rb5MGj@*sE)bOmpV5-Di2c}^Kd6~*9NQYDtf>lA`r(VskCM+{}zhWP`>>u|jRSb@>K$b z<^jX2JtBX45%kJ6QThShk^{IBcmv|+O%hKhy}X9~&iWijm0iQvBq!iCYVliqgGzy~ z`nqb{Oq0L&z@leocRxcJ+@ofrZUr<5+(6QFPXwNu zHKwCc-n0I>Oz(WlCtISzdwlnDk$8&wS>B<4m{eV7qmSoww zu6eEl++MeVI9MP#%mmS4K~rits;9W$KT9&eByEqSJ{q}Gm_8ZPG~IEbeq2bmW)ywD zGCAKrJp&rW50%+!#^$qaurx#76yySC)Id|jaGZON?oinVL)ZyGfs`HYLboK-@>Pv_j><6NWal{FInI|k&OOty9U4$cF-$LM+JI+BhP^czp zf#Jf~vJbq-(j`MROpQ{@^2`MR8=7ajisIRlt+{v;LROKJIg-j0X6dpFM%04d%v4k> zfL(%phTeDxMO_~@pZZ=PE4Je@eSzD(*Rrk3p?U&+_HK7iH4NR*awOmgPB-1ox!|`R$@vR@=XwkMhc-$=joQ`)~ zZe?RobG|(;r)b&}aXCddpPI|{QbJdE@b?1x?75t6%L;x5Q)K)M&5!^yY{@WH)zg{n z+wu?K;J2(U2mf`P(KKDc=%8&nraMm8Jhl85^*Qay^f_aoJvFE6WiYSo=I;mexpO+( z3|!rEC>Y#^4G8Z5;VC}Y-+`^$J{aY??EL_oj{Elor>oQVG1#nG$UXf#oo+==XKCL; zm{^_B8P2xm+|=k~{i);6db##i<#RoOK6gInnLbb#7~O#j>L~DM7Z4w?U$-c;G)D^* z^}DxQL8aA8-<(k!iM@G!LtbFAt1)IyBljbKl1xW5A+VnXtAl^oOEOJiY~q!i@pzcT zQRtDMLqB4V;~c2~12mN!Wb^g7IOQ~1>zBFE)jOT>9` z^z->k=ygn|92W!F)iiAgWJeg)3aiG)D#~9|4-_*kFfQXd{0me{N zG6cq!V#ZHC+C5e^$e`D0HjFUW+an362b2ZEe2kS2NW#YPNBG!&-tb5|J8EywU_bRBsJ!O{GYOJX=*+Hr=n}huKwTG$^Ti(%t8gJp$6tsYDo~a zJlW$a`M%1w2es)G+C*bUoO828B(U032J(O>9mrF=U7p>Zg!f@aM|mR4(|kt2<42VY zo8+|kzL^f*DzQOXe<;J0 z81cBi4s1-rQRN#kMMn~Y_@j7HCVR{n9set?PsDIaB4N}+ocxiiCO%8OB%Fw=q_B%% zmq$b_6tZ8jR0BS}$zuXMo{O2{ck+M#59VNYNPVUr=n=P=+KcB6IRwp-iSHBHL*OGO zBbG7o(ISnP(9&>nm^`bPl2jxbsW`DJugO*MdZv?Niy=+M)O$S0P-Jl_0lXi8`$T|4 zMZ9w`Y09(EE*X=ET(wI;!IMcGrAvX`RN5{15)K%I^B+%OM})(wjf%N%SMapjN2Pk#_7!3T03$s z8}X5LrwxK`TM*pGJApJmF7m%#WZV6MkQP zQC-#8o8}u-S;)%6>RhgXq|kaHMK4nQHl7rxprMu_7HnJrZqddq9(->ZrnFH_D=rj- z(-{742&!t%pHXX_;=Z_#BpWi4!$Ec=SUPSPA6&dYy}m78fZj-9rC|O({|0DCQPKSv z#?$l>eL>?eL#*mT_f5%&PIy}0xjjFsKd%uvSkTmmdEr!ZoIM}~_EtMq#^D-m!sW(1 z#@|$4)<(+T7o874x%cCbb&lAHMqJJ<#G#fJ6~M@Yrzo9T=X_dyTLpRy8|pHF5CIw! zu)nZcJblFhzyS*-0h|$eUkJAhq7-eQ4u;V>`U#fANa$o3dTH0H`DL5JEGiUB91VX9Zm0Y4JTABrk&aWx?hW(j%^)9D1C02?`vg7^l#h?v)BVJBQm;6&_F ztos}Y7yG??!g+?b?&;1NJn3Yc$4C1cLEv{+@?$8T zlzr!{eM0|lMgMDTqu7W|6u>3=pQ@;4Q~xuJo&WdS*Z+pHi51(@)b@XfckASMfPt1Rpgxx`vE6=6wZt9vzyQk^v zX^>w)lWLLw^M!IYQ~{RS|H|C?kD~4D|8HOZx0GCJQ32|$p6Kjnt^n0GgnjGxZ6NRK z@LEOwq9zTl)7f;;ka^1+E{0rZuI(=u3$gro2&+nbUNp*_>|fYs`K-InJNh*34}IzS zES5iw4)doI-3`9n*~HH1|8DI6VqZ5m{QJp&+0vWxUs1JP{Kt17|4U9ZFZIiJ+ZXmF z?5&9T65J-jy&$VrvEKT!DF}*2b5=;po1P{_LI3%`TfX_xkNyo^Y25z+{a@eF{}-YE z|3pYmoMdnM$6!)81O|z|w~sGt{x`BW^B9OQ#&f&@fQT-Fg5OL-RAI26sKSX|fK#yI zN&&v9kT+00`4yhQQ$gnN`|tU%6D)5Xc_BJs$Uj9RPPK^+1nU814$^F@4ZLZBbmvaP zk&na40LaD?-% Date: Tue, 16 Jan 2024 07:50:05 +0000 Subject: [PATCH 21/67] temp row and column fix Support for a diagnostics demo. App deployed to AWS --- .../uk/nhs/england/fhirvalidator/provider/ValidateR4Provider.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/ValidateR4Provider.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/ValidateR4Provider.kt index 42885ed..d0b51ff 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/ValidateR4Provider.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/ValidateR4Provider.kt @@ -180,7 +180,7 @@ class ValidateR4Provider ( additionalIssues.add(it) } } - result = validator.validateWithResult(resource).toOperationOutcome() as? OperationOutcome + result = validator.validateWithResult(fhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(resource)).toOperationOutcome() as? OperationOutcome } if (result !== null) { additionalIssues.forEach{ From 2efe1db518a579587e18a62c315dd2d5297371b0 Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Wed, 17 Jan 2024 08:10:17 +0000 Subject: [PATCH 22/67] Onto server changed from warning to information --- aws-repo-notes.txt | 4 ++-- pom.xml | 2 +- .../configuration/OpenApiConfig.kt | 2 ++ .../CapabilityStatementInterceptor.kt | 10 ++++++++++ .../provider/ValidateR4Provider.kt | 6 ++++++ .../service/CapabilityStatementApplier.kt | 15 +++++++++++---- .../service/MessageDefinitionApplier.kt | 2 +- .../fhirvalidator/util/ProfileApplier.kt | 7 +++---- src/main/resources/application.yaml | 2 +- ...hsengland.diagnostics-0.0.0-prerelease.tgz | Bin 15556 -> 255334 bytes src/main/resources/manifest.json | 4 ++++ 11 files changed, 41 insertions(+), 13 deletions(-) diff --git a/aws-repo-notes.txt b/aws-repo-notes.txt index c557c90..2e942e8 100644 --- a/aws-repo-notes.txt +++ b/aws-repo-notes.txt @@ -23,9 +23,9 @@ mvn clean install docker build -t fhir-validator-r4 . docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest -docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.5 +docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.6 -docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.5 +docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.6 docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest diff --git a/pom.xml b/pom.xml index 2a57400..5df5196 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ uk.nhs.england IOPS-FHIR-Validation-Service - 6.10.5 + 6.10.6 IOPS-FHIR-Validation-Service HAPI FHIR Validator using Spring Boot diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt index 7156f9a..0c9460d 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt @@ -832,6 +832,8 @@ open class OpenApiConfig(@Qualifier("R4") val ctx : FhirContext, packages += "[https://build.fhir.org/ig/hl7-eu/laboratory/](https://build.fhir.org/ig/hl7-eu/laboratory/)" } else if (it.packageName.contains("hl7.fhir.uv.ips")) { packages += "[International Patient Summary Implementation Guide](https://build.fhir.org/ig/HL7/fhir-ips/)" + } else if (it.packageName.contains("hl7.fhir.uv.sdc")) { + packages += "[Structured Data Capture](https://build.fhir.org/ig/HL7/sdc/)" } packages += " | \n" } diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/CapabilityStatementInterceptor.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/CapabilityStatementInterceptor.kt index 055cbff..88f8ead 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/CapabilityStatementInterceptor.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/CapabilityStatementInterceptor.kt @@ -42,12 +42,22 @@ class CapabilityStatementInterceptor( manifest = objectMapper.readValue(configurationInputStream, Array::class.java) } if (manifest != null) { + manifest.forEach { val packageExtension = Extension(); packageExtension.url="FHIRPackage" packageExtension.extension.add(Extension().setUrl("name").setValue(StringType(it.packageName))) packageExtension.extension.add(Extension().setUrl("version").setValue(StringType(it.version))) apiextension.extension.add(packageExtension) + var implementationGuide = ImplementationGuide() + implementationGuide.packageId = it.packageName + implementationGuide.version = it.version + implementationGuide.status = Enumerations.PublicationStatus.UNKNOWN + implementationGuide.name = it.packageName + implementationGuide.url = "https://example.fhir.org/ImplementationGuide/"+it.packageName + "|" + it.version + implementationGuide.id = it.packageName + cs.implementationGuide.add(CanonicalType("#" + it.packageName)) + cs.contained.add(implementationGuide) } } val packageExtension = Extension(); diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/ValidateR4Provider.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/ValidateR4Provider.kt index d0b51ff..943e71d 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/ValidateR4Provider.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/ValidateR4Provider.kt @@ -119,6 +119,12 @@ class ValidateR4Provider ( issue.diagnostics.contains("https://fhir.nhs.uk/CodeSystem/NHSDataModelAndDictionary-treatment-function")) { issue.severity = OperationOutcome.IssueSeverity.INFORMATION } + // This is to downgrade onto server issues to information. + if (!issue.diagnostics.contains(".uk") && (issue.diagnostics.contains("A usable code system with URL") + || issue.diagnostics.contains("LOINC is not indexed!"))) { + // This is probably ontology server issue so degrade warning to information + issue.severity = OperationOutcome.IssueSeverity.INFORMATION + } } } } else { diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/CapabilityStatementApplier.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/CapabilityStatementApplier.kt index c5a8cb1..1296167 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/CapabilityStatementApplier.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/CapabilityStatementApplier.kt @@ -5,15 +5,17 @@ import uk.nhs.england.fhirvalidator.util.applyProfile import uk.nhs.england.fhirvalidator.util.getResourcesOfType import org.hl7.fhir.instance.model.api.IBaseResource import org.hl7.fhir.r4.model.CapabilityStatement -import org.hl7.fhir.r4.model.Resource -import org.hl7.fhir.utilities.npm.NpmPackage import org.springframework.stereotype.Service @Service class CapabilityStatementApplier( val supportChain: ValidationSupportChain ) { - private val restResources = supportChain.fetchAllConformanceResources()?.filterIsInstance(CapabilityStatement::class.java)?.filterNot { it.url == null || it.url.contains("sdc") || it.url.contains("us.core")} + private val restResources = supportChain.fetchAllConformanceResources()?.filterIsInstance(CapabilityStatement::class.java)?.filterNot { it.url == null + || it.url.contains("sdc") + || it.url.contains("ips") + || (!it.url.contains(".uk") && !it.url.contains(".wales") ) + || it.url.contains("us.core")} ?.flatMap { it.rest } ?.flatMap { it.resource } @@ -27,7 +29,12 @@ class CapabilityStatementApplier( ) { val matchingResources = getResourcesOfType(resource, restResource.type) if (restResource.hasProfile()) { - applyProfile(matchingResources, restResource.profileElement) + applyProfile(matchingResources, restResource.profile) + } + if (restResource.hasSupportedProfile()) { + restResource.supportedProfile.forEach{ + applyProfile(matchingResources, it.value) + } } } diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/MessageDefinitionApplier.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/MessageDefinitionApplier.kt index 2d644ae..393aef4 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/MessageDefinitionApplier.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/MessageDefinitionApplier.kt @@ -87,7 +87,7 @@ class MessageDefinitionApplier( matchingResources: List ) { if (focus.hasProfile()) { - applyProfile(matchingResources, focus.profileElement) + applyProfile(matchingResources, focus.profile) } } diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/util/ProfileApplier.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/util/ProfileApplier.kt index b8fe839..b62afeb 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/util/ProfileApplier.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/util/ProfileApplier.kt @@ -1,7 +1,6 @@ package uk.nhs.england.fhirvalidator.util import org.hl7.fhir.instance.model.api.IBaseResource -import org.hl7.fhir.instance.model.api.IPrimitiveType import org.hl7.fhir.r4.model.Bundle fun getResourcesOfType(resource: IBaseResource, resourceType: String?): List { @@ -19,12 +18,12 @@ fun getResourcesOfType(resource: IBaseResource, resourceType: String?): List, profile: IPrimitiveType) { +fun applyProfile(resources: List, profile: String) { resources.stream().forEach { var found = false it.meta.profile.forEach { - if (it.value.equals(profile.value)) found = true + if (it.value.equals(profile)) found = true } - if (!found) it.meta.addProfile(profile.value) + if (!found) it.meta.addProfile(profile) } } diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index ae360c9..288ba8d 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -17,7 +17,7 @@ fhir: server: name: NHS England Interoperability Standards FHIR Testing baseUrl: https://3cdzg7kbj4.execute-api.eu-west-2.amazonaws.com/poc/Conformance - version: 6.10.5 + version: 6.10.6 services: R4: true diff --git a/src/main/resources/fhir.r4.nhsengland.diagnostics-0.0.0-prerelease.tgz b/src/main/resources/fhir.r4.nhsengland.diagnostics-0.0.0-prerelease.tgz index 8d31ef4ecd1bb5f31599639df11df6ab8cc670b2..630096180f6af8c682720a40d98bb3fc9662f03d 100644 GIT binary patch literal 255334 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⪚QTh;AG5dhoZ9n8+VBw_^vtsYeDwbr#_k^Ig?Sg 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 S?0!Dm&;JMet@@1sya52L5QBmM diff --git a/src/main/resources/manifest.json b/src/main/resources/manifest.json index 878dde2..723413d 100644 --- a/src/main/resources/manifest.json +++ b/src/main/resources/manifest.json @@ -7,6 +7,10 @@ "packageName": "hl7.fhir.uv.ips", "version": "1.1.0" }, + { + "packageName": "hl7.fhir.uv.sdc", + "version": "3.0.0" + }, { "packageName": "fhir.r4.nhsengland.diagnostics", "version": "0.0.0-prerelease" From e9a28c2c0a9313c883cf32da3f9e894c6339aeb3 Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Thu, 18 Jan 2024 07:58:37 +0000 Subject: [PATCH 23/67] imposeProfile suppport and deployed to AWS --- aws-repo-notes.txt | 4 +- pom.xml | 2 +- .../configuration/OpenApiConfig.kt | 26 +- .../CapabilityStatementInterceptor.kt | 33 +- .../provider/ValidateR4Provider.kt | 15 +- .../service/CapabilityStatementApplier.kt | 20 +- .../fhirvalidator/service/VerifyOAS.kt | 2 +- ...-message-Diagnostics-laboratory-order.json | 291 ++++ ...Diagnostics-unsolicited-observations.json} | 0 ...age-Medications-dispense-notification.json | 179 +++ ...essage-Medications-prescription-order.json | 177 +++ .../Examples/Bundle-message-ORU-R01.json | 800 ---------- .../Examples/Bundle-message-Referrals.json | 1380 ----------------- .../resources/Examples/Encounter-ADTA03.json | 157 -- src/main/resources/application.yaml | 2 +- src/main/resources/manifest.json | 6 +- 16 files changed, 725 insertions(+), 2369 deletions(-) create mode 100644 src/main/resources/Examples/Bundle-message-Diagnostics-laboratory-order.json rename src/main/resources/Examples/{Bundle-message-Diagnostics.json => Bundle-message-Diagnostics-unsolicited-observations.json} (100%) create mode 100644 src/main/resources/Examples/Bundle-message-Medications-dispense-notification.json create mode 100644 src/main/resources/Examples/Bundle-message-Medications-prescription-order.json delete mode 100644 src/main/resources/Examples/Bundle-message-ORU-R01.json delete mode 100644 src/main/resources/Examples/Bundle-message-Referrals.json delete mode 100644 src/main/resources/Examples/Encounter-ADTA03.json diff --git a/aws-repo-notes.txt b/aws-repo-notes.txt index 2e942e8..ed75572 100644 --- a/aws-repo-notes.txt +++ b/aws-repo-notes.txt @@ -23,9 +23,9 @@ mvn clean install docker build -t fhir-validator-r4 . docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest -docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.6 +docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.7 -docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.6 +docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.7 docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest diff --git a/pom.xml b/pom.xml index 5df5196..9ae7aac 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ uk.nhs.england IOPS-FHIR-Validation-Service - 6.10.6 + 6.10.7 IOPS-FHIR-Validation-Service HAPI FHIR Validator using Spring Boot diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt index 0c9460d..cdde737 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt @@ -102,17 +102,17 @@ open class OpenApiConfig(@Qualifier("R4") val ctx : FhirContext, examples.put("Patient PDS", Example().value(OASExamples().loadFHIRExample("Patient-PDS.json",ctx)) ) - examples.put("Encounter converted from HL7 v2 ADT", - Example().value(OASExamples().loadFHIRExample("Encounter-ADTA03.json",ctx)) + examples.put("FHIR Message - Diagnostics Report (Unsolicited Observations)", + Example().value(OASExamples().loadFHIRExample("Bundle-message-Diagnostics-unsolicited-observations.json",ctx)) ) - examples.put("Referrals - FHIR Message example", - Example().value(OASExamples().loadFHIRExample("Bundle-message-Referrals.json",ctx)) + examples.put("FHIR Message - Diagnostics Request (Laboratory Order)", + Example().value(OASExamples().loadFHIRExample("Bundle-message-Diagnostics-laboratory-order.json",ctx)) ) - examples.put("Diagnostics - FHIR Message example", - Example().value(OASExamples().loadFHIRExample("Bundle-message-Diagnostics.json",ctx)) + examples.put("FHIR Message - Medications Request (Prescription Order)", + Example().value(OASExamples().loadFHIRExample("Bundle-message-Medications-prescription-order.json",ctx)) ) - examples.put("Diagnostics - FHIR Message transformed from HL7 v2 ORU_R01 (DHCW)", - Example().value(OASExamples().loadFHIRExample("Bundle-message-ORU-R01.json",ctx)) + examples.put("FHIR Message - Medications Event (Dispense Notification)", + Example().value(OASExamples().loadFHIRExample("Bundle-message-Medications-dispense-notification.json",ctx)) ) val validateItem = PathItem() .post( @@ -129,6 +129,14 @@ open class OpenApiConfig(@Qualifier("R4") val ctx : FhirContext, .description("The uri that identifies the profile (e.g. https://fhir.hl7.org.uk/StructureDefinition/UKCore-Patient). If no profile uri is supplied, NHS England defaults will be used.") // Removed example profile .schema(StringSchema().format("token"))) + .addParametersItem(Parameter() + .name("imposeProfile") + .`in`("query") + .required(false) + .style(Parameter.StyleEnum.SIMPLE) + .description("`true | false`. Selected true will also validate the resource against the imposeProfile listed in this servers CapabilityStatement") + // Removed example profile + .schema(StringSchema().format("token"))) .requestBody(RequestBody().content(Content() .addMediaType("application/fhir+json", MediaType() .examples(examples) @@ -834,6 +842,8 @@ open class OpenApiConfig(@Qualifier("R4") val ctx : FhirContext, packages += "[International Patient Summary Implementation Guide](https://build.fhir.org/ig/HL7/fhir-ips/)" } else if (it.packageName.contains("hl7.fhir.uv.sdc")) { packages += "[Structured Data Capture](https://build.fhir.org/ig/HL7/sdc/)" + } else if (it.packageName.contains("fhir.r4.nhsengland")) { + packages += "[NHS England Pathology Implementation Guide](https://simplifier.net/guide/nhs-england-implementation-guide-version-history)" } packages += " | \n" } diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/CapabilityStatementInterceptor.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/CapabilityStatementInterceptor.kt index 88f8ead..26f37df 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/CapabilityStatementInterceptor.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/CapabilityStatementInterceptor.kt @@ -69,7 +69,7 @@ class CapabilityStatementInterceptor( for (resourceIG in supportChain.fetchAllConformanceResources()?.filterIsInstance()!!) { - if (!resourceIG.url.contains("sdc") && !resourceIG.url.contains("us.core")) { + if (resourceIG.url.contains(".uk")) { for (restComponent in resourceIG.rest) { for (component in restComponent.resource) { @@ -80,12 +80,33 @@ class CapabilityStatementInterceptor( resourceComponent.profile = component.profile } else { // add this to CapabilityStatement to indicate profile being valiated against - cs.restFirstRep.resource.add( - CapabilityStatement.CapabilityStatementRestResourceComponent().setType(component.type) - .setProfile(component.profile) - ) + resourceComponent = CapabilityStatement.CapabilityStatementRestResourceComponent().setType(component.type) + .setProfile(component.profile) + cs.restFirstRep.resource.add(resourceComponent) + } + if (component.hasExtension()) { + component.extension.forEach{ + if (it.url.equals("http://hl7.org/fhir/StructureDefinition/structuredefinition-imposeProfile")) { + var found = false + if (resourceComponent !== null) { + if (resourceComponent.hasExtension()) { + for (extension in resourceComponent.extension) { + if (extension.url.equals("http://hl7.org/fhir/StructureDefinition/structuredefinition-imposeProfile")) { + if (extension.hasValue() && it.hasValue() && it.value is CanonicalType && extension.value is CanonicalType) { + if ((extension.value as CanonicalType).value.equals((it.value as CanonicalType).value)) { + found = true + } + } + } + } + } + if (!found) { + resourceComponent.extension.add(it) + } + } + } + } } - } } } diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/ValidateR4Provider.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/ValidateR4Provider.kt index 943e71d..a003f07 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/ValidateR4Provider.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/ValidateR4Provider.kt @@ -99,15 +99,18 @@ class ValidateR4Provider ( @Validate.Profile parameterResourceProfile: String? ): MethodOutcome { var profile = parameterResourceProfile ?: servletRequest.getParameter("profile") + var importProfileParam = parameterResourceProfile ?: servletRequest.getParameter("imposeProfile") + var importProfile = false + if (importProfileParam !== null && importProfileParam.equals("true")) importProfile = true if (profile!= null) profile = URLDecoder.decode(profile, StandardCharsets.UTF_8.name()); var operationOutcome : OperationOutcome? = null if (resource == null && theRequestDetails.resource == null) throw UnprocessableEntityException("Not resource supplied to validation") if (resource == null) { // This should cope with Parameters resources being passed in - operationOutcome = parseAndValidateResource(theRequestDetails.resource, profile) + operationOutcome = parseAndValidateResource(theRequestDetails.resource, profile, importProfile) } else { - operationOutcome = parseAndValidateResource(resource, profile) + operationOutcome = parseAndValidateResource(resource, profile, importProfile) } val methodOutcome = MethodOutcome() if (operationOutcome != null ) { @@ -151,10 +154,10 @@ class ValidateR4Provider ( */ - fun parseAndValidateResource(inputResource: IBaseResource, profile: String?): OperationOutcome { + fun parseAndValidateResource(inputResource: IBaseResource, profile: String?, importProfile: Boolean?): OperationOutcome { return try { val resources = getResourcesToValidate(inputResource) - val operationOutcomeList = resources.map { validateResource(it, profile) } + val operationOutcomeList = resources.map { validateResource(it, profile, importProfile) } val operationOutcomeIssues = operationOutcomeList.filterNotNull().flatMap { it.issue } return createOperationOutcome(operationOutcomeIssues) } catch (e: DataFormatException) { @@ -163,7 +166,7 @@ class ValidateR4Provider ( } } - fun validateResource(resource: IBaseResource, profile: String?): OperationOutcome? { + fun validateResource(resource: IBaseResource, profile: String?, importProfile: Boolean?): OperationOutcome? { var additionalIssues = ArrayList() if (resource is Resource) { if (resource.hasMeta() && resource.meta.hasProfile()) { @@ -179,7 +182,7 @@ class ValidateR4Provider ( result = validator.validateWithResult(resource, ValidationOptions().addProfile(profile)) .toOperationOutcome() as? OperationOutcome } else { - capabilityStatementApplier.applyCapabilityStatementProfiles(resource) + capabilityStatementApplier.applyCapabilityStatementProfiles(resource, importProfile) val messageDefinitionErrors = messageDefinitionApplier.applyMessageDefinition(resource) if (messageDefinitionErrors != null) { messageDefinitionErrors.issue.forEach{ diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/CapabilityStatementApplier.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/CapabilityStatementApplier.kt index 1296167..3db750d 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/CapabilityStatementApplier.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/CapabilityStatementApplier.kt @@ -4,6 +4,7 @@ import org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain import uk.nhs.england.fhirvalidator.util.applyProfile import uk.nhs.england.fhirvalidator.util.getResourcesOfType import org.hl7.fhir.instance.model.api.IBaseResource +import org.hl7.fhir.r4.model.CanonicalType import org.hl7.fhir.r4.model.CapabilityStatement import org.springframework.stereotype.Service @@ -19,22 +20,29 @@ class CapabilityStatementApplier( ?.flatMap { it.rest } ?.flatMap { it.resource } - fun applyCapabilityStatementProfiles(resource: IBaseResource) { - restResources?.forEach { applyRestResource(resource, it) } + fun applyCapabilityStatementProfiles(resource: IBaseResource, importProfile: Boolean?) { + restResources?.forEach { applyRestResource(resource, it, importProfile) } } private fun applyRestResource( resource: IBaseResource, - restResource: CapabilityStatement.CapabilityStatementRestResourceComponent + restResource: CapabilityStatement.CapabilityStatementRestResourceComponent, + importProfile: Boolean? ) { val matchingResources = getResourcesOfType(resource, restResource.type) if (restResource.hasProfile()) { applyProfile(matchingResources, restResource.profile) } - if (restResource.hasSupportedProfile()) { - restResource.supportedProfile.forEach{ - applyProfile(matchingResources, it.value) + if (importProfile !== null && importProfile && restResource.hasExtension()) { + restResource.extension.forEach{ + if (it.hasUrl() + && it.url.equals("http://hl7.org/fhir/StructureDefinition/structuredefinition-imposeProfile") + && it.hasValue() && it.value is CanonicalType) { + val canonicalType = it.value as CanonicalType + applyProfile(matchingResources, canonicalType.value) + } } + } } diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/VerifyOAS.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/VerifyOAS.kt index cb79f85..3c4e4aa 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/VerifyOAS.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/VerifyOAS.kt @@ -369,7 +369,7 @@ class VerifyOAS(@Qualifier("R4") private val ctx: FhirContext?, fun validateResource(resource: IBaseResource, profile: String?): OperationOutcome? { if (profile != null) return fhirValidator.validateWithResult(resource, ValidationOptions().addProfile(profile)).toOperationOutcome() as? OperationOutcome - capabilityStatementApplier.applyCapabilityStatementProfiles(resource) + capabilityStatementApplier.applyCapabilityStatementProfiles(resource, false) val messageDefinitionErrors = messageDefinitionApplier.applyMessageDefinition(resource) if (messageDefinitionErrors != null) { return messageDefinitionErrors diff --git a/src/main/resources/Examples/Bundle-message-Diagnostics-laboratory-order.json b/src/main/resources/Examples/Bundle-message-Diagnostics-laboratory-order.json new file mode 100644 index 0000000..c2b1e12 --- /dev/null +++ b/src/main/resources/Examples/Bundle-message-Diagnostics-laboratory-order.json @@ -0,0 +1,291 @@ +{ + "resourceType": "Bundle", + "id": "path-R4-example-bundle-LFT-UandE-request", + "meta": { + "lastUpdated": "2022-03-07T09:48:00+00:00", + "profile": [ + "https://fhir.hl7.org.uk/StructureDefinition/UKCore-Bundle" + ] + }, + "identifier": { + "system": "https://tools.ietf.org/html/rfc4122", + "value": "c2f8848f-a3f3-4018-861f-b369244ed101" + }, + "type": "message", + "entry": [ + { + "fullUrl": "urn:uuid:f18a2226-c0ab-480d-b80a-b6561fe8f9c4", + "resource": { + "resourceType": "MessageHeader", + "id": "f18a2226-c0ab-480d-b80a-b6561fe8f9c4", + "meta": { + "profile": [ + "https://fhir.hl7.org.uk/StructureDefinition/UKCore-MessageHeader" + ] + }, + "eventCoding": { + "system": "https://fhir.nhs.uk/CodeSystem/message-event", + "code": "laboratory-order" + }, + "destination": [ + { + "name": "TD008362 PATH LAB 001", + "endpoint": "TBC", + "receiver": { + "reference": "urn:uuid:8a6d85b8-9837-4fed-a257-4cf207988338" + } + } + ], + "sender": { + "reference": "urn:uuid:3c43b5b3-06d6-445f-ae9a-48d5f05df434" + }, + "source": { + "endpoint": "TBC" + }, + "focus": [ + { + "reference": "urn:uuid:1c38d507-9ad7-4b49-ba91-7da204842cac" + } + ] + } + }, + { + "fullUrl": "urn:uuid:8a6d85b8-9837-4fed-a257-4cf207988338", + "resource": { + "resourceType": "Organization", + "id": "8a6d85b8-9837-4fed-a257-4cf207988338", + "meta": { + "profile": [ + "https://fhir.hl7.org.uk/StructureDefinition/UKCore-Organization" + ] + }, + "identifier": [ + { + "system": "https://fhir.nhs.uk/Id/ods-organization-code", + "value": "Y8J7D" + } + ], + "name": "TD008362 PATH LAB 001", + "address": [ + { + "line": [ + "PATHOLOGY LAB", + "7-8 WELLINGTON PLACE" + ], + "city": "LEEDS", + "district": "WEST YORKSHIRE", + "postalCode": "LS1 4AP" + } + ] + } + }, + { + "fullUrl": "urn:uuid:3c43b5b3-06d6-445f-ae9a-48d5f05df434", + "resource": { + "resourceType": "Organization", + "id": "3c43b5b3-06d6-445f-ae9a-48d5f05df434", + "meta": { + "profile": [ + "https://fhir.hl7.org.uk/StructureDefinition/UKCore-Organization" + ] + }, + "identifier": [ + { + "system": "https://fhir.nhs.uk/Id/ods-organization-code", + "value": "B82033" + } + ], + "name": "PICKERING MEDICAL PRACTICE", + "address": [ + { + "line": [ + "SOUTHGATE" + ], + "city": "PICKERING", + "district": "NORTH YORKSHIRE", + "postalCode": "YO18 8BL" + } + ] + } + }, + { + "fullUrl": "urn:uuid:9a835acf-d715-4d84-8dcf-a8435f6417fe", + "resource": { + "resourceType": "Practitioner", + "id": "9a835acf-d715-4d84-8dcf-a8435f6417fe", + "meta": { + "profile": [ + "https://fhir.hl7.org.uk/StructureDefinition/UKCore-Practitioner" + ] + }, + "identifier": [ + { + "system": "https://fhir.nhs.uk/Id/sds-user-id", + "value": "TBC" + } + ], + "name": [ + { + "use": "official", + "family": "GASKELL", + "given": [ + "Gale" + ], + "prefix": [ + "Dr" + ] + } + ] + } + }, + { + "fullUrl": "urn:uuid:ab87a3f8-1d37-44a9-804e-5e962598a6e4", + "resource": { + "resourceType": "Patient", + "id": "ab87a3f8-1d37-44a9-804e-5e962598a6e4", + "meta": { + "profile": [ + "https://fhir.hl7.org.uk/StructureDefinition/UKCore-Patient" + ] + }, + "identifier": [ + { + "extension": [ + { + "url": "https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSNumberVerificationStatus", + "valueCodeableConcept": { + "coding": [ + { + "system": "https://fhir.hl7.org.uk/CodeSystem/UKCore-NHSNumberVerificationStatus", + "code": "number-present-and-verified", + "display": "Number present and verified" + } + ] + } + } + ], + "system": "https://fhir.nhs.uk/Id/nhs-number", + "value": "9727710638" + } + ], + "name": [ + { + "use": "official", + "family": "WELSH", + "given": [ + "Joel" + ] + } + ], + "gender": "male", + "birthDate": "1972-08-23", + "address": [ + { + "line": [ + "ACONBURY", + "LARPOOL DRIVE" + ], + "city": "WHITBY", + "postalCode": "YO22 4ND" + } + ] + } + }, + { + "fullUrl": "urn:uuid:1c38d507-9ad7-4b49-ba91-7da204842cac", + "resource": { + "resourceType": "ServiceRequest", + "id": "1c38d507-9ad7-4b49-ba91-7da204842cac", + "meta": { + "profile": [ + "https://fhir.hl7.org.uk/StructureDefinition/UKCore-ServiceRequest-Lab" + ] + }, + "identifier": [ + { + "system": "http://B82033-pickeringmedicalpractice.com/labrequest", + "value": "REQ-20220307-000046-001" + } + ], + "requisition": { + "system": "http://B82033-pickeringmedicalpractice.com/labrequest", + "value": "REQ-20220307-000046" + }, + "status": "active", + "intent": "order", + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "26958001", + "display": "Hepatic function panel" + } + ] + }, + "subject": { + "reference": "urn:uuid:ab87a3f8-1d37-44a9-804e-5e962598a6e4", + "display": "WELSH, Joel" + }, + "authoredOn": "2022-03-07T09:48:00+00:00", + "requester": { + "reference": "urn:uuid:9a835acf-d715-4d84-8dcf-a8435f6417fe", + "display": "GASKELL, Dr Gale" + }, + "performer": [ + { + "reference": "urn:uuid:8a6d85b8-9837-4fed-a257-4cf207988338", + "display": "TD008362 PATH LAB 001" + } + ] + } + }, + { + "fullUrl": "urn:uuid:8660ef6a-65ef-408f-92ce-b4d6d03d783c", + "resource": { + "resourceType": "ServiceRequest", + "id": "8660ef6a-65ef-408f-92ce-b4d6d03d783c", + "meta": { + "profile": [ + "https://fhir.hl7.org.uk/StructureDefinition/UKCore-ServiceRequest-Lab" + ] + }, + "identifier": [ + { + "system": "http://B82033-pickeringmedicalpractice.com/labrequest", + "value": "REQ-20220307-000046-002" + } + ], + "requisition": { + "system": "http://B82033-pickeringmedicalpractice.com/labrequest", + "value": "REQ-20220307-000046" + }, + "status": "active", + "intent": "order", + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "252167001", + "display": "Urea and electrolytes" + } + ] + }, + "subject": { + "reference": "urn:uuid:ab87a3f8-1d37-44a9-804e-5e962598a6e4", + "display": "WELSH, Joel" + }, + "authoredOn": "2022-03-07T09:48:00+00:00", + "requester": { + "reference": "urn:uuid:9a835acf-d715-4d84-8dcf-a8435f6417fe", + "display": "GASKELL, Gale" + }, + "performer": [ + { + "reference": "urn:uuid:8a6d85b8-9837-4fed-a257-4cf207988338", + "display": "TD008362 PATH LAB 001" + } + ] + } + } + ] +} diff --git a/src/main/resources/Examples/Bundle-message-Diagnostics.json b/src/main/resources/Examples/Bundle-message-Diagnostics-unsolicited-observations.json similarity index 100% rename from src/main/resources/Examples/Bundle-message-Diagnostics.json rename to src/main/resources/Examples/Bundle-message-Diagnostics-unsolicited-observations.json diff --git a/src/main/resources/Examples/Bundle-message-Medications-dispense-notification.json b/src/main/resources/Examples/Bundle-message-Medications-dispense-notification.json new file mode 100644 index 0000000..6df3c09 --- /dev/null +++ b/src/main/resources/Examples/Bundle-message-Medications-dispense-notification.json @@ -0,0 +1,179 @@ +{ + "resourceType": "Bundle", + "id": "830a2a41-cca8-46a3-a35c-3237cb9828e4", + "type": "message", + "timestamp": "2021-05-07T16:15:32Z", + "entry": [ + { + "fullUrl": "urn:message-header-167434", + "resource": { + "resourceType": "MessageHeader", + "id": "urn:message-header-167434", + "eventCoding": { + "system": "https://fhir.nhs.uk/CodeSystem/message-event", + "code": "dispense-notification", + "display": "Dispense Notification" + }, + "source": { + "name": "ACME Clinical Systems", + "software": "ACME Pharmacy", + "version": "4.1.15", + "endpoint": "urn:nhs-uk:addressing:ods:T48NT" + }, + "focus": [ + { + "reference": "urn:med-disp-324234234" + } + ] + } + }, + { + "fullUrl": "urn:patient-113582401", + "resource": { + "resourceType": "Patient", + "id": "urn:patient-113582401", + "identifier": [ + { + "system": "https://fhir.nhs.uk/Id/nhs-number", + "value": "113582401" + } + ], + "name": [ + { + "use": "official", + "text": "Ms Anne Teak", + "family": "Teak", + "given": [ + "Anna" + ], + "prefix": [ + "Ms" + ] + } + ], + "gender": "female", + "birthDate": "1987-03-29" + } + }, + { + "fullUrl": "urn:staff-0002", + "resource": { + "resourceType": "Practitioner", + "id": "urn:staff-0002", + "name": [ + { + "text": "Dr Allo Kate", + "family": "Kate", + "given": [ + "Allo" + ], + "prefix": [ + "Dr" + ] + } + ], + "qualification": [ + { + "code": { + "coding": [ + { + "system": "https://fhir.hl7.org.uk/Id/gpc-number", + "code": "123543", + "display": "General Pharmaceutical Council" + } + ] + } + } + ] + } + }, + { + "fullUrl": "urn:medication-39732411000001106", + "resource": { + "resourceType": "Medication", + "id": "urn:medication-39732411000001106", + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "39732411000001106", + "display": "Amoxicillin 500mg capsules" + } + ] + } + } + }, + { + "fullUrl": "urn:med-disp-324234234", + "resource": { + "resourceType": "MedicationDispense", + "id": "urn:med-disp-324234234", + "identifier": [ + { + "system": "urn:[organisation_name]:[system_name]", + "value": "urn:16099e16-2494-4a2b-b0e6-93eabd00c41b" + } + ], + "status": "in-progress", + "medicationReference": { + "reference": "urn:medication-39732411000001106", + "display": "Amoxicillin 500mg capsules" + }, + "subject": { + "reference": "urn:patient-113582401", + "display": "Ms Anne Teak" + }, + "performer": [ + { + "actor": { + "reference": "urn:staff-0002", + "display": "Dr Allo Kate" + } + } + ], + "authorizingPrescription": [ + { + "reference": "urn:med-req-1023938" + } + ], + "quantity": { + "value": 21, + "unit": "tablet", + "system": "http://snomed.info/sct", + "code": "428673006" + }, + "whenPrepared": "2021-05-07T16:15:32Z", + "dosageInstruction": [ + { + "timing": { + "repeat": { + "frequency": 3, + "period": 1, + "periodUnit": "d" + } + }, + "route": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "428673006", + "display": "oral" + } + ] + }, + "doseAndRate": [ + { + "doseQuantity": { + "value": 1, + "unit": "tablet", + "system": "http://snomed.info/sct", + "code": "428673006" + } + } + ] + } + ] + } + } + ] +} diff --git a/src/main/resources/Examples/Bundle-message-Medications-prescription-order.json b/src/main/resources/Examples/Bundle-message-Medications-prescription-order.json new file mode 100644 index 0000000..92faf2d --- /dev/null +++ b/src/main/resources/Examples/Bundle-message-Medications-prescription-order.json @@ -0,0 +1,177 @@ +{ + "resourceType": "Bundle", + "id": "d0a503d2-6809-4055-be82-308183e64734", + "type": "message", + "timestamp": "2021-05-07T16:15:32Z", + "entry": [ + { + "fullUrl": "urn:message-header-167434", + "resource": { + "resourceType": "MessageHeader", + "id": "urn:message-header-167434", + "eventCoding": { + "system": "https://fhir.nhs.uk/CodeSystem/message-event", + "code": "prescription-order", + "display": "Prescription Order" + }, + "source": { + "name": "ACME Clinical Systems", + "software": "ACME ePMA", + "version": "3.5.68", + "endpoint": "urn:nhs-uk:addressing:ods:T48NT" + }, + "focus": [ + { + "reference": "urn:med-req-1023938" + } + ] + } + }, + { + "fullUrl": "urn:patient-011223344", + "resource": { + "resourceType": "Patient", + "id": "urn:patient-011223344", + "identifier": [ + { + "system": "https://fhir.nhs.uk/Id/nhs-number", + "value": "2377954310" + } + ], + "name": [ + { + "use": "official", + "text": "Mrs Anne Teak", + "family": "Teak", + "given": [ + "Anne" + ], + "prefix": [ + "Mrs" + ] + } + ], + "gender": "female", + "birthDate": "1956-02-04" + } + }, + { + "fullUrl": "urn:staff-1112", + "resource": { + "resourceType": "Practitioner", + "id": "urn:staff-1112", + "name": [ + { + "text": "Dr Maikeu Well", + "family": "Well", + "given": [ + "Maikeu" + ], + "prefix": [ + "Dr" + ] + } + ], + "qualification": [ + { + "code": { + "coding": [ + { + "system": "https://fhir.hl7.org.uk/Id/gmc-number", + "code": "2145879", + "display": "General Medical Council" + } + ] + } + } + ] + } + }, + { + "fullUrl": "urn:medication-38769117", + "resource": { + "resourceType": "Medication", + "id": "urn:medication-38769117", + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "27658006", + "display": "Amoxicillin" + } + ] + } + } + }, + { + "fullUrl": "urn:med-req-1023938", + "resource": { + "resourceType": "MedicationRequest", + "id": "urn:med-req-1023938", + "status": "active", + "intent": "order", + "category": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/medicationrequest-category", + "code": "inpatient", + "display": "inpatient" + } + ] + } + ], + "priority": "routine", + "medicationReference": { + "reference": "urn:medication-38769117" + }, + "subject": { + "reference": "urn:patient-011223344", + "display": "Mrs Anne Teak" + }, + "authoredOn": "2020-05-15T15:00:00Z", + "requester": { + "reference": "urn:staff-1112", + "display": "Dr Maikeu Well" + }, + "recorder": { + "reference": "urn:staff-1112", + "display": "Dr Maikeu Well" + }, + "dosageInstruction": [ + { + "timing": { + "repeat": { + "frequency": 3, + "period": 1, + "periodUnit": "d" + } + }, + "route": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "26643006", + "display": "Oral" + } + ] + }, + "doseAndRate": [ + { + "doseQuantity": { + "value": 500, + "unit": "milligram", + "system": "http://unitsofmeasure.org", + "code": "mg" + } + } + ] + } + ], + "substitution": { + "allowedBoolean": false + } + } + } + ] +} diff --git a/src/main/resources/Examples/Bundle-message-ORU-R01.json b/src/main/resources/Examples/Bundle-message-ORU-R01.json deleted file mode 100644 index 99a7583..0000000 --- a/src/main/resources/Examples/Bundle-message-ORU-R01.json +++ /dev/null @@ -1,800 +0,0 @@ -{ - "resourceType": "Bundle", - "identifier": { - "system": "https://tools.ietf.org/html/rfc4122", - "value": "889fb12f-1318-4816-bf42-2a80e706743c" - }, - "type": "message", - "entry": [ - { - "fullUrl": "urn:uuid:f18a2226-c0ab-480d-b80a-b6561fe8f9c4", - "resource": { - "resourceType": "MessageHeader", - "id": "f18a2226-c0ab-480d-b80a-b6561fe8f9c4", - "eventCoding": { - "system": "https://fhir.nhs.uk/CodeSystem/message-event", - "code": "unsolicited-observations" - }, - "destination": [ - { - "name": "PICKERING MEDICAL PRACTICE", - "endpoint": "TBC" - } - ], - "source": { - "endpoint": "TBC" - }, - "focus": [ - { - "reference": "urn:uuid:f8684a34-e056-4576-8f23-cd8e433c7183" - }, - { - "reference": "urn:uuid:a82cf83a-8c6a-4cd9-933e-9434b3a296a2" - } - ] - } - }, - { - "fullUrl": "urn:uuid:a26cc7ff-c97b-4c7e-a2d1-b906fa704588", - "resource": { - "resourceType": "Patient", - "identifier": [ - { - "system": "https://cardiff.nhs.uk/Id/mrn", - "value": "403281375" - }, - { - "system": "https://fhir.nhs.uk/Id/nhs-number", - "value": "5189214567" - } - ], - "name": [ - { - "family": "Bloggs", - "given": [ - "Joe" - ], - "prefix": [ - "Mr" - ] - } - ], - "birthDate": "2001-03-28", - "address": [ - { - "city": "Baglan", - "district": "Neath port talbot", - "postalCode": "SA12 7BR" - } - ] - } - }, - { - "fullUrl": "urn:uuid:5e66d610-f72a-472c-b459-e04eb3e043a4", - "resource": { - "resourceType": "Encounter", - "identifier": [ - { - "value": "914694928301" - } - ], - "status": "in-progress", - "class": { - "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode", - "code": "AMB", - "display": "ambulatory" - }, - "subject": { - "identifier": { - "system": "https://fhir.nhs.uk/Id/nhs-number", - "value": "5189214567" - } - } - } - }, - { - "fullUrl": "urn:uuid:46422a30-7431-43e8-8d87-21cd8606d478", - "resource": { - "resourceType": "ServiceRequest", - "identifier": [ - { - "type": { - "coding": [ - { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "FILL" - } - ] - }, - "value": "914694928301" - } - ], - "status": "active", - "intent": "order", - "priority": "stat", - "code": { - "coding": [ - { - "code": "B3051", - "display": "HbA1c (IFCC traceable)" - } - ] - }, - "orderDetail": [ - { - "coding": [ - { - "code": "B3051", - "display": "HbA1c (IFCC traceable)" - } - ] - }, - { - "coding": [ - { - "code": "B0001", - "display": "Full blood count" - } - ] - } - ], - "subject": { - "reference": "urn:uuid:a26cc7ff-c97b-4c7e-a2d1-b906fa704588" - }, - "occurrencePeriod": { - "start": "2018-03-09T14:00:00+00:00", - "end": "2018-03-09T15:00:00+00:00" - }, - "requester": { - "display": "Dr Andar Gunneberg" - } - } - }, - { - "fullUrl": "urn:uuid:f8684a34-e056-4576-8f23-cd8e433c7183", - "resource": { - "resourceType": "DiagnosticReport", - "extension": [ - { - "url": "http://hl7.org/fhir/5.0/StructureDefinition/extension-DiagnosticReport.note", - "valueAnnotation": { - "text": "For monitoring known diabetic patients, please follow NICE guidelines. If not a known diabetic and the patient is asymptomatic, a second confirmatory sample is required within 2 weeks (WEDS Guidance). HbA1c is unreliable for diagnostic and monitoring purposes in the context of several conditions, including some haemoglobinopathies, abnormal haemoglobin levels, chronic renal failure, recent transfusion, pregnancy, or alcoholism./r" - } - } - ], - "identifier": [ - { - "value": "914694928301-1" - } - ], - "basedOn": [ - { - "reference": "urn:uuid:46422a30-7431-43e8-8d87-21cd8606d478", - "type": "ServiceRequest", - "identifier": { - "type": { - "coding": [ - { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "FILL" - } - ] - }, - "value": "914694928301" - } - } - ], - "status": "final", - "category": [ - { - "coding": [ - { - "system": "http://terminology.hl7.org/CodeSystem/v2-0074", - "code": "LAB" - } - ] - } - ], - "code": { - "coding": [ - { - "code": "B3051", - "display": "HbA1c (IFCC traceable)" - } - ] - }, - "subject": { - "reference": "urn:uuid:a26cc7ff-c97b-4c7e-a2d1-b906fa704588" - }, - "encounter": { - "reference": "urn:uuid:5e66d610-f72a-472c-b459-e04eb3e043a4" - }, - "effectiveDateTime": "2018-03-09T15:00:00+00:00", - "performer": [ - { - "display": "ABM: Angharad Shore" - } - ], - "result": [ - { - "reference": "urn:uuid:9bf0cef4-90f9-474d-8d9a-1b24021ff58c" - } - ] - } - }, - { - "fullUrl": "urn:uuid:9bf0cef4-90f9-474d-8d9a-1b24021ff58c", - "resource": { - "resourceType": "Observation", - "identifier": [ - { - "value": "914694928301-1-1" - } - ], - "status": "final", - "category": [ - { - "coding": [ - { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - } - ] - } - ], - "code": { - "coding": [ - { - "code": "B3553", - "display": "HbA1c (IFCC traceable)" - } - ] - }, - "subject": { - "reference": "urn:uuid:a26cc7ff-c97b-4c7e-a2d1-b906fa704588" - }, - "encounter": { - "reference": "urn:uuid:5e66d610-f72a-472c-b459-e04eb3e043a4" - }, - "effectiveDateTime": "2018-03-09T15:00:00+00:00", - "valueQuantity": { - "value": 49, - "unit": "mmol/mol" - }, - "interpretation": [ - { - "coding": [ - { - "system": "http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation", - "code": "H", - "display": "High" - } - ] - } - ], - "referenceRange": [ - { - "text": "<48" - } - ] - } - }, - { - "fullUrl": "urn:uuid:ea538cd0-3dc9-4979-927f-d92e6c758492", - "resource": { - "resourceType": "Specimen", - "accessionIdentifier": { - "value": "9146949283" - }, - "type": { - "coding": [ - { - "code": "BLOO", - "display": "Blood" - } - ] - }, - "subject": { - "reference": "urn:uuid:a26cc7ff-c97b-4c7e-a2d1-b906fa704588" - }, - "collection": { - "collectedDateTime": "2018-03-09T14:00:00+00:00" - } - } - }, - { - "fullUrl": "urn:uuid:a82cf83a-8c6a-4cd9-933e-9434b3a296a2", - "resource": { - "resourceType": "DiagnosticReport", - "identifier": [ - { - "value": "914694928301-2" - } - ], - "basedOn": [ - { - "reference": "urn:uuid:46422a30-7431-43e8-8d87-21cd8606d478", - "type": "ServiceRequest", - "identifier": { - "type": { - "coding": [ - { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "FILL" - } - ] - }, - "value": "914694928301" - } - } - ], - "status": "final", - "category": [ - { - "coding": [ - { - "system": "http://terminology.hl7.org/CodeSystem/v2-0074", - "code": "LAB" - } - ] - } - ], - "code": { - "coding": [ - { - "code": "B0001", - "display": "Full blood count" - } - ] - }, - "subject": { - "reference": "urn:uuid:a26cc7ff-c97b-4c7e-a2d1-b906fa704588" - }, - "encounter": { - "reference": "urn:uuid:5e66d610-f72a-472c-b459-e04eb3e043a4" - }, - "effectiveDateTime": "2018-03-09T15:00:00+00:00", - "performer": [ - { - "display": "ABM: Carl Owen" - } - ], - "specimen": [ - { - "reference": "urn:uuid:ea538cd0-3dc9-4979-927f-d92e6c758492" - } - ], - "result": [ - { - "reference": "urn:uuid:acd3687b-3419-488d-af10-acd4a65adee1" - }, - { - "reference": "urn:uuid:199eb5d1-0ef1-45d3-8603-e386e0eadf1f" - }, - { - "reference": "urn:uuid:142454e9-d444-4610-9588-10f1c0ac0181" - }, - { - "reference": "urn:uuid:013ededa-e403-4799-b944-be0131d30a7d" - }, - { - "reference": "urn:uuid:9f095865-a743-4a64-b9c8-84f335a2912f" - }, - { - "reference": "urn:uuid:f16ba7d2-93ec-4c2f-abca-75ed4ca59df5" - }, - { - "reference": "urn:uuid:609fe923-e837-4799-8d44-1371ed2de9cc" - } - ] - } - }, - { - "fullUrl": "urn:uuid:acd3687b-3419-488d-af10-acd4a65adee1", - "resource": { - "resourceType": "Observation", - "identifier": [ - { - "value": "914694928301-2-1" - } - ], - "status": "final", - "category": [ - { - "coding": [ - { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - } - ] - } - ], - "code": { - "coding": [ - { - "code": "B0300", - "display": "White blood cell (WBC) count" - } - ] - }, - "subject": { - "reference": "urn:uuid:a26cc7ff-c97b-4c7e-a2d1-b906fa704588" - }, - "encounter": { - "reference": "urn:uuid:5e66d610-f72a-472c-b459-e04eb3e043a4" - }, - "effectiveDateTime": "2018-03-09T15:00:00+00:00", - "valueQuantity": { - "value": 3.5, - "unit": "x10^9/L" - }, - "interpretation": [ - { - "coding": [ - { - "system": "http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation", - "code": "L", - "display": "Low" - } - ] - } - ], - "referenceRange": [ - { - "text": "4.0-11.0" - } - ] - } - }, - { - "fullUrl": "urn:uuid:199eb5d1-0ef1-45d3-8603-e386e0eadf1f", - "resource": { - "resourceType": "Observation", - "identifier": [ - { - "value": "914694928301-2-2" - } - ], - "status": "final", - "category": [ - { - "coding": [ - { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - } - ] - } - ], - "code": { - "coding": [ - { - "code": "B0307", - "display": "Haemoglobin (Hb)" - } - ] - }, - "subject": { - "reference": "urn:uuid:a26cc7ff-c97b-4c7e-a2d1-b906fa704588" - }, - "encounter": { - "reference": "urn:uuid:5e66d610-f72a-472c-b459-e04eb3e043a4" - }, - "effectiveDateTime": "2018-03-09T15:00:00+00:00", - "valueQuantity": { - "value": 200, - "unit": "g/L" - }, - "interpretation": [ - { - "coding": [ - { - "system": "http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation", - "code": "H", - "display": "High" - } - ] - } - ], - "referenceRange": [ - { - "text": "130-180" - } - ] - } - }, - { - "fullUrl": "urn:uuid:142454e9-d444-4610-9588-10f1c0ac0181", - "resource": { - "resourceType": "Observation", - "identifier": [ - { - "value": "914694928301-2-3" - } - ], - "status": "final", - "category": [ - { - "coding": [ - { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - } - ] - } - ], - "code": { - "coding": [ - { - "code": "B0314", - "display": "Platelet (PLT) count" - } - ] - }, - "subject": { - "reference": "urn:uuid:a26cc7ff-c97b-4c7e-a2d1-b906fa704588" - }, - "encounter": { - "reference": "urn:uuid:5e66d610-f72a-472c-b459-e04eb3e043a4" - }, - "effectiveDateTime": "2018-03-09T15:00:00+00:00", - "valueQuantity": { - "value": 500, - "unit": "x10^9/L" - }, - "interpretation": [ - { - "coding": [ - { - "system": "http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation", - "code": "H", - "display": "High" - } - ] - } - ], - "referenceRange": [ - { - "text": "150-400" - } - ] - } - }, - { - "fullUrl": "urn:uuid:013ededa-e403-4799-b944-be0131d30a7d", - "resource": { - "resourceType": "Observation", - "identifier": [ - { - "value": "914694928301-2-4" - } - ], - "status": "final", - "category": [ - { - "coding": [ - { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - } - ] - } - ], - "code": { - "coding": [ - { - "code": "B0306", - "display": "Red blood cell (RBC) count" - } - ] - }, - "subject": { - "reference": "urn:uuid:a26cc7ff-c97b-4c7e-a2d1-b906fa704588" - }, - "encounter": { - "reference": "urn:uuid:5e66d610-f72a-472c-b459-e04eb3e043a4" - }, - "effectiveDateTime": "2018-03-09T15:00:00+00:00", - "valueQuantity": { - "value": 6, - "unit": "x10^12/L" - }, - "interpretation": [ - { - "coding": [ - { - "system": "http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation", - "code": "N", - "display": "Normal" - } - ] - } - ], - "referenceRange": [ - { - "text": "4.50-6.00" - } - ] - } - }, - { - "fullUrl": "urn:uuid:9f095865-a743-4a64-b9c8-84f335a2912f", - "resource": { - "resourceType": "Observation", - "identifier": [ - { - "value": "914694928301-2-5" - } - ], - "status": "final", - "category": [ - { - "coding": [ - { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - } - ] - } - ], - "code": { - "coding": [ - { - "code": "B0308", - "display": "Haematocrit (Hct)" - } - ] - }, - "subject": { - "reference": "urn:uuid:a26cc7ff-c97b-4c7e-a2d1-b906fa704588" - }, - "encounter": { - "reference": "urn:uuid:5e66d610-f72a-472c-b459-e04eb3e043a4" - }, - "effectiveDateTime": "2018-03-09T15:00:00+00:00", - "valueQuantity": { - "value": 0.6, - "unit": "L/L" - }, - "interpretation": [ - { - "coding": [ - { - "system": "http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation", - "code": "H", - "display": "High" - } - ] - } - ], - "referenceRange": [ - { - "text": "0.40-0.52" - } - ] - } - }, - { - "fullUrl": "urn:uuid:f16ba7d2-93ec-4c2f-abca-75ed4ca59df5", - "resource": { - "resourceType": "Observation", - "identifier": [ - { - "value": "914694928301-2-6" - } - ], - "status": "final", - "category": [ - { - "coding": [ - { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - } - ] - } - ], - "code": { - "coding": [ - { - "code": "B0309", - "display": "Mean cell volume (MCV)" - } - ] - }, - "subject": { - "reference": "urn:uuid:a26cc7ff-c97b-4c7e-a2d1-b906fa704588" - }, - "encounter": { - "reference": "urn:uuid:5e66d610-f72a-472c-b459-e04eb3e043a4" - }, - "effectiveDateTime": "2018-03-09T15:00:00+00:00", - "valueQuantity": { - "value": 120, - "unit": "fL" - }, - "interpretation": [ - { - "coding": [ - { - "system": "http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation", - "code": "H", - "display": "High" - } - ] - } - ], - "referenceRange": [ - { - "text": "80-100" - } - ] - } - }, - { - "fullUrl": "urn:uuid:609fe923-e837-4799-8d44-1371ed2de9cc", - "resource": { - "resourceType": "Observation", - "identifier": [ - { - "value": "914694928301-2-7" - } - ], - "status": "final", - "category": [ - { - "coding": [ - { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - } - ] - } - ], - "code": { - "coding": [ - { - "code": "B0310", - "display": "Mean cell haemoglobin (MCH)" - } - ] - }, - "subject": { - "reference": "urn:uuid:a26cc7ff-c97b-4c7e-a2d1-b906fa704588" - }, - "encounter": { - "reference": "urn:uuid:5e66d610-f72a-472c-b459-e04eb3e043a4" - }, - "effectiveDateTime": "2018-03-09T15:00:00+00:00", - "valueQuantity": { - "value": 34, - "unit": "pg" - }, - "interpretation": [ - { - "coding": [ - { - "system": "http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation", - "code": "H", - "display": "High" - } - ] - } - ], - "referenceRange": [ - { - "text": "27.0-33.0" - } - ] - } - } - ] -} diff --git a/src/main/resources/Examples/Bundle-message-Referrals.json b/src/main/resources/Examples/Bundle-message-Referrals.json deleted file mode 100644 index 26e1d82..0000000 --- a/src/main/resources/Examples/Bundle-message-Referrals.json +++ /dev/null @@ -1,1380 +0,0 @@ -{ - "resourceType": "Bundle", - "id": "79120f41-a431-4f08-bcc5-1e67006fcae0", - "meta": { - "versionId": "1.0.0-alpha", - "lastUpdated": "2021-10-11T15:23:30+00:00", - "profile": [ - "https://fhir.nhs.uk/StructureDefinition/BARSBundleMessage" - ] - }, - "type": "message", - "timestamp": "2021-10-11T12:15:10+00:00", - "entry": [ - { - "fullUrl": "urn:uuid:c89a8895-56fe-41de-b20b-fab6efa99c99", - "resource": { - "resourceType": "MessageHeader", - "meta": { - "lastUpdated": "2021-10-11T15:23:30+00:00", - "profile": [ - "https://fhir.nhs.uk/StructureDefinition/BARSMessageHeader-servicerequest-request" - ] - }, - "extension": [ - { - "url": "https://fhir.nhs.uk/StructureDefinition/CDSSExtension", - "extension": [ - { - "url": "RequesterCDSSsoftware", - "valueString": "Pathways" - }, - { - "url": "RequesterCDSSversion", - "valueString": "30.2.0" - } - ] - } - ], - "eventCoding": { - "system": "https://fhir.nhs.uk/CodeSystem/message-events-bars", - "code": "servicerequest-request" - }, - "destination": [ - { - "endpoint": "http://fhir.nhs.uk/Id/dos-service-id|111111111", - "receiver": { - "reference": "urn:uuid:d5ffd0cd-ec7e-48a1-84f1-91f4c0eb8fc5" - } - } - ], - "sender": { - "reference": "urn:uuid:07939a0c-2854-46ff-9282-ad906bc93679" - }, - "source": { - "name": "Emergency service", - "software": "Anon Patient Manager", - "version": "2.1.45", - "contact": { - "system": "phone", - "value": "+44 (0113) 123 4567" - }, - "endpoint": "http://fhir.nhs.uk/Id/dos-service-id|2222222222" - }, - "reason": { - "coding": [ - { - "system": "https://fhir.nhs.uk/CodeSystem/message-reason-bars", - "code": "new" - } - ] - }, - "focus": [ - { - "reference": "urn:uuid:236bb75d-90ef-461f-b71e-fde7f899802c" - } - ], - "definition": "https://fhir.nhs.uk/MessageDefinition/bars-message-servicerequest-request-referral" - } - }, - { - "fullUrl": "urn:uuid:8c63d621-4d86-4f57-8699-e8e22d49935d", - "resource": { - "resourceType": "Encounter", - "meta": { - "lastUpdated": "2021-10-11T15:23:30+00:00", - "profile": [ - "https://fhir.hl7.org.uk/StructureDefinition/UKCore-Encounter" - ] - }, - "identifier": [ - { - "system": "https://sender.url/Id/case-number", - "value": "sender1234" - } - ], - "status": "finished", - "class": { - "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode", - "code": "EMER", - "display": "emergency" - }, - "subject": { - "reference": "urn:uuid:9589fb37-87a2-48d8-968f-b371429208a8" - }, - "episodeOfCare": [ - { - "reference": "d877b820-e72b-44d1-a627-195f54bfc606" - } - ], - "period": { - "start": "2021-02-19T07:15:00+10:00" - } - } - }, - { - "fullUrl": "urn:uuid:38e9c018-adbb-4579-9cd8-45f4f890b93b", - "resource": { - "resourceType": "CarePlan", - "meta": { - "lastUpdated": "2021-11-26T15:15:15+00:00", - "profile": [ - "https://fhir.hl7.org.uk/StructureDefinition/UKCore-CarePlan" - ] - }, - "status": "completed", - "intent": "plan", - "subject": { - "reference": "urn:uuid:9589fb37-87a2-48d8-968f-b371429208a8" - }, - "encounter": { - "reference": "urn:uuid:8c63d621-4d86-4f57-8699-e8e22d49935d" - }, - "supportingInfo": [ - { - "reference": "urn:uuid:e53b2595-7875-4687-80e9-23a0c8cb8ea0", - "display": "Person expectations and wishes" - }, - { - "reference": "urn:uuid:ea37a499-245c-40e9-b0fa-df4383c4d413", - "display": "Safeguarding Concerns Flag" - }, - { - "reference": "urn:uuid:75f0e2c7-79db-4518-8a03-edcf096fccbb", - "display": "Additional Information Sources" - } - ], - "activity": [ - { - "outcomeCodeableConcept": [ - { - "coding": [ - { - "system": "https://fhir.nhs.uk/CodeSystem/pathways-sd-codes", - "code": "4389", - "display": "ED post tonsillectomy bleeding" - } - ], - "text": "Pathways Assessment SD Code" - }, - { - "coding": [ - { - "system": "https://fhir.nhs.uk/CodeSystem/pathways-dx-codes", - "code": "DX02", - "display": "The individual needs to attend an emergency treatment centre within 1 hour." - } - ], - "text": "Pathways Assessment DX Code" - }, - { - "coding": [ - { - "system": "https://fhir.nhs.uk/CodeSystem/pathways-pathway-codes", - "code": "PA21", - "display": "Chest and Upper Back Pain" - } - ], - "text": "Presenting Complaint - selected Pathway or Template" - }, - { - "coding": [ - { - "system": "https://fhir.nhs.uk/CodeSystem/pathways-sg-codes", - "code": "1010", - "display": "Allergic Reaction" - } - ], - "text": "Pathways Assessment SG Code - Chief Complaint" - }, - { - "text": "PATHWAYS ASSESSMENT:/n An injury or health problem was the reason for the contact./n Heavy bleeding had not occurred in the previous 2 hours./n An illness or health problem was the main problem. - bleeding for 15 minutes/n The individual was not fighting for breath./n The main reason for the assessment was not an allergic reaction, heart attack, chest/upper back pain, probable/n stroke, recent fit/seizure or suicide attempt./n The main reason for contact was not new confusion, declared diabetic hypo/hyperglycaemia, or ICD shock./n The skin on the torso felt normal, warm or hot./n Pathway Selected: PW818, Nosebleeds without Injury/n The individual was not feeling faint or dizzy./n The nose was continuing to bleed./n There was no nasal foreign body./n Constant pressure for at least 10 minutes had not been applied./n There was no spontaneous bruising, abnormal bleeding or frequent nosebleeds within the previous 2 weeks./n The individual did not use anticoagulant medication or have a bleeding/clotting disorder." - } - ] - } - ] - } - }, - { - "fullUrl": "urn:uuid:236bb75d-90ef-461f-b71e-fde7f899802c", - "resource": { - "resourceType": "ServiceRequest", - "meta": { - "lastUpdated": "2021-10-11T15:23:30+00:00", - "profile": [ - "https://fhir.nhs.uk/StructureDefinition/BARSServiceRequest-request-referral" - ] - }, - "basedOn": [ - { - "reference": "urn:uuid:38e9c018-adbb-4579-9cd8-45f4f890b93b" - } - ], - "status": "active", - "intent": "plan", - "category": [ - { - "coding": [ - { - "system": "https://fhir.nhs.uk/CodeSystem/message-category-servicerequest", - "code": "referral", - "display": "Transfer of Care" - } - ] - } - ], - "subject": { - "reference": "urn:uuid:9589fb37-87a2-48d8-968f-b371429208a8" - }, - "encounter": { - "reference": "urn:uuid:8c63d621-4d86-4f57-8699-e8e22d49935d" - }, - "occurrencePeriod": { - "start": "2021-10-13T16:20:27+07:00" - }, - "authoredOn": "2021-10-11T15:23:30+00:00", - "requester": { - "reference": "urn:uuid:7d948662-bade-450e-b6c5-9bb6ee39cb56" - }, - "performer": [ - { - "reference": "urn:uuid:d5ffd0cd-ec7e-48a1-84f1-91f4c0eb8fc5" - } - ], - "supportingInfo": [ - { - "reference": "urn:uuid:65508934-c9e6-46d2-a393-af096b502daf", - "display": "Rejected Services - Patient Choice in Service Selection - Details" - }, - { - "reference": "urn:uuid:41e591ab-d333-4fb8-87b4-d35f740b6bfc", - "display": "Rejected Services - Patient Choice in Service Selection - Flag" - } - ], - "patientInstruction": "ADVICE GIVEN: If there are any new symptoms, or if the condition gets worse, changes or you have any other concerns, call us back." - } - }, - { - "fullUrl": "urn:uuid:49073ea7-2d55-433f-9bce-9d3e798cfe40", - "resource": { - "resourceType": "HealthcareService", - "meta": { - "lastUpdated": "2021-11-26T15:00:00+00:00", - "profile": [ - "http://hl7.org/fhir/StructureDefinition/HealthcareService", - "https://fhir.hl7.org.uk/StructureDefinition/UKCore-HealthcareService" - ] - }, - "identifier": [ - { - "system": "http://fhir.nhs.uk/Id/dos-service-id", - "value": "111111111" - } - ], - "active": true, - "providedBy": { - "reference": "urn:uuid:d5ffd0cd-ec7e-48a1-84f1-91f4c0eb8fc5" - }, - "name": "Emergency Department - Adult" - } - }, - { - "fullUrl": "urn:uuid:9589fb37-87a2-48d8-968f-b371429208a8", - "resource": { - "resourceType": "Patient", - "meta": { - "lastUpdated": "2021-11-26T15:00:00+00:00", - "profile": [ - "https://fhir.hl7.org.uk/StructureDefinition/UKCore-Patient" - ] - }, - "extension": [ - { - "url": "https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-EthnicCategory", - "valueCodeableConcept": { - "coding": [ - { - "system": "https://fhir.hl7.org.uk/CodeSystem/UKCore-EthnicCategory", - "code": "A", - "display": "British, Mixed British" - } - ] - } - }, - { - "url": "http://hl7.org/fhir/StructureDefinition/patient-religion", - "valueCodeableConcept": { - "coding": [ - { - "system": "http://terminology.hl7.org/CodeSystem/v3-ReligiousAffiliation", - "code": "1041", - "display": "Roman Catholic Church" - } - ] - } - } - ], - "identifier": [ - { - "extension": [ - { - "url": "https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-NHSNumberVerificationStatus", - "valueCodeableConcept": { - "coding": [ - { - "system": "https://fhir.hl7.org.uk/CodeSystem/UKCore-NHSNumberVerificationStatus", - "code": "number-present-and-verified", - "display": "Number present and verified" - } - ] - } - } - ], - "system": "https://fhir.nhs.uk/Id/nhs-number", - "value": "3478526985" - } - ], - "name": [ - { - "use": "official", - "text": "Mrs Julie Jones", - "family": "Jones", - "given": [ - "Julie" - ], - "prefix": [ - "Mrs" - ] - } - ], - "gender": "female", - "birthDate": "1959-05-04", - "address": [ - { - "use": "home", - "type": "both", - "text": "22 Brightside Crescent, Overtown, West Yorkshire, LS10 4YU", - "line": [ - "22 Brightside Crescent" - ], - "city": "Overtown", - "district": "West Yorkshire", - "postalCode": "LS10 4YU" - } - ], - "contact": [ - { - "extension": [ - { - "url": "https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-ContactRank", - "valuePositiveInt": 1 - } - ], - "relationship": [ - { - "coding": [ - { - "system": "https://fhir.hl7.org.uk/ValueSet/UKCore-PersonRelationshipType", - "code": "ONESELF", - "display": "self" - } - ] - } - ], - "telecom": [ - { - "system": "phone", - "value": "01138698975", - "use": "home", - "rank": 2 - }, - { - "system": "phone", - "value": "07736312544", - "use": "mobile", - "rank": 1 - }, - { - "system": "email", - "value": "jjones@hotmail.co.uk", - "use": "home", - "rank": 3 - } - ] - }, - { - "extension": [ - { - "url": "https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-ContactRank", - "valuePositiveInt": 2 - } - ], - "relationship": [ - { - "coding": [ - { - "system": "https://fhir.hl7.org.uk/ValueSet/UKCore-PersonRelationshipType", - "code": "EP", - "display": "Emergency contact person" - } - ] - } - ], - "name": { - "family": "Grayson", - "given": [ - "Jack" - ] - }, - "telecom": [ - { - "system": "phone", - "value": "0789 1234567", - "use": "mobile", - "rank": 1 - } - ], - "gender": "male" - } - ], - "communication": [ - { - "language": { - "coding": [ - { - "system": "https://fhir.hl7.org.uk/CodeSystem/UKCore-HumanLanguage", - "code": "en", - "display": "English" - } - ] - }, - "preferred": true - } - ], - "generalPractitioner": [ - { - "reference": "urn:uuid:c8c21609-cb27-4958-8eb2-37c76f3def85" - } - ] - } - }, - { - "fullUrl": "urn:uuid:1e744e34-6bbb-4aa9-8b20-fa3bb91f9d8f", - "resource": { - "resourceType": "PractitionerRole", - "meta": { - "lastUpdated": "2021-10-11T15:23:30+00:00", - "profile": [ - "https://fhir.hl7.org.uk/StructureDefinition/UKCore-PractitionerRole" - ] - }, - "practitioner": { - "reference": "urn:uuid:07dec093-be12-42f4-ade5-0d582d255ef1" - }, - "organization": { - "reference": "urn:uuid:c8c21609-cb27-4958-8eb2-37c76f3def85" - }, - "specialty": [ - { - "coding": [ - { - "system": "http://snomed.info/sct", - "code": "408443003", - "display": "General medical practice" - } - ] - } - ] - } - }, - { - "fullUrl": "urn:uuid:b5e27389-3ca5-4cbc-9173-73f0c74915d9", - "resource": { - "resourceType": "Organization", - "meta": { - "lastUpdated": "2021-11-26T15:00:00+00:00", - "profile": [ - "https://fhir.hl7.org.uk/StructureDefinition/UKCore-Organization" - ] - }, - "name": "Practitioner Org" - } - }, - { - "fullUrl": "urn:uuid:c8c21609-cb27-4958-8eb2-37c76f3def85", - "resource": { - "resourceType": "Organization", - "meta": { - "lastUpdated": "2021-10-11T15:23:30+00:00", - "profile": [ - "https://fhir.hl7.org.uk/StructureDefinition/UKCore-Organization" - ] - }, - "identifier": [ - { - "system": "https://fhir.nhs.uk/id/ods-organization-code", - "value": "G82080" - } - ], - "name": "Patient's Surgery" - } - }, - { - "fullUrl": "urn:uuid:07dec093-be12-42f4-ade5-0d582d255ef1", - "resource": { - "resourceType": "Practitioner", - "meta": { - "lastUpdated": "2021-10-11T15:23:30+00:00", - "profile": [ - "https://fhir.hl7.org.uk/StructureDefinition/UKCore-Practitioner" - ] - }, - "identifier": [ - { - "system": "https://fhir.nhs.uk/Id/sds-role-profile-id", - "value": "G823658" - } - ], - "name": [ - { - "family": "Smith", - "given": [ - "John" - ] - } - ], - "telecom": [ - { - "system": "phone", - "value": "0205663859", - "use": "work" - } - ] - } - }, - { - "fullUrl": "urn:uuid:d5ffd0cd-ec7e-48a1-84f1-91f4c0eb8fc5", - "resource": { - "resourceType": "Organization", - "meta": { - "lastUpdated": "2021-10-11T15:23:30+00:00", - "profile": [ - "https://fhir.hl7.org.uk/StructureDefinition/UKCore-Organization" - ] - }, - "identifier": [ - { - "system": "https://fhir.nhs.uk/id/ods-organization-code", - "value": "RYE" - } - ], - "name": "Receiving/performing Organization" - } - }, - { - "fullUrl": "urn:uuid:07939a0c-2854-46ff-9282-ad906bc93679", - "resource": { - "resourceType": "Organization", - "meta": { - "lastUpdated": "2021-10-11T15:23:30+00:00", - "profile": [ - "https://fhir.hl7.org.uk/StructureDefinition/UKCore-Organization" - ] - }, - "identifier": [ - { - "system": "https://fhir.nhs.uk/id/ods-organization-code", - "value": "RND" - } - ], - "name": "Sender Organization" - } - }, - { - "fullUrl": "urn:uuid:7d948662-bade-450e-b6c5-9bb6ee39cb56", - "resource": { - "resourceType": "Practitioner", - "meta": { - "lastUpdated": "2021-10-11T15:23:30+00:00", - "profile": [ - "https://fhir.hl7.org.uk/StructureDefinition/UKCore-Practitioner" - ] - }, - "identifier": [ - { - "system": "https://fhir.nhs.uk/Id/sds-role-profile-id", - "value": "PT2489" - } - ], - "name": [ - { - "family": "BLAKE", - "given": [ - "Marcy" - ] - } - ], - "telecom": [ - { - "system": "phone", - "value": "0205568263", - "use": "work" - } - ] - } - }, - { - "fullUrl": "urn:uuid:b923aa53-2376-4015-a07d-afe8bf2310eb", - "resource": { - "resourceType": "PractitionerRole", - "meta": { - "lastUpdated": "2021-10-11T15:23:30+00:00", - "profile": [ - "https://fhir.hl7.org.uk/StructureDefinition/UKCore-PractitionerRole" - ] - }, - "practitioner": { - "reference": "urn:uuid:7d948662-bade-450e-b6c5-9bb6ee39cb56" - }, - "organization": { - "reference": "urn:uuid:b5e27389-3ca5-4cbc-9173-73f0c74915d9" - }, - "code": [ - { - "coding": [ - { - "system": "http://snomed.info/sct", - "code": "224608005", - "display": "Administrative healthcare staff" - } - ] - } - ], - "specialty": [ - { - "coding": [ - { - "system": "http://snomed.info/sct", - "code": "408443003", - "display": "General medical practice" - } - ] - } - ] - } - }, - { - "fullUrl": "urn:uuid:30b7b6e3-93f0-4061-b90e-71f43d5fb06d", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "lastUpdated": "2021-10-11T15:23:30+00:00", - "profile": [ - "https://fhir.hl7.org.uk/StructureDefinition/UKCore-MedicationStatement" - ] - }, - "status": "active", - "category": { - "coding": [ - { - "system": "http://terminology.hl7.org/CodeSystem/medication-statement-category", - "code": "outpatient", - "display": "Outpatient" - } - ] - }, - "medicationCodeableConcept": { - "coding": [ - { - "system": "https://dmd.nhs.uk/", - "code": "8280711000001102", - "display": "Aspirin 50mg/5ml oral solution" - } - ] - }, - "subject": { - "reference": "urn:uuid:9589fb37-87a2-48d8-968f-b371429208a8" - }, - "context": { - "reference": "urn:uuid:8c63d621-4d86-4f57-8699-e8e22d49935d" - }, - "effectiveDateTime": "2021-09-23", - "dateAsserted": "2021-10-22", - "reasonCode": [ - { - "coding": [ - { - "system": "http://snomed.info/sct", - "code": "65363002", - "display": "Otitis Media" - } - ] - } - ], - "dosage": [ - { - "text": "2 capsules 4 times a day.", - "timing": { - "repeat": { - "frequency": 4, - "period": 1, - "periodUnit": "d" - } - }, - "asNeededCodeableConcept": { - "coding": [ - { - "system": "http://snomed.info/sct", - "code": "16001004", - "display": "Otalgia" - } - ] - }, - "site": { - "coding": [ - { - "system": "http://snomed.info/sct", - "code": "123851003", - "display": "Mouth region structure" - } - ] - }, - "route": { - "coding": [ - { - "system": "http://snomed.info/sct", - "code": "26643006", - "display": "Oral" - } - ] - }, - "method": { - "coding": [ - { - "system": "http://snomed.info/sct", - "code": "421984009", - "display": "Until finished" - } - ] - }, - "doseAndRate": [ - { - "doseQuantity": { - "value": 500, - "unit": "milligram", - "system": "http://unitsofmeasure.org", - "code": "mg" - } - } - ] - } - ] - } - }, - { - "fullUrl": "urn:uuid:68e01f49-cf16-4d88-8b06-5c9f40676fdd", - "resource": { - "resourceType": "AllergyIntolerance", - "meta": { - "lastUpdated": "2021-10-11T15:23:30+00:00", - "profile": [ - "https://fhir.hl7.org.uk/StructureDefinition/UKCore-AllergyIntolerance" - ] - }, - "clinicalStatus": { - "coding": [ - { - "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical", - "code": "active", - "display": "Active" - } - ] - }, - "verificationStatus": { - "coding": [ - { - "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification", - "code": "confirmed", - "display": "Confirmed" - } - ] - }, - "type": "allergy", - "category": [ - "medication" - ], - "code": { - "coding": [ - { - "system": "http://snomed.info/sct", - "code": "372687004", - "display": "Amoxicillin" - } - ] - }, - "patient": { - "reference": "urn:uuid:9589fb37-87a2-48d8-968f-b371429208a8" - }, - "encounter": { - "reference": "urn:uuid:8c63d621-4d86-4f57-8699-e8e22d49935d" - }, - "recordedDate": "2021-10-10T13:00:00+00:00", - "recorder": { - "reference": "urn:uuid:7d948662-bade-450e-b6c5-9bb6ee39cb56" - }, - "asserter": { - "reference": "urn:uuid:7d948662-bade-450e-b6c5-9bb6ee39cb56" - }, - "reaction": [ - { - "manifestation": [ - { - "coding": [ - { - "system": "http://snomed.info/sct", - "code": "247472004", - "display": "Urticarial rash" - } - ] - } - ], - "severity": "mild" - } - ] - } - }, - { - "fullUrl": "urn:uuid:ea37a499-245c-40e9-b0fa-df4383c4d413", - "resource": { - "resourceType": "Flag", - "meta": { - "lastUpdated": "2021-10-11T15:23:30+00:00", - "profile": [ - "http://hl7.org/fhir/StructureDefinition/Flag", - "https://fhir.hl7.org.uk/StructureDefinition/UKCore-Flag" - ] - }, - "status": "active", - "category": [ - { - "coding": [ - { - "system": "https://fhir.nhs.uk/CodeSystem/flag-categories-bars", - "code": "SG", - "display": "Safeguarding Concern" - } - ] - } - ], - "code": { - "coding": [ - { - "system": "https://fhir.nhs.uk/CodeSystem/safeguarding-codes-bars", - "code": "U", - "display": "Unspecified Safeguarding Concern Identified" - } - ] - }, - "subject": { - "reference": "urn:uuid:9589fb37-87a2-48d8-968f-b371429208a8" - }, - "period": { - "start": "2020-11-10T19:57:26.961Z", - "end": "2021-11-20T19:57:26.961Z" - } - } - }, - { - "fullUrl": "urn:uuid:3fe61915-32d2-4d41-953a-1d4ff56030e0", - "resource": { - "resourceType": "Flag", - "meta": { - "lastUpdated": "2021-10-11T15:23:30+00:00", - "profile": [ - "http://hl7.org/fhir/StructureDefinition/Flag", - "https://fhir.hl7.org.uk/StructureDefinition/UKCore-Flag" - ] - }, - "status": "active", - "category": [ - { - "coding": [ - { - "system": "https://fhir.nhs.uk/CodeSystem/flag-categories-bars", - "code": "RA", - "display": "Reasonable Adjustment" - } - ] - } - ], - "code": { - "coding": [ - { - "system": "https://fhir.nhs.uk/CodeSystem/reasonable-adjustment-codes-bars", - "code": "adjustforneedlephobia", - "display": "Adjust for needle phobia" - } - ] - }, - "subject": { - "reference": "urn:uuid:9589fb37-87a2-48d8-968f-b371429208a8" - }, - "period": { - "start": "2018-11-10T19:57:26.961Z" - }, - "encounter": { - "reference": "urn:uuid:8c63d621-4d86-4f57-8699-e8e22d49935d" - } - } - }, - { - "fullUrl": "urn:uuid:41e591ab-d333-4fb8-87b4-d35f740b6bfc", - "resource": { - "resourceType": "Flag", - "meta": { - "lastUpdated": "2021-10-11T15:23:30+00:00", - "profile": [ - "http://hl7.org/fhir/StructureDefinition/Flag", - "https://fhir.hl7.org.uk/StructureDefinition/UKCore-Flag" - ] - }, - "status": "active", - "category": [ - { - "coding": [ - { - "system": "https://fhir.nhs.uk/CodeSystem/flag-categories-bars", - "code": "RS", - "display": "Rejected Services" - } - ] - } - ], - "code": { - "text": "Patient Choice in Service Selection" - }, - "subject": { - "reference": "urn:uuid:9589fb37-87a2-48d8-968f-b371429208a8" - }, - "period": { - "start": "2018-11-10T19:57:26.961Z" - } - } - }, - { - "fullUrl": "urn:uuid:65508934-c9e6-46d2-a393-af096b502daf", - "resource": { - "resourceType": "QuestionnaireResponse", - "meta": { - "lastUpdated": "2021-10-11T15:23:30+00:00", - "profile": [ - "https://fhir.hl7.org.uk/StructureDefinition/UKCore-QuestionnaireResponse" - ] - }, - "extension": [ - { - "url": "http://hl7.org/fhir/StructureDefinition/questionnaireresponse-reason", - "valueCodeableConcept": { - "text": "Rejected Services - Patient Choice in Service Selection" - } - } - ], - "status": "completed", - "subject": { - "reference": "urn:uuid:41e591ab-d333-4fb8-87b4-d35f740b6bfc" - }, - "authored": "2021-10-13T16:28:00+07:00", - "author": { - "reference": "urn:uuid:7d948662-bade-450e-b6c5-9bb6ee39cb56" - }, - "source": { - "reference": "urn:uuid:9589fb37-87a2-48d8-968f-b371429208a8" - }, - "item": [ - { - "linkId": "RejectedServices", - "text": "Rejected Services", - "item": [ - { - "linkId": "Service1", - "item": [ - { - "linkId": "ServiceId", - "answer": [ - { - "valueString": "200000359" - } - ] - }, - { - "linkId": "ServiceName", - "answer": [ - { - "valueString": "Test DoS Service" - } - ] - }, - { - "linkId": "RejectionReason", - "answer": [ - { - "valueCoding": { - "system": "https://fhir.nhs.uk/CodeSystem/dos-rejected-reasons-bars", - "code": "26", - "display": "Rejected for patient choice" - } - } - ] - }, - { - "linkId": "RejectionComment", - "answer": [ - { - "valueString": "Same reason, Patient refused service due to parking" - } - ] - } - ] - }, - { - "linkId": "Service2", - "item": [ - { - "linkId": "ServiceId", - "answer": [ - { - "valueString": "200000360" - } - ] - }, - { - "linkId": "ServiceName", - "answer": [ - { - "valueString": "2nd Test DoS Service" - } - ] - }, - { - "linkId": "RejectionReason", - "answer": [ - { - "valueCoding": { - "system": "https://fhir.nhs.uk/CodeSystem/dos-rejected-reasons-bars", - "code": "26", - "display": "Rejected for patient choice" - } - } - ] - }, - { - "linkId": "RejectionComment", - "answer": [ - { - "valueString": "Same reason, Patient refused service due to parking" - } - ] - } - ] - } - ] - } - ] - } - }, - { - "fullUrl": "urn:uuid:0a6689a2-ebb4-48a2-825f-9c88c5959684", - "resource": { - "resourceType": "Observation", - "meta": { - "lastUpdated": "2021-10-11T15:23:30+00:00", - "profile": [ - "https://fhir.hl7.org.uk/StructureDefinition/UKCore-Observation" - ] - }, - "status": "final", - "code": { - "coding": [ - { - "system": "https://fhir.nhs.uk/CodeSystem/household-composition-bars", - "code": "LivesAlone", - "display": "Lives Alone" - } - ] - }, - "encounter": { - "reference": "urn:uuid:8c63d621-4d86-4f57-8699-e8e22d49935d" - }, - "effectiveDateTime": "2021-10-23", - "performer": [ - { - "reference": "urn:uuid:7d948662-bade-450e-b6c5-9bb6ee39cb56" - } - ] - } - }, - { - "fullUrl": "urn:uuid:660f804e-9003-4623-b6c0-9f0faae50433", - "resource": { - "resourceType": "Observation", - "meta": { - "lastUpdated": "2021-10-11T15:23:30+00:00", - "profile": [ - "https://fhir.hl7.org.uk/StructureDefinition/UKCore-Observation" - ] - }, - "status": "final", - "code": { - "coding": [ - { - "system": "http://terminology.hl7.org/CodeSystem/v3-LivingArrangement", - "code": "N", - "display": "Nursing Home" - } - ] - }, - "encounter": { - "reference": "urn:uuid:8c63d621-4d86-4f57-8699-e8e22d49935d" - }, - "effectiveDateTime": "2021-10-23", - "performer": [ - { - "reference": "urn:uuid:7d948662-bade-450e-b6c5-9bb6ee39cb56" - } - ] - } - }, - { - "fullUrl": "urn:uuid:f2d2a6f8-1ef5-40a6-a697-849bb1264a91", - "resource": { - "resourceType": "Observation", - "meta": { - "lastUpdated": "2021-10-11T15:23:30+00:00", - "profile": [ - "https://fhir.hl7.org.uk/StructureDefinition/UKCore-Observation" - ] - }, - "status": "final", - "code": { - "text": "Patient Reported Symptoms" - }, - "encounter": { - "reference": "urn:uuid:8c63d621-4d86-4f57-8699-e8e22d49935d" - }, - "effectiveDateTime": "2021-10-23", - "performer": [ - { - "reference": "urn:uuid:9589fb37-87a2-48d8-968f-b371429208a8" - } - ], - "note": [ - { - "authorString": "Mrs Julie Jones", - "text": "Chest pain on and off for several days. Advised to contact 111" - } - ] - } - }, - { - "fullUrl": "urn:uuid:e53b2595-7875-4687-80e9-23a0c8cb8ea0", - "resource": { - "resourceType": "Observation", - "meta": { - "lastUpdated": "2021-10-11T15:23:30+00:00", - "profile": [ - "https://fhir.hl7.org.uk/StructureDefinition/UKCore-Observation" - ] - }, - "status": "final", - "code": { - "text": "Expectations and wishes" - }, - "subject": { - "reference": "urn:uuid:9589fb37-87a2-48d8-968f-b371429208a8" - }, - "encounter": { - "reference": "urn:uuid:8c63d621-4d86-4f57-8699-e8e22d49935d" - }, - "effectiveDateTime": "2021-10-23", - "performer": [ - { - "reference": "urn:uuid:7d948662-bade-450e-b6c5-9bb6ee39cb56" - } - ], - "note": [ - { - "authorString": "BLAKE, Marcy", - "text": "The patient wishes to not be admitted to hospital unless deemed completely necessary. They have long term conditions which are better managed at home" - } - ] - } - }, - { - "fullUrl": "urn:uuid:75f0e2c7-79db-4518-8a03-edcf096fccbb", - "resource": { - "resourceType": "QuestionnaireResponse", - "meta": { - "lastUpdated": "2021-10-11T15:23:30+00:00", - "profile": [ - "https://fhir.hl7.org.uk/StructureDefinition/UKCore-QuestionnaireResponse" - ] - }, - "extension": [ - { - "url": "http://hl7.org/fhir/StructureDefinition/questionnaireresponse-reason", - "valueCodeableConcept": { - "text": "Additional Information Sources" - } - } - ], - "status": "completed", - "authored": "2021-10-13T16:28:00+07:00", - "author": { - "reference": "urn:uuid:7d948662-bade-450e-b6c5-9bb6ee39cb56" - }, - "source": { - "reference": "urn:uuid:7d948662-bade-450e-b6c5-9bb6ee39cb56" - }, - "item": [ - { - "linkId": "AdditionalSources", - "text": "Additional Lookup Sources", - "item": [ - { - "linkId": "Source1", - "item": [ - { - "linkId": "SourceName", - "answer": [ - { - "valueString": "Healthcare Gateway MIG" - } - ] - }, - { - "linkId": "SourceURL", - "answer": [ - { - "valueUri": "http://www.healthcaregateway.co.uk/mig/patNatNo-4563225478" - } - ] - } - ] - }, - { - "linkId": "Source2", - "item": [ - { - "linkId": "SourceName", - "answer": [ - { - "valueString": "Graphnet" - } - ] - }, - { - "linkId": "SourceURL", - "answer": [ - { - "valueUri": "http://www.graphnet.co.uk/record/NHSNo-4563225478" - } - ] - } - ] - }, - { - "linkId": "Source3", - "item": [ - { - "linkId": "SourceName", - "answer": [ - { - "valueString": "Local SPN" - } - ] - }, - { - "linkId": "SPNTitle", - "answer": [ - { - "valueString": "Abusive patient" - } - ] - }, - { - "linkId": "SPNDetail", - "answer": [ - { - "valueString": "On one encounter with the patient they were verbally abusive to attending staff. Patient should not be seen alone" - } - ] - }, - { - "linkId": "SPNActiveDate", - "answer": [ - { - "valueDateTime": "2021-11-10T19:45:28.654Z" - } - ] - }, - { - "linkId": "SPNReviewDate", - "answer": [ - { - "valueDateTime": "2022-05-10T19:45:28.654Z" - } - ] - } - ] - } - ] - } - ] - } - }, - { - "fullUrl": "urn:uuid:1e91008e-96d0-438b-873c-c6d2c007fc29", - "resource": { - "resourceType": "Consent", - "meta": { - "lastUpdated": "2021-11-26T15:00:00+00:00", - "profile": [ - "https://fhir.hl7.org.uk/StructureDefinition/UKCore-Consent" - ] - }, - "status": "active", - "scope": { - "coding": [ - { - "system": "http://terminology.hl7.org/CodeSystem/consentscope", - "code": "patient-privacy" - } - ] - }, - "category": [ - { - "coding": [ - { - "system": "https://fhir.nhs.uk/CodeSystem/consent-categories-bars", - "code": "DRC", - "display": "Direct Care" - } - ] - } - ], - "patient": { - "reference": "urn:uuid:9589fb37-87a2-48d8-968f-b371429208a8" - }, - "dateTime": "2021-11-26", - "policyRule": { - "coding": [ - { - "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode", - "code": "IMPLIED" - } - ] - } - } - } - ] -} diff --git a/src/main/resources/Examples/Encounter-ADTA03.json b/src/main/resources/Examples/Encounter-ADTA03.json deleted file mode 100644 index 03c2a73..0000000 --- a/src/main/resources/Examples/Encounter-ADTA03.json +++ /dev/null @@ -1,157 +0,0 @@ -{ - "resourceType": "Encounter", - "id": "adt-ao3-converted", - "meta": { - "versionId": "1", - "lastUpdated": "2022-07-26T06:38:54.907+00:00", - "source": "#zinyvQkLDsiddCuu" - }, - "extension": [ - { - "url": "https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-AdmissionMethod", - "valueCodeableConcept": { - "coding": [ - { - "system": "https://fhir.hl7.org.uk/CodeSystem/NHSDataModelAndDictionary-AdmissionMethod", - "code": "82" - } - ] - } - } - ], - "identifier": [ - { - "system": "https://fhir.yorkhospitals.nhs.uk/Id/visitId", - "value": "11554" - } - ], - "status": "finished", - "class": { - "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode", - "code": "SS", - "display": "short stay" - }, - "serviceType": { - "coding": [ - { - "system": "https://fhir.nhs.uk/CodeSystem/NHSDataModelAndDictionary-treatment-function", - "code": "501" - } - ] - }, - "subject": { - "reference": "Patient/6853093", - "identifier": { - "system": "https://fhir.nhs.uk/Id/nhs-number", - "value": "9333333333" - } - }, - "participant": [ - { - "type": [ - { - "coding": [ - { - "system": "http://terminology.hl7.org/CodeSystem/v3-ParticipationType", - "code": "ATND", - "display": "attender" - } - ] - } - ], - "individual": { - "identifier": { - "system": "https://fhir.hl7.org.uk/Id/gmc-number", - "value": "C3456789" - }, - "display": "Dr Samuel Darwin" - } - }, - { - "type": [ - { - "coding": [ - { - "system": "http://terminology.hl7.org/CodeSystem/v3-ParticipationType", - "code": "ADM", - "display": "admitter" - } - ] - } - ], - "individual": { - "identifier": { - "system": "https://fhir.hl7.org.uk/Id/gmc-number", - "value": "C3456789" - }, - "display": "Dr Samuel Darwin" - } - }, - { - "type": [ - { - "coding": [ - { - "system": "http://terminology.hl7.org/CodeSystem/v3-ParticipationType", - "code": "CON", - "display": "consultant" - } - ] - } - ], - "individual": { - "identifier": { - "system": "https://fhir.hl7.org.uk/Id/gmc-number", - "value": "C3456789" - }, - "display": "Dr Samuel Darwin" - } - } - ], - "period": { - "start": "2010-03-30T11:00:00+01:00", - "end": "2010-03-31T17:15:00+01:00" - }, - "reasonReference": [ - { - "display": "Labour" - } - ], - "hospitalization": { - "admitSource": { - "coding": [ - { - "system": "https://fhir.hl7.org.uk/CodeSystem/UKCore-SourceOfAdmissionEngland", - "code": "79" - } - ] - }, - "dischargeDisposition": { - "coding": [ - { - "system": "https://fhir.hl7.org.uk/CodeSystem/NHSDataModelAndDictionary-DischargeDestination", - "code": "19" - } - ] - } - }, - "location": [ - { - "location": { - "identifier": { - "system": "https://fhir.nhs.uk/Id/ods-site-code", - "value": "RCB55" - }, - "display": "York Hospital" - }, - "status": "active" - } - ], - "serviceProvider": { - "identifier": { - "system": "https://fhir.nhs.uk/Id/ods-organization-code", - "value": "RCB" - }, - "display": "York and Scarborough Teaching Hospitals NHS Trust" - } -} diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 288ba8d..1e51377 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -17,7 +17,7 @@ fhir: server: name: NHS England Interoperability Standards FHIR Testing baseUrl: https://3cdzg7kbj4.execute-api.eu-west-2.amazonaws.com/poc/Conformance - version: 6.10.6 + version: 6.10.7 services: R4: true diff --git a/src/main/resources/manifest.json b/src/main/resources/manifest.json index 723413d..7a34aef 100644 --- a/src/main/resources/manifest.json +++ b/src/main/resources/manifest.json @@ -3,6 +3,10 @@ "packageName": "fhir.r4.ukcore.stu3.currentbuild", "version": "0.0.8-pre-release" }, + { + "packageName": "fhir.r4.nhsengland.stu1", + "version": "1.1.0" + }, { "packageName": "hl7.fhir.uv.ips", "version": "1.1.0" @@ -12,7 +16,7 @@ "version": "3.0.0" }, { - "packageName": "fhir.r4.nhsengland.diagnostics", + "packageName": "uk.nhsengland.r4", "version": "0.0.0-prerelease" } ] \ No newline at end of file From 246b29d997d2283e24bcf71efb6496f6366ec382 Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Thu, 18 Jan 2024 16:34:51 +0000 Subject: [PATCH 24/67] Deployed IPS profile correction. --- aws-repo-notes.txt | 4 ++-- pom.xml | 2 +- src/main/resources/application.yaml | 2 +- .../uk.nhsengland.r4-0.0.0-prerelease.tgz | Bin 0 -> 11724 bytes 4 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 src/main/resources/uk.nhsengland.r4-0.0.0-prerelease.tgz diff --git a/aws-repo-notes.txt b/aws-repo-notes.txt index ed75572..4b3204f 100644 --- a/aws-repo-notes.txt +++ b/aws-repo-notes.txt @@ -23,9 +23,9 @@ mvn clean install docker build -t fhir-validator-r4 . docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest -docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.7 +docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.8 -docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.7 +docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.8 docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest diff --git a/pom.xml b/pom.xml index 9ae7aac..d72214c 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ uk.nhs.england IOPS-FHIR-Validation-Service - 6.10.7 + 6.10.8 IOPS-FHIR-Validation-Service HAPI FHIR Validator using Spring Boot diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 1e51377..740114a 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -17,7 +17,7 @@ fhir: server: name: NHS England Interoperability Standards FHIR Testing baseUrl: https://3cdzg7kbj4.execute-api.eu-west-2.amazonaws.com/poc/Conformance - version: 6.10.7 + version: 6.10.8 services: R4: true diff --git a/src/main/resources/uk.nhsengland.r4-0.0.0-prerelease.tgz b/src/main/resources/uk.nhsengland.r4-0.0.0-prerelease.tgz new file mode 100644 index 0000000000000000000000000000000000000000..1654e1787201d003a663c62d0c89e3f8c8fbd0b5 GIT binary patch literal 11724 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%0DB1kWqBF@C1SMszxE9OHCxq*A`z@m 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 literal 0 HcmV?d00001 From 8ceec468dc923d4046cba91b86573ba27ab9849c Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Fri, 19 Jan 2024 15:12:55 +0000 Subject: [PATCH 25/67] IPA changes. --- aws-repo-notes.txt | 4 ++-- pom.xml | 2 +- .../configuration/OpenApiConfig.kt | 2 ++ .../service/CapabilityStatementApplier.kt | 1 + src/main/resources/application.yaml | 2 +- src/main/resources/manifest.json | 4 ++++ .../uk.nhsengland.r4-0.0.0-prerelease.tgz | Bin 11724 -> 11801 bytes 7 files changed, 11 insertions(+), 4 deletions(-) diff --git a/aws-repo-notes.txt b/aws-repo-notes.txt index 4b3204f..4eda7b5 100644 --- a/aws-repo-notes.txt +++ b/aws-repo-notes.txt @@ -23,9 +23,9 @@ mvn clean install docker build -t fhir-validator-r4 . docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest -docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.8 +docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.9 -docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.8 +docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.9 docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest diff --git a/pom.xml b/pom.xml index d72214c..e2ab7f2 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ uk.nhs.england IOPS-FHIR-Validation-Service - 6.10.8 + 6.10.9 IOPS-FHIR-Validation-Service HAPI FHIR Validator using Spring Boot diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt index cdde737..3c1930f 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt @@ -844,6 +844,8 @@ open class OpenApiConfig(@Qualifier("R4") val ctx : FhirContext, packages += "[Structured Data Capture](https://build.fhir.org/ig/HL7/sdc/)" } else if (it.packageName.contains("fhir.r4.nhsengland")) { packages += "[NHS England Pathology Implementation Guide](https://simplifier.net/guide/nhs-england-implementation-guide-version-history)" + } else if (it.packageName.contains("hl7.fhir.uv.ipa")) { + packages += "[International Patient Access](https://build.fhir.org/ig/HL7/fhir-ipa/index.html)" } packages += " | \n" } diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/CapabilityStatementApplier.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/CapabilityStatementApplier.kt index 3db750d..23f22b0 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/CapabilityStatementApplier.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/CapabilityStatementApplier.kt @@ -15,6 +15,7 @@ class CapabilityStatementApplier( private val restResources = supportChain.fetchAllConformanceResources()?.filterIsInstance(CapabilityStatement::class.java)?.filterNot { it.url == null || it.url.contains("sdc") || it.url.contains("ips") + || it.url.contains("ipa") || (!it.url.contains(".uk") && !it.url.contains(".wales") ) || it.url.contains("us.core")} ?.flatMap { it.rest } diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 740114a..023aa4b 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -17,7 +17,7 @@ fhir: server: name: NHS England Interoperability Standards FHIR Testing baseUrl: https://3cdzg7kbj4.execute-api.eu-west-2.amazonaws.com/poc/Conformance - version: 6.10.8 + version: 6.10.9 services: R4: true diff --git a/src/main/resources/manifest.json b/src/main/resources/manifest.json index 7a34aef..61bcdc6 100644 --- a/src/main/resources/manifest.json +++ b/src/main/resources/manifest.json @@ -15,6 +15,10 @@ "packageName": "hl7.fhir.uv.sdc", "version": "3.0.0" }, + { + "packageName": "hl7.fhir.uv.ipa", + "version": "1.0.0" + }, { "packageName": "uk.nhsengland.r4", "version": "0.0.0-prerelease" diff --git a/src/main/resources/uk.nhsengland.r4-0.0.0-prerelease.tgz b/src/main/resources/uk.nhsengland.r4-0.0.0-prerelease.tgz index 1654e1787201d003a663c62d0c89e3f8c8fbd0b5..7f4546807602ba993f9228d46ad523263d48b6da 100644 GIT binary patch literal 11801 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 H0Ez(sC00Bz literal 11724 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%0DB1kWqBF@C1SMszxE9OHCxq*A`z@m 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 From 6f9371918565d8a2fd74fdb1452e131c56cd27a9 Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Fri, 19 Jan 2024 16:13:44 +0000 Subject: [PATCH 26/67] IPA changes. --- Dockerfile | 2 +- aws-repo-notes.txt | 4 ++-- pom.xml | 2 +- src/main/resources/application.yaml | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index c4822e6..28a2d2b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,7 @@ FROM openjdk:23 VOLUME /tmp -ENV JAVA_OPTS="-Xms128m -Xmx2048m" +ENV JAVA_OPTS="-Xms128m -Xmx4096m" ADD target/fhir-validator.jar fhir-validator.jar diff --git a/aws-repo-notes.txt b/aws-repo-notes.txt index 4eda7b5..1a5eb2e 100644 --- a/aws-repo-notes.txt +++ b/aws-repo-notes.txt @@ -23,9 +23,9 @@ mvn clean install docker build -t fhir-validator-r4 . docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest -docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.9 +docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.10 -docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.9 +docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.10 docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest diff --git a/pom.xml b/pom.xml index e2ab7f2..4f007a7 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ uk.nhs.england IOPS-FHIR-Validation-Service - 6.10.9 + 6.10.10 IOPS-FHIR-Validation-Service HAPI FHIR Validator using Spring Boot diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 023aa4b..8f713c3 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -17,7 +17,7 @@ fhir: server: name: NHS England Interoperability Standards FHIR Testing baseUrl: https://3cdzg7kbj4.execute-api.eu-west-2.amazonaws.com/poc/Conformance - version: 6.10.9 + version: 6.10.10 services: R4: true From 1b80b64dbe98c502b0ab299cea2de31950316589 Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Sat, 20 Jan 2024 14:48:49 +0000 Subject: [PATCH 27/67] imposeProfile suppport and deployed to AWS --- aws-repo-notes.txt | 4 ++-- pom.xml | 2 +- .../configuration/OpenApiConfig.kt | 2 +- .../provider/ValidateR4Provider.kt | 1 + src/main/resources/application.yaml | 2 +- ...hsengland.diagnostics-0.0.0-prerelease.tgz | Bin 255334 -> 0 bytes src/main/resources/manifest.json | 4 ++++ .../uk.nhsengland.r4-0.0.0-prerelease.tgz | Bin 11801 -> 11685 bytes 8 files changed, 10 insertions(+), 5 deletions(-) delete mode 100644 src/main/resources/fhir.r4.nhsengland.diagnostics-0.0.0-prerelease.tgz diff --git a/aws-repo-notes.txt b/aws-repo-notes.txt index 1a5eb2e..c6399e1 100644 --- a/aws-repo-notes.txt +++ b/aws-repo-notes.txt @@ -23,9 +23,9 @@ mvn clean install docker build -t fhir-validator-r4 . docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest -docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.10 +docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.11 -docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.10 +docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.11 docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest diff --git a/pom.xml b/pom.xml index 4f007a7..46da7fe 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ uk.nhs.england IOPS-FHIR-Validation-Service - 6.10.10 + 6.10.11 IOPS-FHIR-Validation-Service HAPI FHIR Validator using Spring Boot diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt index 3c1930f..6598126 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt @@ -837,7 +837,7 @@ open class OpenApiConfig(@Qualifier("R4") val ctx : FhirContext, } else if (it.packageName.contains("diagnostics")) { packages += "[NHS England Pathology Implementation Guide](https://simplifier.net/guide/pathology-fhir-implementation-guide)" } else if (it.packageName.contains("eu.laboratory")) { - packages += "[https://build.fhir.org/ig/hl7-eu/laboratory/](https://build.fhir.org/ig/hl7-eu/laboratory/)" + packages += "[HL7 Europe Laboratory Report](https://build.fhir.org/ig/hl7-eu/laboratory/)" } else if (it.packageName.contains("hl7.fhir.uv.ips")) { packages += "[International Patient Summary Implementation Guide](https://build.fhir.org/ig/HL7/fhir-ips/)" } else if (it.packageName.contains("hl7.fhir.uv.sdc")) { diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/ValidateR4Provider.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/ValidateR4Provider.kt index a003f07..ca467fe 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/ValidateR4Provider.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/ValidateR4Provider.kt @@ -179,6 +179,7 @@ class ValidateR4Provider ( } var result : OperationOutcome? = null if (profile != null) { + if (importProfile !== null && importProfile) capabilityStatementApplier.applyCapabilityStatementProfiles(resource, importProfile) result = validator.validateWithResult(resource, ValidationOptions().addProfile(profile)) .toOperationOutcome() as? OperationOutcome } else { diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 8f713c3..7983dd8 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -17,7 +17,7 @@ fhir: server: name: NHS England Interoperability Standards FHIR Testing baseUrl: https://3cdzg7kbj4.execute-api.eu-west-2.amazonaws.com/poc/Conformance - version: 6.10.10 + version: 6.10.11 services: R4: true diff --git a/src/main/resources/fhir.r4.nhsengland.diagnostics-0.0.0-prerelease.tgz b/src/main/resources/fhir.r4.nhsengland.diagnostics-0.0.0-prerelease.tgz deleted file mode 100644 index 630096180f6af8c682720a40d98bb3fc9662f03d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 255334 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⪚QTh;AG5dhoZ9n8+VBw_^vtsYeDwbr#_k^Ig?Sg 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 delta 11782 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 oZ!Yt<(*73Geih`S7b4KNqI&z&{We@1 Date: Sat, 20 Jan 2024 15:10:45 +0000 Subject: [PATCH 28/67] imposeProfile suppport and deployed to AWS --- Dockerfile | 2 +- aws-repo-notes.txt | 4 ++-- pom.xml | 2 +- src/main/resources/application.yaml | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index 28a2d2b..c55dc50 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,7 @@ FROM openjdk:23 VOLUME /tmp -ENV JAVA_OPTS="-Xms128m -Xmx4096m" +ENV JAVA_OPTS="-Xms128m -Xmx8192m" ADD target/fhir-validator.jar fhir-validator.jar diff --git a/aws-repo-notes.txt b/aws-repo-notes.txt index c6399e1..08cdb25 100644 --- a/aws-repo-notes.txt +++ b/aws-repo-notes.txt @@ -23,9 +23,9 @@ mvn clean install docker build -t fhir-validator-r4 . docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest -docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.11 +docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.12 -docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.11 +docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.12 docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest diff --git a/pom.xml b/pom.xml index 46da7fe..d5497ba 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ uk.nhs.england IOPS-FHIR-Validation-Service - 6.10.11 + 6.10.12 IOPS-FHIR-Validation-Service HAPI FHIR Validator using Spring Boot diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 7983dd8..efaff20 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -17,7 +17,7 @@ fhir: server: name: NHS England Interoperability Standards FHIR Testing baseUrl: https://3cdzg7kbj4.execute-api.eu-west-2.amazonaws.com/poc/Conformance - version: 6.10.11 + version: 6.10.12 services: R4: true From bedb3d3a8b27b70c044498983d178ccba3f6ab30 Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Mon, 22 Jan 2024 15:32:46 +0000 Subject: [PATCH 29/67] Prototype FHIR Document validation --- aws-repo-notes.txt | 4 +- pom.xml | 2 +- .../provider/ValidateR4Provider.kt | 6 ++- .../service/FHIRDocumentApplier.kt | 42 ++++++++++++++++++ .../fhirvalidator/util/FhirSystems.java | 1 + src/main/resources/application.yaml | 2 +- .../uk.nhsengland.r4-0.0.0-prerelease.tgz | Bin 11685 -> 0 bytes 7 files changed, 52 insertions(+), 5 deletions(-) create mode 100644 src/main/kotlin/uk/nhs/england/fhirvalidator/service/FHIRDocumentApplier.kt delete mode 100644 src/main/resources/uk.nhsengland.r4-0.0.0-prerelease.tgz diff --git a/aws-repo-notes.txt b/aws-repo-notes.txt index 08cdb25..e7c52e0 100644 --- a/aws-repo-notes.txt +++ b/aws-repo-notes.txt @@ -23,9 +23,9 @@ mvn clean install docker build -t fhir-validator-r4 . docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest -docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.12 +docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.14 -docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.12 +docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.14 docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest diff --git a/pom.xml b/pom.xml index d5497ba..c9cd033 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ uk.nhs.england IOPS-FHIR-Validation-Service - 6.10.12 + 6.10.14 IOPS-FHIR-Validation-Service HAPI FHIR Validator using Spring Boot diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/ValidateR4Provider.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/ValidateR4Provider.kt index ca467fe..fefadd8 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/ValidateR4Provider.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/ValidateR4Provider.kt @@ -18,6 +18,7 @@ import org.hl7.fhir.r4.utils.FHIRPathEngine import org.springframework.beans.factory.annotation.Qualifier import org.springframework.stereotype.Component import uk.nhs.england.fhirvalidator.service.CapabilityStatementApplier +import uk.nhs.england.fhirvalidator.service.FHIRDocumentApplier import uk.nhs.england.fhirvalidator.service.MessageDefinitionApplier import uk.nhs.england.fhirvalidator.util.createOperationOutcome import java.net.URLDecoder @@ -30,7 +31,8 @@ class ValidateR4Provider ( @Qualifier("SupportChain") private val supportChain: IValidationSupport, private val validator: FhirValidator, private val messageDefinitionApplier: MessageDefinitionApplier, - private val capabilityStatementApplier: CapabilityStatementApplier + private val capabilityStatementApplier: CapabilityStatementApplier, + private val fhirDocumentApplier: FHIRDocumentApplier ) { companion object : KLogging() @@ -180,6 +182,7 @@ class ValidateR4Provider ( var result : OperationOutcome? = null if (profile != null) { if (importProfile !== null && importProfile) capabilityStatementApplier.applyCapabilityStatementProfiles(resource, importProfile) + if (importProfile !== null && importProfile && resource is Bundle) fhirDocumentApplier.applyDocumentDefinition(resource) result = validator.validateWithResult(resource, ValidationOptions().addProfile(profile)) .toOperationOutcome() as? OperationOutcome } else { @@ -190,6 +193,7 @@ class ValidateR4Provider ( additionalIssues.add(it) } } + if (importProfile !== null && importProfile && resource is Bundle) fhirDocumentApplier.applyDocumentDefinition(resource) result = validator.validateWithResult(fhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(resource)).toOperationOutcome() as? OperationOutcome } if (result !== null) { diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/FHIRDocumentApplier.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/FHIRDocumentApplier.kt new file mode 100644 index 0000000..9d3138f --- /dev/null +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/FHIRDocumentApplier.kt @@ -0,0 +1,42 @@ +package uk.nhs.england.fhirvalidator.service + +import org.hl7.fhir.instance.model.api.IBaseResource +import org.hl7.fhir.r4.model.* +import org.springframework.stereotype.Service +import uk.nhs.england.fhirvalidator.util.FhirSystems +import uk.nhs.england.fhirvalidator.util.createOperationOutcome + + +@Service +class FHIRDocumentApplier { + + fun applyDocumentDefinition(resource: IBaseResource): OperationOutcome? { + if (resource !is Bundle || resource.type != Bundle.BundleType.DOCUMENT) { + return null + } + + val composition = findComposition(resource) + ?: return createOperationOutcome( + "No Composition found.", + "Bundle.entry" + ) + + if (composition.hasType()) { + if (composition.type.hasCoding(FhirSystems.SNOMED_CT,"4241000179101") + || composition.type.hasCoding(FhirSystems.LOINC,"11502-2") + ) composition.meta.addProfile("http://hl7.eu/fhir/laboratory/StructureDefinition/Composition-eu-lab") + if (composition.type.hasCoding(FhirSystems.LOINC,"60591-5") + ) composition.meta.addProfile("http://hl7.org/fhir/uv/ips/StructureDefinition/Composition-uv-ips") + } + return null + } + + private fun findComposition(bundle: Bundle): Composition? { + return bundle.entry + ?.map { it.resource } + ?.filterIsInstance(Composition::class.java) + ?.singleOrNull() + } + + +} diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/util/FhirSystems.java b/src/main/kotlin/uk/nhs/england/fhirvalidator/util/FhirSystems.java index 1638759..8f08f11 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/util/FhirSystems.java +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/util/FhirSystems.java @@ -34,6 +34,7 @@ public final class FhirSystems { public static final String EMIS_PRACTITIONER_IDENTIFIER = "https://emis.com/Id/Practitioner/DBID"; public static final String SNOMED_CT = "http://snomed.info/sct"; + public static final String LOINC = " http://loinc.org"; public static final String DMandD= "https://dmd.nhs.uk"; diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index efaff20..a6b5033 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -17,7 +17,7 @@ fhir: server: name: NHS England Interoperability Standards FHIR Testing baseUrl: https://3cdzg7kbj4.execute-api.eu-west-2.amazonaws.com/poc/Conformance - version: 6.10.12 + version: 6.10.14 services: R4: true diff --git a/src/main/resources/uk.nhsengland.r4-0.0.0-prerelease.tgz b/src/main/resources/uk.nhsengland.r4-0.0.0-prerelease.tgz deleted file mode 100644 index 40911c88df36033499d6a64ca3821027af4d9c9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11685 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 From 207ec476526f3ec16d2e04a03f0bb6bd4c7eaca8 Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Tue, 23 Jan 2024 08:35:57 +0000 Subject: [PATCH 30/67] Added $openapi CapabilityStatement examples --- .../configuration/OpenApiConfig.kt | 7 +- .../UKCore-Access-Patient-Provider.json | 210 ++++++++++++++++++ 2 files changed, 215 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/Examples/UKCore-Access-Patient-Provider.json diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt index 6598126..1a7e727 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt @@ -722,14 +722,17 @@ open class OpenApiConfig(@Qualifier("R4") val ctx : FhirContext, .addMediaType("application/fhir+xml",MediaType().schema(StringSchema())) ))) oas.path("/FHIR/STU3/\$convertR4",convertR4Item) - + val examplesCS = LinkedHashMap() + examplesCS.put("UK Core Access Patient Provider", + Example().value(OASExamples().loadFHIRExample("UKCore-Access-Patient-Provider.json",ctx)) + ) val capabilityStatementItem = PathItem() .post( Operation() .addTagsItem(EXPERIMENTAL) .summary("Converts a FHIR CapabilityStatement to openapi v3 format") .responses(getApiResponsesMarkdown()) - .requestBody(RequestBody().content(Content().addMediaType("application/fhir+json",MediaType().schema(StringSchema()._default("{\"resourceType\":\"CapabilityStatement\"}"))))) + .requestBody(RequestBody().content(Content().addMediaType("application/fhir+json",MediaType().examples(examplesCS).schema(StringSchema())))) ) oas.path("/FHIR/R4/\$openapi",capabilityStatementItem) diff --git a/src/main/resources/Examples/UKCore-Access-Patient-Provider.json b/src/main/resources/Examples/UKCore-Access-Patient-Provider.json new file mode 100644 index 0000000..92f93f8 --- /dev/null +++ b/src/main/resources/Examples/UKCore-Access-Patient-Provider.json @@ -0,0 +1,210 @@ +{ + "resourceType": "CapabilityStatement", + "id": "UKCoreAccessPatientIndexProvider", + "text": { + "status": "extensions", + "div": "

Provider supports read-only access to a patient index for the purposes of direct care and subject of care access.

\n
ModeSERVER
Description
Transaction
System History
System Search
Resource TypeProfileReadSearchUpdateCreate
Patienthttps://fhir.hl7.org.uk/uk-core-access/StructureDefinition/UKCoreAccessPatientIndexPatienty

" + }, + "url": "https://fhir.hl7.org.uk/uk-core-access/CapabilityStatement/UKCoreAccessPatientIndexProvider", + "version": "0.1.0", + "title": "UKCore Access Patient Index Provider", + "status": "active", + "date": "2023-02-01", + "publisher": "HL7 UK", + "contact": [ + { + "name": "HL7 UK", + "telecom": [ + { + "system": "url", + "value": "https://www.hl7.org.uk/" + } + ] + } + ], + "description": "Provider supports read-only access to a patient index for the purposes of direct care and subject of care access.", + "jurisdiction": [ + { + "coding": [ + { + "system": "urn:iso:std:iso:3166", + "code": "GB", + "display": "United Kingdom of Great Britain and Northern Ireland" + } + ] + } + ], + "kind": "requirements", + "fhirVersion": "4.0.1", + "format": [ + "json" + ], + "rest": [ + { + "mode": "server", + "resource": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation", + "valueCode": "SHALL" + }, + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation", + "valueCode": "SHOULD" + }, + { + "url": "required", + "valueString": "birthdate" + }, + { + "url": "required", + "valueString": "family" + } + ], + "url": "http://hl7.org/fhir/StructureDefinition/capabilitystatement-search-parameter-combination" + }, + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation", + "valueCode": "SHOULD" + }, + { + "url": "required", + "valueString": "birthdate" + }, + { + "url": "required", + "valueString": "name" + } + ], + "url": "http://hl7.org/fhir/StructureDefinition/capabilitystatement-search-parameter-combination" + }, + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation", + "valueCode": "SHOULD" + }, + { + "url": "required", + "valueString": "gender" + }, + { + "url": "required", + "valueString": "family" + } + ], + "url": "http://hl7.org/fhir/StructureDefinition/capabilitystatement-search-parameter-combination" + }, + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation", + "valueCode": "SHOULD" + }, + { + "url": "required", + "valueString": "gender" + }, + { + "url": "required", + "valueString": "name" + } + ], + "url": "http://hl7.org/fhir/StructureDefinition/capabilitystatement-search-parameter-combination" + } + ], + "type": "Patient", + "profile": "https://fhir.hl7.org.uk/uk-core-access/StructureDefinition/UKCoreAccessPatientIndexPatient", + "interaction": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation", + "valueCode": "SHALL" + } + ], + "code": "search-type" + } + ], + "searchParam": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation", + "valueCode": "SHOULD" + } + ], + "name": "_id", + "type": "token" + }, + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation", + "valueCode": "SHOULD" + } + ], + "name": "birthdate", + "type": "date" + }, + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation", + "valueCode": "SHOULD" + } + ], + "name": "family", + "type": "string" + }, + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation", + "valueCode": "SHALL" + } + ], + "name": "gender", + "type": "token" + }, + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation", + "valueCode": "SHOULD" + } + ], + "name": "given", + "type": "string" + }, + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation", + "valueCode": "SHALL" + } + ], + "name": "identifier", + "type": "token" + }, + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation", + "valueCode": "SHALL" + } + ], + "name": "name", + "type": "string" + } + ] + } + ] + } + ] +} From ef9dead8563b56806e5cfcc0ccf82eb351eb0b7c Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Tue, 23 Jan 2024 12:01:11 +0000 Subject: [PATCH 31/67] openAPI refactor to turn off additional markdown --- .../configuration/OpenApiConfig.kt | 12 ++++- .../provider/CapabilityStatementProvider.kt | 50 ++++++++++++++++++- .../fhirvalidator/provider/OpenAPIProvider.kt | 33 ++---------- .../fhirvalidator/service/OpenAPIParser.kt | 42 +++++++++++----- src/main/resources/manifest.json | 22 +------- 5 files changed, 92 insertions(+), 67 deletions(-) diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt index 1a7e727..5744971 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt @@ -729,12 +729,20 @@ open class OpenApiConfig(@Qualifier("R4") val ctx : FhirContext, val capabilityStatementItem = PathItem() .post( Operation() - .addTagsItem(EXPERIMENTAL) + .addTagsItem(UTILITY) .summary("Converts a FHIR CapabilityStatement to openapi v3 format") + .addParametersItem(Parameter() + .name("addFHIRExtras") + .`in`("query") + .required(false) + .style(Parameter.StyleEnum.SIMPLE) + .description("`true | false`. Adds markdown documentation from FHIR Specification (do not rerun once it has been added)") + // Removed example profile + .schema(StringSchema().format("token"))) .responses(getApiResponsesMarkdown()) .requestBody(RequestBody().content(Content().addMediaType("application/fhir+json",MediaType().examples(examplesCS).schema(StringSchema())))) ) - oas.path("/FHIR/R4/\$openapi",capabilityStatementItem) + oas.path("/FHIR/R4/CapabilityStatement/\$openapi",capabilityStatementItem) return oas diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/CapabilityStatementProvider.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/CapabilityStatementProvider.kt index e647574..8fbc54c 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/CapabilityStatementProvider.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/CapabilityStatementProvider.kt @@ -1,20 +1,28 @@ package uk.nhs.england.fhirvalidator.provider import ca.uhn.fhir.context.FhirContext -import ca.uhn.fhir.rest.annotation.RequiredParam -import ca.uhn.fhir.rest.annotation.Search +import ca.uhn.fhir.rest.annotation.* import ca.uhn.fhir.rest.param.TokenParam import ca.uhn.fhir.rest.server.IResourceProvider +import io.swagger.util.Yaml +import io.swagger.v3.core.util.Json +import org.apache.commons.io.IOUtils import org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain +import org.hl7.fhir.instance.model.api.IBaseResource +import org.hl7.fhir.r4.model.BooleanType import org.hl7.fhir.r4.model.CapabilityStatement import org.springframework.beans.factory.annotation.Qualifier import org.springframework.stereotype.Component import uk.nhs.england.fhirvalidator.service.ImplementationGuideParser +import uk.nhs.england.fhirvalidator.service.OpenAPIParser import java.nio.charset.StandardCharsets +import javax.servlet.http.HttpServletRequest +import javax.servlet.http.HttpServletResponse @Component class CapabilityStatementProvider(@Qualifier("R4") private val fhirContext: FhirContext, + private val oasParser : OpenAPIParser, private val supportChain: ValidationSupportChain) : IResourceProvider { /** * The getResourceType method comes from IResourceProvider, and must @@ -36,4 +44,42 @@ class CapabilityStatementProvider(@Qualifier("R4") private val fhirContext: Fhir if (resource != null) list.add(resource) return list } + + @Operation(name = "openapi", idempotent = true,manualResponse=true, manualRequest=true) + fun convertOpenAPI( + servletRequest: HttpServletRequest, + servletResponse: HttpServletResponse, + @ResourceParam inputResource: IBaseResource, + @OperationParam(name = "addFHIRExtras") abstract: BooleanType?, + ) { + + // var input = IOUtils.toString(servletRequest.getReader()); + // var inputResource : IBaseResource + servletResponse.setContentType("application/json") + servletResponse.setCharacterEncoding("UTF-8") + /* + try { + inputResource = fhirContext.newJsonParser().parseResource(input) + } catch (ex : Exception) { + inputResource = fhirContext.newXmlParser().parseResource(input) + } + + */ + if (inputResource is CapabilityStatement) { + val cs : CapabilityStatement = inputResource + + var boilerPlate = true + if (abstract !== null && !abstract.booleanValue()) boilerPlate = false + val os = oasParser.generateOpenApi(cs, boilerPlate); + val yaml = Yaml.pretty().writeValueAsString(os); + // System.out.println(yaml); + servletResponse.writer.write(Json.pretty(os)) + servletResponse.writer.flush() + return + } + servletResponse.writer.write("{}") + servletResponse.writer.flush() + return + } + } diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/OpenAPIProvider.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/OpenAPIProvider.kt index fa28bf6..dbeecd6 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/OpenAPIProvider.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/OpenAPIProvider.kt @@ -2,6 +2,7 @@ package uk.nhs.england.fhirvalidator.provider import ca.uhn.fhir.context.FhirContext import ca.uhn.fhir.rest.annotation.Operation +import ca.uhn.fhir.rest.annotation.OperationParam import io.swagger.util.Yaml import io.swagger.v3.core.util.Json import io.swagger.v3.oas.models.OpenAPI @@ -10,6 +11,7 @@ import io.swagger.v3.parser.core.models.ParseOptions import io.swagger.v3.parser.core.models.SwaggerParseResult import org.apache.commons.io.IOUtils import org.hl7.fhir.instance.model.api.IBaseResource +import org.hl7.fhir.r4.model.BooleanType import org.hl7.fhir.r4.model.CapabilityStatement import org.hl7.fhir.r4.model.OperationOutcome import org.springframework.beans.factory.annotation.Qualifier @@ -23,7 +25,7 @@ import javax.servlet.http.HttpServletResponse @Component class OpenAPIProvider(@Qualifier("R4") private val fhirContext: FhirContext, - private val oasParser : OpenAPIParser, + private val verifyOAS: VerifyOAS ) { @@ -105,35 +107,6 @@ class OpenAPIProvider(@Qualifier("R4") private val fhirContext: FhirContext, return } - @Operation(name = "openapi", idempotent = true,manualResponse=true, manualRequest=true) - fun convertOpenAPI( - servletRequest: HttpServletRequest, - servletResponse: HttpServletResponse - ) { - - var input = IOUtils.toString(servletRequest.getReader()); - var inputResource : IBaseResource - servletResponse.setContentType("application/json") - servletResponse.setCharacterEncoding("UTF-8") - try { - inputResource = fhirContext.newJsonParser().parseResource(input) - } catch (ex : Exception) { - inputResource = fhirContext.newXmlParser().parseResource(input) - } - if (inputResource is CapabilityStatement) { - val cs : CapabilityStatement = inputResource - - val os = oasParser.generateOpenApi(cs); - val yaml = Yaml.pretty().writeValueAsString(os); - // System.out.println(yaml); - servletResponse.writer.write(Json.pretty(os)) - servletResponse.writer.flush() - return - } - servletResponse.writer.write("{}") - servletResponse.writer.flush() - return - } } diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/OpenAPIParser.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/OpenAPIParser.kt index 093527a..959eea0 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/OpenAPIParser.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/OpenAPIParser.kt @@ -52,7 +52,7 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, - fun generateOpenApi(_cs: CapabilityStatement): OpenAPI? { + fun generateOpenApi(_cs: CapabilityStatement, addFHIRBoilerPlater: Boolean): OpenAPI? { cs = _cs val openApi = OpenAPI() openApi.info = Info() @@ -68,7 +68,7 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, if (code.value.contains("xml")) generateXML = true } - if (cs.hasExtension("https://fhir.nhs.uk/StructureDefinition/Extension-NHSDigital-CapabilityStatement-Package")) { + if (addFHIRBoilerPlater && cs.hasExtension("https://fhir.nhs.uk/StructureDefinition/Extension-NHSDigital-CapabilityStatement-Package")) { val apiDefinition = cs.getExtensionByUrl("https://fhir.nhs.uk/StructureDefinition/Extension-NHSDigital-CapabilityStatement-Package") // Sample table:\n\n| One | Two | Three |\n|-----|-----|-------|\n| a | b | c | if (apiDefinition.hasExtension("openApi")) { @@ -122,10 +122,14 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, serverTag.name = PAGE_SYSTEM serverTag.description = "Server-level operations" openApi.addTagsItem(serverTag) + + /* This should be in the capability statement REMOVED val capabilitiesOperation = getPathItem(paths, "/metadata", PathItem.HttpMethod.GET) capabilitiesOperation.addTagsItem(PAGE_SYSTEM) capabilitiesOperation.summary = "server-capabilities: Fetch the server FHIR CapabilityStatement" addFhirResourceResponse(this.ctx, openApi, capabilitiesOperation, "CapabilityStatement",null,null,null) + */ + val systemInteractions = cs.restFirstRep.interaction.stream().map { t: CapabilityStatement.SystemInteractionComponent -> t.code } .collect(Collectors.toSet()) @@ -182,9 +186,9 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, if (resftfulIntraction.hasDocumentation()) { operation.description += "\n\n"+ resftfulIntraction.documentation } - if (nextResource.hasExtension("http://hl7.org/fhir/StructureDefinition/capabilitystatement-search-parameter-combination")) { - var comboDoc = "\n\n **Required Parameters** \n\n One of the following search paramter combinations is **required** \n\n" + - "| Required | Optional | \n" + if (addFHIRBoilerPlater && nextResource.hasExtension("http://hl7.org/fhir/StructureDefinition/capabilitystatement-search-parameter-combination")) { + var comboDoc = "\n\n **Search Parameter Combinations** \n\n The following search parameters combinations should be supported. \n\n" + + "| SHALL | SHOULD | \n" comboDoc += "|----------|---------| \n" for (extension in nextResource.getExtensionsByUrl("http://hl7.org/fhir/StructureDefinition/capabilitystatement-search-parameter-combination")) { @@ -206,7 +210,7 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, operation.description += comboDoc } addFhirResourceResponse(ctx, openApi, operation, resourceType,resftfulIntraction, null,null) - processSearchParameter(operation,nextResource,resourceType) + processSearchParameter(operation,nextResource,resourceType, addFHIRBoilerPlater) addResourceAPIMParameter(operation) } // Instance Read @@ -292,7 +296,7 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, if (resftfulIntraction.hasDocumentation()) { operation.description += "\n\n"+resftfulIntraction.documentation } - processSearchParameter(operation,nextResource,resourceType) + processSearchParameter(operation,nextResource,resourceType, addFHIRBoilerPlater) addResourceAPIMParameter(operation) addFhirResourceResponse(ctx, openApi, operation, resourceType,resftfulIntraction, null,null) } @@ -311,7 +315,7 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, operation.description += "\n\n"+resftfulIntraction.documentation } addResourceIdParameter(operation) - processSearchParameter(operation,nextResource,resourceType) + processSearchParameter(operation,nextResource,resourceType, addFHIRBoilerPlater) addResourceAPIMParameter(operation) addFhirResourceResponse(ctx, openApi, operation, resourceType,resftfulIntraction,null,null) } @@ -347,15 +351,29 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, } - private fun processSearchParameter(operation : Operation, nextResource : CapabilityStatement.CapabilityStatementRestResourceComponent,resourceType: String) { + private fun processSearchParameter(operation : Operation, + nextResource : CapabilityStatement.CapabilityStatementRestResourceComponent, + resourceType: String, + addFHIRBoilerPlater: Boolean) { for (nextSearchParam in nextResource.searchParam) { val parametersItem = Parameter() operation.addParametersItem(parametersItem) parametersItem.name = nextSearchParam.name parametersItem.setIn("query") - parametersItem.description = nextSearchParam.documentation - parametersItem.description += getSearchParameterDocumentation(nextSearchParam,resourceType, parametersItem,true) - + parametersItem.description = "" + if (nextSearchParam.hasDocumentation()) parametersItem.description += nextSearchParam.documentation + if (addFHIRBoilerPlater) parametersItem.description += getSearchParameterDocumentation(nextSearchParam,resourceType, parametersItem,true) + if (nextSearchParam.hasExtension()) { + nextSearchParam.extension.forEach { + if (it.hasUrl() && it.url.equals("http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation")) { + if (it.hasValue() && it.value is CodeType) { + if ((it.value as CodeType).code.equals("SHALL")) { + parametersItem.required = true + } + } + } + } + } // calculate style and explode parametersItem.style = Parameter.StyleEnum.FORM if (parametersItem.schema != null && parametersItem.schema.format != null) { diff --git a/src/main/resources/manifest.json b/src/main/resources/manifest.json index eb1a738..4802a4d 100644 --- a/src/main/resources/manifest.json +++ b/src/main/resources/manifest.json @@ -6,25 +6,5 @@ { "packageName": "fhir.r4.nhsengland.stu1", "version": "1.1.0" - }, - { - "packageName": "hl7.fhir.uv.ips", - "version": "1.1.0" - }, - { - "packageName": "hl7.fhir.uv.sdc", - "version": "3.0.0" - }, - { - "packageName": "hl7.fhir.uv.ipa", - "version": "1.0.0" - }, - { - "packageName": "hl7.fhir.eu.laboratory", - "version": "0.1.0-ballot" - }, - { - "packageName": "uk.nhsengland.r4", - "version": "0.0.0-prerelease" } -] \ No newline at end of file +] From a8378ea58ede86d284d8af672e2b14d29de50774 Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Tue, 23 Jan 2024 15:51:16 +0000 Subject: [PATCH 32/67] OAS to CapabilityStatement first draft --- aws-repo-notes.txt | 4 +- pom.xml | 2 +- .../configuration/OpenApiConfig.kt | 37 ++ .../AWSAuditEventLoggingInterceptor.kt | 7 +- .../provider/MarkdownProvider.kt | 5 - .../fhirvalidator/provider/OpenAPIProvider.kt | 25 +- .../service/{VerifyOAS.kt => OASSupport.kt} | 141 +++++- .../fhirvalidator/service/OpenAPIParser.kt | 25 +- src/main/resources/OAS/Proxy-api.yaml | 318 +++++++++++++ src/main/resources/OAS/proxy-api.json | 431 ++++++++++++++++++ src/main/resources/application.yaml | 2 +- src/main/resources/manifest.json | 20 + .../controller/ValidateControllerTest.kt | 9 +- 13 files changed, 984 insertions(+), 42 deletions(-) rename src/main/kotlin/uk/nhs/england/fhirvalidator/service/{VerifyOAS.kt => OASSupport.kt} (76%) create mode 100644 src/main/resources/OAS/Proxy-api.yaml create mode 100644 src/main/resources/OAS/proxy-api.json diff --git a/aws-repo-notes.txt b/aws-repo-notes.txt index e7c52e0..aa53368 100644 --- a/aws-repo-notes.txt +++ b/aws-repo-notes.txt @@ -23,9 +23,9 @@ mvn clean install docker build -t fhir-validator-r4 . docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest -docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.14 +docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.15 -docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.14 +docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.15 docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest diff --git a/pom.xml b/pom.xml index c9cd033..4a2fc9b 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ uk.nhs.england IOPS-FHIR-Validation-Service - 6.10.14 + 6.10.15 IOPS-FHIR-Validation-Service HAPI FHIR Validator using Spring Boot diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt index 5744971..1c569d6 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt @@ -669,6 +669,41 @@ open class OpenApiConfig(@Qualifier("R4") val ctx : FhirContext, ) oas.path("/FHIR/R4/\$verifyOAS",verifyOASItem) + val convertOASItem = PathItem() + .post( + Operation() + .addTagsItem(EXPERIMENTAL) + .summary("Converts OAS in YAML to JSON format") + .description("This is a proof of concept.") + .responses(getApiResponsesRAWJSON()) + .requestBody(RequestBody().content(Content() + .addMediaType("application/x-yaml",MediaType().schema(StringSchema())) + .addMediaType("application/json",MediaType().examples(examplesOAS) + .schema(StringSchema())) + ) + ) + ) + oas.path("/FHIR/R4/\$convertOAS",convertOASItem) + + val convertOAStoFHIRItem = PathItem() + .post( + Operation() + .addTagsItem(EXPERIMENTAL) + .summary("Converts OAS in YAML/JSON format to FHIR CapabilityStatement") + .description("This is a proof of concept.") + .responses(getApiResponsesRAWJSON()) + .requestBody(RequestBody().content(Content() + .addMediaType("application/x-yaml",MediaType().schema(StringSchema())) + .addMediaType("application/json",MediaType().examples(examplesOAS) + .schema(StringSchema())) + ) + ) + ) + oas.path("/FHIR/R4/\$convertOAStoFHIR",convertOAStoFHIRItem) + + + + val convertToTextItem = PathItem() .post( Operation() @@ -807,6 +842,8 @@ open class OpenApiConfig(@Qualifier("R4") val ctx : FhirContext, return apiResponses } + + fun getApiResponsesRAWJSON() : ApiResponses { val response200 = ApiResponse() diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/AWSAuditEventLoggingInterceptor.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/AWSAuditEventLoggingInterceptor.kt index 8ba4aa4..0e93139 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/AWSAuditEventLoggingInterceptor.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/AWSAuditEventLoggingInterceptor.kt @@ -83,10 +83,13 @@ class AWSAuditEventLoggingInterceptor( } } } catch (io: InvalidRequestException) { - System.out.println("Issue Processing - " + theRequestDetails.requestPath) + System.out.println("InvalidRequestException Issue Processing - " + theRequestDetails.requestPath) } catch (io: IOException) { - System.out.println("Issue Processing - " + theRequestDetails.requestPath) + System.out.println("IOException Issue Processing - " + theRequestDetails.requestPath) + } + catch (io: IllegalStateException) { + System.out.println("IllegalStateException Issue Processing - " + theRequestDetails.requestPath) } } } diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/MarkdownProvider.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/MarkdownProvider.kt index c2085b0..51a8880 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/MarkdownProvider.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/MarkdownProvider.kt @@ -1,16 +1,11 @@ package uk.nhs.england.fhirvalidator.provider -import ca.uhn.fhir.context.FhirContext import ca.uhn.fhir.rest.annotation.Operation import ca.uhn.fhir.rest.annotation.OperationParam import ca.uhn.fhir.rest.param.StringParam -import ca.uhn.fhir.validation.FhirValidator import mu.KLogging import org.springframework.stereotype.Component -import uk.nhs.england.fhirvalidator.service.CapabilityStatementApplier -import uk.nhs.england.fhirvalidator.service.MessageDefinitionApplier import uk.nhs.england.fhirvalidator.service.OpenAPIParser -import uk.nhs.england.fhirvalidator.service.VerifyOAS import java.nio.charset.StandardCharsets import javax.servlet.http.HttpServletRequest import javax.servlet.http.HttpServletResponse diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/OpenAPIProvider.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/OpenAPIProvider.kt index dbeecd6..f9bf5ce 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/OpenAPIProvider.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/OpenAPIProvider.kt @@ -2,22 +2,17 @@ package uk.nhs.england.fhirvalidator.provider import ca.uhn.fhir.context.FhirContext import ca.uhn.fhir.rest.annotation.Operation -import ca.uhn.fhir.rest.annotation.OperationParam -import io.swagger.util.Yaml import io.swagger.v3.core.util.Json import io.swagger.v3.oas.models.OpenAPI import io.swagger.v3.parser.OpenAPIV3Parser import io.swagger.v3.parser.core.models.ParseOptions import io.swagger.v3.parser.core.models.SwaggerParseResult import org.apache.commons.io.IOUtils -import org.hl7.fhir.instance.model.api.IBaseResource -import org.hl7.fhir.r4.model.BooleanType import org.hl7.fhir.r4.model.CapabilityStatement import org.hl7.fhir.r4.model.OperationOutcome import org.springframework.beans.factory.annotation.Qualifier import org.springframework.stereotype.Component -import uk.nhs.england.fhirvalidator.service.OpenAPIParser -import uk.nhs.england.fhirvalidator.service.VerifyOAS +import uk.nhs.england.fhirvalidator.service.OASSupport import uk.nhs.england.fhirvalidator.util.createOperationOutcome import javax.servlet.http.HttpServletRequest import javax.servlet.http.HttpServletResponse @@ -26,7 +21,7 @@ import javax.servlet.http.HttpServletResponse @Component class OpenAPIProvider(@Qualifier("R4") private val fhirContext: FhirContext, - private val verifyOAS: VerifyOAS + private val OASSupport: OASSupport ) { @Operation(name = "convertOAS", idempotent = true,manualResponse=true, manualRequest=true) @@ -42,6 +37,20 @@ class OpenAPIProvider(@Qualifier("R4") private val fhirContext: FhirContext, return } + @Operation(name = "convertOAStoFHIR", idempotent = true, manualRequest=true) + fun convertOAStoFHIR( + servletRequest: HttpServletRequest, + servletResponse: HttpServletResponse + ) : CapabilityStatement { + var input = IOUtils.toString(servletRequest.getReader()); + var openAPI : OpenAPI? = null + openAPI = OpenAPIV3Parser().readContents(input).openAPI + var capabilityStatement = OASSupport.convert(openAPI) + return capabilityStatement + } + + + @Operation(name = "verifyOAS", idempotent = true,manualResponse=true, manualRequest=true) fun verifyOAS( servletRequest: HttpServletRequest, @@ -81,7 +90,7 @@ class OpenAPIProvider(@Qualifier("R4") private val fhirContext: FhirContext, if (openAPI !=null) { - val results = verifyOAS.validate(openAPI) + val results = OASSupport.validate(openAPI) var outcome = createOperationOutcome(results) if (oasResult !== null && oasResult.getMessages() != null) { oasResult.getMessages().forEach({ diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/VerifyOAS.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/OASSupport.kt similarity index 76% rename from src/main/kotlin/uk/nhs/england/fhirvalidator/service/VerifyOAS.kt rename to src/main/kotlin/uk/nhs/england/fhirvalidator/service/OASSupport.kt index 3c4e4aa..4b33b24 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/VerifyOAS.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/OASSupport.kt @@ -14,22 +14,148 @@ import io.swagger.v3.oas.models.examples.Example import io.swagger.v3.oas.models.media.ArraySchema import io.swagger.v3.oas.models.media.MediaType import io.swagger.v3.oas.models.parameters.QueryParameter +import mu.KLogging +import org.apache.commons.text.StringEscapeUtils import org.hl7.fhir.instance.model.api.IBaseResource import org.hl7.fhir.r4.model.* +import org.hl7.fhir.r4.model.CapabilityStatement.TypeRestfulInteraction +import org.hl7.fhir.r4.model.CapabilityStatement.TypeRestfulInteraction.READ +import org.hl7.fhir.r4.model.CapabilityStatement.TypeRestfulInteraction.SEARCHTYPE import org.springframework.beans.factory.annotation.Qualifier import org.springframework.stereotype.Service +import java.util.* +import kotlin.math.log @Service -class VerifyOAS(@Qualifier("R4") private val ctx: FhirContext?, - @Qualifier("SupportChain") private val supportChain: IValidationSupport, - private val searchParameterSupport : SearchParameterSupport, - private val fhirValidator: FhirValidator, - private val messageDefinitionApplier: MessageDefinitionApplier, - private val capabilityStatementApplier: CapabilityStatementApplier) +class OASSupport(@Qualifier("R4") private val ctx: FhirContext?, + @Qualifier("SupportChain") private val supportChain: IValidationSupport, + private val searchParameterSupport : SearchParameterSupport, + private val fhirValidator: FhirValidator, + private val messageDefinitionApplier: MessageDefinitionApplier, + private val capabilityStatementApplier: CapabilityStatementApplier) { // var implementationGuideParser: ImplementationGuideParser? = ImplementationGuideParser(ctx!!) val objectMapper = ObjectMapper() + companion object : KLogging() + + fun convert(openAPI : OpenAPI) : CapabilityStatement { + var capabilityStatement = CapabilityStatement() + capabilityStatement.status = Enumerations.PublicationStatus.UNKNOWN + capabilityStatement.fhirVersion = Enumerations.FHIRVersion._4_0_1 + capabilityStatement.format.add(CodeType("application/fhir+json")) + capabilityStatement.kind = CapabilityStatement.CapabilityStatementKind.REQUIREMENTS + capabilityStatement.date = Date() + + var rest =CapabilityStatement.CapabilityStatementRestComponent() + rest.mode = CapabilityStatement.RestfulCapabilityMode.SERVER + capabilityStatement.rest.add(rest) + val outcomes = mutableListOf() + if (openAPI.info !== null) { + capabilityStatement.title = openAPI.info.title + capabilityStatement.description = escapeMarkdown(openAPI.info.description) + } + for (apiPaths in openAPI.paths) { + var path = apiPaths.key.removePrefix("/FHIR/R4") + path = path.removePrefix("/") + val paths = path.split("/") + var resourceType = paths[0] + var multiPathParameter : CapabilityStatement.CapabilityStatementRestResourceSearchParamComponent? = null + for(it in paths) { + if (!it.contains("{") && !it.contains("$")) { + if (it !== resourceType && resourceType.equals("Patient")) { + multiPathParameter = CapabilityStatement.CapabilityStatementRestResourceSearchParamComponent() + multiPathParameter.name = "patient" + val extension = Extension().setUrl("http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation") + extension.setValue(CodeType().setValue("SHALL")) + multiPathParameter.type = Enumerations.SearchParamType.TOKEN + multiPathParameter.extension.add(extension) + } + resourceType = it + } + } + + var resource : CapabilityStatement.CapabilityStatementRestResourceComponent? = null + + rest.resource.forEach { + if (it.type.equals(resourceType)) { + resource = it + } + } + if (resource == null) { + resource = CapabilityStatement.CapabilityStatementRestResourceComponent().setType(resourceType) + rest.addResource(resource) + } + var operation = "" + if (paths.size > 1) operation = paths[1] + if (paths[0].startsWith("$")) operation = paths[0] + + if (!resourceType.startsWith("$") && !resourceType.equals("metadata")) { + val codeSystem = supportChain.fetchCodeSystem("http://hl7.org/fhir/resource-types") + + } + if (operation.isNotEmpty() && operation.startsWith("$")) { + val operationDefinition = getOperationDefinition(operation) + + } + + // check all parameters + if (apiPaths.value.get != null && apiPaths.value.get.parameters != null) { + var hasParameters = false + for (apiParameter in apiPaths.value.get.parameters) { + if (apiParameter is QueryParameter) { + hasParameters = true + val searchParam = CapabilityStatement.CapabilityStatementRestResourceSearchParamComponent() + searchParam.name = apiParameter.name + if (apiParameter.description !== null) { + searchParam.documentation = escapeMarkdown(apiParameter.description) + } + if (apiParameter.required !== null && apiParameter.required) { + val extension = Extension().setUrl("http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation") + extension.setValue(CodeType().setValue("SHALL")) + searchParam.extension.add(extension) + } + + + when (apiParameter.schema.type) { + "string" -> { + searchParam.type = Enumerations.SearchParamType.STRING + } + "boolean" -> { + searchParam.type = Enumerations.SearchParamType.STRING + } + "integer" -> { + searchParam.type = Enumerations.SearchParamType.NUMBER + } + "array" -> { + searchParam.type = Enumerations.SearchParamType.STRING + } + else ->{ + logger.info(searchParam.name + " type= " + apiParameter.schema.type ) + searchParam.type = Enumerations.SearchParamType.STRING + } + } + + if (resource !== null) resource!!.searchParam.add(searchParam) + } + } + var interaction = CapabilityStatement.ResourceInteractionComponent() + if (hasParameters || multiPathParameter !== null ) { + interaction.setCode(SEARCHTYPE) + if (multiPathParameter !== null && resource !== null ) { + resource!!.searchParam.add(multiPathParameter) + } + + } else { + interaction.setCode(READ) + } + if (apiPaths.value.get.description !== null) interaction.documentation = escapeMarkdown(apiPaths.value.get.description) + resource?.interaction?.add(interaction) + + } + } + return capabilityStatement + } fun validate(openAPI : OpenAPI) : List { // check all examples validate @@ -391,4 +517,7 @@ class VerifyOAS(@Qualifier("R4") private val ctx: FhirContext?, return listOf(inputResource) } + fun escapeMarkdown(markdown : String ) : String { + return StringEscapeUtils.escapeHtml4(markdown) + } } diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/OpenAPIParser.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/OpenAPIParser.kt index 959eea0..c9c7ecf 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/OpenAPIParser.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/OpenAPIParser.kt @@ -18,6 +18,7 @@ import io.swagger.v3.oas.models.responses.ApiResponses import io.swagger.v3.oas.models.servers.Server import io.swagger.v3.oas.models.tags.Tag import org.apache.commons.lang3.StringUtils +import org.apache.commons.text.StringEscapeUtils import org.hl7.fhir.instance.model.api.IBaseResource import org.hl7.fhir.instance.model.api.IPrimitiveType import org.hl7.fhir.r4.model.* @@ -56,7 +57,7 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, cs = _cs val openApi = OpenAPI() openApi.info = Info() - openApi.info.description = cs.description + openApi.info.description = unescapeMarkdown(cs.description) if (openApi.info.description == null) openApi.info.description = "" openApi.info.title = cs.software.name openApi.info.version = cs.software.version @@ -454,6 +455,10 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, } } + fun unescapeMarkdown(markdown : String ) : String { + return StringEscapeUtils.unescapeHtml4(markdown) + } + private fun addJSONSchema(openApi: OpenAPI) { // Add schema @@ -700,7 +705,7 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, theOperation.addTagsItem(theResourceType) } theOperation.summary = theOperationDefinition!!.title - theOperation.description = theOperationDefinition.description + theOperation.description = unescapeMarkdown(theOperationDefinition.description) if (theOperationComponent.hasExtension("https://fhir.nhs.uk/StructureDefinition/Extension-NHSDigital-CapabilityStatement-Examples")) { // val exampleOperation = getOperationResponeExample(theOperationComponent) @@ -734,7 +739,7 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, theOperation.addParametersItem(parametersItem) parametersItem.name = nextParameter.name parametersItem.setIn("query") - parametersItem.description = nextParameter.documentation + parametersItem.description = unescapeMarkdown(nextParameter.documentation) parametersItem.style = Parameter.StyleEnum.SIMPLE parametersItem.required = nextParameter.min > 0 val exampleExtensions = nextParameter.getExtensionsByUrl(HapiExtensions.EXT_OP_PARAMETER_EXAMPLE_VALUE) @@ -928,7 +933,7 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, theOperation.description += outDoc } if (theOperationDefinition.hasComment()) { - theOperation.description += "\n\n ## Comment \n\n"+theOperationDefinition.comment + theOperation.description += "\n\n ## Comment \n\n"+unescapeMarkdown(theOperationDefinition.comment) } if (theOperationDefinition.url.equals("http://hl7.org/fhir/OperationDefinition/MessageHeader-process-message") || theOperationDefinition.url.equals("https://fhir.nhs.uk/OperationDefinition/MessageHeader-process-message")) { @@ -1151,7 +1156,7 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, if (resourceChain is MessageDefinition) { if (resourceChain.url == supportedMessage.definition) { if (resourceChain.hasDescription()) { - example.summary = resourceChain.description + example.summary = unescapeMarkdown(resourceChain.description) } if (resourceChain.hasPurpose()) { supportedDocumentation += "\n ### Purpose" + resourceChain.purpose @@ -1196,7 +1201,7 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, example.value = ctx?.newJsonParser()?.encodeResourceToString(messageExample?.get()) } } - example.description = supportedDocumentation + example.description = unescapeMarkdown(supportedDocumentation) return example } @@ -1251,7 +1256,7 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, exampleOAS.summary = (exampleExt.getExtensionString("summary") as String) } if (exampleExt.hasExtension("description")) { - exampleOAS.description = (exampleExt.getExtensionString("description") as String) + exampleOAS.description = unescapeMarkdown((exampleExt.getExtensionString("description") as String)) } } } @@ -1575,7 +1580,7 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, var description = "" if (searchParameter?.description != null) { - var desc = searchParameter.description + var desc = unescapeMarkdown(searchParameter.description) if (desc.split("*").size>1) { val exps = desc.split("*") for (exp in exps) { @@ -1751,7 +1756,7 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, if (structureDefinition is StructureDefinition) { if (structureDefinition.hasDescription()) { - schema.description += "\n\n " + structureDefinition.description + schema.description += "\n\n " + unescapeMarkdown(structureDefinition.description) } if (structureDefinition.hasPurpose()) { schema.description += "\n\n " + structureDefinition.purpose @@ -1788,7 +1793,7 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, } if (elementSchema != null) { - elementSchema.description = getElementDescription(element) + elementSchema.description = unescapeMarkdown(getElementDescription(element)) if (element.hasMin()) elementSchema.minimum = BigDecimal(element.min) diff --git a/src/main/resources/OAS/Proxy-api.yaml b/src/main/resources/OAS/Proxy-api.yaml new file mode 100644 index 0000000..c256dc8 --- /dev/null +++ b/src/main/resources/OAS/Proxy-api.yaml @@ -0,0 +1,318 @@ +openapi: 3.0.0 +info: + version: 1.0.11 + title: Validated Relationship Service + description: This is an Open API specification for the Validated Relationship Service. +paths: + /RelatedPerson: + get: + summary: Get relationships. + parameters: + - $ref: "#/components/parameters/BearerAuthorisation" + - $ref: "#/components/parameters/proxyID" + - $ref: "#/components/parameters/patientID" + - $ref: "#/components/parameters/RequestID" + - $ref: "#/components/parameters/CorrelationID" + responses: + "200": + description: Successful retrieval. + content: + application/json: + schema: + $ref: "#/components/schemas/Relationship" + "4XX": + description: | + Bad request. + + | HTTP status | Error code | Description | + | ----------- | -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | + | 400 | `INVALID_PROXY_IDENTIFIER` | Missing or malformed proxy NHS number. | + | 400 | `INVALID_PATIENT_IDENTIFIER` | Missing or malformed patient NHS number. | + | 400 | `NOT_SUPPORTED` | The request is not currently supported. | + | 401 | `ACCESS_DENIED` | Missing or invalid OAuth 2.0 bearer token in request. | + | 408 | `TIMEOUT` | Request timed out. | + | 429 | `THROTTLED` | You have exceeded your application's [rate limit](https://digital.nhs.uk/developer/guides-and-documentation/reference-guide#rate-limits). | + "500": + description: | + Server error. + + | HTTP status | Error code | Description | + | ----------- | -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | + | 500 | `SERVER_ERROR` | An internal error has occurred when processing the request. | + +components: + schemas: + Relationship: + type: object + description: A FHIR searchset. + properties: + resourceType: + type: string + description: FHIR resource type. + enum: [Bundle] + type: + type: string + description: Denotes that the Bundle is a collection of resources returned as a result of a search. + enum: [searchset] + timestamp: + type: string + description: The time the search results were returned. + example: "2020-08-26T14:00:00+00:00" + total: + type: number + description: | + The number of resources contained within the Bundle. + + An empty bundle suggests that the proxy does not have patients they can act on behalf of. + example: 2 + entry: + type: array + description: | + A collection of resources contained within the Bundle. + + An empty bundle suggests that the proxy does not have patients they can act on behalf of. + items: + anyOf: + - $ref: "#/components/schemas/RelatedPerson" + - $ref: "#/components/schemas/Patient" + + RelatedPerson: + type: object + description: The proxy's details. This includes their relationship to the referenced patient. + properties: + resource: + type: object + properties: + resourceType: + type: string + description: FHIR resource type. + enum: [RelatedPerson] + identifier: + type: array + description: The proxy's NHS number. + items: + type: object + properties: + system: + type: string + description: Codesystem URL for the proxy's NHS number. + enum: ["https://fhir.nhs.uk/Id/nhs-number"] + value: + type: string + description: The proxy's NHS number. + example: "9449304130" + patient: + type: object + description: A reference to a patient the proxy is related to. + properties: + type: + type: string + description: FHIR resource type. + enum: ["Patient"] + identifier: + type: object + description: The patient's NHS number. + example: "9459304130" + relationship: + type: array + description: How the proxy is related to the patient. + items: + type: object + properties: + coding: + type: array + description: FHIR coding array. + items: + type: object + properties: + system: + type: string + description: FHIR codesystem. + enum: + [ + "https://fhir.nhs.uk/R4/CodeSystem/UKCore-AdditionalRelatedPersonRole", + ] + code: + type: string + description: FHIR relationship type code. + enum: + - "MTH" + display: + type: string + description: FHIR relationship type. + enum: + - "MOTHER" + Patient: + type: object + description: The patient's details. + properties: + resourceType: + type: string + description: FHIR resource type. + enum: [Patient] + identifier: + type: array + description: The patient's NHS number. + items: + type: object + properties: + system: + type: string + description: Codesystem URL for the NHS number. + enum: ["https://fhir.nhs.uk/Id/nhs-number"] + value: + type: string + description: The NHS number. + example: "9000000009" + name: + type: array + description: List of names associated with the patient. + items: + type: object + required: + - use + - family + additionalProperties: false + properties: + id: + type: string + description: Unique object identifier for this name. + example: "123" + use: + type: string + description: | + How this name should be used. + * usual - Known as, conventional or the one patient normally uses. A patient always has a usual name. + * temp - An alias or temporary name. This may also be used for temporary names assigned at birth or in emergency situations. + * nickname - A name that the patient prefers to be addressed by, but is not part of their usual name. + * old - This name is no longer in use (or was never correct, but retained for records). + * maiden - Name changed for Marriage. A name used prior to changing name because of marriage. This term is not gender specific. The use of this term does not imply any particular history for a person's name. + + The following use codes are included in the [name-use](https://www.hl7.org/fhir/valueset-name-use.html) value set, but should not be used and is not be returned as part of a retrieval. + * official - The formal name as registered in an official (government) registry, but which name might not be commonly used. May be called "legal name". + * anonymous - Anonymous assigned name, alias, or pseudonym (used to protect a person's identity for privacy reasons). + enum: [usual, temp, nickname, old, maiden] + example: usual + period: + type: object + description: | + Business effective period when the name was, is, or will be in use. + required: + - start + properties: + start: + type: string + format: date + description: Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date. + example: 2020-01-01 + end: + type: string + format: date + description: End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date. + example: 2021-12-31 + given: + type: array + maxItems: 5 + description: | + Given names, including any middle names. + + Each name(s) should be a separate item in the list. The first given name may include multiple names, separated by a space. + Subsequent names must be broken down into list items. For example, the input `[Jane Marie Anne, Jo Adele]` returns `[Jane Marie Anne, Jo, Adele]`. + + example: [Jane Marie Anne] + items: + type: string + maxLength: 35 + example: Jane + family: + type: string + maxLength: 35 + description: Family name (often called Surname). + example: Smith + prefix: + type: array + description: Name prefixes, titles, and prenominals. + example: [Mrs] + items: + type: string + example: Mrs + suffix: + type: array + description: Name suffices and postnominals. + example: [MBE, PhD] + items: + type: string + example: MBE + birthDate: + description: | + The date on which the patient was born or is officially deemed to have been born. + + It is a date in the format `yyyy-mm-dd`. Due to data quality issues on a small number of patients `yyyy-mm` and `yyyy` format may also be returned. + example: "2010-10-22" + type: string + format: date + + parameters: + proxyID: + in: query + name: identifier + description: | + The proxy's NHS number. + required: false + schema: + type: string + examples: + withoutSystem: + value: "9000000009" + summary: "NHS number specified without system" + withSystem: + value: "https://fhir.nhs.uk/Id/nhs-number/9000000009" + summary: "System and NHS number specified" + + patientID: + in: query + name: patient:identifier + description: | + The patient's NHS number. + required: false + schema: + type: string + examples: + withoutSystem: + value: "9000000009" + summary: "NHS number specified without system" + withSystem: + value: "https://fhir.nhs.uk/Id/nhs-number/9000000009" + summary: "System and NHS number specified" + BearerAuthorisation: + in: header + name: Authorisation + description: | + An [OAuth 2.0 bearer token](https://digital.nhs.uk/developer/guides-and-documentation/security-and-authorisation#user-restricted-apis). + required: true + schema: + type: string + format: '^Bearer\ [[:ascii:]]+$' + example: "Bearer g1112R_ccQ1Ebbb4gtHBP1aaaNM" + RequestID: + in: header + name: X-Request-ID + required: true + description: | + A globally unique identifier (GUID) for the request, which we use to correlate logs through different components. + Must be a universally unique identifier (UUID) (ideally version 4). + Mirrored back in a response header. + schema: + type: string + pattern: "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$" + example: 60E0B220-8136-4CA5-AE46-1D97EF59D068 + CorrelationID: + in: header + name: X-Correlation-ID + required: false + description: | + An optional ID which you can use to track transactions across multiple systems. It can have any value, but we recommend avoiding `.` characters. + Mirrored back in a response header. + schema: + type: string + example: 11C46F5F-CDEF-4865-94B2-0EE0EDCC26DA diff --git a/src/main/resources/OAS/proxy-api.json b/src/main/resources/OAS/proxy-api.json new file mode 100644 index 0000000..86ebf21 --- /dev/null +++ b/src/main/resources/OAS/proxy-api.json @@ -0,0 +1,431 @@ +{ + "openapi" : "3.0.0", + "info" : { + "title" : "Validated Relationship Service", + "description" : "This is an Open API specification for the Validated Relationship Service.", + "version" : "1.0.11" + }, + "servers" : [ { + "url" : "/" + } ], + "paths" : { + "/RelatedPerson" : { + "get" : { + "summary" : "Get relationships.", + "parameters" : [ { + "name" : "Authorisation", + "in" : "header", + "description" : "An [OAuth 2.0 bearer token](https:\n", + "required" : true, + "style" : "simple", + "explode" : false, + "schema" : { + "type" : "string", + "format" : "^Bearer\\ [[:ascii:]]+$", + "example" : "Bearer g1112R_ccQ1Ebbb4gtHBP1aaaNM" + } + }, { + "name" : "identifier", + "in" : "query", + "description" : "The proxy's NHS number.\n", + "required" : false, + "style" : "form", + "explode" : true, + "schema" : { + "type" : "string" + }, + "examples" : { + "withoutSystem" : { + "summary" : "NHS number specified without system", + "value" : "9000000009" + }, + "withSystem" : { + "summary" : "System and NHS number specified", + "value" : "https://fhir.nhs.uk/Id/nhs-number/9000000009" + } + } + }, { + "name" : "patient:identifier", + "in" : "query", + "description" : "The patient's NHS number.\n", + "required" : false, + "style" : "form", + "explode" : true, + "schema" : { + "type" : "string" + }, + "examples" : { + "withoutSystem" : { + "summary" : "NHS number specified without system", + "value" : "9000000009" + }, + "withSystem" : { + "summary" : "System and NHS number specified", + "value" : "https://fhir.nhs.uk/Id/nhs-number/9000000009" + } + } + }, { + "name" : "X-Request-ID", + "in" : "header", + "description" : "A globally unique identifier (GUID) for the request, which we use to correlate logs through different components.\nMust be a universally unique identifier (UUID) (ideally version 4).\nMirrored back in a response header.\n", + "required" : true, + "style" : "simple", + "explode" : false, + "schema" : { + "pattern" : "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + "type" : "string", + "example" : "60E0B220-8136-4CA5-AE46-1D97EF59D068" + } + }, { + "name" : "X-Correlation-ID", + "in" : "header", + "description" : "An optional ID which you can use to track transactions across multiple systems. It can have any value, but we recommend avoiding `.` characters.\nMirrored back in a response header.\n", + "required" : false, + "style" : "simple", + "explode" : false, + "schema" : { + "type" : "string", + "example" : "11C46F5F-CDEF-4865-94B2-0EE0EDCC26DA" + } + } ], + "responses" : { + "200" : { + "description" : "Successful retrieval.", + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/Relationship" + } + } + } + }, + "4XX" : { + "description" : "Bad request.\n\n| HTTP status | Error code | Description |\n| ----------- | -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |\n| 400 | `INVALID_PROXY_IDENTIFIER` | Missing or malformed proxy NHS number. |\n| 400 | `INVALID_PATIENT_IDENTIFIER` | Missing or malformed patient NHS number. |\n| 400 | `NOT_SUPPORTED` | The request is not currently supported. |\n| 401 | `ACCESS_DENIED` | Missing or invalid OAuth 2.0 bearer token in request. |\n| 408 | `TIMEOUT` | Request timed out. |\n| 429 | `THROTTLED` | You have exceeded your application's [rate limit](https:\n" + }, + "500" : { + "description" : "Server error.\n\n| HTTP status | Error code | Description |\n| ----------- | -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |\n| 500 | `SERVER_ERROR` | An internal error has occurred when processing the request. |\n" + } + } + } + } + }, + "components" : { + "schemas" : { + "Relationship" : { + "type" : "object", + "properties" : { + "resourceType" : { + "type" : "string", + "description" : "FHIR resource type.", + "enum" : [ "Bundle" ] + }, + "type" : { + "type" : "string", + "description" : "Denotes that the Bundle is a collection of resources returned as a result of a search.", + "enum" : [ "searchset" ] + }, + "timestamp" : { + "type" : "string", + "description" : "The time the search results were returned.", + "example" : "2020-08-26T14:00:00+00:00" + }, + "total" : { + "type" : "number", + "description" : "The number of resources contained within the Bundle. \n\nAn empty bundle suggests that the proxy does not have patients they can act on behalf of.\n", + "example" : 2 + }, + "entry" : { + "type" : "array", + "description" : "A collection of resources contained within the Bundle.\n\nAn empty bundle suggests that the proxy does not have patients they can act on behalf of.\n", + "items" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/RelatedPerson" + }, { + "$ref" : "#/components/schemas/Patient" + } ] + } + } + }, + "description" : "A FHIR searchset." + }, + "RelatedPerson" : { + "type" : "object", + "properties" : { + "resource" : { + "type" : "object", + "properties" : { + "resourceType" : { + "type" : "string", + "description" : "FHIR resource type.", + "enum" : [ "RelatedPerson" ] + }, + "identifier" : { + "type" : "array", + "description" : "The proxy's NHS number.", + "items" : { + "type" : "object", + "properties" : { + "system" : { + "type" : "string", + "description" : "Codesystem URL for the proxy's NHS number.", + "enum" : [ "https://fhir.nhs.uk/Id/nhs-number" ] + }, + "value" : { + "type" : "string", + "description" : "The proxy's NHS number.", + "example" : "9449304130" + } + } + } + }, + "patient" : { + "type" : "object", + "properties" : { + "type" : { + "type" : "string", + "description" : "FHIR resource type.", + "enum" : [ "Patient" ] + }, + "identifier" : { + "type" : "object", + "description" : "The patient's NHS number.", + "example" : "9459304130" + } + }, + "description" : "A reference to a patient the proxy is related to." + }, + "relationship" : { + "type" : "array", + "description" : "How the proxy is related to the patient.", + "items" : { + "type" : "object", + "properties" : { + "coding" : { + "type" : "array", + "description" : "FHIR coding array.", + "items" : { + "type" : "object", + "properties" : { + "system" : { + "type" : "string", + "description" : "FHIR codesystem.", + "enum" : [ "https://fhir.nhs.uk/R4/CodeSystem/UKCore-AdditionalRelatedPersonRole" ] + }, + "code" : { + "type" : "string", + "description" : "FHIR relationship type code.", + "enum" : [ "MTH" ] + }, + "display" : { + "type" : "string", + "description" : "FHIR relationship type.", + "enum" : [ "MOTHER" ] + } + } + } + } + } + } + } + } + } + }, + "description" : "The proxy's details. This includes their relationship to the referenced patient." + }, + "Patient" : { + "type" : "object", + "properties" : { + "resourceType" : { + "type" : "string", + "description" : "FHIR resource type.", + "enum" : [ "Patient" ] + }, + "identifier" : { + "type" : "array", + "description" : "The patient's NHS number.", + "items" : { + "type" : "object", + "properties" : { + "system" : { + "type" : "string", + "description" : "Codesystem URL for the NHS number.", + "enum" : [ "https://fhir.nhs.uk/Id/nhs-number" ] + }, + "value" : { + "type" : "string", + "description" : "The NHS number.", + "example" : "9000000009" + } + } + } + }, + "name" : { + "type" : "array", + "description" : "List of names associated with the patient.", + "items" : { + "required" : [ "family", "use" ], + "type" : "object", + "properties" : { + "id" : { + "type" : "string", + "description" : "Unique object identifier for this name.", + "example" : "123" + }, + "use" : { + "type" : "string", + "description" : "How this name should be used.\n* usual - Known as, conventional or the one patient normally uses. A patient always has a usual name.\n* temp - An alias or temporary name. This may also be used for temporary names assigned at birth or in emergency situations.\n* nickname - A name that the patient prefers to be addressed by, but is not part of their usual name.\n* old - This name is no longer in use (or was never correct, but retained for records).\n* maiden - Name changed for Marriage. A name used prior to changing name because of marriage. This term is not gender specific. The use of this term does not imply any particular history for a person's name.\n\nThe following use codes are included in the [name-use](https:\n* official - The formal name as registered in an official (government) registry, but which name might not be commonly used. May be called \"legal name\".\n* anonymous - Anonymous assigned name, alias, or pseudonym (used to protect a person's identity for privacy reasons).\n", + "example" : "usual", + "enum" : [ "usual", "temp", "nickname", "old", "maiden" ] + }, + "period" : { + "required" : [ "start" ], + "type" : "object", + "properties" : { + "start" : { + "type" : "string", + "description" : "Start date of time period, if known, in format `yyyy-mm-dd`. Can be a future date.", + "format" : "date", + "example" : "2020-01-01" + }, + "end" : { + "type" : "string", + "description" : "End date of time period, if known and if not ongoing, in format `yyyy-mm-dd`. Can be a future date.", + "format" : "date", + "example" : "2021-12-31" + } + }, + "description" : "Business effective period when the name was, is, or will be in use.\n" + }, + "given" : { + "maxItems" : 5, + "type" : "array", + "description" : "Given names, including any middle names.\n\nEach name(s) should be a separate item in the list. The first given name may include multiple names, separated by a space.\nSubsequent names must be broken down into list items. For example, the input `[Jane Marie Anne, Jo Adele]` returns `[Jane Marie Anne, Jo, Adele]`.\n", + "example" : [ "Jane Marie Anne" ], + "items" : { + "maxLength" : 35, + "type" : "string", + "example" : "Jane" + } + }, + "family" : { + "maxLength" : 35, + "type" : "string", + "description" : "Family name (often called Surname).", + "example" : "Smith" + }, + "prefix" : { + "type" : "array", + "description" : "Name prefixes, titles, and prenominals.", + "example" : [ "Mrs" ], + "items" : { + "type" : "string", + "example" : "Mrs" + } + }, + "suffix" : { + "type" : "array", + "description" : "Name suffices and postnominals.", + "example" : [ "MBE", "PhD" ], + "items" : { + "type" : "string", + "example" : "MBE" + } + } + }, + "additionalProperties" : false + } + }, + "birthDate" : { + "type" : "string", + "description" : "The date on which the patient was born or is officially deemed to have been born.\n\nIt is a date in the format `yyyy-mm-dd`. Due to data quality issues on a small number of patients `yyyy-mm` and `yyyy` format may also be returned.\n", + "format" : "date", + "example" : "2010-10-22" + } + }, + "description" : "The patient's details." + } + }, + "parameters" : { + "proxyID" : { + "name" : "identifier", + "in" : "query", + "description" : "The proxy's NHS number.\n", + "required" : false, + "style" : "form", + "explode" : true, + "schema" : { + "type" : "string" + }, + "examples" : { + "withoutSystem" : { + "summary" : "NHS number specified without system", + "value" : "9000000009" + }, + "withSystem" : { + "summary" : "System and NHS number specified", + "value" : "https://fhir.nhs.uk/Id/nhs-number/9000000009" + } + } + }, + "patientID" : { + "name" : "patient:identifier", + "in" : "query", + "description" : "The patient's NHS number.\n", + "required" : false, + "style" : "form", + "explode" : true, + "schema" : { + "type" : "string" + }, + "examples" : { + "withoutSystem" : { + "summary" : "NHS number specified without system", + "value" : "9000000009" + }, + "withSystem" : { + "summary" : "System and NHS number specified", + "value" : "https://fhir.nhs.uk/Id/nhs-number/9000000009" + } + } + }, + "BearerAuthorisation" : { + "name" : "Authorisation", + "in" : "header", + "description" : "An [OAuth 2.0 bearer token](https:\n", + "required" : true, + "style" : "simple", + "explode" : false, + "schema" : { + "type" : "string", + "format" : "^Bearer\\ [[:ascii:]]+$", + "example" : "Bearer g1112R_ccQ1Ebbb4gtHBP1aaaNM" + } + }, + "RequestID" : { + "name" : "X-Request-ID", + "in" : "header", + "description" : "A globally unique identifier (GUID) for the request, which we use to correlate logs through different components.\nMust be a universally unique identifier (UUID) (ideally version 4).\nMirrored back in a response header.\n", + "required" : true, + "style" : "simple", + "explode" : false, + "schema" : { + "pattern" : "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + "type" : "string", + "example" : "60E0B220-8136-4CA5-AE46-1D97EF59D068" + } + }, + "CorrelationID" : { + "name" : "X-Correlation-ID", + "in" : "header", + "description" : "An optional ID which you can use to track transactions across multiple systems. It can have any value, but we recommend avoiding `.` characters.\nMirrored back in a response header.\n", + "required" : false, + "style" : "simple", + "explode" : false, + "schema" : { + "type" : "string", + "example" : "11C46F5F-CDEF-4865-94B2-0EE0EDCC26DA" + } + } + } + } +} diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index a6b5033..e366b10 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -17,7 +17,7 @@ fhir: server: name: NHS England Interoperability Standards FHIR Testing baseUrl: https://3cdzg7kbj4.execute-api.eu-west-2.amazonaws.com/poc/Conformance - version: 6.10.14 + version: 6.10.15 services: R4: true diff --git a/src/main/resources/manifest.json b/src/main/resources/manifest.json index 4802a4d..85395bc 100644 --- a/src/main/resources/manifest.json +++ b/src/main/resources/manifest.json @@ -6,5 +6,25 @@ { "packageName": "fhir.r4.nhsengland.stu1", "version": "1.1.0" + }, + { + "packageName": "hl7.fhir.uv.ips", + "version": "1.1.0" + }, + { + "packageName": "hl7.fhir.uv.sdc", + "version": "3.0.0" + }, + { + "packageName": "hl7.fhir.uv.ipa", + "version": "1.0.0" + }, + { + "packageName": "hl7.fhir.eu.laboratory", + "version": "0.1.0-ballot" + }, + { + "packageName": "uk.nhsengland.r4", + "version": "0.0.0-prerelease" } ] diff --git a/src/test/kotlin/uk/nhs/england/fhirvalidator/controller/ValidateControllerTest.kt b/src/test/kotlin/uk/nhs/england/fhirvalidator/controller/ValidateControllerTest.kt index f4db844..a26c122 100644 --- a/src/test/kotlin/uk/nhs/england/fhirvalidator/controller/ValidateControllerTest.kt +++ b/src/test/kotlin/uk/nhs/england/fhirvalidator/controller/ValidateControllerTest.kt @@ -6,15 +6,10 @@ import ca.uhn.fhir.validation.FhirValidator import uk.nhs.england.fhirvalidator.service.CapabilityStatementApplier import uk.nhs.england.fhirvalidator.service.MessageDefinitionApplier import org.hl7.fhir.r4.model.Bundle -import org.hl7.fhir.r4.model.Patient -import org.junit.jupiter.api.Assertions.* -import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith -import org.mockito.InjectMocks import org.mockito.Mock import org.mockito.junit.jupiter.MockitoExtension -import org.springframework.beans.factory.annotation.Qualifier -import uk.nhs.england.fhirvalidator.service.VerifyOAS +import uk.nhs.england.fhirvalidator.service.OASSupport @ExtendWith(MockitoExtension::class) internal class ValidateControllerTest { @@ -37,7 +32,7 @@ internal class ValidateControllerTest { lateinit var mockSearchParameters : Bundle @Mock - lateinit var verifyOAS: VerifyOAS + lateinit var OASSupport: OASSupport /* @Test From 918fcfa73dce64689167b80f95ce616216b29d93 Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Wed, 24 Jan 2024 08:28:03 +0000 Subject: [PATCH 33/67] Support for FHIR RESTful --- aws-repo-notes.txt | 4 +- pom.xml | 2 +- .../configuration/OpenApiConfig.kt | 2 +- .../CapabilityStatementApplier.kt | 2 +- .../interceptor/ValidationInterceptor.kt | 3 +- .../provider/CapabilityStatementProvider.kt | 7 +- .../provider/FHIRtoTextProvider.kt | 2 - .../provider/MarkdownProvider.kt | 4 +- .../fhirvalidator/provider/OpenAPIProvider.kt | 8 +- .../provider/ValidateR4Provider.kt | 29 +- .../FHIRDocument.kt} | 4 +- .../FHIRMessage.kt} | 5 +- .../service/interactions/FHIRRESTful.kt | 170 ++++++++ ...CapabilityStatementToOpenAPIConversion.kt} | 371 +++++++++--------- ...OpenAPItoCapabilityStatementConversion.kt} | 52 ++- src/main/resources/application.yaml | 2 +- .../controller/ValidateControllerTest.kt | 10 +- 17 files changed, 439 insertions(+), 238 deletions(-) rename src/main/kotlin/uk/nhs/england/fhirvalidator/{service => interceptor}/CapabilityStatementApplier.kt (97%) rename src/main/kotlin/uk/nhs/england/fhirvalidator/service/{FHIRDocumentApplier.kt => interactions/FHIRDocument.kt} (94%) rename src/main/kotlin/uk/nhs/england/fhirvalidator/service/{MessageDefinitionApplier.kt => interactions/FHIRMessage.kt} (96%) create mode 100644 src/main/kotlin/uk/nhs/england/fhirvalidator/service/interactions/FHIRRESTful.kt rename src/main/kotlin/uk/nhs/england/fhirvalidator/service/{OpenAPIParser.kt => oas/CapabilityStatementToOpenAPIConversion.kt} (90%) rename src/main/kotlin/uk/nhs/england/fhirvalidator/service/{OASSupport.kt => oas/OpenAPItoCapabilityStatementConversion.kt} (92%) diff --git a/aws-repo-notes.txt b/aws-repo-notes.txt index aa53368..1304530 100644 --- a/aws-repo-notes.txt +++ b/aws-repo-notes.txt @@ -23,9 +23,9 @@ mvn clean install docker build -t fhir-validator-r4 . docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest -docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.15 +docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.16 -docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.15 +docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.16 docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest diff --git a/pom.xml b/pom.xml index 4a2fc9b..77a2f3e 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ uk.nhs.england IOPS-FHIR-Validation-Service - 6.10.15 + 6.10.16 IOPS-FHIR-Validation-Service HAPI FHIR Validator using Spring Boot diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt index 1c569d6..f61d9be 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt @@ -767,7 +767,7 @@ open class OpenApiConfig(@Qualifier("R4") val ctx : FhirContext, .addTagsItem(UTILITY) .summary("Converts a FHIR CapabilityStatement to openapi v3 format") .addParametersItem(Parameter() - .name("addFHIRExtras") + .name("enhance") .`in`("query") .required(false) .style(Parameter.StyleEnum.SIMPLE) diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/CapabilityStatementApplier.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/CapabilityStatementApplier.kt similarity index 97% rename from src/main/kotlin/uk/nhs/england/fhirvalidator/service/CapabilityStatementApplier.kt rename to src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/CapabilityStatementApplier.kt index 23f22b0..22dff57 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/CapabilityStatementApplier.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/CapabilityStatementApplier.kt @@ -1,4 +1,4 @@ -package uk.nhs.england.fhirvalidator.service +package uk.nhs.england.fhirvalidator.interceptor import org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain import uk.nhs.england.fhirvalidator.util.applyProfile diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/ValidationInterceptor.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/ValidationInterceptor.kt index 10ee054..6b9e29c 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/ValidationInterceptor.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/ValidationInterceptor.kt @@ -56,8 +56,7 @@ class ValidationInterceptor(val ctx : FhirContext, val messageProperties: Messag for (issue in validationResult.issue) { if (issue.hasSeverity() && ( issue.severity.equals(OperationOutcome.IssueSeverity.ERROR) || - issue.severity.equals(OperationOutcome.IssueSeverity.FATAL) || - issue.severity.equals(OperationOutcome.IssueSeverity.WARNING) + issue.severity.equals(OperationOutcome.IssueSeverity.FATAL) )) { log.debug(issue.diagnostics) fail(validationResult) diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/CapabilityStatementProvider.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/CapabilityStatementProvider.kt index 8fbc54c..b48ed5c 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/CapabilityStatementProvider.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/CapabilityStatementProvider.kt @@ -6,7 +6,6 @@ import ca.uhn.fhir.rest.param.TokenParam import ca.uhn.fhir.rest.server.IResourceProvider import io.swagger.util.Yaml import io.swagger.v3.core.util.Json -import org.apache.commons.io.IOUtils import org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain import org.hl7.fhir.instance.model.api.IBaseResource import org.hl7.fhir.r4.model.BooleanType @@ -15,14 +14,14 @@ import org.hl7.fhir.r4.model.CapabilityStatement import org.springframework.beans.factory.annotation.Qualifier import org.springframework.stereotype.Component import uk.nhs.england.fhirvalidator.service.ImplementationGuideParser -import uk.nhs.england.fhirvalidator.service.OpenAPIParser +import uk.nhs.england.fhirvalidator.service.oas.CapabilityStatementToOpenAPIConversion import java.nio.charset.StandardCharsets import javax.servlet.http.HttpServletRequest import javax.servlet.http.HttpServletResponse @Component class CapabilityStatementProvider(@Qualifier("R4") private val fhirContext: FhirContext, - private val oasParser : OpenAPIParser, + private val oasParser : CapabilityStatementToOpenAPIConversion, private val supportChain: ValidationSupportChain) : IResourceProvider { /** * The getResourceType method comes from IResourceProvider, and must @@ -50,7 +49,7 @@ class CapabilityStatementProvider(@Qualifier("R4") private val fhirContext: Fhir servletRequest: HttpServletRequest, servletResponse: HttpServletResponse, @ResourceParam inputResource: IBaseResource, - @OperationParam(name = "addFHIRExtras") abstract: BooleanType?, + @OperationParam(name = "enhance") abstract: BooleanType?, ) { // var input = IOUtils.toString(servletRequest.getReader()); diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/FHIRtoTextProvider.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/FHIRtoTextProvider.kt index 12d639c..4f95879 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/FHIRtoTextProvider.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/FHIRtoTextProvider.kt @@ -6,14 +6,12 @@ import ca.uhn.fhir.context.support.ValidationSupportContext import ca.uhn.fhir.model.api.IElement import ca.uhn.fhir.rest.annotation.Operation import ca.uhn.fhir.rest.annotation.ResourceParam -import ca.uhn.fhir.rest.server.exceptions.UnprocessableEntityException import org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain import org.hl7.fhir.instance.model.api.IBaseResource import org.hl7.fhir.r4.model.* import org.springframework.beans.factory.annotation.Qualifier import org.springframework.stereotype.Component import uk.nhs.england.fhirvalidator.service.CodingSupport -import uk.nhs.england.fhirvalidator.service.OpenAPIParser import java.net.URI import java.nio.charset.StandardCharsets import java.text.SimpleDateFormat diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/MarkdownProvider.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/MarkdownProvider.kt index 51a8880..bda632c 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/MarkdownProvider.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/MarkdownProvider.kt @@ -5,14 +5,14 @@ import ca.uhn.fhir.rest.annotation.OperationParam import ca.uhn.fhir.rest.param.StringParam import mu.KLogging import org.springframework.stereotype.Component -import uk.nhs.england.fhirvalidator.service.OpenAPIParser +import uk.nhs.england.fhirvalidator.service.oas.CapabilityStatementToOpenAPIConversion import java.nio.charset.StandardCharsets import javax.servlet.http.HttpServletRequest import javax.servlet.http.HttpServletResponse @Component class MarkdownProvider ( - private val oasParser : OpenAPIParser + private val oasParser : CapabilityStatementToOpenAPIConversion ) { companion object : KLogging() diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/OpenAPIProvider.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/OpenAPIProvider.kt index f9bf5ce..f355202 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/OpenAPIProvider.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/OpenAPIProvider.kt @@ -12,7 +12,7 @@ import org.hl7.fhir.r4.model.CapabilityStatement import org.hl7.fhir.r4.model.OperationOutcome import org.springframework.beans.factory.annotation.Qualifier import org.springframework.stereotype.Component -import uk.nhs.england.fhirvalidator.service.OASSupport +import uk.nhs.england.fhirvalidator.service.oas.OpenAPItoCapabilityStatementConversion import uk.nhs.england.fhirvalidator.util.createOperationOutcome import javax.servlet.http.HttpServletRequest import javax.servlet.http.HttpServletResponse @@ -21,7 +21,7 @@ import javax.servlet.http.HttpServletResponse @Component class OpenAPIProvider(@Qualifier("R4") private val fhirContext: FhirContext, - private val OASSupport: OASSupport + private val openAPItoCapabilityStatementConversion: OpenAPItoCapabilityStatementConversion ) { @Operation(name = "convertOAS", idempotent = true,manualResponse=true, manualRequest=true) @@ -45,7 +45,7 @@ class OpenAPIProvider(@Qualifier("R4") private val fhirContext: FhirContext, var input = IOUtils.toString(servletRequest.getReader()); var openAPI : OpenAPI? = null openAPI = OpenAPIV3Parser().readContents(input).openAPI - var capabilityStatement = OASSupport.convert(openAPI) + var capabilityStatement = openAPItoCapabilityStatementConversion.convert(openAPI) return capabilityStatement } @@ -90,7 +90,7 @@ class OpenAPIProvider(@Qualifier("R4") private val fhirContext: FhirContext, if (openAPI !=null) { - val results = OASSupport.validate(openAPI) + val results = openAPItoCapabilityStatementConversion.validate(openAPI) var outcome = createOperationOutcome(results) if (oasResult !== null && oasResult.getMessages() != null) { oasResult.getMessages().forEach({ diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/ValidateR4Provider.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/ValidateR4Provider.kt index fefadd8..bd967d5 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/ValidateR4Provider.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/ValidateR4Provider.kt @@ -17,9 +17,10 @@ import org.hl7.fhir.r4.model.OperationOutcome.OperationOutcomeIssueComponent import org.hl7.fhir.r4.utils.FHIRPathEngine import org.springframework.beans.factory.annotation.Qualifier import org.springframework.stereotype.Component -import uk.nhs.england.fhirvalidator.service.CapabilityStatementApplier -import uk.nhs.england.fhirvalidator.service.FHIRDocumentApplier -import uk.nhs.england.fhirvalidator.service.MessageDefinitionApplier +import uk.nhs.england.fhirvalidator.interceptor.CapabilityStatementApplier +import uk.nhs.england.fhirvalidator.service.interactions.FHIRDocument +import uk.nhs.england.fhirvalidator.service.interactions.FHIRMessage +import uk.nhs.england.fhirvalidator.service.interactions.FHIRRESTful import uk.nhs.england.fhirvalidator.util.createOperationOutcome import java.net.URLDecoder import java.nio.charset.StandardCharsets @@ -30,9 +31,10 @@ class ValidateR4Provider ( @Qualifier("R4") private val fhirContext: FhirContext, @Qualifier("SupportChain") private val supportChain: IValidationSupport, private val validator: FhirValidator, - private val messageDefinitionApplier: MessageDefinitionApplier, + private val fhirMessage: FHIRMessage, private val capabilityStatementApplier: CapabilityStatementApplier, - private val fhirDocumentApplier: FHIRDocumentApplier + private val fhirDocumentApplier: FHIRDocument, + private val fhirRESTful: FHIRRESTful ) { companion object : KLogging() @@ -130,6 +132,13 @@ class ValidateR4Provider ( // This is probably ontology server issue so degrade warning to information issue.severity = OperationOutcome.IssueSeverity.INFORMATION } + + } + if (issue.diagnostics.contains("http://unstats.un.org/unsd/")) { + issue.severity = OperationOutcome.IssueSeverity.INFORMATION + } + if (issue.diagnostics.contains("note that the validator cannot judge what is suitable")) { + issue.severity = OperationOutcome.IssueSeverity.INFORMATION } } } else { @@ -180,6 +189,14 @@ class ValidateR4Provider ( } } var result : OperationOutcome? = null + if (resource is CapabilityStatement) { + val errors = fhirRESTful.test(resource) + if (errors != null) { + errors.forEach { + additionalIssues.add(it) + } + } + } if (profile != null) { if (importProfile !== null && importProfile) capabilityStatementApplier.applyCapabilityStatementProfiles(resource, importProfile) if (importProfile !== null && importProfile && resource is Bundle) fhirDocumentApplier.applyDocumentDefinition(resource) @@ -187,7 +204,7 @@ class ValidateR4Provider ( .toOperationOutcome() as? OperationOutcome } else { capabilityStatementApplier.applyCapabilityStatementProfiles(resource, importProfile) - val messageDefinitionErrors = messageDefinitionApplier.applyMessageDefinition(resource) + val messageDefinitionErrors = fhirMessage.applyMessageDefinition(resource) if (messageDefinitionErrors != null) { messageDefinitionErrors.issue.forEach{ additionalIssues.add(it) diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/FHIRDocumentApplier.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/interactions/FHIRDocument.kt similarity index 94% rename from src/main/kotlin/uk/nhs/england/fhirvalidator/service/FHIRDocumentApplier.kt rename to src/main/kotlin/uk/nhs/england/fhirvalidator/service/interactions/FHIRDocument.kt index 9d3138f..a9e0f54 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/FHIRDocumentApplier.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/interactions/FHIRDocument.kt @@ -1,4 +1,4 @@ -package uk.nhs.england.fhirvalidator.service +package uk.nhs.england.fhirvalidator.service.interactions import org.hl7.fhir.instance.model.api.IBaseResource import org.hl7.fhir.r4.model.* @@ -8,7 +8,7 @@ import uk.nhs.england.fhirvalidator.util.createOperationOutcome @Service -class FHIRDocumentApplier { +class FHIRDocument { fun applyDocumentDefinition(resource: IBaseResource): OperationOutcome? { if (resource !is Bundle || resource.type != Bundle.BundleType.DOCUMENT) { diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/MessageDefinitionApplier.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/interactions/FHIRMessage.kt similarity index 96% rename from src/main/kotlin/uk/nhs/england/fhirvalidator/service/MessageDefinitionApplier.kt rename to src/main/kotlin/uk/nhs/england/fhirvalidator/service/interactions/FHIRMessage.kt index 393aef4..7431b5e 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/MessageDefinitionApplier.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/interactions/FHIRMessage.kt @@ -1,4 +1,4 @@ -package uk.nhs.england.fhirvalidator.service +package uk.nhs.england.fhirvalidator.service.interactions import uk.nhs.england.fhirvalidator.util.applyProfile import uk.nhs.england.fhirvalidator.util.createOperationOutcome @@ -8,9 +8,10 @@ import org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain import org.hl7.fhir.instance.model.api.IBaseResource import org.hl7.fhir.r4.model.* import org.springframework.stereotype.Service +import uk.nhs.england.fhirvalidator.service.ImplementationGuideParser @Service -class MessageDefinitionApplier( +class FHIRMessage( implementationGuideParser: ImplementationGuideParser, supportChain: ValidationSupportChain ) { diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/interactions/FHIRRESTful.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/interactions/FHIRRESTful.kt new file mode 100644 index 0000000..6ee80f2 --- /dev/null +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/interactions/FHIRRESTful.kt @@ -0,0 +1,170 @@ +package uk.nhs.england.fhirvalidator.service.interactions + +import io.swagger.v3.oas.models.media.ArraySchema +import org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain +import org.hl7.fhir.instance.model.api.IBaseResource +import org.hl7.fhir.r4.model.* +import org.springframework.stereotype.Service +import uk.nhs.england.fhirvalidator.service.ImplementationGuideParser +import uk.nhs.england.fhirvalidator.service.SearchParameterSupport + +@Service +class FHIRRESTful( + implementationGuideParser: ImplementationGuideParser, + private val searchParameterSupport : SearchParameterSupport, + supportChain: ValidationSupportChain +) { + + + fun test(resource: IBaseResource): List { + val outcomes = mutableListOf() + + if (resource !is CapabilityStatement) { + return outcomes + } + val capabilityStatement = resource as CapabilityStatement + for((index,rest) in capabilityStatement.rest.withIndex()) { + for((idx,resource) in rest.resource.withIndex()) { + if (resource.hasSearchParam()) { + for(searchParameter in resource.searchParam) { + checkSearchParameter(resource.type,"CapabilityStatement.rest[$index].resource[$idx]",searchParameter,outcomes) + + } + } + } + } + + return outcomes + } + + fun checkSearchParameter( + resourceType: String, + locaton: String, + apiParameter: CapabilityStatement.CapabilityStatementRestResourceSearchParamComponent, + outcomes: MutableList + ) { + val searchParameter = getSearchParameter(outcomes, resourceType,apiParameter.name) + if (searchParameter == null) { + val issue = addOperationIssue( + outcomes, + OperationOutcome.IssueType.CODEINVALID, + OperationOutcome.IssueSeverity.WARNING, + "Unable to find FHIR SearchParameter of for: " + apiParameter.name + ) + issue.location.add(StringType(locaton)) + } else { + if (searchParameter.name.startsWith("_include")) { + + } + else { + if (!searchParameter.type.equals(apiParameter.type)) { + val issue = addOperationIssue( + outcomes, + OperationOutcome.IssueType.CODEINVALID, + OperationOutcome.IssueSeverity.INFORMATION, + "Parameter type for **" + resourceType + '.'+ apiParameter.name + "** should be `" + searchParameter.type.toCode() + "`, is `" + apiParameter.type.toCode()+"`" + ) + issue.location.add(StringType(locaton)) + } + /* + when (searchParameter.type) { + Enumerations.SearchParamType.STRING -> { + if (!apiParameter.type.equals(Enumerations.SearchParamType.STRING)) { + addOperationIssue( + outcomes, + OperationOutcome.IssueType.CODEINVALID, + OperationOutcome.IssueSeverity.INFORMATION, + "Parameter type for :" + apiParameter.name + " should be a `" + searchParameter.type.toCode() + "`, is `" + apiParameter.type.toCode()+"`" + ) + } + } + + Enumerations.SearchParamType.REFERENCE -> { + if (!apiParameter.type.equals(Enumerations.SearchParamType.REFERENCE)) { + addOperationIssue( + outcomes, + OperationOutcome.IssueType.CODEINVALID, + OperationOutcome.IssueSeverity.INFORMATION, + "Parameter type for :" + apiParameter.name + " should be a `" + searchParameter.type.toCode() + "`, is `" + apiParameter.type.toCode()+"`" + ) + } + } + + Enumerations.SearchParamType.TOKEN -> { + if (!apiParameter.type.equals(Enumerations.SearchParamType.TOKEN)) { + addOperationIssue( + outcomes, + OperationOutcome.IssueType.CODEINVALID, + OperationOutcome.IssueSeverity.INFORMATION, + "Parameter type for :" + apiParameter.name + " should be a `" + searchParameter.type.toCode() + "`, is `" + apiParameter.type.toCode()+"`" + ) + } + } + + Enumerations.SearchParamType.DATE -> { + if (!apiParameter.type.equals(Enumerations.SearchParamType.DATE)) { + addOperationIssue( + outcomes, + OperationOutcome.IssueType.CODEINVALID, + OperationOutcome.IssueSeverity.INFORMATION, + "Parameter type for :" + apiParameter.name + " should be a `" + searchParameter.type.toCode() + "`, is `" + apiParameter.type.toCode()+"`" + ) + } + } + + Enumerations.SearchParamType.NUMBER -> { + addOperationIssue( + outcomes, + OperationOutcome.IssueType.CODEINVALID, + OperationOutcome.IssueSeverity.INFORMATION, + "Parameter type for :" + apiParameter.name + " should be a `" + searchParameter.type.toCode() + "`, is `" + apiParameter.type.toCode()+"`" + ) + } + + else -> {} + }*/ + } + } + } + +private fun addOperationIssue(outcomes: MutableList, code : OperationOutcome.IssueType, severity :OperationOutcome.IssueSeverity, message : String? ): OperationOutcome.OperationOutcomeIssueComponent { + val operation = OperationOutcome.OperationOutcomeIssueComponent() + operation.code = code + operation.severity = severity + if (message!=null) operation.diagnostics = message + outcomes.add(operation) + return operation +} + fun getSearchParameter(outcomes : MutableList , resourceType: String, name : String) : SearchParameter? { + val parameters = name.split(".") + + val searchParameter = searchParameterSupport.getSearchParameter(resourceType,name) + + if (parameters.size>1) { + if (searchParameter?.type != Enumerations.SearchParamType.REFERENCE) { + // maybe throw error? + } else { + + var resourceType: String? + + // A bit coarse + resourceType = "Resource" + if (searchParameter.hasTarget() ) { + for (resource in searchParameter.target) { + if (!resource.code.equals("Group")) resourceType=resource.code + } + } + + var newSearchParamName = parameters.get(1) + // Add back in remaining chained parameters + for (i in 3..parameters.size) { + newSearchParamName += "."+parameters.get(i) + } + + } + } + + return searchParameter + } + +} diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/OpenAPIParser.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/oas/CapabilityStatementToOpenAPIConversion.kt similarity index 90% rename from src/main/kotlin/uk/nhs/england/fhirvalidator/service/OpenAPIParser.kt rename to src/main/kotlin/uk/nhs/england/fhirvalidator/service/oas/CapabilityStatementToOpenAPIConversion.kt index c9c7ecf..8e825b3 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/OpenAPIParser.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/oas/CapabilityStatementToOpenAPIConversion.kt @@ -1,4 +1,4 @@ -package uk.nhs.england.fhirvalidator.service +package uk.nhs.england.fhirvalidator.service.oas import ca.uhn.fhir.context.FhirContext import ca.uhn.fhir.context.support.IValidationSupport @@ -6,6 +6,7 @@ import ca.uhn.fhir.context.support.ValidationSupportContext import ca.uhn.fhir.context.support.ValueSetExpansionOptions import ca.uhn.fhir.rest.api.Constants import ca.uhn.fhir.util.HapiExtensions +import com.fasterxml.jackson.databind.ObjectMapper import io.swagger.v3.oas.models.* import io.swagger.v3.oas.models.examples.Example import io.swagger.v3.oas.models.info.Contact @@ -26,7 +27,11 @@ import org.hl7.fhir.utilities.npm.NpmPackage import org.json.JSONArray import org.json.JSONObject import org.springframework.beans.factory.annotation.Qualifier +import org.springframework.core.io.ClassPathResource import org.springframework.stereotype.Service +import uk.nhs.england.fhirvalidator.model.SimplifierPackage +import uk.nhs.england.fhirvalidator.service.ImplementationGuideParser +import uk.nhs.england.fhirvalidator.service.SearchParameterSupport import java.math.BigDecimal import java.net.URI import java.util.concurrent.atomic.AtomicReference @@ -34,10 +39,12 @@ import java.util.function.Supplier import java.util.stream.Collectors @Service -class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, - private val npmPackages: List?, - @Qualifier("SupportChain") private val supportChain: IValidationSupport, - private val searchParameterSupport : SearchParameterSupport) { +class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: FhirContext, + private val npmPackages: List?, + val objectMapper: ObjectMapper, + @Qualifier("SupportChain") private val supportChain: IValidationSupport, + private val searchParameterSupport : SearchParameterSupport +) { val PAGE_SYSTEM = "System Level Operations" @@ -53,7 +60,7 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, - fun generateOpenApi(_cs: CapabilityStatement, addFHIRBoilerPlater: Boolean): OpenAPI? { + fun generateOpenApi(_cs: CapabilityStatement, enhance: Boolean): OpenAPI? { cs = _cs val openApi = OpenAPI() openApi.info = Info() @@ -69,7 +76,7 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, if (code.value.contains("xml")) generateXML = true } - if (addFHIRBoilerPlater && cs.hasExtension("https://fhir.nhs.uk/StructureDefinition/Extension-NHSDigital-CapabilityStatement-Package")) { + if (enhance && cs.hasExtension("https://fhir.nhs.uk/StructureDefinition/Extension-NHSDigital-CapabilityStatement-Package")) { val apiDefinition = cs.getExtensionByUrl("https://fhir.nhs.uk/StructureDefinition/Extension-NHSDigital-CapabilityStatement-Package") // Sample table:\n\n| One | Two | Three |\n|-----|-----|-------|\n| a | b | c | if (apiDefinition.hasExtension("openApi")) { @@ -144,8 +151,8 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, val transaction = getPathItem(paths, "/", PathItem.HttpMethod.POST) transaction.addTagsItem(PAGE_SYSTEM) transaction.summary = "server-transaction: Execute a FHIR Transaction (or FHIR Batch) Bundle" - addFhirResourceResponse(ctx, openApi, transaction, null, null,null,null) - addFhirResourceRequestBody(openApi, transaction, emptyList(), "Bundle",null) + addFhirResourceResponse(ctx, openApi, transaction, null, null,null,null, enhance) + addFhirResourceRequestBody(openApi, transaction, emptyList(), "Bundle",null, enhance) } // System History Operation @@ -154,12 +161,12 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, systemHistory.addTagsItem(PAGE_SYSTEM) systemHistory.summary = "server-history: Fetch the resource change history across all resource types on the server" - addFhirResourceResponse(ctx, openApi, systemHistory, null, null,null,null) + addFhirResourceResponse(ctx, openApi, systemHistory, null, null,null,null, enhance) } // System-level Operations for (nextOperation in cs.restFirstRep.operation) { - addFhirOperation(ctx, openApi, paths, null, nextOperation) + addFhirOperation(ctx, openApi, paths, null, nextOperation, enhance) } @@ -172,7 +179,7 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, t.codeElement.value }.collect(Collectors.toSet()) - addResoureTag(openApi,resourceType,nextResource.profile) + addResoureTag(openApi,resourceType,nextResource.profile, enhance, nextResource.documentation) for (resftfulIntraction in nextResource.interaction) { val requestExample = getRequestExample(resftfulIntraction) @@ -183,11 +190,15 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, val operation = getPathItem(paths, "/$resourceType", PathItem.HttpMethod.GET) operation.addTagsItem(resourceType) operation.summary = resftfulIntraction.code.display - operation.description = "[search](http://www.hl7.org/fhir/search.html) for $resourceType instances." + if (enhance) { + operation.description = "[search](http://www.hl7.org/fhir/search.html) for $resourceType instances." + } else { + operation.description = "" + } if (resftfulIntraction.hasDocumentation()) { - operation.description += "\n\n"+ resftfulIntraction.documentation + operation.description += "\n\n"+ unescapeMarkdown(resftfulIntraction.documentation) } - if (addFHIRBoilerPlater && nextResource.hasExtension("http://hl7.org/fhir/StructureDefinition/capabilitystatement-search-parameter-combination")) { + if (enhance && nextResource.hasExtension("http://hl7.org/fhir/StructureDefinition/capabilitystatement-search-parameter-combination")) { var comboDoc = "\n\n **Search Parameter Combinations** \n\n The following search parameters combinations should be supported. \n\n" + "| SHALL | SHOULD | \n" comboDoc += "|----------|---------| \n" @@ -210,8 +221,8 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, } operation.description += comboDoc } - addFhirResourceResponse(ctx, openApi, operation, resourceType,resftfulIntraction, null,null) - processSearchParameter(operation,nextResource,resourceType, addFHIRBoilerPlater) + addFhirResourceResponse(ctx, openApi, operation, resourceType,resftfulIntraction, null,null, enhance) + processSearchParameter(operation,nextResource,resourceType, enhance) addResourceAPIMParameter(operation) } // Instance Read @@ -226,7 +237,7 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, } addResourceIdParameter(operation) addResourceAPIMParameter(operation) - addFhirResourceResponse(ctx, openApi, operation,resourceType,resftfulIntraction,null,null) + addFhirResourceResponse(ctx, openApi, operation,resourceType,resftfulIntraction,null,null, enhance) } // Instance Update CapabilityStatement.TypeRestfulInteraction.UPDATE -> { @@ -240,8 +251,8 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, } addResourceIdParameter(operation) addResourceAPIMParameter(operation) - addFhirResourceRequestBody(openApi, operation, requestExample, resourceType,nextResource.profile) - addFhirResourceResponse(ctx, openApi, operation, "OperationOutcome",resftfulIntraction,null,null) + addFhirResourceRequestBody(openApi, operation, requestExample, resourceType,nextResource.profile, enhance) + addFhirResourceResponse(ctx, openApi, operation, "OperationOutcome",resftfulIntraction,null,null, enhance) } // Type Create CapabilityStatement.TypeRestfulInteraction.CREATE -> { @@ -253,8 +264,8 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, operation.description += "\n\n"+resftfulIntraction.documentation } addResourceAPIMParameter(operation) - addFhirResourceRequestBody(openApi, operation, requestExample, resourceType, nextResource.profile) - addFhirResourceResponse(ctx, openApi, operation, "OperationOutcome",resftfulIntraction,null,null) + addFhirResourceRequestBody(openApi, operation, requestExample, resourceType, nextResource.profile, enhance) + addFhirResourceResponse(ctx, openApi, operation, "OperationOutcome",resftfulIntraction,null,null, enhance) } // Instance Patch CapabilityStatement.TypeRestfulInteraction.PATCH -> { @@ -270,7 +281,7 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, addResourceAPIMParameter(operation) addJSONSchema(openApi) addPatchResourceRequestBody(operation, patchExampleSupplier(resourceType)) - addFhirResourceResponse(ctx, openApi, operation, "OperationOutcome",resftfulIntraction,null,null) + addFhirResourceResponse(ctx, openApi, operation, "OperationOutcome",resftfulIntraction,null,null, enhance) } // Instance Delete @@ -284,7 +295,7 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, operation.description += "\n\n"+resftfulIntraction.documentation } addResourceIdParameter(operation) - addFhirResourceResponse(ctx, openApi, operation, "OperationOutcome",resftfulIntraction,null,null) + addFhirResourceResponse(ctx, openApi, operation, "OperationOutcome",resftfulIntraction,null,null, enhance) } // Type history @@ -297,9 +308,9 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, if (resftfulIntraction.hasDocumentation()) { operation.description += "\n\n"+resftfulIntraction.documentation } - processSearchParameter(operation,nextResource,resourceType, addFHIRBoilerPlater) + processSearchParameter(operation,nextResource,resourceType, enhance) addResourceAPIMParameter(operation) - addFhirResourceResponse(ctx, openApi, operation, resourceType,resftfulIntraction, null,null) + addFhirResourceResponse(ctx, openApi, operation, resourceType,resftfulIntraction, null,null, enhance) } // Instance history @@ -316,9 +327,9 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, operation.description += "\n\n"+resftfulIntraction.documentation } addResourceIdParameter(operation) - processSearchParameter(operation,nextResource,resourceType, addFHIRBoilerPlater) + processSearchParameter(operation,nextResource,resourceType, enhance) addResourceAPIMParameter(operation) - addFhirResourceResponse(ctx, openApi, operation, resourceType,resftfulIntraction,null,null) + addFhirResourceResponse(ctx, openApi, operation, resourceType,resftfulIntraction,null,null, enhance) } else -> {} @@ -339,13 +350,13 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, addResourceIdParameter(operation) addResourceVersionIdParameter(operation) addResourceAPIMParameter(operation) - addFhirResourceResponse(ctx, openApi, operation, resourceType,null,null,null) + addFhirResourceResponse(ctx, openApi, operation, resourceType,null,null,null, enhance) } // Resource-level Operations for (nextOperation in nextResource.operation) { - addFhirOperation(ctx, openApi, paths, resourceType, nextOperation) + addFhirOperation(ctx, openApi, paths, resourceType, nextOperation, enhance) } } return openApi @@ -473,30 +484,13 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, } - - private fun getBaseProfile(profile: String) :StructureDefinition? { - var profileDef = getProfile(profile) - if (profileDef != null && profileDef.hasBaseDefinition() && !profileDef.baseDefinition.contains("Resource")) { - profileDef = getBaseProfile(profileDef.baseDefinition) - } - return profileDef - } - private fun getProfile(profile: String?) : StructureDefinition? { val structureDefinition = supportChain.fetchStructureDefinition(profile) if (structureDefinition is StructureDefinition) return structureDefinition return null } - private fun getDocumentationPath(profile : String) : String { - supportChain.fetchAllConformanceResources()?.filterIsInstance()?.forEach { - if (it.url == profile) { - return "https://simplifier.net/guide/nhsdigital" - /// TODO return getDocumentationPathNpm(profile,npmPackage) - } - } - return "https://simplifier.net/guide/nhsdigital/home" - } + private fun getProfileName(profile : String) : String { @@ -559,7 +553,8 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, theOpenApi: OpenAPI, thePaths: Paths, theResourceType: String?, - theOperation: CapabilityStatement.CapabilityStatementRestResourceOperationComponent + theOperation: CapabilityStatement.CapabilityStatementRestResourceOperationComponent, + enhance: Boolean ) { val operationDefinition = AtomicReference() //val definitionId = IdType(theOperation.definition) @@ -590,7 +585,8 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, operationDefinition.get(), operation, true, - theOperation + theOperation, + enhance ) return } @@ -610,7 +606,8 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, operationDefinition.get(), operation, true, - theOperation + theOperation, + enhance ) } if (operationDefinition.get()!!.instance) { @@ -626,7 +623,8 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, operationDefinition.get(), operation, true, - theOperation + theOperation, + enhance ) } } else { @@ -636,7 +634,7 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, .code, PathItem.HttpMethod.GET ) populateOperation(theFhirContext, theOpenApi, null, operationDefinition.get(), operation, true, - theOperation + theOperation, enhance ) } } @@ -656,7 +654,8 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, operationDefinition.get(), operation, false, - theOperation + theOperation, + enhance ) } if (operationDefinition.get()!!.instance) { @@ -672,7 +671,8 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, operationDefinition.get(), operation, false, - theOperation + theOperation, + enhance ) } @@ -682,8 +682,8 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, thePaths, "/$" + operationDefinition.get()!! .code, PathItem.HttpMethod.POST ) - populateOperation(theFhirContext, theOpenApi, null, operationDefinition.get(), operation, false, theOperation - ) + populateOperation(theFhirContext, theOpenApi, null, operationDefinition.get(), operation, + false, theOperation, enhance) } } } @@ -697,7 +697,8 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, theOperationDefinition: OperationDefinition?, theOperation: Operation, theGet: Boolean, - theOperationComponent: CapabilityStatement.CapabilityStatementRestResourceOperationComponent + theOperationComponent: CapabilityStatement.CapabilityStatementRestResourceOperationComponent, + enhance: Boolean ) { if (theResourceType == null) { theOperation.addTagsItem(PAGE_SYSTEM) @@ -719,18 +720,19 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, openApi, exampleList, (exampleOperation.get())?.fhirType(), - null + null, + enhance ) theOperation.responses.addApiResponse("200",response200) - addStandardResponses(openApi,theOperation.responses) + addStandardResponses(openApi,theOperation.responses, enhance) } else { - addFhirResourceResponse(theFhirContext, openApi, theOperation, "Parameters", null,theOperationComponent,null) + addFhirResourceResponse(theFhirContext, openApi, theOperation, "Parameters", null,theOperationComponent,null, enhance) } //theOperation.requestBody.content = provideContentFhirResource(theOpenApi,ctx,exampleOperation, null) } else { - addFhirResourceResponse(theFhirContext, openApi, theOperation, "Parameters", null, theOperationComponent,null) + addFhirResourceResponse(theFhirContext, openApi, theOperation, "Parameters", null, theOperationComponent,null, enhance) } val mediaType = MediaType() if (theGet) { @@ -880,7 +882,7 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, Schema().type("object").title("Bundle-Message") // addSchemaFhirResource(openApi,bundleSchema,"Bundle-Message") - addFhirResourceSchema(openApi,"Bundle","https://fhir.nhs.uk/StructureDefinition/NHSDigital-Bundle-FHIRMessage") + addFhirResourceSchema(openApi,"Bundle","https://fhir.nhs.uk/StructureDefinition/NHSDigital-Bundle-FHIRMessage", enhance) mediaType.schema = ObjectSchema().`$ref`( "#/components/schemas/Bundle" ) @@ -895,7 +897,7 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, theOperation.requestBody.content.addMediaType(Constants.CT_FHIR_JSON_NEW, mediaType) } - if (theOperationDefinition.hasParameter()) { + if (enhance && theOperationDefinition.hasParameter()) { var inDoc = "\n\n ## Parameters (In) \n\n |Name | Cardinality | Type | Profile | Documentation |\n |-------|-----------|-------------|------------|------------|" var outDoc = "\n\n ## Parameters (Out) \n\n |Name | Cardinality | Type | Profile | Documentation |\n |-------|-----------|-------------|------------|------------|" for (parameter in theOperationDefinition.parameter) { @@ -935,7 +937,7 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, if (theOperationDefinition.hasComment()) { theOperation.description += "\n\n ## Comment \n\n"+unescapeMarkdown(theOperationDefinition.comment) } - if (theOperationDefinition.url.equals("http://hl7.org/fhir/OperationDefinition/MessageHeader-process-message") + if (enhance && theOperationDefinition.url.equals("http://hl7.org/fhir/OperationDefinition/MessageHeader-process-message") || theOperationDefinition.url.equals("https://fhir.nhs.uk/OperationDefinition/MessageHeader-process-message")) { var supportedDocumentation = "\n\n ## Supported Messages \n\n" @@ -946,7 +948,7 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, for (supportedMessage in messaging.supportedMessage) { val idStr = getProfileName(supportedMessage.definition) supportedDocumentation += "* $idStr \n" - mediaType.examples[idStr] = getMessageExample(openApi, supportedMessage) + mediaType.examples[idStr] = getMessageExample(openApi, supportedMessage, enhance) } } theOperation.description += supportedDocumentation @@ -1012,10 +1014,11 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, theOperation: Operation, theExampleSupplier: List, theResourceType: String?, - profile: String? + profile: String?, + enhance: Boolean ) { val requestBody = RequestBody() - requestBody.content = provideContentFhirResource(theOpenApi, theExampleSupplier,theResourceType, profile) + requestBody.content = provideContentFhirResource(theOpenApi, theExampleSupplier,theResourceType, profile, enhance) theOperation.requestBody = requestBody } @@ -1037,7 +1040,8 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, theResourceType: String?, resftfulIntraction : CapabilityStatement.ResourceInteractionComponent?, operationComponent: CapabilityStatement.CapabilityStatementRestResourceOperationComponent?, - profile: String? + profile: String?, + enhance: Boolean ) { theOperation.responses = ApiResponses() val response200 = ApiResponse() @@ -1049,7 +1053,7 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, theOpenApi, exampleResponse, theResourceType, - profile + profile, enhance ) } @@ -1060,7 +1064,7 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, theOpenApi, exampleResponse, theResourceType, - profile + profile, enhance ) } @@ -1070,17 +1074,17 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, theOpenApi, genericExampleSupplier(theFhirContext, theResourceType), theResourceType, - profile + profile, enhance ) } theOperation.responses.addApiResponse("200", response200) - addStandardResponses(theOpenApi,theOperation.responses) + addStandardResponses(theOpenApi,theOperation.responses, enhance) } - private fun addStandardResponses(theOpenApi: OpenAPI,responses: ApiResponses) { + private fun addStandardResponses(theOpenApi: OpenAPI,responses: ApiResponses, enhance: Boolean) { val response4xx = ApiResponse() var example = Example() example.value = getErrorOperationOutcome() @@ -1090,7 +1094,8 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, theOpenApi, exampleResponse, "OperationOutcome", - null + null, + enhance ) responses.addApiResponse("4xx", response4xx) @@ -1104,7 +1109,8 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, theOpenApi, exampleResponse, "OperationOutcome", - null + null, + enhance ) responses.addApiResponse("403", response403) } @@ -1144,7 +1150,7 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, return ctx?.newJsonParser()?.setPrettyPrint(true)?.encodeResourceToString(operationOutcome) } - private fun getMessageExample(openApi: OpenAPI,supportedMessage : CapabilityStatement.CapabilityStatementMessagingSupportedMessageComponent) : Example { + private fun getMessageExample(openApi: OpenAPI,supportedMessage : CapabilityStatement.CapabilityStatementMessagingSupportedMessageComponent, enhance: Boolean) : Example { var supportedDocumentation = "" val example = Example() @@ -1176,8 +1182,8 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, profile = "" } else { profile = getDocumentationPath(profile) - addFhirResourceSchema(openApi, foci.code, foci.profile) - addResoureTag(openApi, foci.code,foci.profile) + addFhirResourceSchema(openApi, foci.code, foci.profile, enhance) + addResoureTag(openApi, foci.code,foci.profile, enhance, "") } val idStr = getProfileName(foci.profile) supportedDocumentation += "| [$resource](https://www.hl7.org/fhir/$resource.html) | [$idStr]($profile) | $min | $max | \n" @@ -1407,7 +1413,8 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, theOpenApi: OpenAPI, examples: List, resourceType: String?, - profile: String? + profile: String?, + enhance: Boolean ): Content { val retVal = Content() var resourceType2 = resourceType @@ -1423,7 +1430,7 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, if (resourceType2 == null && theExampleSupplier != null) resourceType2 = theExampleSupplier.fhirType() // if (resourceType2 != null) addJSONSchema(theOpenApi, resourceType2) - val jsonSchema = resourceType2?.let { getMediaType(theOpenApi, it, profile) } + val jsonSchema = resourceType2?.let { getMediaType(theOpenApi, it, profile, enhance) } if (theExampleSupplier != null) { if (jsonSchema != null) { @@ -1431,7 +1438,7 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, } } retVal.addMediaType(Constants.CT_FHIR_JSON_NEW, jsonSchema) - val xmlSchema = resourceType2?.let { getMediaType(theOpenApi, it, profile) } + val xmlSchema = resourceType2?.let { getMediaType(theOpenApi, it, profile, enhance) } if (theExampleSupplier != null) { if (xmlSchema != null) { @@ -1440,7 +1447,7 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, } if (generateXML) retVal.addMediaType(Constants.CT_FHIR_XML_NEW, xmlSchema) } else { - val jsonSchema = getMediaType(theOpenApi,resourceType2, profile) + val jsonSchema = getMediaType(theOpenApi,resourceType2, profile, enhance) // Ensure schema is added //if (resourceType2 != null) addJSONSchema(theOpenApi, resourceType2) @@ -1702,24 +1709,15 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, return description } - private fun getMediaType(openApi: OpenAPI, resourceType: String?, profile: String?) : MediaType { + private fun getMediaType(openApi: OpenAPI, resourceType: String?, profile: String?, enhance: Boolean) : MediaType { val mediaType = MediaType().schema(ObjectSchema().`$ref`( "#/components/schemas/$resourceType" //"https://hl7.org/fhir/R4/fhir.schema.json#/definitions/$resourceType" )) - addFhirResourceSchema(openApi,resourceType, profile) + addFhirResourceSchema(openApi,resourceType, profile, enhance) return mediaType } - /* - private fun addSchemaFhirResource(openApi: OpenAPI, schema : Schema, schemaName : String?) { - ensureComponentsSchemasPopulated(openApi) - if (!openApi.components.schemas.containsKey(schemaName)) { - openApi.components.addSchemas(schemaName,schema) - } - } -*/ - private fun ensureComponentsSchemasPopulated(theOpenApi: OpenAPI) { if (theOpenApi.components == null) { theOpenApi.components = Components() @@ -1729,7 +1727,7 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, } } - private fun addFhirResourceSchema(openApi: OpenAPI, resourceType: String?, profile: String?) { + private fun addFhirResourceSchema(openApi: OpenAPI, resourceType: String?, profile: String?, enhance: Boolean) { // Add schema ensureComponentsSchemasPopulated(openApi) if (!openApi.components.schemas.containsKey(resourceType)) { @@ -1739,7 +1737,7 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, var schemaList = mutableMapOf>() schema.description = - "HL7 FHIR Schema [$resourceType](https://hl7.org/fhir/R4/fhir.schema.json#/definitions/$resourceType)." + ". HL7 FHIR Documentation [$resourceType](\"https://www.hl7.org/fhir/$resourceType.html\")" + "HL7 FHIR Schema [$resourceType](https://hl7.org/fhir/R4/fhir.schema.json#/definitions/$resourceType). HL7 FHIR Documentation [$resourceType](\"https://www.hl7.org/fhir/$resourceType.html\")" // This doesn't appear to be used. Consider removing @@ -1754,62 +1752,57 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, if (profile != null) { val structureDefinition = getProfile(profile) if (structureDefinition is StructureDefinition) { - - if (structureDefinition.hasDescription()) { - schema.description += "\n\n " + unescapeMarkdown(structureDefinition.description) - } - if (structureDefinition.hasPurpose()) { - schema.description += "\n\n " + structureDefinition.purpose - } - - for (element in structureDefinition.snapshot.element) { - if ((element.hasDefinition() || - element.hasShort() || - element.hasType() || - element.hasBinding()) && - (element.hasMustSupport() || (element.hasMin() && element.min > 0)) - ) { - val paths = element.id.split(".") - var title = paths[paths.size - 1] - /* if (element.hasSliceName()) { - title += " (" + element.sliceName + ")" - }*/ - var elementSchema: Schema? = null - - if (element.hasType()) { - if (element.typeFirstRep.code[0].isUpperCase()) { - elementSchema = Schema().type("object") + schema.description += "\n\n Profile: [" + structureDefinition.url+"]("+this.getDocumentationPath(structureDefinition.url)+")" + if (enhance) { + for (element in structureDefinition.snapshot.element) { + if ((element.hasDefinition() || + element.hasShort() || + element.hasType() || + element.hasBinding()) && + (element.hasMustSupport() || (element.hasMin() && element.min > 0)) + ) { + val paths = element.id.split(".") + var title = paths[paths.size - 1] + /* if (element.hasSliceName()) { + title += " (" + element.sliceName + ")" + }*/ + var elementSchema: Schema? = null + + if (element.hasType()) { + if (element.typeFirstRep.code[0].isUpperCase()) { + elementSchema = Schema().type("object") + } else { + elementSchema = Schema() + .type("string") + } } else { elementSchema = Schema() .type("string") } - } else { - elementSchema = Schema() - .type("string") - } - if (element.hasBase() && element.base.max.equals("*")) { - elementSchema = ArraySchema().type("array").items(elementSchema) - } + if (element.hasBase() && element.base.max.equals("*")) { + elementSchema = ArraySchema().type("array").items(elementSchema) + } - if (elementSchema != null) { - elementSchema.description = unescapeMarkdown(getElementDescription(element)) - if (element.hasMin()) elementSchema.minimum = BigDecimal(element.min) + if (elementSchema != null) { + elementSchema.description = unescapeMarkdown(getElementDescription(element)) + if (element.hasMin()) elementSchema.minimum = BigDecimal(element.min) - var parent = "" - for (i in 0 until (paths.size - 1)) { - if (!parent.isEmpty()) parent += "." - parent += paths[i] - } - if (schemaList.get(element.id) == null) { - schemaList.put(element.id, elementSchema) - } - val parentSchema = schemaList.get(parent) - if (parentSchema is ArraySchema) { - parentSchema.items.addProperties(title, elementSchema) - } else { - parentSchema?.addProperties(title, elementSchema) + var parent = "" + for (i in 0 until (paths.size - 1)) { + if (!parent.isEmpty()) parent += "." + parent += paths[i] + } + if (schemaList.get(element.id) == null) { + schemaList.put(element.id, elementSchema) + } + val parentSchema = schemaList.get(parent) + if (parentSchema is ArraySchema) { + parentSchema.items.addProperties(title, elementSchema) + } else { + parentSchema?.addProperties(title, elementSchema) + } } } } @@ -1926,7 +1919,7 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, if (element.binding.hasValueSet()) { val valueSet = supportChain.fetchValueSet(element.binding.valueSet) - var description = "["+(valueSet as ValueSet).name + "](" + getCanonicalUrl(element.binding.valueSet) +")" + var description = "["+(valueSet as ValueSet).name + "](" + getDocumentationPath(element.binding.valueSet) +")" if (element.binding.hasStrength()) description += " (" + element.binding.strength.display + ")" if (element.binding.hasDescription()) { var elementDescription = element.binding.description @@ -1978,7 +1971,7 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, } else { first = false } - itemDescription += "["+(profile as StructureDefinition).name + "]("+ getCanonicalUrl(target.value) +")" + itemDescription += "["+(profile as StructureDefinition).name + "]("+ getDocumentationPath(target.value) +")" } first = true @@ -1990,7 +1983,7 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, } else { first = false } - itemDescription += "["+(profile as StructureDefinition).name+ "](" +getCanonicalUrl(target.value) +")" + itemDescription += "["+(profile as StructureDefinition).name+ "](" +getDocumentationPath(target.value) +")" } if (itemDescription.isNotEmpty()) description+= itemDescription + ")" @@ -2053,54 +2046,41 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, return true } - private fun addResoureTag(openApi: OpenAPI,resourceType: String?, profile: String?) { + private fun addResoureTag( + openApi: OpenAPI, + resourceType: String?, + profile: String?, + enhance: Boolean, + documentation: String? + ) { // potential flaw here if multiple profiles are used. for (tags in openApi.tags) { if (tags.name.equals(resourceType)) return } // Try using schema for describing the profile . - addFhirResourceSchema(openApi,resourceType,profile) + addFhirResourceSchema(openApi,resourceType,profile, enhance) val resourceTag = Tag() resourceTag.name = resourceType - - //addFhirResourceSchema(openApi, resourceType, nextResource.profile) - - if (profile != null) { - resourceTag.extensions = mutableMapOf() - resourceTag.extensions.put("x-HL7-FHIR-Profile",profile) - val idStr = getProfileName(profile) - val documentation = getDocumentationPath(profile) - resourceTag.description = "" //""Resource (schema): [FHIR $resourceType](https://www.hl7.org/fhir/$resourceType.html)" - - var profileDef = getBaseProfile(profile) - - if (profileDef !=null) { - if (profileDef.hasDescription()) { - resourceTag.description += "\n\n "+profileDef.description - } - if (profileDef.hasPurpose()) { - resourceTag.description += "\n\n "+profileDef.purpose - } + if (documentation !== null) resourceTag.description = documentation + if (enhance) { + if (resourceTag.description == null) { + resourceTag.description = "" + } else { + resourceTag.description += "\n\n " } - resourceTag.description += "\n\n Profile (constraints): [$idStr]($documentation)" - resourceTag.description += "\n\n" + getProfileDescription(profile) - - profileDef = getProfile(profile) + resourceTag.description += "Base Definition: [$resourceType](https://hl7.org/fhir/R4/$resourceType)" - if (profileDef !=null) { + if (profile != null) { + resourceTag.extensions = mutableMapOf() + resourceTag.extensions.put("x-HL7-FHIR-Profile", profile) + val idStr = getProfileName(profile) + val documentation = getDocumentationPath(profile) - if (profileDef.hasDescription()) { - resourceTag.description += "\n\n "+profileDef.description - } - if (profileDef.hasPurpose()) { - resourceTag.description += "\n\n "+profileDef.purpose - } + resourceTag.description += " Profile: [$idStr]($documentation)" } - - } else { - resourceTag.description = "Resource type: $resourceType" } + openApi.addTagsItem(resourceTag) } @@ -2151,18 +2131,23 @@ class OpenAPIParser(@Qualifier("R4") private val ctx: FhirContext, return mainDescription + "\n\n" + index + subDescription } + private fun getDocumentationPath(profile : String) : String { - - private fun getPackageCanonicalUrl(profile : String, npmPackage: NpmPackage?) : String { - val npm= npmPackage?.npm?.get("name").toString().replace("\"","") + "@" + npmPackage?.npm?.get("version").toString().replace("\"","") - return " "+ npm + "&canonical="+ profile.replace("|","|") - } - private fun getDocumentationPathNpm(profile : String, npmPackage : NpmPackage) : String { - return getPackageCanonicalUrl(profile,npmPackage) - } - private fun getCanonicalUrl(resourceUrl : String ) :String { - val npm = npmPackages?.get(npmPackages.size-1) // get last package - return getPackageCanonicalUrl(resourceUrl, npm) + if (profile.contains("http://hl7.org/fhir") + || profile.contains("http://hl7.eu/fhir") ) return profile + + val configurationInputStream = ClassPathResource("manifest.json").inputStream + var manifest = objectMapper.readValue(configurationInputStream, Array::class.java) + var path = profile + for(guide in manifest) { + if (!guide.version.contains("0.0.0") && ( + guide.packageName.contains("england") || + guide.packageName.contains("ukcore") + )) { + path = "https://simplifier.net/resolve?fhirVersion=R4&scope="+ guide.packageName + "@" + guide.version + "&canonical="+profile + } + } + return path } } diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/OASSupport.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/oas/OpenAPItoCapabilityStatementConversion.kt similarity index 92% rename from src/main/kotlin/uk/nhs/england/fhirvalidator/service/OASSupport.kt rename to src/main/kotlin/uk/nhs/england/fhirvalidator/service/oas/OpenAPItoCapabilityStatementConversion.kt index 4b33b24..1e3d8a7 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/OASSupport.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/oas/OpenAPItoCapabilityStatementConversion.kt @@ -1,4 +1,4 @@ -package uk.nhs.england.fhirvalidator.service +package uk.nhs.england.fhirvalidator.service.oas //import io.swagger.models.parameters.QueryParameter import ca.uhn.fhir.context.FhirContext @@ -18,21 +18,23 @@ import mu.KLogging import org.apache.commons.text.StringEscapeUtils import org.hl7.fhir.instance.model.api.IBaseResource import org.hl7.fhir.r4.model.* -import org.hl7.fhir.r4.model.CapabilityStatement.TypeRestfulInteraction import org.hl7.fhir.r4.model.CapabilityStatement.TypeRestfulInteraction.READ import org.hl7.fhir.r4.model.CapabilityStatement.TypeRestfulInteraction.SEARCHTYPE import org.springframework.beans.factory.annotation.Qualifier import org.springframework.stereotype.Service +import uk.nhs.england.fhirvalidator.service.interactions.FHIRMessage +import uk.nhs.england.fhirvalidator.interceptor.CapabilityStatementApplier +import uk.nhs.england.fhirvalidator.service.SearchParameterSupport import java.util.* -import kotlin.math.log @Service -class OASSupport(@Qualifier("R4") private val ctx: FhirContext?, - @Qualifier("SupportChain") private val supportChain: IValidationSupport, - private val searchParameterSupport : SearchParameterSupport, - private val fhirValidator: FhirValidator, - private val messageDefinitionApplier: MessageDefinitionApplier, - private val capabilityStatementApplier: CapabilityStatementApplier) +class OpenAPItoCapabilityStatementConversion(@Qualifier("R4") private val ctx: FhirContext?, + @Qualifier("SupportChain") private val supportChain: IValidationSupport, + private val searchParameterSupport : SearchParameterSupport, + private val fhirValidator: FhirValidator, + private val FHIRMessage: FHIRMessage, + private val capabilityStatementApplier: CapabilityStatementApplier +) { // var implementationGuideParser: ImplementationGuideParser? = ImplementationGuideParser(ctx!!) @@ -56,6 +58,11 @@ class OASSupport(@Qualifier("R4") private val ctx: FhirContext?, capabilityStatement.description = escapeMarkdown(openAPI.info.description) } for (apiPaths in openAPI.paths) { + // To cope with eRS OAS + if (apiPaths.key !== null && ( + apiPaths.key.contains("STU3") || + apiPaths.key.contains("STU2") + )) continue; var path = apiPaths.key.removePrefix("/FHIR/R4") path = path.removePrefix("/") val paths = path.split("/") @@ -84,7 +91,11 @@ class OASSupport(@Qualifier("R4") private val ctx: FhirContext?, } if (resource == null) { resource = CapabilityStatement.CapabilityStatementRestResourceComponent().setType(resourceType) + if (apiPaths.value !== null && apiPaths.value.description !== null) { + resource!!.documentation = apiPaths.value.description + } rest.addResource(resource) + } var operation = "" if (paths.size > 1) operation = paths[1] @@ -135,6 +146,27 @@ class OASSupport(@Qualifier("R4") private val ctx: FhirContext?, searchParam.type = Enumerations.SearchParamType.STRING } } + when (apiParameter.schema.format) { + "string" -> { + searchParam.type = Enumerations.SearchParamType.STRING + } + "token" -> { + searchParam.type = Enumerations.SearchParamType.TOKEN + } + "date" -> { + searchParam.type = Enumerations.SearchParamType.DATE + } + "number" -> { + searchParam.type = Enumerations.SearchParamType.NUMBER + } + "reference" -> { + searchParam.type = Enumerations.SearchParamType.REFERENCE + } + else ->{ + logger.info(searchParam.name + " format= " + apiParameter.schema.format) + searchParam.type = Enumerations.SearchParamType.STRING + } + } if (resource !== null) resource!!.searchParam.add(searchParam) } @@ -496,7 +528,7 @@ class OASSupport(@Qualifier("R4") private val ctx: FhirContext?, fun validateResource(resource: IBaseResource, profile: String?): OperationOutcome? { if (profile != null) return fhirValidator.validateWithResult(resource, ValidationOptions().addProfile(profile)).toOperationOutcome() as? OperationOutcome capabilityStatementApplier.applyCapabilityStatementProfiles(resource, false) - val messageDefinitionErrors = messageDefinitionApplier.applyMessageDefinition(resource) + val messageDefinitionErrors = FHIRMessage.applyMessageDefinition(resource) if (messageDefinitionErrors != null) { return messageDefinitionErrors } diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index e366b10..e803bfa 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -17,7 +17,7 @@ fhir: server: name: NHS England Interoperability Standards FHIR Testing baseUrl: https://3cdzg7kbj4.execute-api.eu-west-2.amazonaws.com/poc/Conformance - version: 6.10.15 + version: 6.10.16 services: R4: true diff --git a/src/test/kotlin/uk/nhs/england/fhirvalidator/controller/ValidateControllerTest.kt b/src/test/kotlin/uk/nhs/england/fhirvalidator/controller/ValidateControllerTest.kt index a26c122..eac5965 100644 --- a/src/test/kotlin/uk/nhs/england/fhirvalidator/controller/ValidateControllerTest.kt +++ b/src/test/kotlin/uk/nhs/england/fhirvalidator/controller/ValidateControllerTest.kt @@ -3,13 +3,13 @@ package uk.nhs.england.fhirvalidator.controller import ca.uhn.fhir.context.FhirContext import ca.uhn.fhir.context.support.IValidationSupport import ca.uhn.fhir.validation.FhirValidator -import uk.nhs.england.fhirvalidator.service.CapabilityStatementApplier -import uk.nhs.england.fhirvalidator.service.MessageDefinitionApplier +import uk.nhs.england.fhirvalidator.interceptor.CapabilityStatementApplier +import uk.nhs.england.fhirvalidator.service.interactions.FHIRMessage import org.hl7.fhir.r4.model.Bundle import org.junit.jupiter.api.extension.ExtendWith import org.mockito.Mock import org.mockito.junit.jupiter.MockitoExtension -import uk.nhs.england.fhirvalidator.service.OASSupport +import uk.nhs.england.fhirvalidator.service.oas.OpenAPItoCapabilityStatementConversion @ExtendWith(MockitoExtension::class) internal class ValidateControllerTest { @@ -20,7 +20,7 @@ internal class ValidateControllerTest { lateinit var mockValidator: FhirValidator @Mock - lateinit var mockMessageDefinitionApplier: MessageDefinitionApplier + lateinit var mockFHIRMessage: FHIRMessage @Mock lateinit var mockCapabilityStatementApplier: CapabilityStatementApplier @@ -32,7 +32,7 @@ internal class ValidateControllerTest { lateinit var mockSearchParameters : Bundle @Mock - lateinit var OASSupport: OASSupport + lateinit var OpenAPItoCapabilityStatementConversion: OpenAPItoCapabilityStatementConversion /* @Test From f43bcea84adc309a13ecd0ccd92db0a52c48f62b Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Wed, 24 Jan 2024 14:54:47 +0000 Subject: [PATCH 34/67] Fix for search parameters --- aws-repo-notes.txt | 4 ++-- pom.xml | 2 +- .../service/interactions/FHIRRESTful.kt | 13 +++++++++++-- src/main/resources/application.yaml | 2 +- src/main/resources/manifest.json | 18 +----------------- 5 files changed, 16 insertions(+), 23 deletions(-) diff --git a/aws-repo-notes.txt b/aws-repo-notes.txt index 1304530..42b670f 100644 --- a/aws-repo-notes.txt +++ b/aws-repo-notes.txt @@ -23,9 +23,9 @@ mvn clean install docker build -t fhir-validator-r4 . docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest -docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.16 +docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.17 -docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.16 +docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.17 docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest diff --git a/pom.xml b/pom.xml index 77a2f3e..ffce647 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ uk.nhs.england IOPS-FHIR-Validation-Service - 6.10.16 + 6.10.17 IOPS-FHIR-Validation-Service HAPI FHIR Validator using Spring Boot diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/interactions/FHIRRESTful.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/interactions/FHIRRESTful.kt index 6ee80f2..29504e9 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/interactions/FHIRRESTful.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/interactions/FHIRRESTful.kt @@ -57,12 +57,21 @@ class FHIRRESTful( } else { - if (!searchParameter.type.equals(apiParameter.type)) { + if (searchParameter.hasType() && apiParameter.hasType() && !searchParameter.type.equals(apiParameter.type)) { val issue = addOperationIssue( outcomes, OperationOutcome.IssueType.CODEINVALID, OperationOutcome.IssueSeverity.INFORMATION, - "Parameter type for **" + resourceType + '.'+ apiParameter.name + "** should be `" + searchParameter.type.toCode() + "`, is `" + apiParameter.type.toCode()+"`" + "Parameter type for **" + resourceType + '.'+ apiParameter.name + "** should be `" + searchParameter.type.toCode() + "` but is `" + apiParameter.type.toCode()+"`." + ) + issue.location.add(StringType(locaton)) + } + if (searchParameter.hasType() && !apiParameter.hasType() && !searchParameter.type.equals(apiParameter.type)) { + val issue = addOperationIssue( + outcomes, + OperationOutcome.IssueType.CODEINVALID, + OperationOutcome.IssueSeverity.INFORMATION, + "Parameter type for **" + resourceType + '.'+ apiParameter.name + "** should be `" + searchParameter.type.toCode() + "` but is not present." ) issue.location.add(StringType(locaton)) } diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index e803bfa..d77f9d7 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -17,7 +17,7 @@ fhir: server: name: NHS England Interoperability Standards FHIR Testing baseUrl: https://3cdzg7kbj4.execute-api.eu-west-2.amazonaws.com/poc/Conformance - version: 6.10.16 + version: 6.10.17 services: R4: true diff --git a/src/main/resources/manifest.json b/src/main/resources/manifest.json index 85395bc..2913867 100644 --- a/src/main/resources/manifest.json +++ b/src/main/resources/manifest.json @@ -7,24 +7,8 @@ "packageName": "fhir.r4.nhsengland.stu1", "version": "1.1.0" }, - { - "packageName": "hl7.fhir.uv.ips", - "version": "1.1.0" - }, - { - "packageName": "hl7.fhir.uv.sdc", - "version": "3.0.0" - }, - { - "packageName": "hl7.fhir.uv.ipa", - "version": "1.0.0" - }, - { - "packageName": "hl7.fhir.eu.laboratory", - "version": "0.1.0-ballot" - }, { "packageName": "uk.nhsengland.r4", "version": "0.0.0-prerelease" } -] +] \ No newline at end of file From 65f7f9157c9597254ce8d9d38c65503b7691d882 Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Wed, 24 Jan 2024 20:11:30 +0000 Subject: [PATCH 35/67] fixed duplicate package load. --- aws-repo-notes.txt | 4 +-- pom.xml | 2 +- .../configuration/ValidationConfiguration.kt | 23 ++++++++++++++--- .../provider/CapabilityStatementProvider.kt | 25 +++++++++++++------ src/main/resources/application.yaml | 2 +- src/main/resources/manifest.json | 14 ++++++++++- 6 files changed, 54 insertions(+), 16 deletions(-) diff --git a/aws-repo-notes.txt b/aws-repo-notes.txt index 42b670f..a7bfc29 100644 --- a/aws-repo-notes.txt +++ b/aws-repo-notes.txt @@ -23,9 +23,9 @@ mvn clean install docker build -t fhir-validator-r4 . docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest -docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.17 +docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.18 -docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.17 +docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.18 docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest diff --git a/pom.xml b/pom.xml index ffce647..1b7fc06 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ uk.nhs.england IOPS-FHIR-Validation-Service - 6.10.17 + 6.10.18 IOPS-FHIR-Validation-Service HAPI FHIR Validator using Spring Boot diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/ValidationConfiguration.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/ValidationConfiguration.kt index 5313bd6..e0c0dde 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/ValidationConfiguration.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/ValidationConfiguration.kt @@ -10,6 +10,7 @@ import com.fasterxml.jackson.databind.ObjectMapper import mu.KLogging import org.hl7.fhir.common.hapi.validation.support.* import org.hl7.fhir.common.hapi.validation.validator.FhirInstanceValidator +import org.hl7.fhir.r4.model.CapabilityStatement import org.hl7.fhir.r4.model.StructureDefinition import org.hl7.fhir.utilities.json.model.JsonProperty import org.hl7.fhir.utilities.npm.NpmPackage @@ -216,7 +217,8 @@ open class ValidationConfiguration( val configurationInputStream = ClassPathResource("manifest.json").inputStream manifest = objectMapper.readValue(configurationInputStream, Array::class.java) } - val packages = arrayListOf() + + val packages = HashMap() if (manifest == null) throw UnprocessableEntityException("Error processing IG manifest") for (packageNpm in manifest ) { val packageName = packageNpm.packageName + "-" + packageNpm.version+ ".tgz" @@ -229,13 +231,26 @@ open class ValidationConfiguration( } if (inputStream == null) { val downloadedPackages = downloadPackage(packageNpm.packageName,packageNpm.version) - packages.addAll(downloadedPackages) + for (downloadpackage in downloadedPackages) { + val name = downloadpackage.name()+'#'+downloadpackage.version() + if (packages.get(name) == null) { + packages.put(name,downloadpackage) + } else { + logger.info("package "+name + " already present") + } + } } else { logger.info("Using local cache for {} - {}",packageNpm.packageName, packageNpm.version) - packages.add(NpmPackage.fromPackage(inputStream)) + val downloadpackage = NpmPackage.fromPackage(inputStream) + val name = downloadpackage.name()+'#'+downloadpackage.version() + if (packages.get(name) == null) { + packages.put(name,downloadpackage) + } else { + logger.info("package "+name + " already present") + } } } - this.npmPackages = packages + this.npmPackages = packages.values.toList() /* if (fhirServerProperties.ig != null && !fhirServerProperties.ig!!.isEmpty()) { return downloadPackage(fhirServerProperties.ig!!) diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/CapabilityStatementProvider.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/CapabilityStatementProvider.kt index b48ed5c..b922985 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/CapabilityStatementProvider.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/CapabilityStatementProvider.kt @@ -10,7 +10,6 @@ import org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain import org.hl7.fhir.instance.model.api.IBaseResource import org.hl7.fhir.r4.model.BooleanType import org.hl7.fhir.r4.model.CapabilityStatement - import org.springframework.beans.factory.annotation.Qualifier import org.springframework.stereotype.Component import uk.nhs.england.fhirvalidator.service.ImplementationGuideParser @@ -19,6 +18,7 @@ import java.nio.charset.StandardCharsets import javax.servlet.http.HttpServletRequest import javax.servlet.http.HttpServletResponse + @Component class CapabilityStatementProvider(@Qualifier("R4") private val fhirContext: FhirContext, private val oasParser : CapabilityStatementToOpenAPIConversion, @@ -36,12 +36,23 @@ class CapabilityStatementProvider(@Qualifier("R4") private val fhirContext: Fhir @Search - fun search(@RequiredParam(name = CapabilityStatement.SP_URL) url: TokenParam): List { - val list = mutableListOf() - var decodeUri = java.net.URLDecoder.decode(url.value, StandardCharsets.UTF_8.name()); - val resource = supportChain.fetchResource(CapabilityStatement::class.java,decodeUri) - if (resource != null) list.add(resource) - return list + fun search(@OptionalParam(name = CapabilityStatement.SP_URL) url: TokenParam?): List { + val list = HashMap() + if (url !== null) { + val decodeUri = java.net.URLDecoder.decode(url.value, StandardCharsets.UTF_8.name()) + val resource = supportChain.fetchResource(CapabilityStatement::class.java,decodeUri) + if (resource != null) list.put(resource.url, resource) + return list.values.toList() + }; + for (resource in supportChain.fetchAllConformanceResources()!!) { + if (resource is CapabilityStatement) { + val cs = resource as CapabilityStatement + if (list.get(cs.url) === null) { + list.put(resource.url,resource) + } + } + } + return list.values.toList() } @Operation(name = "openapi", idempotent = true,manualResponse=true, manualRequest=true) diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index d77f9d7..459803d 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -17,7 +17,7 @@ fhir: server: name: NHS England Interoperability Standards FHIR Testing baseUrl: https://3cdzg7kbj4.execute-api.eu-west-2.amazonaws.com/poc/Conformance - version: 6.10.17 + version: 6.10.18 services: R4: true diff --git a/src/main/resources/manifest.json b/src/main/resources/manifest.json index 2913867..11cbccf 100644 --- a/src/main/resources/manifest.json +++ b/src/main/resources/manifest.json @@ -7,8 +7,20 @@ "packageName": "fhir.r4.nhsengland.stu1", "version": "1.1.0" }, + { + "packageName": "hl7.fhir.uv.sdc", + "version": "3.0.0" + }, + { + "packageName": "hl7.fhir.uv.ipa", + "version": "1.0.0" + }, + { + "packageName": "hl7.fhir.eu.laboratory", + "version": "0.1.0-ballot" + }, { "packageName": "uk.nhsengland.r4", "version": "0.0.0-prerelease" } -] \ No newline at end of file +] From 7a475a0d56acfd80a8a7369db59cd91e4b5600f9 Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Thu, 25 Jan 2024 06:44:00 +0000 Subject: [PATCH 36/67] Fixed issue with ValidationInterceptor.kt reporting Validation failed --- aws-repo-notes.txt | 4 ++-- pom.xml | 2 +- .../fhirvalidator/interceptor/ValidationInterceptor.kt | 1 + .../nhs/england/fhirvalidator/provider/FHIRtoTextProvider.kt | 4 ++++ src/main/resources/application.yaml | 2 +- 5 files changed, 9 insertions(+), 4 deletions(-) diff --git a/aws-repo-notes.txt b/aws-repo-notes.txt index a7bfc29..d87119a 100644 --- a/aws-repo-notes.txt +++ b/aws-repo-notes.txt @@ -23,9 +23,9 @@ mvn clean install docker build -t fhir-validator-r4 . docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest -docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.18 +docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.19 -docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.18 +docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.19 docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest diff --git a/pom.xml b/pom.xml index 1b7fc06..998052a 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ uk.nhs.england IOPS-FHIR-Validation-Service - 6.10.18 + 6.10.19 IOPS-FHIR-Validation-Service HAPI FHIR Validator using Spring Boot diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/ValidationInterceptor.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/ValidationInterceptor.kt index 6b9e29c..008aa99 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/ValidationInterceptor.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/ValidationInterceptor.kt @@ -59,6 +59,7 @@ class ValidationInterceptor(val ctx : FhirContext, val messageProperties: Messag issue.severity.equals(OperationOutcome.IssueSeverity.FATAL) )) { log.debug(issue.diagnostics) + if (issue.diagnostics.contains("Validation failed for")) continue fail(validationResult) } } diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/FHIRtoTextProvider.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/FHIRtoTextProvider.kt index 4f95879..5a7319c 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/FHIRtoTextProvider.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/FHIRtoTextProvider.kt @@ -21,6 +21,10 @@ import kotlin.reflect.KClass import kotlin.reflect.full.memberProperties import kotlin.reflect.jvm.isAccessible +/* + +DO NOT USE + */ @Component class FHIRtoTextProvider(@Qualifier("R4") private val fhirContext: FhirContext, diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 459803d..1c21cdf 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -17,7 +17,7 @@ fhir: server: name: NHS England Interoperability Standards FHIR Testing baseUrl: https://3cdzg7kbj4.execute-api.eu-west-2.amazonaws.com/poc/Conformance - version: 6.10.18 + version: 6.10.19 services: R4: true From f9a7b1e36a7107d9feb83867524d1ad6ae79f10e Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Thu, 25 Jan 2024 11:35:31 +0000 Subject: [PATCH 37/67] Fixed issue with missing valueSet --- aws-repo-notes.txt | 4 ++-- pom.xml | 2 +- .../CapabilityStatementToOpenAPIConversion.kt | 17 ++++++++++------- src/main/resources/application.yaml | 2 +- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/aws-repo-notes.txt b/aws-repo-notes.txt index d87119a..a542d49 100644 --- a/aws-repo-notes.txt +++ b/aws-repo-notes.txt @@ -23,9 +23,9 @@ mvn clean install docker build -t fhir-validator-r4 . docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest -docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.19 +docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.20 -docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.19 +docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.20 docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest diff --git a/pom.xml b/pom.xml index 998052a..1addba0 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ uk.nhs.england IOPS-FHIR-Validation-Service - 6.10.19 + 6.10.20 IOPS-FHIR-Validation-Service HAPI FHIR Validator using Spring Boot diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/oas/CapabilityStatementToOpenAPIConversion.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/oas/CapabilityStatementToOpenAPIConversion.kt index 8e825b3..347f0d5 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/oas/CapabilityStatementToOpenAPIConversion.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/oas/CapabilityStatementToOpenAPIConversion.kt @@ -1919,14 +1919,17 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F if (element.binding.hasValueSet()) { val valueSet = supportChain.fetchValueSet(element.binding.valueSet) - var description = "["+(valueSet as ValueSet).name + "](" + getDocumentationPath(element.binding.valueSet) +")" - if (element.binding.hasStrength()) description += " (" + element.binding.strength.display + ")" - if (element.binding.hasDescription()) { - var elementDescription = element.binding.description - elementDescription = "
" + elementDescription.replace("\\n","\n") - description += elementDescription + " " + if (valueSet !== null) { + var description = + "[" + (valueSet as ValueSet).name + "](" + getDocumentationPath(element.binding.valueSet) + ")" + if (element.binding.hasStrength()) description += " (" + element.binding.strength.display + ")" + if (element.binding.hasDescription()) { + var elementDescription = element.binding.description + elementDescription = "
" + elementDescription.replace("\\n", "\n") + description += elementDescription + " " + } + table += "\n|[Terminology Binding](https://www.hl7.org/fhir/terminologies.html)|" + description + "|" } - table += "\n|[Terminology Binding](https://www.hl7.org/fhir/terminologies.html)|"+description+"|" } } diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 1c21cdf..0168226 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -17,7 +17,7 @@ fhir: server: name: NHS England Interoperability Standards FHIR Testing baseUrl: https://3cdzg7kbj4.execute-api.eu-west-2.amazonaws.com/poc/Conformance - version: 6.10.19 + version: 6.10.20 services: R4: true From ce14cced8f59a40172eb705e2116586e51cccce1 Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Fri, 26 Jan 2024 07:02:00 +0000 Subject: [PATCH 38/67] api queryparameter name missing issue --- .../fhirvalidator/service/interactions/FHIRRESTful.kt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/interactions/FHIRRESTful.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/interactions/FHIRRESTful.kt index 29504e9..7c7b534 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/interactions/FHIRRESTful.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/interactions/FHIRRESTful.kt @@ -43,6 +43,15 @@ class FHIRRESTful( apiParameter: CapabilityStatement.CapabilityStatementRestResourceSearchParamComponent, outcomes: MutableList ) { + if (apiParameter.name == null) { + val issue = addOperationIssue( + outcomes, + OperationOutcome.IssueType.CODEINVALID, + OperationOutcome.IssueSeverity.WARNING, + "Name must not be null for resource type = "+resourceType + ) + issue.location.add(StringType(locaton)) + } val searchParameter = getSearchParameter(outcomes, resourceType,apiParameter.name) if (searchParameter == null) { val issue = addOperationIssue( From 4c741d43b00d1afa2f6340948e7a546b582a82f2 Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Fri, 26 Jan 2024 16:46:09 +0000 Subject: [PATCH 39/67] Issue around _include --- aws-repo-notes.txt | 4 ++-- pom.xml | 2 +- .../england/fhirvalidator/service/interactions/FHIRRESTful.kt | 2 +- src/main/resources/application.yaml | 2 +- src/main/resources/manifest.json | 4 ---- 5 files changed, 5 insertions(+), 9 deletions(-) diff --git a/aws-repo-notes.txt b/aws-repo-notes.txt index a542d49..14ac63a 100644 --- a/aws-repo-notes.txt +++ b/aws-repo-notes.txt @@ -23,9 +23,9 @@ mvn clean install docker build -t fhir-validator-r4 . docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest -docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.20 +docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.21 -docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.20 +docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.21 docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest diff --git a/pom.xml b/pom.xml index 1addba0..934fcc9 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ uk.nhs.england IOPS-FHIR-Validation-Service - 6.10.20 + 6.10.21 IOPS-FHIR-Validation-Service HAPI FHIR Validator using Spring Boot diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/interactions/FHIRRESTful.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/interactions/FHIRRESTful.kt index 7c7b534..09e71c5 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/interactions/FHIRRESTful.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/interactions/FHIRRESTful.kt @@ -62,7 +62,7 @@ class FHIRRESTful( ) issue.location.add(StringType(locaton)) } else { - if (searchParameter.name.startsWith("_include")) { + if (searchParameter.hasName() && searchParameter.name.startsWith("_include")) { } else { diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 0168226..647c9f6 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -17,7 +17,7 @@ fhir: server: name: NHS England Interoperability Standards FHIR Testing baseUrl: https://3cdzg7kbj4.execute-api.eu-west-2.amazonaws.com/poc/Conformance - version: 6.10.20 + version: 6.10.21 services: R4: true diff --git a/src/main/resources/manifest.json b/src/main/resources/manifest.json index 11cbccf..a6ea009 100644 --- a/src/main/resources/manifest.json +++ b/src/main/resources/manifest.json @@ -1,8 +1,4 @@ [ - { - "packageName": "fhir.r4.ukcore.stu3.currentbuild", - "version": "0.0.8-pre-release" - }, { "packageName": "fhir.r4.nhsengland.stu1", "version": "1.1.0" From 16567220b6e522b8a023e462fd6045733e745085 Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Sat, 27 Jan 2024 10:38:07 +0000 Subject: [PATCH 40/67] Removed schema generation from OAS. Use link to profile documentation instead --- aws-repo-notes.txt | 4 +- pom.xml | 2 +- .../fhirvalidator/FHIRR4RestfulServer.kt | 7 +- .../configuration/ValidationConfiguration.kt | 27 +- .../interceptor/CapabilityStatementApplier.kt | 10 + .../CapabilityStatementInterceptor.kt | 68 ++- .../fhirvalidator/model/FHIRPackage.kt | 3 + .../provider/MarkdownProvider.kt | 211 +++++++- .../fhirvalidator/service/CodingSupport.kt | 1 - .../CapabilityStatementToOpenAPIConversion.kt | 511 ++++++------------ src/main/resources/application.yaml | 2 +- 11 files changed, 474 insertions(+), 372 deletions(-) create mode 100644 src/main/kotlin/uk/nhs/england/fhirvalidator/model/FHIRPackage.kt diff --git a/aws-repo-notes.txt b/aws-repo-notes.txt index 14ac63a..c1fae7b 100644 --- a/aws-repo-notes.txt +++ b/aws-repo-notes.txt @@ -23,9 +23,9 @@ mvn clean install docker build -t fhir-validator-r4 . docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest -docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.21 +docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.22 -docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.21 +docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.22 docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest diff --git a/pom.xml b/pom.xml index 934fcc9..80c797e 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ uk.nhs.england IOPS-FHIR-Validation-Service - 6.10.21 + 6.10.22 IOPS-FHIR-Validation-Service HAPI FHIR Validator using Spring Boot diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRR4RestfulServer.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRR4RestfulServer.kt index e34594c..2ac1e24 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRR4RestfulServer.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRR4RestfulServer.kt @@ -15,6 +15,7 @@ import uk.nhs.england.fhirvalidator.configuration.MessageProperties import uk.nhs.england.fhirvalidator.interceptor.AWSAuditEventLoggingInterceptor import uk.nhs.england.fhirvalidator.interceptor.CapabilityStatementInterceptor import uk.nhs.england.fhirvalidator.interceptor.ValidationInterceptor +import uk.nhs.england.fhirvalidator.model.FHIRPackage import uk.nhs.england.fhirvalidator.provider.* import java.util.* import javax.servlet.annotation.WebServlet @@ -24,7 +25,7 @@ import javax.servlet.annotation.WebServlet class FHIRR4RestfulServer( @Qualifier("R4") fhirContext: FhirContext, @Autowired(required = false) val sqs : AmazonSQS?, - val objectMapper: ObjectMapper, + val fhirPackage: List, private val validateR4Provider: ValidateR4Provider, private val openAPIProvider: OpenAPIProvider, private val markdownProvider: MarkdownProvider, @@ -38,8 +39,6 @@ class FHIRR4RestfulServer( private val namingSystemProvider: NamingSystemProvider, private val valueSetProvider: ValueSetProvider, private val codeSystemProvider: CodeSystemProvider, - - private val npmPackages: List, @Qualifier("SupportChain") private val supportChain: IValidationSupport, val fhirServerProperties: FHIRServerProperties, private val messageProperties: MessageProperties @@ -66,7 +65,7 @@ class FHIRR4RestfulServer( - registerInterceptor(CapabilityStatementInterceptor(this.fhirContext, objectMapper, supportChain, fhirServerProperties)) + registerInterceptor(CapabilityStatementInterceptor(this.fhirContext, fhirPackage, supportChain, fhirServerProperties)) val awsAuditEventLoggingInterceptor = diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/ValidationConfiguration.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/ValidationConfiguration.kt index e0c0dde..93b2f90 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/ValidationConfiguration.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/ValidationConfiguration.kt @@ -7,6 +7,7 @@ import ca.uhn.fhir.context.support.ValidationSupportContext import ca.uhn.fhir.rest.server.exceptions.UnprocessableEntityException import ca.uhn.fhir.validation.FhirValidator import com.fasterxml.jackson.databind.ObjectMapper +import io.swagger.v3.oas.models.examples.Example import mu.KLogging import org.hl7.fhir.common.hapi.validation.support.* import org.hl7.fhir.common.hapi.validation.validator.FhirInstanceValidator @@ -21,6 +22,7 @@ import org.springframework.context.annotation.Configuration import org.springframework.core.io.ClassPathResource import org.springframework.security.oauth2.client.OAuth2AuthorizedClientManager import uk.nhs.england.fhirvalidator.awsProvider.* +import uk.nhs.england.fhirvalidator.model.FHIRPackage import uk.nhs.england.fhirvalidator.model.SimplifierPackage import uk.nhs.england.fhirvalidator.service.ImplementationGuideParser import uk.nhs.england.fhirvalidator.util.AccessTokenInterceptor @@ -35,6 +37,7 @@ import java.time.Duration import java.time.Instant import java.util.* import java.util.function.Predicate +import kotlin.collections.ArrayList @Configuration @@ -47,8 +50,13 @@ open class ValidationConfiguration( ) { companion object : KLogging() - var npmPackages: List? = null + var npmPackages: List = emptyList() + var fhirPackage = mutableListOf() + @Bean + open fun fhirPackages() : List { + return this.fhirPackage + } @Bean open fun validator(@Qualifier("R4") fhirContext: FhirContext, instanceValidator: FhirInstanceValidator): FhirValidator { return fhirContext.newValidator().registerValidatorModule(instanceValidator) @@ -82,7 +90,7 @@ open class ValidationConfiguration( switchedTerminologyServiceValidationSupport ) if (messageProperties.getAWSValidationSupport()) supportChain.addValidationSupport( AWSValidationSupport(fhirContext, awsQuestionnaire,awsCodeSystem,awsValueSet, awsConceptMap)) - getPackages() + val manifest = getPackages() if (npmPackages != null) { npmPackages!! .filter { !it.name().equals("hl7.fhir.r4.examples") } @@ -94,6 +102,18 @@ open class ValidationConfiguration( generateSnapshots(supportChain) supportChain.fetchCodeSystem("http://snomed.info/sct") // packages have been processed so remove them + for (pckg in npmPackages) { + var description = pckg.description() + if (description == null) description = "" + var derived = true + if (manifest !==null) { + manifest.forEach { + if (it.packageName.equals(pckg.name())) derived = false + } + } + var newPckg = FHIRPackage(pckg.name(),pckg.version(),description,pckg.url(),derived) + this.fhirPackage.add(newPckg) + } npmPackages = emptyList() return supportChain } else { @@ -209,7 +229,7 @@ open class ValidationConfiguration( } - open fun getPackages() { + open fun getPackages() :Array? { var manifest : Array? = null if (fhirServerProperties.ig != null ) { manifest = arrayOf(SimplifierPackage(fhirServerProperties.ig!!.name, fhirServerProperties.ig!!.version)) @@ -262,6 +282,7 @@ open class ValidationConfiguration( .toList() */ + return manifest } open fun downloadPackage(name : String, version : String) : List { diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/CapabilityStatementApplier.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/CapabilityStatementApplier.kt index 22dff57..1ab3df9 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/CapabilityStatementApplier.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/CapabilityStatementApplier.kt @@ -25,6 +25,16 @@ class CapabilityStatementApplier( restResources?.forEach { applyRestResource(resource, it, importProfile) } } + fun getProfile(resourceType: String): String? { + var profile: String? = null + restResources?.forEach { + if (it.type !== null && it.type.equals(resourceType) && it.hasProfile()) { + profile = it.profile + } + + } + return profile + } private fun applyRestResource( resource: IBaseResource, restResource: CapabilityStatement.CapabilityStatementRestResourceComponent, diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/CapabilityStatementInterceptor.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/CapabilityStatementInterceptor.kt index 26f37df..36cbd78 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/CapabilityStatementInterceptor.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/CapabilityStatementInterceptor.kt @@ -12,13 +12,14 @@ import org.hl7.fhir.r4.model.* import org.hl7.fhir.utilities.npm.NpmPackage import org.springframework.core.io.ClassPathResource import uk.nhs.england.fhirvalidator.configuration.FHIRServerProperties +import uk.nhs.england.fhirvalidator.model.FHIRPackage import uk.nhs.england.fhirvalidator.model.SimplifierPackage import uk.nhs.england.fhirvalidator.service.ImplementationGuideParser @Interceptor class CapabilityStatementInterceptor( fhirContext: FhirContext, - val objectMapper: ObjectMapper, + private val fhirPackage: List, private val supportChain: IValidationSupport, private val fhirServerProperties: FHIRServerProperties ) { @@ -34,32 +35,47 @@ class CapabilityStatementInterceptor( // Customize the CapabilityStatement as desired val apiextension = Extension(); apiextension.url = "https://fhir.nhs.uk/StructureDefinition/Extension-NHSDigital-CapabilityStatement-Package" - var manifest : Array? = null - if (fhirServerProperties.ig != null ) { - manifest = arrayOf(SimplifierPackage(fhirServerProperties.ig!!.name, fhirServerProperties.ig!!.version)) - } else { - val configurationInputStream = ClassPathResource("manifest.json").inputStream - manifest = objectMapper.readValue(configurationInputStream, Array::class.java) - } - if (manifest != null) { - - manifest.forEach { - val packageExtension = Extension(); - packageExtension.url="FHIRPackage" - packageExtension.extension.add(Extension().setUrl("name").setValue(StringType(it.packageName))) - packageExtension.extension.add(Extension().setUrl("version").setValue(StringType(it.version))) - apiextension.extension.add(packageExtension) - var implementationGuide = ImplementationGuide() - implementationGuide.packageId = it.packageName - implementationGuide.version = it.version - implementationGuide.status = Enumerations.PublicationStatus.UNKNOWN - implementationGuide.name = it.packageName - implementationGuide.url = "https://example.fhir.org/ImplementationGuide/"+it.packageName + "|" + it.version - implementationGuide.id = it.packageName - cs.implementationGuide.add(CanonicalType("#" + it.packageName)) - cs.contained.add(implementationGuide) + /* + if (enhance && fhirPackage !== null && fhirPackage.size > 0) { + var igDescription = "\n\n | FHIR Implementation Guide | Version |\n |-----|-----|\n" + + fhirPackage.forEach { + if (!it.derived) { + val name = it.url + val version = it.version + val pckg = it.name + val url = getDocumentationPath(it.url) + if (name == null) igDescription += " ||$pckg#$version|\n" + else igDescription += " |[$name]($url)|$pckg#$version|\n" + } + } + openApi.info.description += "\n\n" + igDescription + } + + */ + + + fhirPackage.forEach { + if (!it.derived) { + /* 27 Jan 2024 Use contained instead + val packageExtension = Extension(); + packageExtension.url = "FHIRPackage" + packageExtension.extension.add(Extension().setUrl("name").setValue(StringType(it.name))) + packageExtension.extension.add(Extension().setUrl("version").setValue(StringType(it.version))) + apiextension.extension.add(packageExtension) */ + var implementationGuide = ImplementationGuide() + implementationGuide.packageId = it.name + implementationGuide.version = it.version + implementationGuide.status = Enumerations.PublicationStatus.UNKNOWN + implementationGuide.name = it.name + implementationGuide.url = + "https://example.fhir.org/ImplementationGuide/" + it.name + "|" + it.version + implementationGuide.id = it.name + cs.implementationGuide.add(CanonicalType("#" + it.name)) + cs.contained.add(implementationGuide) + } } - } + val packageExtension = Extension(); packageExtension.url="openApi" packageExtension.extension.add(Extension().setUrl("documentation").setValue(UriType("https://simplifier.net/guide/NHSDigital/Home"))) diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/model/FHIRPackage.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/model/FHIRPackage.kt new file mode 100644 index 0000000..00c1aac --- /dev/null +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/model/FHIRPackage.kt @@ -0,0 +1,3 @@ +package uk.nhs.england.fhirvalidator.model + +data class FHIRPackage(val name: String, val version: String, val description: String, val url: String?, val derived: Boolean) diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/MarkdownProvider.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/MarkdownProvider.kt index bda632c..a496c4f 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/MarkdownProvider.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/MarkdownProvider.kt @@ -1,9 +1,12 @@ package uk.nhs.england.fhirvalidator.provider +import ca.uhn.fhir.context.support.IValidationSupport import ca.uhn.fhir.rest.annotation.Operation import ca.uhn.fhir.rest.annotation.OperationParam import ca.uhn.fhir.rest.param.StringParam import mu.KLogging +import org.hl7.fhir.r4.model.* +import org.springframework.beans.factory.annotation.Qualifier import org.springframework.stereotype.Component import uk.nhs.england.fhirvalidator.service.oas.CapabilityStatementToOpenAPIConversion import java.nio.charset.StandardCharsets @@ -12,7 +15,8 @@ import javax.servlet.http.HttpServletResponse @Component class MarkdownProvider ( - private val oasParser : CapabilityStatementToOpenAPIConversion + private val oasParser : CapabilityStatementToOpenAPIConversion, + @Qualifier("SupportChain") private val supportChain: IValidationSupport, ) { companion object : KLogging() @@ -26,10 +30,213 @@ class MarkdownProvider ( servletResponse.setContentType("text/markdown") servletResponse.setCharacterEncoding("UTF-8") if (profile != null) { - servletResponse.writer.write(oasParser.generateMarkdown(java.net.URLDecoder.decode(profile.value, StandardCharsets.UTF_8.name()))) + servletResponse.writer.write(generateMarkdown(java.net.URLDecoder.decode(profile.value, StandardCharsets.UTF_8.name()))) } servletResponse.writer.flush() return } + private fun getElementDescription(element : ElementDefinition) : String { + + var table = "\n\n| | |\n|----|----|" + // header body + /* + if (element.hasMustSupport() && element.mustSupport) { + description += "\n `mustSupport`" + } +*/ + table += "\n|Element Id|"+element.id+"|" + table += "\n|[Cardinality](https://www.hl7.org/fhir/conformance-rules.html#cardinality)|"+element.min+".."+element.max+"|" + + + if (element.hasFixed()) { + if (element.fixed is UriType) { + table += "\n|Fixed Value|"+(element.fixed as UriType).value+"|" + } + if (element.fixed is CodeType) { + table += "\n|Fixed Value|"+(element.fixed as CodeType).value+"|" + } + } + + if (element.hasBinding()) { + if (element.binding.hasValueSet()) + { + val valueSet = supportChain.fetchValueSet(element.binding.valueSet) + if (valueSet !== null) { + var description = + "[" + (valueSet as ValueSet).name + "](" + oasParser.getDocumentationPath(element.binding.valueSet) + ")" + if (element.binding.hasStrength()) description += " (" + element.binding.strength.display + ")" + if (element.binding.hasDescription()) { + var elementDescription = element.binding.description + elementDescription = "
" + elementDescription.replace("\\n", "\n") + description += elementDescription + " " + } + table += "\n|[Terminology Binding](https://www.hl7.org/fhir/terminologies.html)|" + description + "|" + } + } + } + + if (element.hasSliceName()) { + table += "\n|[Slice Name](https://www.hl7.org/fhir/profiling.html#slicing)|"+element.sliceName+"|" + } + if (element.hasSlicing()) { + var description = "" + if (element.slicing.hasRules()) { + description += " *"+element.slicing.rules.name + "*" + } + if (element.slicing.hasDiscriminator()) { + for (discrimninator in element.slicing.discriminator) { + description += " discriminator - " + if (discrimninator.hasType()) { + description += " *"+discrimninator.type.name + "*" + } + if (discrimninator.hasPath()) { + description += " *"+discrimninator.path + "*" + } + } + } + if (element.slicing.hasDescription()) { + description += "
"+element.slicing.description + } + table += "\n|[Slicing](https://www.hl7.org/fhir/profiling.html#slicing)|"+description+"|" + } + + // Data type + if (element.hasType()) { + var description = "" + for (type in element.type) { + + description += "["+type.code+"](https://www.hl7.org/fhir/datatypes.html#"+type.code+")" + var itemDescription="" + var first = true + for (target in type.targetProfile) { + if (itemDescription.isEmpty()) description+= "(" + val profile = supportChain.fetchStructureDefinition(target.value) + if (!first) { + itemDescription += " " + } else { + first = false + } + itemDescription += "["+(profile as StructureDefinition).name + "]("+ oasParser.getDocumentationPath(target.value) +")" + + } + first = true + for (target in type.profile) { + if (itemDescription.isEmpty()) description+= "(" + val profile = supportChain.fetchStructureDefinition(target.value) + if (!first) { + itemDescription += " " + } else { + first = false + } + itemDescription += "["+(profile as StructureDefinition).name+ "](" + oasParser.getDocumentationPath(target.value) +")" + } + + if (itemDescription.isNotEmpty()) description+= itemDescription + ")" + if (type.hasAggregation()) { + for (aggregation in type.aggregation) { + description += "
Aggregation - [" + aggregation.code+"](http://www.hl7.org/fhir/valueset-resource-aggregation-mode.html)" + } + } + } + table += "\n|[type](https://www.hl7.org/fhir/datatypes.html)|"+description+"|" + } + var description = table + "\n\n
" + // Documentation section + /* + if (element.hasShort()) { + + description += "\n\n " + element.short + } + */ + + if (element.hasDefinition()) { + description += "\n\n #### Definition" + description += "\n\n " + element.definition.replace("\\n","\n") + } + + if (element.hasRequirements()) { + description += "\n\n #### Requirements" + description += "\n\n " + element.requirements.replace("\\n","\n") + } + + if (element.hasComment()) { + description += "\n\n #### Comment" + description += "\n\n " + element.comment.replace("\\n","\n") + } + + if (element.hasConstraint()) { + var displayConstraints = false + for (constraint in element.constraint) { + if (doDisplay(constraint.key)) displayConstraints = true + } + + if (displayConstraints) { + description += "\n\n #### Constraints \n" + for (constraint in element.constraint) { + if (doDisplay(constraint.key)) description += "\n- **" + constraint.key + "** (*" + constraint.severity + "*) " + constraint.human.replace( + "\\n", + "\n" + ) + } + } + } + + return description + } + + fun generateMarkdown(profile :String) : String { + var mainDescription = "" + var subDescription = "" + var index = "" + + + if (profile != null) { + val structureDefinition = oasParser.getProfile(profile) + if (structureDefinition is StructureDefinition) { + + if (structureDefinition.hasDescription()) { + mainDescription += "\n\n " + structureDefinition.description + } + if (structureDefinition.hasPurpose()) { + mainDescription += "\n\n " + structureDefinition.purpose + } + + for (element in structureDefinition.snapshot.element) { + val paths = element.path.split(".") + if ( + element.hasMustSupport() || element.hasFixed() || (element.hasSliceName() && !paths[paths.size-1].equals("extension")) + || element.id.split(".").size == 1) { + val paths = element.id.split(".") + var title = "" + + + if (paths.size>1){ + for (i in 2..paths.size) { + if (title.isNotEmpty()) title += "." + title += paths[i-1] + } + index += "\n-
"+title+"" + subDescription += "\n\n\n ## "+title + subDescription += getElementDescription(element) + } else { + mainDescription += getElementDescription(element) + } + + + + } + } + } + } + return mainDescription + "\n\n" + index + subDescription + } + + private fun doDisplay(key : String) : Boolean { + if (key.startsWith("ext")) return false + if (key.startsWith("ele")) return false + if (key.startsWith("dom")) return false + return true + } + } diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/CodingSupport.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/CodingSupport.kt index 5581bd5..7baf38c 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/CodingSupport.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/CodingSupport.kt @@ -27,7 +27,6 @@ import kotlin.collections.ArrayList @Service class CodingSupport(@Qualifier("R4") private val ctx: FhirContext?, - private val npmPackages: List?, @Qualifier("SupportChain") private val supportChain: IValidationSupport, private val terminologyValidationProperties: TerminologyValidationProperties, optionalAuthorizedClientManager: Optional, diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/oas/CapabilityStatementToOpenAPIConversion.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/oas/CapabilityStatementToOpenAPIConversion.kt index 347f0d5..888b113 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/oas/CapabilityStatementToOpenAPIConversion.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/oas/CapabilityStatementToOpenAPIConversion.kt @@ -23,12 +23,15 @@ import org.apache.commons.text.StringEscapeUtils import org.hl7.fhir.instance.model.api.IBaseResource import org.hl7.fhir.instance.model.api.IPrimitiveType import org.hl7.fhir.r4.model.* -import org.hl7.fhir.utilities.npm.NpmPackage import org.json.JSONArray import org.json.JSONObject import org.springframework.beans.factory.annotation.Qualifier +import org.springframework.core.Ordered +import org.springframework.core.annotation.Order import org.springframework.core.io.ClassPathResource import org.springframework.stereotype.Service +import uk.nhs.england.fhirvalidator.interceptor.CapabilityStatementApplier +import uk.nhs.england.fhirvalidator.model.FHIRPackage import uk.nhs.england.fhirvalidator.model.SimplifierPackage import uk.nhs.england.fhirvalidator.service.ImplementationGuideParser import uk.nhs.england.fhirvalidator.service.SearchParameterSupport @@ -39,11 +42,12 @@ import java.util.function.Supplier import java.util.stream.Collectors @Service +@Order(Ordered.LOWEST_PRECEDENCE) class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: FhirContext, - private val npmPackages: List?, - val objectMapper: ObjectMapper, + private val fhirPackage: List, @Qualifier("SupportChain") private val supportChain: IValidationSupport, - private val searchParameterSupport : SearchParameterSupport + private val searchParameterSupport : SearchParameterSupport, + private val capabilityStatementApplier: CapabilityStatementApplier ) { @@ -66,59 +70,50 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F openApi.info = Info() openApi.info.description = unescapeMarkdown(cs.description) if (openApi.info.description == null) openApi.info.description = "" - openApi.info.title = cs.software.name + if (cs.hasTitle()) openApi.info.title = cs.title openApi.info.version = cs.software.version - openApi.info.contact = Contact() - openApi.info.contact.name = cs.contactFirstRep.name - openApi.info.contact.email = cs.contactFirstRep.telecomFirstRep.value + if (cs.hasContact()) { + openApi.info.contact = Contact() + for (contact in cs.contact){ + if (cs.hasName()) openApi.info.contact.name = contact.name + if (contact.hasTelecom()) { + for (telecom in contact.telecom) { + if (telecom.hasSystem() && telecom.system.equals(ContactPoint.ContactPointSystem.EMAIL)) { + openApi.info.contact.email = telecom.value + } + if (telecom.hasSystem() && telecom.system.equals(ContactPoint.ContactPointSystem.URL)) { + openApi.info.contact.url = telecom.value + } + } + } + } + } for (code in cs.format) { if (code.value.contains("xml")) generateXML = true } - - if (enhance && cs.hasExtension("https://fhir.nhs.uk/StructureDefinition/Extension-NHSDigital-CapabilityStatement-Package")) { - val apiDefinition = cs.getExtensionByUrl("https://fhir.nhs.uk/StructureDefinition/Extension-NHSDigital-CapabilityStatement-Package") - // Sample table:\n\n| One | Two | Three |\n|-----|-----|-------|\n| a | b | c | - if (apiDefinition.hasExtension("openApi")) { - var docDescription = "\n\n | API Documentation |\n |-----|\n " - apiDefinition.extension.forEach{ - if (it.url.equals("openApi")) { - docDescription += " |["+(it.getExtensionByUrl("description").value as StringType).value+"]("+(it.getExtensionByUrl("documentation").value as UriType).value+")|\n" - } + /* + if (enhance && fhirPackage !== null && fhirPackage.size > 0) { + var igDescription = "\n\n | FHIR Implementation Guide | Version |\n |-----|-----|\n" + + fhirPackage.forEach { + if (!it.derived) { + val name = it.url + val version = it.version + val pckg = it.name + val url = getDocumentationPath(it.url) + if (name == null) igDescription += " ||$pckg#$version|\n" + else igDescription += " |[$name]($url)|$pckg#$version|\n" } - openApi.info.description += docDescription } - openApi.info.extensions = mutableMapOf() - val igs = mutableMapOf() - if (apiDefinition.hasExtension("FHIRPackage")) { - var igDescription = "\n\n | FHIR Implementation Guide | Version |\n |-----|-----|\n" - apiDefinition.extension.forEach{ - - if (it.url.equals("FHIRPackage")) { - - val name = it.getExtensionByUrl("name").value as StringType - var url = "https://simplifier.net/guide/NHSDigital/Home" - var version = "" - if (it.hasExtension("version")) { - version = (it.getExtensionByUrl("version").value as StringType).value - igs[(it.getExtensionByUrl("name").value as StringType).value] = (it.getExtensionByUrl("version").value as StringType).value - } else { - igs[(it.getExtensionByUrl("name").value as StringType).value] = "" - } - if (name.value.startsWith("uk.nhsdigital.medicines")) url = "https://simplifier.net/guide/nhsdigital-medicines/home" - if (name.value.startsWith("ukcore.")) url = "https://simplifier.net/guide/hl7fhirukcorer4release1/home" - igDescription += " |[$name]($url)|$version|\n" + openApi.info.description += "\n\n" + igDescription + } - } - } - openApi.info.description += igDescription - } - openApi.info.extensions["x-HL7-FHIR-NpmPackages"] = igs + */ - } openApi.externalDocs = ExternalDocumentation() - openApi.externalDocs.description = "Hl7 FHIR R4" - openApi.externalDocs.url = "https://www.hl7.org/fhir/" + if (cs.hasTitle()) openApi.externalDocs.description = cs.title + if (cs.hasUrl()) openApi.externalDocs.url = getDocumentationPath(cs.url) val server = Server() openApi.addServersItem(server) server.url = cs.implementation.url @@ -131,12 +126,16 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F serverTag.description = "Server-level operations" openApi.addTagsItem(serverTag) - /* This should be in the capability statement REMOVED + val capabilitiesOperation = getPathItem(paths, "/metadata", PathItem.HttpMethod.GET) capabilitiesOperation.addTagsItem(PAGE_SYSTEM) - capabilitiesOperation.summary = "server-capabilities: Fetch the server FHIR CapabilityStatement" - addFhirResourceResponse(this.ctx, openApi, capabilitiesOperation, "CapabilityStatement",null,null,null) - */ + if (enhance) { + capabilitiesOperation.externalDocs = ExternalDocumentation() + capabilitiesOperation.externalDocs.url = "https://hl7.org/fhir/R4/http.html#capabilities" + capabilitiesOperation.externalDocs.description = "FHIR RESTful API - capabilities" + } + addFhirResourceResponse(this.ctx, openApi, capabilitiesOperation, "CapabilityStatement",null,null,null, enhance) + val systemInteractions = cs.restFirstRep.interaction.stream().map { t: CapabilityStatement.SystemInteractionComponent -> t.code } @@ -150,7 +149,11 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F ) { val transaction = getPathItem(paths, "/", PathItem.HttpMethod.POST) transaction.addTagsItem(PAGE_SYSTEM) - transaction.summary = "server-transaction: Execute a FHIR Transaction (or FHIR Batch) Bundle" + if (enhance) { + transaction.externalDocs = ExternalDocumentation() + transaction.externalDocs.url = "https://hl7.org/fhir/R4/http.html#transaction" + transaction.externalDocs.description = "FHIR RESTful API - transaction" + } addFhirResourceResponse(ctx, openApi, transaction, null, null,null,null, enhance) addFhirResourceRequestBody(openApi, transaction, emptyList(), "Bundle",null, enhance) } @@ -159,8 +162,11 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F if (systemInteractions.contains(CapabilityStatement.SystemRestfulInteraction.HISTORYSYSTEM)) { val systemHistory = getPathItem(paths, "/_history", PathItem.HttpMethod.GET) systemHistory.addTagsItem(PAGE_SYSTEM) - systemHistory.summary = - "server-history: Fetch the resource change history across all resource types on the server" + if (enhance) { + systemHistory.externalDocs = ExternalDocumentation() + systemHistory.externalDocs.url = "https://hl7.org/fhir/R4/http.html#history" + systemHistory.externalDocs.description = "FHIR RESTful API - history" + } addFhirResourceResponse(ctx, openApi, systemHistory, null, null,null,null, enhance) } @@ -189,14 +195,13 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F CapabilityStatement.TypeRestfulInteraction.SEARCHTYPE -> { val operation = getPathItem(paths, "/$resourceType", PathItem.HttpMethod.GET) operation.addTagsItem(resourceType) - operation.summary = resftfulIntraction.code.display if (enhance) { - operation.description = "[search](http://www.hl7.org/fhir/search.html) for $resourceType instances." - } else { - operation.description = "" + operation.externalDocs = ExternalDocumentation() + operation.externalDocs.description("FHIR RESTful API - search") + operation.externalDocs.url("https://hl7.org/fhir/R4/http.html#search") } if (resftfulIntraction.hasDocumentation()) { - operation.description += "\n\n"+ unescapeMarkdown(resftfulIntraction.documentation) + operation.description = unescapeMarkdown(resftfulIntraction.documentation) } if (enhance && nextResource.hasExtension("http://hl7.org/fhir/StructureDefinition/capabilitystatement-search-parameter-combination")) { var comboDoc = "\n\n **Search Parameter Combinations** \n\n The following search parameters combinations should be supported. \n\n" + @@ -219,6 +224,7 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F } comboDoc += "| $requiredDoc| $optionalDoc | \n" } + if (operation.description == null) operation.description = "" operation.description += comboDoc } addFhirResourceResponse(ctx, openApi, operation, resourceType,resftfulIntraction, null,null, enhance) @@ -229,11 +235,15 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F CapabilityStatement.TypeRestfulInteraction.READ -> { val operation = getPathItem(paths, "/$resourceType/{id}", PathItem.HttpMethod.GET) operation.addTagsItem(resourceType) - operation.summary = resftfulIntraction.code.display - operation.description = "[read](http://www.hl7.org/fhir/http.html#read) $resourceType instance." + + if (enhance) { + operation.externalDocs = ExternalDocumentation() + operation.externalDocs.description("FHIR RESTful API - read") + operation.externalDocs.url("https://hl7.org/fhir/R4/http.html#read") + } if (resftfulIntraction.hasDocumentation()) { - operation.description += "\n\n"+resftfulIntraction.documentation + operation.description = resftfulIntraction.documentation } addResourceIdParameter(operation) addResourceAPIMParameter(operation) @@ -243,11 +253,13 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F CapabilityStatement.TypeRestfulInteraction.UPDATE -> { val operation = getPathItem(paths, "/$resourceType/{id}", PathItem.HttpMethod.PUT) operation.addTagsItem(resourceType) - operation.summary = resftfulIntraction.code.display - operation.description = - "[update](http://www.hl7.org/fhir/http.html#update) an existing $resourceType instance, or create using a client-assigned ID." - if (resftfulIntraction.hasDocumentation()) { - operation.description += "\n\n"+ resftfulIntraction.documentation + if (enhance) { + operation.externalDocs = ExternalDocumentation() + operation.externalDocs.description("FHIR RESTful API - update") + operation.externalDocs.url("https://hl7.org/fhir/R4/http.html#update") + } + if (resftfulIntraction.hasDocumentation()) { + operation.description = resftfulIntraction.documentation } addResourceIdParameter(operation) addResourceAPIMParameter(operation) @@ -258,10 +270,14 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F CapabilityStatement.TypeRestfulInteraction.CREATE -> { val operation = getPathItem(paths, "/$resourceType", PathItem.HttpMethod.POST) operation.addTagsItem(resourceType) - operation.summary = resftfulIntraction.code.display - operation.description = "[create](http://www.hl7.org/fhir/http.html#create) a new $resourceType instance." + + if (enhance) { + operation.externalDocs = ExternalDocumentation() + operation.externalDocs.description("FHIR RESTful API - create") + operation.externalDocs.url("https://hl7.org/fhir/R4/http.html#create") + } if (resftfulIntraction.hasDocumentation()) { - operation.description += "\n\n"+resftfulIntraction.documentation + operation.description = resftfulIntraction.documentation } addResourceAPIMParameter(operation) addFhirResourceRequestBody(openApi, operation, requestExample, resourceType, nextResource.profile, enhance) @@ -271,11 +287,14 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F CapabilityStatement.TypeRestfulInteraction.PATCH -> { val operation = getPathItem(paths, "/$resourceType/{id}", PathItem.HttpMethod.PATCH) operation.addTagsItem(resourceType) - operation.summary = resftfulIntraction.code.display - operation.description = "[patch](http://www.hl7.org/fhir/http.html#patch) a resource instance of type $resourceType by ID." + if (enhance) { + operation.externalDocs = ExternalDocumentation() + operation.externalDocs.description("FHIR RESTful API - patch") + operation.externalDocs.url("https://hl7.org/fhir/R4/http.html#patch") + } if (resftfulIntraction.hasDocumentation()) { - operation.description += "\n\n"+resftfulIntraction.documentation + operation.description = resftfulIntraction.documentation } addResourceIdParameter(operation) addResourceAPIMParameter(operation) @@ -288,11 +307,14 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F CapabilityStatement.TypeRestfulInteraction.DELETE -> { val operation = getPathItem(paths, "/$resourceType/{id}", PathItem.HttpMethod.DELETE) operation.addTagsItem(resourceType) - operation.summary = resftfulIntraction.code.display - operation.description = "Perform a logical [delete](http://www.hl7.org/fhir/http.html#delete) on a resource instance." + if (enhance) { + operation.externalDocs = ExternalDocumentation() + operation.externalDocs.description("FHIR RESTful API - delete") + operation.externalDocs.url("https://hl7.org/fhir/R4/http.html#delete") + } if (resftfulIntraction.hasDocumentation()) { - operation.description += "\n\n"+resftfulIntraction.documentation + operation.description = resftfulIntraction.documentation } addResourceIdParameter(operation) addFhirResourceResponse(ctx, openApi, operation, "OperationOutcome",resftfulIntraction,null,null, enhance) @@ -302,11 +324,13 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F CapabilityStatement.TypeRestfulInteraction.HISTORYTYPE -> { val operation = getPathItem(paths, "/$resourceType/_history", PathItem.HttpMethod.GET) operation.addTagsItem(resourceType) - operation.summary = "history" - operation.description = - "Fetch the resource change [history](http://www.hl7.org/fhir/http.html#history) for all resources of type $resourceType." + if (enhance) { + operation.externalDocs = ExternalDocumentation() + operation.externalDocs.description("FHIR RESTful API - history") + operation.externalDocs.url("https://hl7.org/fhir/R4/http.html#history") + } if (resftfulIntraction.hasDocumentation()) { - operation.description += "\n\n"+resftfulIntraction.documentation + operation.description = resftfulIntraction.documentation } processSearchParameter(operation,nextResource,resourceType, enhance) addResourceAPIMParameter(operation) @@ -320,11 +344,13 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F "/$resourceType/{id}/_history", PathItem.HttpMethod.GET ) operation.addTagsItem(resourceType) - operation.summary = "history" - operation.description = - "Fetch the resource change [history](http://www.hl7.org/fhir/http.html#history) for all resources of type $resourceType" - if (resftfulIntraction.hasDocumentation()) { - operation.description += "\n\n"+resftfulIntraction.documentation + if (enhance) { + operation.externalDocs = ExternalDocumentation() + operation.externalDocs.description("FHIR RESTful API - history") + operation.externalDocs.url("https://hl7.org/fhir/R4/http.html#history") + } + if (resftfulIntraction.hasDocumentation()) { + operation.description = resftfulIntraction.documentation } addResourceIdParameter(operation) processSearchParameter(operation,nextResource,resourceType, enhance) @@ -344,8 +370,11 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F "/$resourceType/{id}/_history/{version_id}", PathItem.HttpMethod.GET ) operation.addTagsItem(resourceType) - operation.summary = "vread" - operation.description = "[vread](http://www.hl7.org/fhir/http.html#vread) $resourceType instance with specific version." + if (enhance) { + operation.externalDocs = ExternalDocumentation() + operation.externalDocs.description("FHIR RESTful API - vread") + operation.externalDocs.url("https://hl7.org/fhir/R4/http.html#vread") + } addResourceIdParameter(operation) addResourceVersionIdParameter(operation) @@ -484,7 +513,7 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F } - private fun getProfile(profile: String?) : StructureDefinition? { + fun getProfile(profile: String?) : StructureDefinition? { val structureDefinition = supportChain.fetchStructureDefinition(profile) if (structureDefinition is StructureDefinition) return structureDefinition return null @@ -1211,7 +1240,10 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F return example } + private fun getExampleFromPackages(request: Boolean, extension: Extension, create : Boolean) : Supplier? { + return null + /* // TODO Return array of examples including documentation val path = (extension.getExtensionByUrl("value").value as Reference).reference val pathParts = path.split("/") @@ -1243,7 +1275,13 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F println("----- Not found " + request + path) } return null + + */ } + + + + private fun getRequestExample(interaction : CapabilityStatement.ResourceInteractionComponent) : List{ // val examples = mutableListOf() @@ -1737,19 +1775,51 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F var schemaList = mutableMapOf>() schema.description = - "HL7 FHIR Schema [$resourceType](https://hl7.org/fhir/R4/fhir.schema.json#/definitions/$resourceType). HL7 FHIR Documentation [$resourceType](\"https://www.hl7.org/fhir/$resourceType.html\")" + "HL7 FHIR Schema [$resourceType](https://hl7.org/fhir/R4/fhir.schema.json#/definitions/$resourceType)." + " HL7 FHIR Documentation [$resourceType](\"https://www.hl7.org/fhir/$resourceType.html\")" - // This doesn't appear to be used. Consider removing schema.externalDocs = ExternalDocumentation() schema.externalDocs.description = resourceType - schema.externalDocs.url = "https://www.hl7.org/fhir/$resourceType.html" + if (profile !== null) { + val structureDefinition = getProfile(profile) + if (structureDefinition !== null) { + schema.externalDocs.description = structureDefinition.title + schema.externalDocs.url = getDocumentationPath(profile) + } + // Won't work if NHS England fixes URL resolution + if ((structureDefinition == null || schema.externalDocs.url.equals(profile)) + && resourceType !== null) { + val profileNew = capabilityStatementApplier.getProfile(resourceType) + val structureDefinition = getProfile(profileNew) + if (structureDefinition !== null) { + schema.description += " \n\n NHS England/HL7 UK Conformance Documentation (Schema constraints) [" + structureDefinition.title + "](" +getDocumentationPath(profileNew) + ")" + } + schema.externalDocs.description = profile + schema.externalDocs.url = getDocumentationPath(profile) + } + + } else { + if (resourceType !== null) { + val profileNew = capabilityStatementApplier.getProfile(resourceType) + if (profileNew !== null) { + val structureDefinition = getProfile(profileNew) + if (structureDefinition !== null) { + schema.externalDocs.description = structureDefinition.title + schema.externalDocs.url = getDocumentationPath(profileNew) + } + } + } + } + if (resourceType != null) { schemaList.put(resourceType, schema) } - if (profile != null) { + /* Disabled 27/Jan/2024 This is done via API teams, no reason to enter into that conversation + + if (profile != null) { + val structureDefinition = getProfile(profile) if (structureDefinition is StructureDefinition) { schema.description += "\n\n Profile: [" + structureDefinition.url+"]("+this.getDocumentationPath(structureDefinition.url)+")" @@ -1808,7 +1878,7 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F } } } - } + } */ if (resourceType == null) { System.out.println("resourceTyoe null") } else { @@ -1866,187 +1936,6 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F if (profile.startsWith("https://www.hl7.org")) return "" // todo disable for now and try using schema instead return "" - /* - val structureDefinition = supportChain.fetchStructureDefinition(profile) - var description = "" - if (structureDefinition is StructureDefinition) { - for (element in structureDefinition.snapshot.element) { - if ((element.hasDefinition() || - element.hasShort() || - element.hasType() || - element.hasBinding()) && - element.hasMustSupport() - ) { - // section title - description += "\n\n ### " + element.path.replace(structureDefinition.type + ".", "") - if (element.hasSliceName()) { - description += " ("+element.sliceName+ ")" - } - - description += getElementDescription(element) - - } - } - } - return description - - */ - } - - private fun getElementDescription(element : ElementDefinition) : String { - - var table = "\n\n| | |\n|----|----|" - // header body - /* - if (element.hasMustSupport() && element.mustSupport) { - description += "\n `mustSupport`" - } -*/ - table += "\n|Element Id|"+element.id+"|" - table += "\n|[Cardinality](https://www.hl7.org/fhir/conformance-rules.html#cardinality)|"+element.min+".."+element.max+"|" - - - if (element.hasFixed()) { - if (element.fixed is UriType) { - table += "\n|Fixed Value|"+(element.fixed as UriType).value+"|" - } - if (element.fixed is CodeType) { - table += "\n|Fixed Value|"+(element.fixed as CodeType).value+"|" - } - } - - if (element.hasBinding()) { - if (element.binding.hasValueSet()) - { - val valueSet = supportChain.fetchValueSet(element.binding.valueSet) - if (valueSet !== null) { - var description = - "[" + (valueSet as ValueSet).name + "](" + getDocumentationPath(element.binding.valueSet) + ")" - if (element.binding.hasStrength()) description += " (" + element.binding.strength.display + ")" - if (element.binding.hasDescription()) { - var elementDescription = element.binding.description - elementDescription = "
" + elementDescription.replace("\\n", "\n") - description += elementDescription + " " - } - table += "\n|[Terminology Binding](https://www.hl7.org/fhir/terminologies.html)|" + description + "|" - } - } - } - - if (element.hasSliceName()) { - table += "\n|[Slice Name](https://www.hl7.org/fhir/profiling.html#slicing)|"+element.sliceName+"|" - } - if (element.hasSlicing()) { - var description = "" - if (element.slicing.hasRules()) { - description += " *"+element.slicing.rules.name + "*" - } - if (element.slicing.hasDiscriminator()) { - for (discrimninator in element.slicing.discriminator) { - description += " discriminator - " - if (discrimninator.hasType()) { - description += " *"+discrimninator.type.name + "*" - } - if (discrimninator.hasPath()) { - description += " *"+discrimninator.path + "*" - } - } - } - if (element.slicing.hasDescription()) { - description += "
"+element.slicing.description - } - table += "\n|[Slicing](https://www.hl7.org/fhir/profiling.html#slicing)|"+description+"|" - } - - // Data type - if (element.hasType()) { - var description = "" - for (type in element.type) { - - description += "["+type.code+"](https://www.hl7.org/fhir/datatypes.html#"+type.code+")" - var itemDescription="" - var first = true - for (target in type.targetProfile) { - if (itemDescription.isEmpty()) description+= "(" - val profile = supportChain.fetchStructureDefinition(target.value) - if (!first) { - itemDescription += " " - } else { - first = false - } - itemDescription += "["+(profile as StructureDefinition).name + "]("+ getDocumentationPath(target.value) +")" - - } - first = true - for (target in type.profile) { - if (itemDescription.isEmpty()) description+= "(" - val profile = supportChain.fetchStructureDefinition(target.value) - if (!first) { - itemDescription += " " - } else { - first = false - } - itemDescription += "["+(profile as StructureDefinition).name+ "](" +getDocumentationPath(target.value) +")" - } - - if (itemDescription.isNotEmpty()) description+= itemDescription + ")" - if (type.hasAggregation()) { - for (aggregation in type.aggregation) { - description += "
Aggregation - [" + aggregation.code+"](http://www.hl7.org/fhir/valueset-resource-aggregation-mode.html)" - } - } - } - table += "\n|[type](https://www.hl7.org/fhir/datatypes.html)|"+description+"|" - } - var description = table + "\n\n
" - // Documentation section - /* - if (element.hasShort()) { - - description += "\n\n " + element.short - } - */ - - if (element.hasDefinition()) { - description += "\n\n #### Definition" - description += "\n\n " + element.definition.replace("\\n","\n") - } - - if (element.hasRequirements()) { - description += "\n\n #### Requirements" - description += "\n\n " + element.requirements.replace("\\n","\n") - } - - if (element.hasComment()) { - description += "\n\n #### Comment" - description += "\n\n " + element.comment.replace("\\n","\n") - } - - if (element.hasConstraint()) { - var displayConstraints = false - for (constraint in element.constraint) { - if (doDisplay(constraint.key)) displayConstraints = true - } - - if (displayConstraints) { - description += "\n\n #### Constraints \n" - for (constraint in element.constraint) { - if (doDisplay(constraint.key)) description += "\n- **" + constraint.key + "** (*" + constraint.severity + "*) " + constraint.human.replace( - "\\n", - "\n" - ) - } - } - } - - return description - } - - private fun doDisplay(key : String) : Boolean { - if (key.startsWith("ext")) return false - if (key.startsWith("ele")) return false - if (key.startsWith("dom")) return false - return true } private fun addResoureTag( @@ -2065,7 +1954,7 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F val resourceTag = Tag() resourceTag.name = resourceType if (documentation !== null) resourceTag.description = documentation - if (enhance) { + /* if (enhance) { if (resourceTag.description == null) { resourceTag.description = "" } else { @@ -2083,74 +1972,32 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F resourceTag.description += " Profile: [$idStr]($documentation)" } } - +*/ openApi.addTagsItem(resourceTag) } - fun generateMarkdown(profile :String) : String { - var mainDescription = "" - var subDescription = "" - var index = "" - - - if (profile != null) { - val structureDefinition = getProfile(profile) - if (structureDefinition is StructureDefinition) { - - if (structureDefinition.hasDescription()) { - mainDescription += "\n\n " + structureDefinition.description - } - if (structureDefinition.hasPurpose()) { - mainDescription += "\n\n " + structureDefinition.purpose - } - - for (element in structureDefinition.snapshot.element) { - val paths = element.path.split(".") - if ( - element.hasMustSupport() || element.hasFixed() || (element.hasSliceName() && !paths[paths.size-1].equals("extension")) - || element.id.split(".").size == 1) { - val paths = element.id.split(".") - var title = "" - - - if (paths.size>1){ - for (i in 2..paths.size) { - if (title.isNotEmpty()) title += "." - title += paths[i-1] - } - index += "\n- "+title+"" - subDescription += "\n\n\n ## "+title - subDescription += getElementDescription(element) - } else { - mainDescription += getElementDescription(element) - } - - - - } - } - } - } - return mainDescription + "\n\n" + index + subDescription - } - - private fun getDocumentationPath(profile : String) : String { - - if (profile.contains("http://hl7.org/fhir") - || profile.contains("http://hl7.eu/fhir") ) return profile + fun getDocumentationPath(profile: String?) : String { + if (profile == null) return "" + // Only process UK profiles + if (!profile.contains("https://fhir.nhs.uk/") + && !profile.contains("https://fhir.hl7.org.uk")) return profile val configurationInputStream = ClassPathResource("manifest.json").inputStream - var manifest = objectMapper.readValue(configurationInputStream, Array::class.java) var path = profile - for(guide in manifest) { + for(guide in fhirPackage) { if (!guide.version.contains("0.0.0") && ( - guide.packageName.contains("england") || - guide.packageName.contains("ukcore") + guide.name.contains("england") || + guide.name.contains("ukcore") )) { - path = "https://simplifier.net/resolve?fhirVersion=R4&scope="+ guide.packageName + "@" + guide.version + "&canonical="+profile + path = "https://simplifier.net/resolve?fhirVersion=R4&scope="+ guide.name + "@" + guide.version + "&canonical="+profile } } + if (path == null) return "" return path } + + + + } diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 647c9f6..13ced2d 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -17,7 +17,7 @@ fhir: server: name: NHS England Interoperability Standards FHIR Testing baseUrl: https://3cdzg7kbj4.execute-api.eu-west-2.amazonaws.com/poc/Conformance - version: 6.10.21 + version: 6.10.22 services: R4: true From 91fc45ddabef63c1a886976c9fd2752d17d647c6 Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Sat, 27 Jan 2024 12:30:32 +0000 Subject: [PATCH 41/67] Removed schema generation from OAS. Use link to profile documentation instead --- aws-repo-notes.txt | 4 ++-- pom.xml | 2 +- .../service/oas/CapabilityStatementToOpenAPIConversion.kt | 6 ++++-- src/main/resources/application.yaml | 2 +- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/aws-repo-notes.txt b/aws-repo-notes.txt index c1fae7b..79f55f8 100644 --- a/aws-repo-notes.txt +++ b/aws-repo-notes.txt @@ -23,9 +23,9 @@ mvn clean install docker build -t fhir-validator-r4 . docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest -docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.22 +docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.23 -docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.22 +docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.23 docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest diff --git a/pom.xml b/pom.xml index 80c797e..b6d2738 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ uk.nhs.england IOPS-FHIR-Validation-Service - 6.10.22 + 6.10.23 IOPS-FHIR-Validation-Service HAPI FHIR Validator using Spring Boot diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/oas/CapabilityStatementToOpenAPIConversion.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/oas/CapabilityStatementToOpenAPIConversion.kt index 888b113..5cb2705 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/oas/CapabilityStatementToOpenAPIConversion.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/oas/CapabilityStatementToOpenAPIConversion.kt @@ -514,6 +514,7 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F fun getProfile(profile: String?) : StructureDefinition? { + if (profile == null) return null val structureDefinition = supportChain.fetchStructureDefinition(profile) if (structureDefinition is StructureDefinition) return structureDefinition return null @@ -1706,13 +1707,14 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F if (parameters.size>1) { description += "\n\n Chained search parameter. Please see [chained](http://www.hl7.org/fhir/search.html#chaining)" } - if (first) description += "\n\n | Name | Type | Expression | \n |--------|--------|--------| \n " + if (first) description += "\n\n | Name | OAS format / FHIR Type | \n |--------|--------| \n " if (searchParameter != null) { - description += "| $name | [" + type?.lowercase() + " ](https://www.hl7.org/fhir/search.html#" + type?.lowercase() + ")| $expression | \n" + description += "| [$name](https://www.hl7.org/fhir/R4/$originalResourceType.html#search) | [" + type?.lowercase() + " ](https://www.hl7.org/fhir/search.html#" + type?.lowercase() + ")| \n" } else { description += "\n\n Caution: This does not appear to be a valid search parameter. **Please check HL7 FHIR conformance.**" } + if (parameters.size>1) { if (searchParameter?.type != Enumerations.SearchParamType.REFERENCE) { description += "\n\n Caution: This does not appear to be a valid search parameter. Chained search paramters **MUST** always be on reference types Please check Hl7 FHIR conformance." diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 13ced2d..a937f4c 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -17,7 +17,7 @@ fhir: server: name: NHS England Interoperability Standards FHIR Testing baseUrl: https://3cdzg7kbj4.execute-api.eu-west-2.amazonaws.com/poc/Conformance - version: 6.10.22 + version: 6.10.23 services: R4: true From dc21655b872ac6c803d58d02dd6f05d4c12036a5 Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Sun, 28 Jan 2024 09:15:56 +0000 Subject: [PATCH 42/67] Corrected required parameter (disabled). Improved conformance display with support for more extensions --- aws-repo-notes.txt | 4 +- pom.xml | 2 +- .../CapabilityStatementToOpenAPIConversion.kt | 93 ++++++++++++++++--- src/main/resources/application.yaml | 2 +- 4 files changed, 83 insertions(+), 18 deletions(-) diff --git a/aws-repo-notes.txt b/aws-repo-notes.txt index 79f55f8..bc27030 100644 --- a/aws-repo-notes.txt +++ b/aws-repo-notes.txt @@ -23,9 +23,9 @@ mvn clean install docker build -t fhir-validator-r4 . docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest -docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.23 +docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.24 -docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.23 +docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.24 docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest diff --git a/pom.xml b/pom.xml index b6d2738..25314ea 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ uk.nhs.england IOPS-FHIR-Validation-Service - 6.10.23 + 6.10.24 IOPS-FHIR-Validation-Service HAPI FHIR Validator using Spring Boot diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/oas/CapabilityStatementToOpenAPIConversion.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/oas/CapabilityStatementToOpenAPIConversion.kt index 5cb2705..ccf5336 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/oas/CapabilityStatementToOpenAPIConversion.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/oas/CapabilityStatementToOpenAPIConversion.kt @@ -203,26 +203,41 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F if (resftfulIntraction.hasDocumentation()) { operation.description = unescapeMarkdown(resftfulIntraction.documentation) } + if (enhance && resftfulIntraction.hasExtension("http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation")) { + if (operation.description == null) operation.description = "" + for (required in resftfulIntraction.getExtensionsByUrl("http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation")) { + operation.description += "\n\n Query Conformance Expectation: **" + (required.value as CodeType).value + "** be supported." + } + } if (enhance && nextResource.hasExtension("http://hl7.org/fhir/StructureDefinition/capabilitystatement-search-parameter-combination")) { - var comboDoc = "\n\n **Search Parameter Combinations** \n\n The following search parameters combinations should be supported. \n\n" + - "| SHALL | SHOULD | \n" + var comboDoc = "\n\n **Search Parameter Combination Conformance** \n\n " + + "| Conformance Expectation | Parameter Combination | \n" comboDoc += "|----------|---------| \n" for (extension in nextResource.getExtensionsByUrl("http://hl7.org/fhir/StructureDefinition/capabilitystatement-search-parameter-combination")) { - var requiredDoc = "" - var optionalDoc = "" + var conformance = "" + var combination = "" + if (extension.hasExtension("http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation")) { + for (required in extension.getExtensionsByUrl("http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation")) { + conformance = "**" + (required.value as CodeType).value + "**" + } + } if (extension.hasExtension("required")) { for (required in extension.getExtensionsByUrl("required")) { - if (requiredDoc != "") requiredDoc += "+" - requiredDoc += (required.value as StringType).value + if (combination != "") combination += " + " + val name = (required.value as StringType).value + combination += "[$name](https://www.hl7.org/fhir/R4/$resourceType.html#search)" + } } if (extension.hasExtension("optional")) { for (optional in extension.getExtensionsByUrl("optional")) { - optionalDoc += (optional.value as StringType).value + "
" + if (combination != "") combination += " + " + val name = (optional.value as StringType).value + combination += "[$name](https://www.hl7.org/fhir/R4/$resourceType.html#search) *optional*" } } - comboDoc += "| $requiredDoc| $optionalDoc | \n" + comboDoc += "| $conformance| $combination | \n" } if (operation.description == null) operation.description = "" operation.description += comboDoc @@ -245,6 +260,12 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F if (resftfulIntraction.hasDocumentation()) { operation.description = resftfulIntraction.documentation } + if (enhance && resftfulIntraction.hasExtension("http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation")) { + if (operation.description == null) operation.description = "" + for (required in resftfulIntraction.getExtensionsByUrl("http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation")) { + operation.description += "\n\n Query Conformance Expectation: **" + (required.value as CodeType).value + "** be supported." + } + } addResourceIdParameter(operation) addResourceAPIMParameter(operation) addFhirResourceResponse(ctx, openApi, operation,resourceType,resftfulIntraction,null,null, enhance) @@ -261,6 +282,12 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F if (resftfulIntraction.hasDocumentation()) { operation.description = resftfulIntraction.documentation } + if (enhance && resftfulIntraction.hasExtension("http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation")) { + if (operation.description == null) operation.description = "" + for (required in resftfulIntraction.getExtensionsByUrl("http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation")) { + operation.description += "\n\n Query Conformance Expectation: **" + (required.value as CodeType).value + "** be supported." + } + } addResourceIdParameter(operation) addResourceAPIMParameter(operation) addFhirResourceRequestBody(openApi, operation, requestExample, resourceType,nextResource.profile, enhance) @@ -279,6 +306,12 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F if (resftfulIntraction.hasDocumentation()) { operation.description = resftfulIntraction.documentation } + if (enhance && resftfulIntraction.hasExtension("http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation")) { + if (operation.description == null) operation.description = "" + for (required in resftfulIntraction.getExtensionsByUrl("http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation")) { + operation.description += "\n\n Query Conformance Expectation: **" + (required.value as CodeType).value + "** be supported." + } + } addResourceAPIMParameter(operation) addFhirResourceRequestBody(openApi, operation, requestExample, resourceType, nextResource.profile, enhance) addFhirResourceResponse(ctx, openApi, operation, "OperationOutcome",resftfulIntraction,null,null, enhance) @@ -296,6 +329,12 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F if (resftfulIntraction.hasDocumentation()) { operation.description = resftfulIntraction.documentation } + if (enhance && resftfulIntraction.hasExtension("http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation")) { + if (operation.description == null) operation.description = "" + for (required in resftfulIntraction.getExtensionsByUrl("http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation")) { + operation.description += "\n\n Query Conformance Expectation: **" + (required.value as CodeType).value + "** be supported." + } + } addResourceIdParameter(operation) addResourceAPIMParameter(operation) addJSONSchema(openApi) @@ -316,6 +355,12 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F if (resftfulIntraction.hasDocumentation()) { operation.description = resftfulIntraction.documentation } + if (enhance && resftfulIntraction.hasExtension("http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation")) { + if (operation.description == null) operation.description = "" + for (required in resftfulIntraction.getExtensionsByUrl("http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation")) { + operation.description += "\n\n Query Conformance Expectation: **" + (required.value as CodeType).value + "** be supported." + } + } addResourceIdParameter(operation) addFhirResourceResponse(ctx, openApi, operation, "OperationOutcome",resftfulIntraction,null,null, enhance) } @@ -332,6 +377,12 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F if (resftfulIntraction.hasDocumentation()) { operation.description = resftfulIntraction.documentation } + if (enhance && resftfulIntraction.hasExtension("http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation")) { + if (operation.description == null) operation.description = "" + for (required in resftfulIntraction.getExtensionsByUrl("http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation")) { + operation.description += "\n\n Query Conformance Expectation: **" + (required.value as CodeType).value + "** be supported." + } + } processSearchParameter(operation,nextResource,resourceType, enhance) addResourceAPIMParameter(operation) addFhirResourceResponse(ctx, openApi, operation, resourceType,resftfulIntraction, null,null, enhance) @@ -352,6 +403,12 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F if (resftfulIntraction.hasDocumentation()) { operation.description = resftfulIntraction.documentation } + if (enhance && resftfulIntraction.hasExtension("http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation")) { + if (operation.description == null) operation.description = "" + for (required in resftfulIntraction.getExtensionsByUrl("http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation")) { + operation.description += "\n\n Query Conformance Expectation: **" + (required.value as CodeType).value + "** be supported." + } + } addResourceIdParameter(operation) processSearchParameter(operation,nextResource,resourceType, enhance) addResourceAPIMParameter(operation) @@ -404,6 +461,7 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F parametersItem.description = "" if (nextSearchParam.hasDocumentation()) parametersItem.description += nextSearchParam.documentation if (addFHIRBoilerPlater) parametersItem.description += getSearchParameterDocumentation(nextSearchParam,resourceType, parametersItem,true) + /* required is not present in CapabilityStatement ..... or not found at present if (nextSearchParam.hasExtension()) { nextSearchParam.extension.forEach { if (it.hasUrl() && it.url.equals("http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation")) { @@ -415,6 +473,8 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F } } } + + */ // calculate style and explode parametersItem.style = Parameter.StyleEnum.FORM if (parametersItem.schema != null && parametersItem.schema.format != null) { @@ -1679,11 +1739,11 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F array.format("token") parameter.schema = array // parameter.schema.type = "string" - parameter.schema.example = "[system]|[code],[code],[system]" + // parameter.schema.example = "[system]|[code],[code],[system]" } Enumerations.SearchParamType.REFERENCE -> { parameter.schema = StringSchema().format("reference") - parameter.schema.example = "[type]/[id] or [id] or [uri]" + // parameter.schema.example = "[type]/[id] or [id] or [uri]" } Enumerations.SearchParamType.DATE -> { val array = ArraySchema() @@ -1692,11 +1752,11 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F array.format("date") parameter.schema = array parameter.description = "See FHIR documentation for more details." - parameter.schema.example = "eq2013-01-14" + // parameter.schema.example = "eq2013-01-14" } Enumerations.SearchParamType.STRING -> { parameter.schema = StringSchema().type("string") - parameter.schema.example = "LS15" + // parameter.schema.example = "LS15" } else -> { parameter.schema = StringSchema().format(nextSearchParam.type.toCode()) @@ -1707,9 +1767,14 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F if (parameters.size>1) { description += "\n\n Chained search parameter. Please see [chained](http://www.hl7.org/fhir/search.html#chaining)" } - if (first) description += "\n\n | Name | OAS format / FHIR Type | \n |--------|--------| \n " + if (first) description += "\n\n **Search Parameter Conformance** \n\n | Conformance Expectation | Name | OAS format / FHIR Type | \n |--------|--------|--------| \n " + var conformance = "" + val conformanceExt = nextSearchParam.getExtensionByUrl("http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation") + if (conformanceExt !== null && conformanceExt.hasValue()) { + conformance = "**" + (conformanceExt.value as CodeType).value + "**" + } if (searchParameter != null) { - description += "| [$name](https://www.hl7.org/fhir/R4/$originalResourceType.html#search) | [" + type?.lowercase() + " ](https://www.hl7.org/fhir/search.html#" + type?.lowercase() + ")| \n" + description += "| $conformance | [$name](https://www.hl7.org/fhir/R4/$originalResourceType.html#search) | [" + type?.lowercase() + " ](https://www.hl7.org/fhir/search.html#" + type?.lowercase() + ")| \n" } else { description += "\n\n Caution: This does not appear to be a valid search parameter. **Please check HL7 FHIR conformance.**" } diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index a937f4c..b4b410f 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -17,7 +17,7 @@ fhir: server: name: NHS England Interoperability Standards FHIR Testing baseUrl: https://3cdzg7kbj4.execute-api.eu-west-2.amazonaws.com/poc/Conformance - version: 6.10.23 + version: 6.10.24 services: R4: true From 699adb2d057dd8da97cd24891003f27d13ba2e2b Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Sun, 28 Jan 2024 15:58:48 +0000 Subject: [PATCH 43/67] fhir url correction and changes for post search --- .../CapabilityStatementToOpenAPIConversion.kt | 23 ++++++++++++------- .../OpenAPItoCapabilityStatementConversion.kt | 5 +++- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/oas/CapabilityStatementToOpenAPIConversion.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/oas/CapabilityStatementToOpenAPIConversion.kt index ccf5336..116e2b4 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/oas/CapabilityStatementToOpenAPIConversion.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/oas/CapabilityStatementToOpenAPIConversion.kt @@ -1276,7 +1276,7 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F addResoureTag(openApi, foci.code,foci.profile, enhance, "") } val idStr = getProfileName(foci.profile) - supportedDocumentation += "| [$resource](https://www.hl7.org/fhir/$resource.html) | [$idStr]($profile) | $min | $max | \n" + supportedDocumentation += "| [$resource](https://www.hl7.org/fhir/R4/$resource.html) | [$idStr]($profile) | $min | $max | \n" } } // only process this loop once @@ -1734,7 +1734,8 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F when (searchParameter.type) { Enumerations.SearchParamType.TOKEN -> { val array = ArraySchema() - array.items = StringSchema().format("token") + array.items = StringSchema().format("token").description("token format: [system]|[code],[code],[system]") + // Should really be added to the StringSchema only but this gets around UI issues array.format("token") parameter.schema = array @@ -1742,20 +1743,25 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F // parameter.schema.example = "[system]|[code],[code],[system]" } Enumerations.SearchParamType.REFERENCE -> { - parameter.schema = StringSchema().format("reference") + parameter.schema = StringSchema().format("reference").description("reference format: [type]/[id] or [id] or [uri]") // parameter.schema.example = "[type]/[id] or [id] or [uri]" } Enumerations.SearchParamType.DATE -> { val array = ArraySchema() - array.items = StringSchema().format("date") + array.items = StringSchema().format("date").pattern("([0-9]([0-9]([0-9][1-9]|[1-9]0)|[1-9]00)|[1-9]000)(-(0[1-9]|1[0-2])(-(0[1-9]|[1-2][0-9]|3[0-1])\n" + + ")?)?") // Should really be added to the StringSchema only but this gets around UI issues array.format("date") parameter.schema = array parameter.description = "See FHIR documentation for more details." // parameter.schema.example = "eq2013-01-14" } + Enumerations.SearchParamType.NUMBER -> { + parameter.schema = StringSchema().type("number").pattern("[0]|[-+]?[1-9][0-9]*") + // parameter.schema.example = "LS15" + } Enumerations.SearchParamType.STRING -> { - parameter.schema = StringSchema().type("string") + parameter.schema = StringSchema().type("string").pattern("^[\\s\\S]+\$") // parameter.schema.example = "LS15" } else -> { @@ -1774,9 +1780,9 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F conformance = "**" + (conformanceExt.value as CodeType).value + "**" } if (searchParameter != null) { - description += "| $conformance | [$name](https://www.hl7.org/fhir/R4/$originalResourceType.html#search) | [" + type?.lowercase() + " ](https://www.hl7.org/fhir/search.html#" + type?.lowercase() + ")| \n" + description += "| $conformance | [$name](https://www.hl7.org/fhir/R4/$originalResourceType.html#search) | [" + type?.lowercase() + " ](https://www.hl7.org/fhir/R4/search.html#" + type?.lowercase() + ")| \n" } else { - description += "\n\n Caution: This does not appear to be a valid search parameter. **Please check HL7 FHIR conformance.**" + description += "\n\n **Caution:** This does not appear to be a valid search parameter. Please check HL7 FHIR conformance." } @@ -1842,7 +1848,8 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F var schemaList = mutableMapOf>() schema.description = - "HL7 FHIR Schema [$resourceType](https://hl7.org/fhir/R4/fhir.schema.json#/definitions/$resourceType)." + " HL7 FHIR Documentation [$resourceType](\"https://www.hl7.org/fhir/$resourceType.html\")" + "HL7 FHIR Schema [$resourceType](https://hl7.org/fhir/R4/fhir.schema.json#/definitions/$resourceType)." + + " HL7 FHIR Documentation [$resourceType](https://www.hl7.org/fhir/R4/$resourceType.html)" schema.externalDocs = ExternalDocumentation() diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/oas/OpenAPItoCapabilityStatementConversion.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/oas/OpenAPItoCapabilityStatementConversion.kt index 1e3d8a7..dcc3434 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/oas/OpenAPItoCapabilityStatementConversion.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/oas/OpenAPItoCapabilityStatementConversion.kt @@ -69,7 +69,7 @@ class OpenAPItoCapabilityStatementConversion(@Qualifier("R4") private val ctx: F var resourceType = paths[0] var multiPathParameter : CapabilityStatement.CapabilityStatementRestResourceSearchParamComponent? = null for(it in paths) { - if (!it.contains("{") && !it.contains("$")) { + if (!it.contains("{") && !it.contains("$") && !it.startsWith("_")) { if (it !== resourceType && resourceType.equals("Patient")) { multiPathParameter = CapabilityStatement.CapabilityStatementRestResourceSearchParamComponent() multiPathParameter.name = "patient" @@ -109,6 +109,9 @@ class OpenAPItoCapabilityStatementConversion(@Qualifier("R4") private val ctx: F val operationDefinition = getOperationDefinition(operation) } + if (operation.isNotEmpty() && operation.startsWith("_search")) { + // TODO + } // check all parameters if (apiPaths.value.get != null && apiPaths.value.get.parameters != null) { From 037d6858f2fe10b074f82abec51a98294adc7eff Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Sun, 28 Jan 2024 21:51:24 +0000 Subject: [PATCH 44/67] Improved search example --- .../CapabilityStatementToOpenAPIConversion.kt | 54 ++++++++++++++++--- 1 file changed, 47 insertions(+), 7 deletions(-) diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/oas/CapabilityStatementToOpenAPIConversion.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/oas/CapabilityStatementToOpenAPIConversion.kt index 116e2b4..d9260e9 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/oas/CapabilityStatementToOpenAPIConversion.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/oas/CapabilityStatementToOpenAPIConversion.kt @@ -1137,14 +1137,27 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F val response200 = ApiResponse() response200.description = "Success" if (resftfulIntraction != null) { - val exampleResponse = getInteractionResponseExample(resftfulIntraction) + var exampleResponse = getInteractionResponseExample(resftfulIntraction) + + if (resftfulIntraction.code.toCode().equals("search-type")) { + if (theResourceType !== null) { + exampleResponse = getSearchSetExample(theResourceType) + } + response200.content = provideContentFhirResource( + theOpenApi, + exampleResponse, + "Bundle", + profile, enhance + ) + } else { + response200.content = provideContentFhirResource( + theOpenApi, + exampleResponse, + theResourceType, + profile, enhance + ) + } - response200.content = provideContentFhirResource( - theOpenApi, - exampleResponse, - theResourceType, - profile, enhance - ) } if (operationComponent != null) { @@ -1391,6 +1404,33 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F } return emptyList() } + + fun getSearchSetExample(resourceType : String) : List { + val examples = mutableListOf() + val exampleOAS = Example() + examples.add(exampleOAS) + val bundle = Bundle() + bundle.type = Bundle.BundleType.SEARCHSET + bundle.addLink( + Bundle.BundleLinkComponent() + .setRelation("self") + .setUrl(exampleServer + exampleServerPrefix + resourceType + "?parameterExample=123&page=1") + ) + bundle.addLink( + Bundle.BundleLinkComponent() + .setRelation("next") + .setUrl(exampleServer + exampleServerPrefix + resourceType + "?parameterExample=123&page=2") + ) + val example = ctx?.getResourceDefinition(resourceType)?.newInstance() + example?.setId("1234") + bundle.entry.add( + Bundle.BundleEntryComponent().setResource(example as Resource) + .setFullUrl(exampleServer + exampleServerPrefix + resourceType + "/1234") + ) + bundle.total = 1 + exampleOAS.value = ctx?.newJsonParser()?.encodeResourceToString(bundle) + return examples + } private fun getResponseExample(apiExtension : Extension,searchExample : Boolean,createCall : Boolean) : List { val examples = mutableListOf() if (apiExtension.hasExtension("example")) { From 3f7677cfa7e3191bce4ef59e8b364748cced2c04 Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Fri, 2 Feb 2024 16:26:39 +0000 Subject: [PATCH 45/67] update hapi fhir version --- aws-repo-notes.txt | 4 ++-- pom.xml | 4 ++-- src/main/resources/application.yaml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/aws-repo-notes.txt b/aws-repo-notes.txt index bc27030..200df89 100644 --- a/aws-repo-notes.txt +++ b/aws-repo-notes.txt @@ -23,9 +23,9 @@ mvn clean install docker build -t fhir-validator-r4 . docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest -docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.24 +docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.25 -docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.24 +docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.25 docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest diff --git a/pom.xml b/pom.xml index 25314ea..9be5a57 100644 --- a/pom.xml +++ b/pom.xml @@ -10,14 +10,14 @@ uk.nhs.england IOPS-FHIR-Validation-Service - 6.10.24 + 6.10.25 IOPS-FHIR-Validation-Service HAPI FHIR Validator using Spring Boot 20 1.9.22 - 6.10.2 + 6.10.3 2.1.12 2.0.30 2.15.3 diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index b4b410f..b73203f 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -17,7 +17,7 @@ fhir: server: name: NHS England Interoperability Standards FHIR Testing baseUrl: https://3cdzg7kbj4.execute-api.eu-west-2.amazonaws.com/poc/Conformance - version: 6.10.24 + version: 6.10.25 services: R4: true From d868519008b98d184476ce5c885ee85b87d7fe9d Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Wed, 14 Feb 2024 16:56:43 +0000 Subject: [PATCH 46/67] update hapi fhir version Added configurable package parameter fhir.igs --- Dockerfile | 1 + aws-repo-notes.txt | 9 +- pom.xml | 4 +- readme.md | 83 ++++++++++++++++++- .../configuration/FHIRServerProperties.kt | 6 +- .../configuration/PackageConfiguration.kt | 3 +- .../configuration/ValidationConfiguration.kt | 9 +- src/main/resources/application.yaml | 4 +- 8 files changed, 108 insertions(+), 11 deletions(-) diff --git a/Dockerfile b/Dockerfile index c55dc50..8d83b65 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,6 +5,7 @@ VOLUME /tmp ENV JAVA_OPTS="-Xms128m -Xmx8192m" ADD target/fhir-validator.jar fhir-validator.jar +EXPOSE 9001 ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/fhir-validator.jar"] diff --git a/aws-repo-notes.txt b/aws-repo-notes.txt index 200df89..ab67eac 100644 --- a/aws-repo-notes.txt +++ b/aws-repo-notes.txt @@ -23,12 +23,17 @@ mvn clean install docker build -t fhir-validator-r4 . docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest -docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.25 +docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.27 -docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.25 +docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.27 docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest +## Docker +docker tag fhir-validator-r4:latest thorlogic/fhir-validator-r4:latest +docker tag fhir-validator-r4:latest thorlogic/fhir-validator-r4:6.10.27 + +docker push thorlogic/fhir-validator-r4:latest ### Cloud Formation Notes diff --git a/pom.xml b/pom.xml index 9be5a57..778c063 100644 --- a/pom.xml +++ b/pom.xml @@ -10,14 +10,14 @@ uk.nhs.england IOPS-FHIR-Validation-Service - 6.10.25 + 6.10.27 IOPS-FHIR-Validation-Service HAPI FHIR Validator using Spring Boot 20 1.9.22 - 6.10.3 + 6.10.4 2.1.12 2.0.30 2.15.3 diff --git a/readme.md b/readme.md index b05f609..093972a 100644 --- a/readme.md +++ b/readme.md @@ -1,4 +1,6 @@ -### IOPS FHIR Validator +# IOPS FHIR Validator + +This project is classed as **skunkworks** it is not built for operational use. [Demonstration Server](http://lb-fhir-validator-924628614.eu-west-2.elb.amazonaws.com/) @@ -16,6 +18,85 @@ c. Optionally validate using the NHS England Ontology Service (configured via en The configuration is aimed at supporting different use cases. For example the lambda version with no ontology support is aimed at performing basic FHIR validation checks. This may just be FHIR core and schema validation but can also test against UKCore profiles. +## Docker Image + +**Experimental** + +https://hub.docker.com/repository/docker/thorlogic/fhir-validator-r4/general +This should work without the configuration below +Port is expected to be 9001 + +`docker run thorlogic/fhir-validator-r4 -p 9001:9001` + +## Environmental Variables + + +#### fhir.server.baseUrl + +This controls the url used in the OAS/Swagger page. This needs to be altered when hosted on AWS (for example the base url of the ELB service). + +`http://localhost:9001` + +### fhir.igs + +Optional - Use to override the default packages. Package id and version can be found from FHIR Implementation Guides. + +`fhir.r4.ukcore.stu3.currentbuild#0.0.3-pre-release,uk.nhsengland.r4#0.0.0-prerelease` + +### Ontology Server Configuration + +Optional, if Ontoserver is to be used then all parameters are required. +Configuation details are found by requesting a [System-to-system account] from NHS England Ontology Server + +#### terminology.authorization.clientId + +#### terminology.authorization.clientSecret + +#### terminology.authorization.tokenUrl + +`https://ontology.nhs.uk/authorisation/auth/realms/nhs-digital-terminology/protocol/openid-connect/token` + +#### terminology.url + +'https://ontology.nhs.uk/authoring/fhir/; + +#### terminology.loincUrl + +Experimental - do not use + +'https://r4.ontoserver.csiro.au/fhir' + +### AWS FHIRWorks Configuration + +Can be obtained from NHS England Interoperability Standards + +#### aws.apiKey + +AWS FHIRWorks API Gateway Key + +#### aws.clientId + +AWS Cognito token clientId + +#### aws.pass + +AWS FHIR Works password + +#### aws.tokenUrl + +AWS Cognito token url + +#### aws.user + +AWS FHIR Works username + +#### cdr.fhirServer + +Url of AWS FHIRWorks in API Gateway +https://cnuc9zdola.execute-api.eu-west-2.amazonaws.com/dev + + + diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/FHIRServerProperties.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/FHIRServerProperties.kt index 09d9831..1efc450 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/FHIRServerProperties.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/FHIRServerProperties.kt @@ -7,15 +7,19 @@ import org.springframework.boot.context.properties.ConstructorBinding @ConfigurationProperties(prefix = "fhir") data class FHIRServerProperties( var server: Server, - var ig: Package? + //var ig: Package?, + var igs: String? ) { data class Server( var baseUrl: String, var name: String, var version: String ) + /* data class Package( var name: String, var version: String ) + + */ } diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/PackageConfiguration.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/PackageConfiguration.kt index c077600..b524080 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/PackageConfiguration.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/PackageConfiguration.kt @@ -21,7 +21,7 @@ import java.util.* @Configuration open class PackageConfiguration( - + val terminologyValidationProperties: TerminologyValidationProperties ) { companion object : KLogging() @@ -29,6 +29,7 @@ open class PackageConfiguration( @Bean open fun getCoreSearchParamters(@Qualifier("R4") ctx: FhirContext) : Bundle? { + // TODO could maybe get this from packages val u = URL("http://hl7.org/fhir/R4/search-parameters.json") try { diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/ValidationConfiguration.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/ValidationConfiguration.kt index 93b2f90..106c3fd 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/ValidationConfiguration.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/ValidationConfiguration.kt @@ -231,8 +231,13 @@ open class ValidationConfiguration( open fun getPackages() :Array? { var manifest : Array? = null - if (fhirServerProperties.ig != null ) { - manifest = arrayOf(SimplifierPackage(fhirServerProperties.ig!!.name, fhirServerProperties.ig!!.version)) + if (fhirServerProperties.igs != null && !fhirServerProperties.igs!!.isEmpty() ) { + val packages= fhirServerProperties.igs!!.split(",") + val manifest2 = arrayListOf() + packages.forEachIndexed{ index, pkg -> + manifest2.add(SimplifierPackage(pkg.substringBefore("#"),pkg.substringAfter("#"))) + } + manifest = manifest2.toTypedArray() } else { val configurationInputStream = ClassPathResource("manifest.json").inputStream manifest = objectMapper.readValue(configurationInputStream, Array::class.java) diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index b73203f..9a33ffd 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -16,8 +16,8 @@ management: fhir: server: name: NHS England Interoperability Standards FHIR Testing - baseUrl: https://3cdzg7kbj4.execute-api.eu-west-2.amazonaws.com/poc/Conformance - version: 6.10.25 + baseUrl: http://localhost:9001 + version: 6.10.27 services: R4: true From 9e3a0879f4f240ab113d1120955c12b7afaf47b4 Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Thu, 15 Feb 2024 05:04:42 +0000 Subject: [PATCH 47/67] Add UI as submodule and improved readme --- .gitmodules | 3 +++ interoperability-standards-tools-skunkworks | 1 + readme.md | 3 ++- 3 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .gitmodules create mode 160000 interoperability-standards-tools-skunkworks diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..957a039 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "interoperability-standards-tools-skunkworks"] + path = interoperability-standards-tools-skunkworks + url = https://github.com/NHSDigital/interoperability-standards-tools-skunkworks diff --git a/interoperability-standards-tools-skunkworks b/interoperability-standards-tools-skunkworks new file mode 160000 index 0000000..41643b0 --- /dev/null +++ b/interoperability-standards-tools-skunkworks @@ -0,0 +1 @@ +Subproject commit 41643b07a0b16bf11ef410dc19e52a6e9f96d705 diff --git a/readme.md b/readme.md index 093972a..5a77c7c 100644 --- a/readme.md +++ b/readme.md @@ -26,7 +26,8 @@ https://hub.docker.com/repository/docker/thorlogic/fhir-validator-r4/general This should work without the configuration below Port is expected to be 9001 -`docker run thorlogic/fhir-validator-r4 -p 9001:9001` +`docker run --env=fhir.igs=fhir.r4.ukcore.stu3.currentbuild#0.0.3-pre-release --env=fhir.server.baseUrl=http://localhost -p 80:9001 --runtime=runc thorlogic/fhir-validator-r4:latest` + ## Environmental Variables From 31cc3dd20f4f0557f85adc71840eb41bfdcfed3c Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Thu, 15 Feb 2024 06:08:30 +0000 Subject: [PATCH 48/67] Improved docker documentation --- aws-repo-notes.txt => deploy-notes.md | 15 +- interoperability-standards-tools-skunkworks | 1 - pom.xml | 2 +- readme.md | 2 +- .../configuration/OpenApiConfig.kt | 680 ++++++++++-------- src/main/resources/application.yaml | 4 +- 6 files changed, 397 insertions(+), 307 deletions(-) rename aws-repo-notes.txt => deploy-notes.md (88%) delete mode 160000 interoperability-standards-tools-skunkworks diff --git a/aws-repo-notes.txt b/deploy-notes.md similarity index 88% rename from aws-repo-notes.txt rename to deploy-notes.md index ab67eac..b881d69 100644 --- a/aws-repo-notes.txt +++ b/deploy-notes.md @@ -1,3 +1,5 @@ +## AWS + Initial user Setup https://nhsd-confluence.digital.nhs.uk/display/AWS/001+-+Use+AWS+CLI+with+MFA @@ -23,21 +25,26 @@ mvn clean install docker build -t fhir-validator-r4 . docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest -docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.27 +docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.28 -docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.27 +docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.28 docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest ## Docker +mvn clean install + +docker build -t fhir-validator-r4 . + docker tag fhir-validator-r4:latest thorlogic/fhir-validator-r4:latest -docker tag fhir-validator-r4:latest thorlogic/fhir-validator-r4:6.10.27 +docker tag fhir-validator-r4:latest thorlogic/fhir-validator-r4:6.10.28 docker push thorlogic/fhir-validator-r4:latest +docker push thorlogic/fhir-validator-r4:6.10.28 ### Cloud Formation Notes -Command is +Do not use aws cloudformation deploy --template-file C:\Development\NHSDigital\validation-service-fhir-r4\cloudfront\IOPSValidation.yaml --stack-name test-stack diff --git a/interoperability-standards-tools-skunkworks b/interoperability-standards-tools-skunkworks deleted file mode 160000 index 41643b0..0000000 --- a/interoperability-standards-tools-skunkworks +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 41643b07a0b16bf11ef410dc19e52a6e9f96d705 diff --git a/pom.xml b/pom.xml index 778c063..82dde11 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ uk.nhs.england IOPS-FHIR-Validation-Service - 6.10.27 + 6.10.28 IOPS-FHIR-Validation-Service HAPI FHIR Validator using Spring Boot diff --git a/readme.md b/readme.md index 5a77c7c..23c148b 100644 --- a/readme.md +++ b/readme.md @@ -1,4 +1,4 @@ -# IOPS FHIR Validator +# FHIR Development and Testing (FHIR Validation) Skunkworks This project is classed as **skunkworks** it is not built for operational use. diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt index f61d9be..de6b7b3 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OpenApiConfig.kt @@ -30,16 +30,18 @@ import uk.nhs.england.fhirvalidator.util.OASExamples @Configuration open class OpenApiConfig(@Qualifier("R4") val ctx : FhirContext, val objectMapper: ObjectMapper, - val servicesProperties: ServicesProperties) { + val servicesProperties: ServicesProperties, + val fhirServerProperties: FHIRServerProperties, + val terminologyValidationProperties: TerminologyValidationProperties + ) { var VALIDATION = "Validation" var UTILITY = "Utility" - var EXPANSION = "ValueSet Expansion (inc. Filtering)" + var CONFORMANCE = "FHIR Package Queries" - val SVCM_98 = "Lookup Code" var MEDICATION_DEFINITION = "Experimental - FHIR R4B Medication Definition" var EXPERIMENTAL = "Experimental" - var TERMINOLOGY = "Terminology" + var ONTOLOGY = "Terminology Services" @Bean open fun customOpenAPI( @@ -84,19 +86,12 @@ open class OpenApiConfig(@Qualifier("R4") val ctx : FhirContext, .description("[Validation](https://www.hl7.org/fhir/R4/validation.html)") ) - oas.addTagsItem(io.swagger.v3.oas.models.tags.Tag() - .name(EXPANSION) - .description("[expand](https://www.hl7.org/fhir/R4/operation-valueset-expand.html)") - ) - oas.addTagsItem(io.swagger.v3.oas.models.tags.Tag() - .name(SVCM_98) - .description("[lookup](https://www.hl7.org/fhir/R4/operation-codesystem-lookup.html)") - ) - - oas.addTagsItem( - io.swagger.v3.oas.models.tags.Tag() - .name(TERMINOLOGY) - ) + if (terminologyValidationProperties.url !== null ) { + oas.addTagsItem( + io.swagger.v3.oas.models.tags.Tag() + .name(ONTOLOGY) + ) + } val examples = LinkedHashMap() examples.put("Patient PDS", @@ -224,202 +219,256 @@ open class OpenApiConfig(@Qualifier("R4") val ctx : FhirContext, oas.path("/FHIR/R4/MessageDefinition",getPathItem(CONFORMANCE,"MessageDefinition", "Message Definition", "url" , "https://fhir.nhs.uk/MessageDefinition/prescription-order", "")) - // SVCM - - // ITI-95 Query Value Set - var pathItem = getPathItem(getTerminologyTagName(TERMINOLOGY),"ValueSet", "Value Set", "url" , "https://fhir.nhs.uk/ValueSet/NHSDigital-MedicationRequest-Code", - "This transaction is used by the Terminology Consumer to find value sets based on criteria it\n" + - "provides in the query parameters of the request message, or to retrieve a specific value set. The\n" + - "request is received by the Terminology Repository. The Terminology Repository processes the\n" + - "request and returns a response of the matching value sets.") - oas.path("/FHIR/R4/ValueSet",pathItem) - - // ITI 96 Query Code System - - pathItem = getPathItem(getTerminologyTagName(TERMINOLOGY),"CodeSystem", "Code System", "url", "https://fhir.nhs.uk/CodeSystem/NHSD-API-ErrorOrWarningCode", - "This transaction is used by the Terminology Consumer to solicit information about code systems " + - "whose data match data provided in the query parameters on the request message. The request is " + - "received by the Terminology Repository. The Terminology Repository processes the request and " + - "returns a response of the matching code systems.") - oas.path("/FHIR/R4/CodeSystem",pathItem) - - // ITI 97 Expand Value Set [ - oas.path("/FHIR/R4/ValueSet/\$expand",PathItem() - .get( - Operation() - .addTagsItem(getTerminologyTagName(EXPANSION)) - .summary("Expand a Value Set") - .description("This transaction is used by the Terminology Consumer to expand a given ValueSet to return the\n" + - "full list of concepts available in that ValueSet. The request is received by the Terminology\n" + - "Repository. The Terminology Repository processes the request and returns a response of the\n" + - "expanded ValueSet. \n\n" + - "FHIR Definition [expand](https://www.hl7.org/fhir/R4/operation-valueset-expand.html) " - ) - .responses(getApiResponses()) - .addParametersItem(Parameter() - .name("url") - .`in`("query") - .required(false) - .style(Parameter.StyleEnum.SIMPLE) - .description("A canonical reference to a value set. The server must know the value set (e.g. it is defined explicitly in the server's value sets, or it is defined implicitly by some code system known to the server") - .schema(StringSchema().format("uri")) - .example("https://fhir.hl7.org.uk/ValueSet/UKCore-MedicationPrecondition")) - .addParametersItem(Parameter() - .name("filter") - .`in`("query") - .required(false) - .style(Parameter.StyleEnum.SIMPLE) - .description("(EXPERIMENTAL - ValueSet must be in UKCore or NHSDigital IG) A text filter that is applied to restrict the codes that are returned (this is useful in a UI context).") - .schema(StringSchema()) - .example("Otalgia")) + if (terminologyValidationProperties.url !== null) { + // SVCM + + // ITI-95 Query Value Set + var pathItem = getPathItem( + getTerminologyTagName(ONTOLOGY), + "ValueSet", + "Value Set", + "url", + "https://fhir.nhs.uk/ValueSet/NHSDigital-MedicationRequest-Code", + "This transaction is used by the Terminology Consumer to find value sets based on criteria it\n" + + "provides in the query parameters of the request message, or to retrieve a specific value set. The\n" + + "request is received by the Terminology Repository. The Terminology Repository processes the\n" + + "request and returns a response of the matching value sets." ) - .post( - Operation() - .addTagsItem(getTerminologyTagName(EXPANSION)) - .summary("The definition of a value set is used to create a simple collection of codes suitable for use for data entry or validation. Body should be a FHIR ValueSet").responses(getApiResponses()) - .description("[expand](https://www.hl7.org/fhir/R4/operation-valueset-expand.html)") - .responses(getApiResponsesXMLJSON_JSONDefault()) - .requestBody(RequestBody().content(Content() - .addMediaType("application/fhir+json",MediaType().schema(StringSchema()._default("{}"))) - .addMediaType("application/fhir+xml",MediaType().schema(StringSchema())) - )) + oas.path("/FHIR/R4/ValueSet", pathItem) + + // ITI 96 Query Code System + + pathItem = getPathItem( + getTerminologyTagName(ONTOLOGY), + "CodeSystem", + "Code System", + "url", + "https://fhir.nhs.uk/CodeSystem/NHSD-API-ErrorOrWarningCode", + "This transaction is used by the Terminology Consumer to solicit information about code systems " + + "whose data match data provided in the query parameters on the request message. The request is " + + "received by the Terminology Repository. The Terminology Repository processes the request and " + + "returns a response of the matching code systems." ) - ) - val eclItem = PathItem() - .get( - Operation() - .addTagsItem(getTerminologyTagName(EXPANSION)) - .summary("Expand a SNOMED CT ecl statement.") - .description("This internally uses ValueSet [expand](https://www.hl7.org/fhir/R4/operation-valueset-expand.html) operation.") - .responses(getApiResponses()) - .addParametersItem(Parameter() - .name("ecl") - .`in`("query") - .required(true) - .style(Parameter.StyleEnum.SIMPLE) - .description("A text filter that is applied to restrict the codes that are returned (this is useful in a UI context).") - .schema(StringSchema()) - .example("< 19829001 |Disorder of lung| AND < 301867009 |Edema of trunk|")) - .addParametersItem(Parameter() - .name("count") - .`in`("query") - .required(false) - .style(Parameter.StyleEnum.SIMPLE) - .description("(EXPERIMENTAL) A text filter that is applied to restrict the codes that are returned (this is useful in a UI context).") - .schema(StringSchema()) - .example("10")) - .addParametersItem(Parameter() - .name("filter") - .`in`("query") - .required(false) - .style(Parameter.StyleEnum.SIMPLE) - .description("(EXPERIMENTAL - ValueSet must be in UKCore or NHSDigital IG) A text filter that is applied to restrict the codes that are returned (this is useful in a UI context).") - .schema(StringSchema())) - + oas.path("/FHIR/R4/CodeSystem", pathItem) + + // ITI 97 Expand Value Set [ + oas.path( + "/FHIR/R4/ValueSet/\$expand", PathItem() + .get( + Operation() + .addTagsItem(getTerminologyTagName(ONTOLOGY)) + .summary("Expand a Value Set") + .description( + "This transaction is used by the Terminology Consumer to expand a given ValueSet to return the\n" + + "full list of concepts available in that ValueSet. The request is received by the Terminology\n" + + "Repository. The Terminology Repository processes the request and returns a response of the\n" + + "expanded ValueSet. \n\n" + + "FHIR Definition [expand](https://www.hl7.org/fhir/R4/operation-valueset-expand.html) " + ) + .responses(getApiResponses()) + .addParametersItem( + Parameter() + .name("url") + .`in`("query") + .required(false) + .style(Parameter.StyleEnum.SIMPLE) + .description("A canonical reference to a value set. The server must know the value set (e.g. it is defined explicitly in the server's value sets, or it is defined implicitly by some code system known to the server") + .schema(StringSchema().format("uri")) + .example("https://fhir.hl7.org.uk/ValueSet/UKCore-MedicationPrecondition") + ) + .addParametersItem( + Parameter() + .name("filter") + .`in`("query") + .required(false) + .style(Parameter.StyleEnum.SIMPLE) + .description("(EXPERIMENTAL - ValueSet must be in UKCore or NHSDigital IG) A text filter that is applied to restrict the codes that are returned (this is useful in a UI context).") + .schema(StringSchema()) + .example("Otalgia") + ) + ) + .post( + Operation() + .addTagsItem(getTerminologyTagName(ONTOLOGY)) + .summary("The definition of a value set is used to create a simple collection of codes suitable for use for data entry or validation. Body should be a FHIR ValueSet") + .responses(getApiResponses()) + .description("[expand](https://www.hl7.org/fhir/R4/operation-valueset-expand.html)") + .responses(getApiResponsesXMLJSON_JSONDefault()) + .requestBody( + RequestBody().content( + Content() + .addMediaType( + "application/fhir+json", + MediaType().schema(StringSchema()._default("{}")) + ) + .addMediaType("application/fhir+xml", MediaType().schema(StringSchema())) + ) + ) + ) ) + val eclItem = PathItem() + .get( + Operation() + .addTagsItem(getTerminologyTagName(ONTOLOGY)) + .summary("Expand a SNOMED CT ecl statement.") + .description("This internally uses ValueSet [expand](https://www.hl7.org/fhir/R4/operation-valueset-expand.html) operation.") + .responses(getApiResponses()) + .addParametersItem( + Parameter() + .name("ecl") + .`in`("query") + .required(true) + .style(Parameter.StyleEnum.SIMPLE) + .description("A text filter that is applied to restrict the codes that are returned (this is useful in a UI context).") + .schema(StringSchema()) + .example("< 19829001 |Disorder of lung| AND < 301867009 |Edema of trunk|") + ) + .addParametersItem( + Parameter() + .name("count") + .`in`("query") + .required(false) + .style(Parameter.StyleEnum.SIMPLE) + .description("(EXPERIMENTAL) A text filter that is applied to restrict the codes that are returned (this is useful in a UI context).") + .schema(StringSchema()) + .example("10") + ) + .addParametersItem( + Parameter() + .name("filter") + .`in`("query") + .required(false) + .style(Parameter.StyleEnum.SIMPLE) + .description("(EXPERIMENTAL - ValueSet must be in UKCore or NHSDigital IG) A text filter that is applied to restrict the codes that are returned (this is useful in a UI context).") + .schema(StringSchema()) + ) - oas.path("/FHIR/R4/ValueSet/\$expandEcl",eclItem) + ) - val searchItem = PathItem() - .get( - Operation() - .addTagsItem(getTerminologyTagName(EXPANSION)) - .summary("Search SNOMED CT for a term.") - .description("This internally uses ValueSet [expand](https://www.hl7.org/fhir/R4/operation-valueset-expand.html) operation.") - .responses(getApiResponses()) - .addParametersItem(Parameter() - .name("filter") - .`in`("query") - .required(true) - .style(Parameter.StyleEnum.SIMPLE) - .description("(EXPERIMENTAL) A text filter that is applied to restrict the codes that are returned (this is useful in a UI context).") - .schema(StringSchema()) - .example("Otalgia")) - .addParametersItem(Parameter() - .name("count") - .`in`("query") - .required(false) - .style(Parameter.StyleEnum.SIMPLE) - .description("(EXPERIMENTAL) A text filter that is applied to restrict the codes that are returned (this is useful in a UI context).") - .schema(StringSchema()) - .example("10")) - .addParametersItem(Parameter() - .name("includeDesignations") - .`in`("query") - .required(false) - .style(Parameter.StyleEnum.SIMPLE) - .description("(EXPERIMENTAL) A text filter that is applied to restrict the codes that are returned (this is useful in a UI context).") - .schema(BooleanSchema()) - .example("true")) - .addParametersItem(Parameter() - .name("property") - .`in`("query") - .required(false) - .style(Parameter.StyleEnum.SIMPLE) - .description("(EXPERIMENTAL) Properties to return.") - .schema(StringSchema()) - .example("sufficientlyDefined,inactive,parent")) + oas.path("/FHIR/R4/ValueSet/\$expandEcl", eclItem) - ) + val searchItem = PathItem() + .get( + Operation() + .addTagsItem(getTerminologyTagName(ONTOLOGY)) + .summary("Search SNOMED CT for a term.") + .description("This internally uses ValueSet [expand](https://www.hl7.org/fhir/R4/operation-valueset-expand.html) operation.") + .responses(getApiResponses()) + .addParametersItem( + Parameter() + .name("filter") + .`in`("query") + .required(true) + .style(Parameter.StyleEnum.SIMPLE) + .description("(EXPERIMENTAL) A text filter that is applied to restrict the codes that are returned (this is useful in a UI context).") + .schema(StringSchema()) + .example("Otalgia") + ) + .addParametersItem( + Parameter() + .name("count") + .`in`("query") + .required(false) + .style(Parameter.StyleEnum.SIMPLE) + .description("(EXPERIMENTAL) A text filter that is applied to restrict the codes that are returned (this is useful in a UI context).") + .schema(StringSchema()) + .example("10") + ) + .addParametersItem( + Parameter() + .name("includeDesignations") + .`in`("query") + .required(false) + .style(Parameter.StyleEnum.SIMPLE) + .description("(EXPERIMENTAL) A text filter that is applied to restrict the codes that are returned (this is useful in a UI context).") + .schema(BooleanSchema()) + .example("true") + ) + .addParametersItem( + Parameter() + .name("property") + .`in`("query") + .required(false) + .style(Parameter.StyleEnum.SIMPLE) + .description("(EXPERIMENTAL) Properties to return.") + .schema(StringSchema()) + .example("sufficientlyDefined,inactive,parent") + ) - oas.path("/FHIR/R4/ValueSet/\$expandSCT",searchItem) + ) - // Lookup Code [ITI-98] - val lookupItem = PathItem() - .get( - Operation() - .addTagsItem(getTerminologyTagName(SVCM_98)) - .summary("Lookup a Code in a Value Set") - .description("This transaction is used by the Terminology Consumer to lookup a given code to return the full " + - "details. The request is received by the Terminology Repository. The Terminology Repository " + - "processes the request and returns a response of the code details as a Parameters Resource." + - "\n\nFHIR Definition [lookup](https://www.hl7.org/fhir/R4/operation-codesystem-lookup.html)") - .responses(getApiResponses()) - .addParametersItem(Parameter() - .name("code") - .`in`("query") - .required(false) - .style(Parameter.StyleEnum.SIMPLE) - .description("The code that is to be located. If a code is provided, a system must be provided") - .schema(StringSchema().format("code")) - .example("15517911000001104")) - .addParametersItem(Parameter() - .name("system") - .`in`("query") - .required(false) - .style(Parameter.StyleEnum.SIMPLE) - .description("The system for the code that is to be located") - .schema(StringSchema().format("url")) - .example("http://snomed.info/sct")) - .addParametersItem(Parameter() - .name("version") - .`in`("query") - .required(false) - .style(Parameter.StyleEnum.SIMPLE) - .description("The version of the system, if one was provided in the source data") - .schema(StringSchema())) - .addParametersItem(Parameter() - .name("coding") - .`in`("query") - .required(false) - .style(Parameter.StyleEnum.SIMPLE) - .description("The system for the code that is to be located") - .schema(StringSchema().format("Coding"))) - .addParametersItem(Parameter() - .name("date") - .`in`("query") - .required(false) - .style(Parameter.StyleEnum.SIMPLE) - .description("The date for which the information should be returned.") - .schema(StringSchema().format("dateTime"))) - .addParametersItem(Parameter() - .name("displayLanguage") - .`in`("query") - .required(false) - .style(Parameter.StyleEnum.SIMPLE) - .description("The requested language for display (see \$expand.displayLanguage)") - .schema(StringSchema().format("code"))) - /* .addParametersItem(Parameter() + oas.path("/FHIR/R4/ValueSet/\$expandSCT", searchItem) + + // Lookup Code [ITI-98] + val lookupItem = PathItem() + .get( + Operation() + .addTagsItem(getTerminologyTagName(ONTOLOGY)) + .summary("Lookup a Code in a Value Set") + .description( + "This transaction is used by the Terminology Consumer to lookup a given code to return the full " + + "details. The request is received by the Terminology Repository. The Terminology Repository " + + "processes the request and returns a response of the code details as a Parameters Resource." + + "\n\nFHIR Definition [lookup](https://www.hl7.org/fhir/R4/operation-codesystem-lookup.html)" + ) + .responses(getApiResponses()) + .addParametersItem( + Parameter() + .name("code") + .`in`("query") + .required(false) + .style(Parameter.StyleEnum.SIMPLE) + .description("The code that is to be located. If a code is provided, a system must be provided") + .schema(StringSchema().format("code")) + .example("15517911000001104") + ) + .addParametersItem( + Parameter() + .name("system") + .`in`("query") + .required(false) + .style(Parameter.StyleEnum.SIMPLE) + .description("The system for the code that is to be located") + .schema(StringSchema().format("url")) + .example("http://snomed.info/sct") + ) + .addParametersItem( + Parameter() + .name("version") + .`in`("query") + .required(false) + .style(Parameter.StyleEnum.SIMPLE) + .description("The version of the system, if one was provided in the source data") + .schema(StringSchema()) + ) + .addParametersItem( + Parameter() + .name("coding") + .`in`("query") + .required(false) + .style(Parameter.StyleEnum.SIMPLE) + .description("The system for the code that is to be located") + .schema(StringSchema().format("Coding")) + ) + .addParametersItem( + Parameter() + .name("date") + .`in`("query") + .required(false) + .style(Parameter.StyleEnum.SIMPLE) + .description("The date for which the information should be returned.") + .schema(StringSchema().format("dateTime")) + ) + .addParametersItem( + Parameter() + .name("displayLanguage") + .`in`("query") + .required(false) + .style(Parameter.StyleEnum.SIMPLE) + .description("The requested language for display (see \$expand.displayLanguage)") + .schema(StringSchema().format("code")) + ) + /* .addParametersItem(Parameter() .name("property") .`in`("query") .required(false) @@ -428,105 +477,129 @@ open class OpenApiConfig(@Qualifier("R4") val ctx : FhirContext, .description("A property that the client wishes to be returned in the output. If no properties are specified, the server chooses what to return.") .schema(StringSchema().format("code").maxItems(10)) .example("code display property fullySpecifiedName")) */ - ) + ) - oas.path("/FHIR/R4/CodeSystem/\$lookup",lookupItem) + oas.path("/FHIR/R4/CodeSystem/\$lookup", lookupItem) - // Validate Code [ITI-99] + // Validate Code [ITI-99] - val validateCodeItem = PathItem() - .get( - Operation() - .addTagsItem(getTerminologyTagName(VALIDATION)) - .summary("Validate that a coded value is in the set of codes allowed by a value set.") - .description("This transaction is used by the Terminology Consumer to validate the existence of a given code " + - "in a value set or code system. The request is received by the Terminology Repository. The " + - "Terminology Repository processes the request and returns a response as a Parameters Resource." + - "\n\nFHIR Definition [validate-code](https://www.hl7.org/fhir/R4/operation-valueset-validate-code.html)") - .responses(getApiResponses()) - .addParametersItem(Parameter() - .name("url") - .`in`("query") - .required(false) - .style(Parameter.StyleEnum.SIMPLE) - .description("Value set Canonical URL. The server must know the value set (e.g. it is defined explicitly in the server's value sets, or it is defined implicitly by some code system known to the server") - .schema(StringSchema().format("uri")) - //.example("https://fhir.nhs.uk/ValueSet/NHSDigital-MedicationRequest-Code") - ) - .addParametersItem(Parameter() - .name("code") - .`in`("query") - .required(false) - .style(Parameter.StyleEnum.SIMPLE) - .description("The code that is to be validated. If a code is provided, a system or a context must be provided.") - .schema(StringSchema().format("code")) - .example("15517911000001104")) - .addParametersItem(Parameter() - .name("system") - .`in`("query") - .required(false) - .style(Parameter.StyleEnum.SIMPLE) - .description("The system for the code that is to be validated") - .schema(StringSchema().format("uri")) - .example("http://snomed.info/sct")) - .addParametersItem(Parameter() - .name("display") - .`in`("query") - .required(false) - .style(Parameter.StyleEnum.SIMPLE) - .description("The display associated with the code, if provided. If a display is provided a code must be provided. If no display is provided, the server cannot validate the display value, but may choose to return a recommended display name using the display parameter in the outcome. Whether displays are case sensitive is code system dependent") - .schema(StringSchema()) - .example("Methotrexate 10mg/0.2ml solution for injection pre-filled syringes")) + val validateCodeItem = PathItem() + .get( + Operation() + .addTagsItem(getTerminologyTagName(ONTOLOGY)) + .summary("Validate that a coded value is in the set of codes allowed by a value set.") + .description( + "This transaction is used by the Terminology Consumer to validate the existence of a given code " + + "in a value set or code system. The request is received by the Terminology Repository. The " + + "Terminology Repository processes the request and returns a response as a Parameters Resource." + + "\n\nFHIR Definition [validate-code](https://www.hl7.org/fhir/R4/operation-valueset-validate-code.html)" + ) + .responses(getApiResponses()) + .addParametersItem( + Parameter() + .name("url") + .`in`("query") + .required(false) + .style(Parameter.StyleEnum.SIMPLE) + .description("Value set Canonical URL. The server must know the value set (e.g. it is defined explicitly in the server's value sets, or it is defined implicitly by some code system known to the server") + .schema(StringSchema().format("uri")) + //.example("https://fhir.nhs.uk/ValueSet/NHSDigital-MedicationRequest-Code") + ) + .addParametersItem( + Parameter() + .name("code") + .`in`("query") + .required(false) + .style(Parameter.StyleEnum.SIMPLE) + .description("The code that is to be validated. If a code is provided, a system or a context must be provided.") + .schema(StringSchema().format("code")) + .example("15517911000001104") + ) + .addParametersItem( + Parameter() + .name("system") + .`in`("query") + .required(false) + .style(Parameter.StyleEnum.SIMPLE) + .description("The system for the code that is to be validated") + .schema(StringSchema().format("uri")) + .example("http://snomed.info/sct") + ) + .addParametersItem( + Parameter() + .name("display") + .`in`("query") + .required(false) + .style(Parameter.StyleEnum.SIMPLE) + .description("The display associated with the code, if provided. If a display is provided a code must be provided. If no display is provided, the server cannot validate the display value, but may choose to return a recommended display name using the display parameter in the outcome. Whether displays are case sensitive is code system dependent") + .schema(StringSchema()) + .example("Methotrexate 10mg/0.2ml solution for injection pre-filled syringes") + ) + ) + oas.path("/FHIR/R4/ValueSet/\$validate-code", validateCodeItem) + + // Query Concept Map [ITI-100] + + oas.path( + "/FHIR/R4/ConceptMap", getPathItem( + getTerminologyTagName(ONTOLOGY), + "ConceptMap", + "Concept Map", + "url", + "https://fhir.nhs.uk/ConceptMap/eps-issue-code-to-fhir-issue-type", + "This transaction is used by the Terminology Consumer that supports the Translate Option to " + + "solicit information about concept maps whose data match data provided in the query parameters " + + "on the request message. The request is received by the Terminology Repository that supports the " + + "Translate Option. The Terminology Repository processes the request and returns a response of " + + "the matching concept maps." + ) ) - oas.path("/FHIR/R4/ValueSet/\$validate-code",validateCodeItem) - - // Query Concept Map [ITI-100] - oas.path("/FHIR/R4/ConceptMap",getPathItem(getTerminologyTagName(TERMINOLOGY),"ConceptMap", "Concept Map", "url" , "https://fhir.nhs.uk/ConceptMap/eps-issue-code-to-fhir-issue-type", - "This transaction is used by the Terminology Consumer that supports the Translate Option to " + - "solicit information about concept maps whose data match data provided in the query parameters " + - "on the request message. The request is received by the Terminology Repository that supports the " + - "Translate Option. The Terminology Repository processes the request and returns a response of " + - "the matching concept maps.")) + // Terminology Misc - // Terminology Misc - - val subsumesItem = PathItem() - .get( - Operation() - .addTagsItem(EXPERIMENTAL) - .summary("Test the subsumption relationship between code A and code B given the semantics of subsumption in the underlying code system ") - .description("[subsumes](https://hl7.org/fhir/R4/codesystem-operation-subsumes.html)") - .responses(getApiResponses()) - .addParametersItem(Parameter() - .name("codeA") - .`in`("query") - .required(true) - .style(Parameter.StyleEnum.SIMPLE) - .description("The \"A\" code that is to be tested.") - .schema(StringSchema().format("code")) - .example("15517911000001104")) - .addParametersItem(Parameter() - .name("codeB") - .`in`("query") - .required(true) - .style(Parameter.StyleEnum.SIMPLE) - .description("The \"B\" code that is to be tested.") - .schema(StringSchema().format("code")) - .example("15513411000001100")) - .addParametersItem(Parameter() - .name("system") - .`in`("query") - .required(true) - .style(Parameter.StyleEnum.SIMPLE) - .description("The code system in which subsumption testing is to be performed. This must be provided unless the operation is invoked on a code system instance") - .schema(StringSchema()) - .example("http://snomed.info/sct")) + val subsumesItem = PathItem() + .get( + Operation() + .addTagsItem(EXPERIMENTAL) + .summary("Test the subsumption relationship between code A and code B given the semantics of subsumption in the underlying code system ") + .description("[subsumes](https://hl7.org/fhir/R4/codesystem-operation-subsumes.html)") + .responses(getApiResponses()) + .addParametersItem( + Parameter() + .name("codeA") + .`in`("query") + .required(true) + .style(Parameter.StyleEnum.SIMPLE) + .description("The \"A\" code that is to be tested.") + .schema(StringSchema().format("code")) + .example("15517911000001104") + ) + .addParametersItem( + Parameter() + .name("codeB") + .`in`("query") + .required(true) + .style(Parameter.StyleEnum.SIMPLE) + .description("The \"B\" code that is to be tested.") + .schema(StringSchema().format("code")) + .example("15513411000001100") + ) + .addParametersItem( + Parameter() + .name("system") + .`in`("query") + .required(true) + .style(Parameter.StyleEnum.SIMPLE) + .description("The code system in which subsumption testing is to be performed. This must be provided unless the operation is invoked on a code system instance") + .schema(StringSchema()) + .example("http://snomed.info/sct") + ) - ) + ) + oas.path("/FHIR/R4/CodeSystem/\$subsumes",subsumesItem) + } - oas.path("/FHIR/R4/CodeSystem/\$subsumes",subsumesItem) if (servicesProperties.R4B) { @@ -876,9 +949,20 @@ open class OpenApiConfig(@Qualifier("R4") val ctx : FhirContext, fun getPackages() : String { var packages = "" - val configurationInputStream = ClassPathResource("manifest.json").inputStream - val manifest = objectMapper.readValue(configurationInputStream, Array::class.java) - manifest.forEach { + var manifest : Array? = null + if (fhirServerProperties.igs != null && !fhirServerProperties.igs!!.isEmpty() ) { + val packages= fhirServerProperties.igs!!.split(",") + val manifest2 = arrayListOf() + packages.forEachIndexed{ index, pkg -> + manifest2.add(SimplifierPackage(pkg.substringBefore("#"),pkg.substringAfter("#"))) + } + manifest = manifest2.toTypedArray() + } else { + val configurationInputStream = ClassPathResource("manifest.json").inputStream + manifest = objectMapper.readValue(configurationInputStream, Array::class.java) + } + + manifest!!.forEach { packages += " | "+ it.packageName + " | " + it.version + " | " if (it.packageName.contains("ukcore")) { packages += "[UK Core Implementation Guide](https://simplifier.net/guide/ukcoreversionhistory?version=current)" diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 9a33ffd..4da5b1c 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -15,9 +15,9 @@ management: fhir: server: - name: NHS England Interoperability Standards FHIR Testing + name: FHIR Development and Testing (FHIR Validation) Skunkworks baseUrl: http://localhost:9001 - version: 6.10.27 + version: 6.10.28 services: R4: true From bc1f77656e0187e41c72601a131578d753f6ab71 Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Thu, 15 Feb 2024 08:53:19 +0000 Subject: [PATCH 49/67] clean --- deploy-notes.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/deploy-notes.md b/deploy-notes.md index b881d69..3ec7f18 100644 --- a/deploy-notes.md +++ b/deploy-notes.md @@ -20,8 +20,15 @@ And repeat configure step? aws ecr get-login-password --region eu-west-2 | docker login --username AWS --password-stdin 365027538941.dkr.ecr.eu-west-2.amazonaws.com +Think we need to output the angular app to resources static folder + +ng build --configuration production --output-path target/classes/ --base-href /interoperability-standards-tools-skunkworks/ + + mvn clean install + + docker build -t fhir-validator-r4 . docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest From ff00e83361d10f4234fc2d2ae01d9c273e80640c Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Thu, 15 Feb 2024 08:53:31 +0000 Subject: [PATCH 50/67] clean --- .gitignore | 2 ++ .gitmodules | 4 +--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 6af55f9..ba92c58 100644 --- a/.gitignore +++ b/.gitignore @@ -38,3 +38,5 @@ build/ ### VS Code ### .vscode/ +/interoperability-standards-tools-skunkworks/.angular/cache/17.1.3/angular-webpack/a1dba4dffcba8d84d9c03b2ef4d54bb9f8f40d2d/0.pack +/interoperability-standards-tools-skunkworks/.angular/cache/17.1.3/angular-webpack/a1dba4dffcba8d84d9c03b2ef4d54bb9f8f40d2d/index.pack diff --git a/.gitmodules b/.gitmodules index 957a039..8b13789 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1 @@ -[submodule "interoperability-standards-tools-skunkworks"] - path = interoperability-standards-tools-skunkworks - url = https://github.com/NHSDigital/interoperability-standards-tools-skunkworks + From fab911bddb49bf3e244d6e496b32b7a95f989261 Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Thu, 15 Feb 2024 08:53:31 +0000 Subject: [PATCH 51/67] Improved docker documentation --- .gitignore | 2 ++ .gitmodules | 1 + deploy-notes.md | 13 ++++++++----- interoperability-standards-tools-skunkworks | 1 + pom.xml | 2 +- readme.md | 2 +- .../CapabilityStatementToOpenAPIConversion.kt | 2 +- src/main/resources/application.yaml | 2 +- src/main/resources/static/favicon.ico | Bin 1383 -> 0 bytes src/main/resources/static/favicon.png | Bin 575 -> 0 bytes src/main/resources/static/index.html | 12 ------------ 11 files changed, 16 insertions(+), 21 deletions(-) create mode 160000 interoperability-standards-tools-skunkworks delete mode 100644 src/main/resources/static/favicon.ico delete mode 100644 src/main/resources/static/favicon.png delete mode 100644 src/main/resources/static/index.html diff --git a/.gitignore b/.gitignore index 6af55f9..ba92c58 100644 --- a/.gitignore +++ b/.gitignore @@ -38,3 +38,5 @@ build/ ### VS Code ### .vscode/ +/interoperability-standards-tools-skunkworks/.angular/cache/17.1.3/angular-webpack/a1dba4dffcba8d84d9c03b2ef4d54bb9f8f40d2d/0.pack +/interoperability-standards-tools-skunkworks/.angular/cache/17.1.3/angular-webpack/a1dba4dffcba8d84d9c03b2ef4d54bb9f8f40d2d/index.pack diff --git a/.gitmodules b/.gitmodules index 957a039..51d8a1b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,4 @@ [submodule "interoperability-standards-tools-skunkworks"] path = interoperability-standards-tools-skunkworks url = https://github.com/NHSDigital/interoperability-standards-tools-skunkworks + diff --git a/deploy-notes.md b/deploy-notes.md index 3ec7f18..1c5b7dd 100644 --- a/deploy-notes.md +++ b/deploy-notes.md @@ -22,32 +22,35 @@ aws ecr get-login-password --region eu-west-2 | docker login --username AWS --pa Think we need to output the angular app to resources static folder -ng build --configuration production --output-path target/classes/ --base-href /interoperability-standards-tools-skunkworks/ +ng build --configuration production --output-path ../src/main/resources/public --base-href / mvn clean install +ng build --configuration production --output-path ../src/main/resources/static --base-href ./ docker build -t fhir-validator-r4 . docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest -docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.28 +docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.33 -docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.28 +docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.33 docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest ## Docker +ng build --configuration docker --output-path ../src/main/resources/static --base-href ./ + mvn clean install docker build -t fhir-validator-r4 . docker tag fhir-validator-r4:latest thorlogic/fhir-validator-r4:latest -docker tag fhir-validator-r4:latest thorlogic/fhir-validator-r4:6.10.28 +docker tag fhir-validator-r4:latest thorlogic/fhir-validator-r4:6.10.33 docker push thorlogic/fhir-validator-r4:latest -docker push thorlogic/fhir-validator-r4:6.10.28 +docker push thorlogic/fhir-validator-r4:6.10.33 ### Cloud Formation Notes diff --git a/interoperability-standards-tools-skunkworks b/interoperability-standards-tools-skunkworks new file mode 160000 index 0000000..56d07ce --- /dev/null +++ b/interoperability-standards-tools-skunkworks @@ -0,0 +1 @@ +Subproject commit 56d07ce12a00d1629d2f01d690a27133f4d118d5 diff --git a/pom.xml b/pom.xml index 82dde11..5330cfd 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ uk.nhs.england IOPS-FHIR-Validation-Service - 6.10.28 + 6.10.33 IOPS-FHIR-Validation-Service HAPI FHIR Validator using Spring Boot diff --git a/readme.md b/readme.md index 23c148b..f5a0243 100644 --- a/readme.md +++ b/readme.md @@ -26,7 +26,7 @@ https://hub.docker.com/repository/docker/thorlogic/fhir-validator-r4/general This should work without the configuration below Port is expected to be 9001 -`docker run --env=fhir.igs=fhir.r4.ukcore.stu3.currentbuild#0.0.3-pre-release --env=fhir.server.baseUrl=http://localhost -p 80:9001 --runtime=runc thorlogic/fhir-validator-r4:latest` +`docker run --env=fhir.igs=fhir.r4.ukcore.stu3.currentbuild#0.0.3-pre-release --env=fhir.server.baseUrl=http://localhost:9001 -p 9001:9001 --runtime=runc thorlogic/fhir-validator-r4:latest` ## Environmental Variables diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/oas/CapabilityStatementToOpenAPIConversion.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/oas/CapabilityStatementToOpenAPIConversion.kt index d9260e9..4166af2 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/oas/CapabilityStatementToOpenAPIConversion.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/oas/CapabilityStatementToOpenAPIConversion.kt @@ -1670,7 +1670,7 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F /* protected fun getIndexTemplate(): ClassLoaderTemplateResource? { return ClassLoaderTemplateResource( - myResourcePathToClasspath["/swagger-ui/index.html"], + myResourcePathToClasspath["/swagger-ui/404.html"], StandardCharsets.UTF_8.name() ) } diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 4da5b1c..a150ac5 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -17,7 +17,7 @@ fhir: server: name: FHIR Development and Testing (FHIR Validation) Skunkworks baseUrl: http://localhost:9001 - version: 6.10.28 + version: 6.10.33 services: R4: true diff --git a/src/main/resources/static/favicon.ico b/src/main/resources/static/favicon.ico deleted file mode 100644 index a4c5bdb703d274b6922b309e55acd17fbd7eb265..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1383 zcmV-t1(^DYP)N2bZe?^J zG%heMF)*zP3cvsW1msCXK~zXf-Bo)~lvNZ*D=llL#_2KBV*mkhuyUHxEQ{2d{%CAa zYbKkF1r!7YK@=ua1cB6)3}`5kWOEUDWW+0Cmj!kg7Iz_G1p#AOXnDx8%R^v+UH8@R z<9sYQ4#U(8|8VB)e&_z~IrrTAJLi6%gKdFj5hRF8xwfF{;NV>fUBW4S^_cYa6E#rB zLt+A<9$!@hagVH8<|m-pm%>Ce^@uN@5a+{;|56U$HA3=PisHcK7N4}H_s`Tl87O2t z$@{55q26GoLrL3)34C;qKs#y#!maAre7crq!>`_^*>%UIRx5*?DpWliTp_qMV4?A} z#1*I*Px5~Aanln4Wx6S@dWH-io~i-A=se|fA@5Q);|6oGKur+pgKhx=MGc+8#khm8 z6G}SCVP#M`AzVq%meaKex3|EA(Nf(ubRTbcNnnrYZd`pk`q*9p5GYy@?*Ovx4j_aO zYL#Waf|VdDLV^kb#De6;DzB<%L3I&)4@ReCa&nRdY&KD4{Ix={?%Uo`EH}htlGl4`bhNV`kU7ehZi;8x7ZI6wPDag-X zvtUP`wokjv#=U0pD!7>Wi3cn=Q^1H&L~o&-N%yodx%jg6Fmv-?Zr0G^hb z`d|XBR*M{1_ri}q3Co1@BtUsT-Lcc%#WgxA3e;1AoUE+Xt6cW)3&iTP6KFIVP!|?* zuvR8t>%ImdzTO)uyHs@tE^5+rQ)*Nnxue-rWEI002ovPDHLkV1nusescf- diff --git a/src/main/resources/static/favicon.png b/src/main/resources/static/favicon.png deleted file mode 100644 index 296a680b0b9fd27d998aad29dbd43fff1632b26f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 575 zcmV-F0>J%=P)+gIT3N{y1}ofQEk` zKYiP<<#lu#6X#WS`#;R05+8deGW`9EUBllOFF!Q4{dx54|NE_iH6MQ6`Nb6&@OkF^ z-`8(q)A0ZQhn7yB_~?)Ab%G__On?6|GU@*R@%7L1+rMsJ!=mBu%SR0CZ$7V>%#$q6 zruF&P6LvP2?63PLv)Xd~d3_d(hMyOgvRjJ(`+Ar^RpZa|cRya)u^S39vR&e`{lUcX z42uS4p)V{#uh~@pG6{bDahqKrd)m+Q#e9KcY$_})QY=_Bu&D>I2tHty`^E56n%%VG z&&^y;9YHp2PiEd9tg06OUT#3wz{qFDENjUo`tko?ab^)sCdLD-n%N8tvMfTs89#O~ za*1LIRz|@DW{o - - - Old Page - - - - - -

Redirecting to OAS Specficition here

- - From a0e88945fc370322dfdf56101f21002b7a873dbc Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Fri, 16 Feb 2024 08:33:25 +0000 Subject: [PATCH 52/67] Linked in frontend app to backend api --- .gitignore | 2 ++ deploy-notes.md | 4 --- interoperability-standards-tools-skunkworks | 2 +- readme.md | 2 +- .../controller/ErrorController.kt | 28 +++++++++++++++++++ .../controller/StatusController.kt | 12 ++++++++ src/main/resources/application.yaml | 3 ++ 7 files changed, 47 insertions(+), 6 deletions(-) create mode 100644 src/main/kotlin/uk/nhs/england/fhirvalidator/controller/ErrorController.kt diff --git a/.gitignore b/.gitignore index ba92c58..fd96800 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,8 @@ target/ src/main/resources/validation.json src/main/resources/nhs-validation.json src/main/resources/implementationGuides/*.tgz +src/main/resources/static/web/*.* +src/main/resources/static/app/*.* src/uk.nhs.digital.fhir.fwoa.main/resources/*.tgz !.mvn/wrapper/maven-wrapper.jar !**/src/main/**/target/ diff --git a/deploy-notes.md b/deploy-notes.md index 1c5b7dd..9f81934 100644 --- a/deploy-notes.md +++ b/deploy-notes.md @@ -20,10 +20,6 @@ And repeat configure step? aws ecr get-login-password --region eu-west-2 | docker login --username AWS --password-stdin 365027538941.dkr.ecr.eu-west-2.amazonaws.com -Think we need to output the angular app to resources static folder - -ng build --configuration production --output-path ../src/main/resources/public --base-href / - mvn clean install diff --git a/interoperability-standards-tools-skunkworks b/interoperability-standards-tools-skunkworks index 56d07ce..51ec515 160000 --- a/interoperability-standards-tools-skunkworks +++ b/interoperability-standards-tools-skunkworks @@ -1 +1 @@ -Subproject commit 56d07ce12a00d1629d2f01d690a27133f4d118d5 +Subproject commit 51ec5159f0ebda87c39ace5f61b7a436d89da8af diff --git a/readme.md b/readme.md index f5a0243..23c148b 100644 --- a/readme.md +++ b/readme.md @@ -26,7 +26,7 @@ https://hub.docker.com/repository/docker/thorlogic/fhir-validator-r4/general This should work without the configuration below Port is expected to be 9001 -`docker run --env=fhir.igs=fhir.r4.ukcore.stu3.currentbuild#0.0.3-pre-release --env=fhir.server.baseUrl=http://localhost:9001 -p 9001:9001 --runtime=runc thorlogic/fhir-validator-r4:latest` +`docker run --env=fhir.igs=fhir.r4.ukcore.stu3.currentbuild#0.0.3-pre-release --env=fhir.server.baseUrl=http://localhost -p 80:9001 --runtime=runc thorlogic/fhir-validator-r4:latest` ## Environmental Variables diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/controller/ErrorController.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/controller/ErrorController.kt new file mode 100644 index 0000000..47aff1b --- /dev/null +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/controller/ErrorController.kt @@ -0,0 +1,28 @@ +package uk.nhs.england.fhirvalidator.controller + +import mu.KLogging +import org.springframework.boot.web.servlet.error.ErrorController +import org.springframework.stereotype.Controller +import org.springframework.web.bind.annotation.RequestMapping +import javax.servlet.RequestDispatcher +import javax.servlet.http.HttpServletRequest +import javax.servlet.http.HttpServletResponse + + +@Controller +class ErrorController : ErrorController { + companion object : KLogging() + @RequestMapping("/error") + fun handleError(request : HttpServletRequest, response: HttpServletResponse): String { + val status: Any = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE) + + val statusCode = status.toString().toInt() + + if (statusCode.equals(404)) { + response.sendRedirect("/") + return "error-404" + + } + return "error" + } +} diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/controller/StatusController.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/controller/StatusController.kt index 1e9bde1..d0e7a37 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/controller/StatusController.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/controller/StatusController.kt @@ -1,14 +1,26 @@ package uk.nhs.england.fhirvalidator.controller import io.swagger.v3.oas.annotations.Hidden +import mu.KLogging +import org.springframework.http.HttpStatus +import org.springframework.web.bind.annotation.ExceptionHandler import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.ResponseStatus import org.springframework.web.bind.annotation.RestController +import kotlin.math.log @RestController @Hidden class StatusController { + companion object : KLogging() @GetMapping("_status") fun validate(): String { return "Validator is alive" } + @ExceptionHandler + @ResponseStatus(value= HttpStatus.NOT_FOUND) + fun conflict() { + // Nothing to do + logger.info("not found") + } } diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index a150ac5..8efc788 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -4,6 +4,9 @@ server: threads: max: 10 forward-headers-strategy: native + error: + whitelabel: + enabled=false: management: health: From 67518d9a64c739b447e62e823fc249efc29c3424 Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Fri, 16 Feb 2024 11:35:54 +0000 Subject: [PATCH 53/67] Automating docker build and deply Added configurable package parameter fhir.igs --- deploy-notes.md | 16 ++-- pom.xml | 118 +++++++++++++++++++++++++++- readme.md | 2 +- src/main/resources/application.yaml | 2 +- 4 files changed, 125 insertions(+), 13 deletions(-) diff --git a/deploy-notes.md b/deploy-notes.md index 9f81934..f62bab7 100644 --- a/deploy-notes.md +++ b/deploy-notes.md @@ -29,24 +29,20 @@ ng build --configuration production --output-path ../src/main/resources/static - docker build -t fhir-validator-r4 . docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest -docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.33 +docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.34 -docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.33 +docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.34 docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest ## Docker -ng build --configuration docker --output-path ../src/main/resources/static --base-href ./ - -mvn clean install +Do this first if app has changed or app code is not present in the static folder +(may need to run `git submodule update` and `npm install`) -docker build -t fhir-validator-r4 . +ng build --configuration docker --output-path ../src/main/resources/static --base-href ./ -docker tag fhir-validator-r4:latest thorlogic/fhir-validator-r4:latest -docker tag fhir-validator-r4:latest thorlogic/fhir-validator-r4:6.10.33 +mvn clean install -P dockerBuild,dockerRelease -docker push thorlogic/fhir-validator-r4:latest -docker push thorlogic/fhir-validator-r4:6.10.33 ### Cloud Formation Notes diff --git a/pom.xml b/pom.xml index 5330cfd..70e85df 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ uk.nhs.england IOPS-FHIR-Validation-Service - 6.10.33 + 6.10.34 IOPS-FHIR-Validation-Service HAPI FHIR Validator using Spring Boot @@ -224,5 +224,121 @@ + + + dockerBuild + + + + maven-resources-plugin + + + copy-resources + validate + + copy-resources + + + ${basedir}/target + + + src/main/docker + true + + + + + + + + + org.apache.maven.plugins + maven-antrun-plugin + 1.6 + + + prepare-package + package + false + + + + + + + + + + + + run + + + + + + + + true + + + + + dockerRelease + + + + org.apache.maven.plugins + maven-antrun-plugin + 1.6 + + + install + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + run + + + + + + + +
diff --git a/readme.md b/readme.md index 23c148b..d789701 100644 --- a/readme.md +++ b/readme.md @@ -26,7 +26,7 @@ https://hub.docker.com/repository/docker/thorlogic/fhir-validator-r4/general This should work without the configuration below Port is expected to be 9001 -`docker run --env=fhir.igs=fhir.r4.ukcore.stu3.currentbuild#0.0.3-pre-release --env=fhir.server.baseUrl=http://localhost -p 80:9001 --runtime=runc thorlogic/fhir-validator-r4:latest` +`docker run --env=fhir.igs=fhir.r4.ukcore.stu3.currentbuild#0.0.8-pre-release --env=fhir.server.baseUrl=http://localhost -p 80:9001 --runtime=runc thorlogic/fhir-validator-r4:latest` ## Environmental Variables diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 8efc788..e9d30e6 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -20,7 +20,7 @@ fhir: server: name: FHIR Development and Testing (FHIR Validation) Skunkworks baseUrl: http://localhost:9001 - version: 6.10.33 + version: 6.10.34 services: R4: true From e7628370ba62a65f659ae1f51aa152bb5e350386 Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Fri, 16 Feb 2024 14:25:54 +0000 Subject: [PATCH 54/67] Automating docker build and deply Added configurable package parameter fhir.igs --- deploy-notes.md | 44 ++++++++------------------------------------ pom.xml | 43 +++++++++++++++++++++++++++++++++++++++++++ readme.md | 5 +++++ 3 files changed, 56 insertions(+), 36 deletions(-) diff --git a/deploy-notes.md b/deploy-notes.md index f62bab7..1f520b9 100644 --- a/deploy-notes.md +++ b/deploy-notes.md @@ -1,47 +1,19 @@ ## AWS -Initial user Setup +Use AWS Toolkit terminal -https://nhsd-confluence.digital.nhs.uk/display/AWS/001+-+Use+AWS+CLI+with+MFA - -Logon using MFA - MFA needs replacing in the following - -aws --profile kevin.mayfield1 sts get-session-token --serial-number arn:aws:iam::347250048819:mfa/kevin.mayfield1 --duration-seconds 129600 --token-code MFA - -aws configure --profile default set aws_access_key_id {from above} -aws configure --profile default set aws_secret_access_key {from above} -aws configure --profile default set aws_session_token - -Then run - -aws sts assume-role --role-arn arn:aws:iam::365027538941:role/NHSDAdminRole --role-session-name bob - -And repeat configure step? - -aws ecr get-login-password --region eu-west-2 | docker login --username AWS --password-stdin 365027538941.dkr.ecr.eu-west-2.amazonaws.com - - -mvn clean install - -ng build --configuration production --output-path ../src/main/resources/static --base-href ./ - - -docker build -t fhir-validator-r4 . - -docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest -docker tag fhir-validator-r4:latest 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.34 - -docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:6.10.34 -docker push 365027538941.dkr.ecr.eu-west-2.amazonaws.com/fhir-validator-r4:latest - -## Docker +`aws ecr get-login-password --region eu-west-2 | docker login --username AWS --password-stdin 365027538941.dkr.ecr.eu-west-2.amazonaws.com` Do this first if app has changed or app code is not present in the static folder (may need to run `git submodule update` and `npm install`) -ng build --configuration docker --output-path ../src/main/resources/static --base-href ./ +In **interoperability-standards-tools-skunkworks** folder + +`ng build --configuration production --output-path ../src/main/resources/static --base-href ./` + +In root folder -mvn clean install -P dockerBuild,dockerRelease +`mvn clean install -P dockerBuild,dockerRelease,awsRelease` ### Cloud Formation Notes diff --git a/pom.xml b/pom.xml index 70e85df..9498470 100644 --- a/pom.xml +++ b/pom.xml @@ -340,5 +340,48 @@ + + awsRelease + + + + org.apache.maven.plugins + maven-antrun-plugin + 1.6 + + + install + false + + + + + + + + + + + + + + + + + + + + + + + + run + + + + + + +
diff --git a/readme.md b/readme.md index d789701..bfffa68 100644 --- a/readme.md +++ b/readme.md @@ -28,6 +28,11 @@ Port is expected to be 9001 `docker run --env=fhir.igs=fhir.r4.ukcore.stu3.currentbuild#0.0.8-pre-release --env=fhir.server.baseUrl=http://localhost -p 80:9001 --runtime=runc thorlogic/fhir-validator-r4:latest` +Using an ontology service + +`docker run --env=fhir.igs=fhir.r4.ukcore.stu3.currentbuild#0.0.8-pre-release --env=fhir.server.baseUrl=http://localhost --env=terminology.authorization.clientId=REPLACE_ME_CLIENT_ID --env=terminology.authorization.clientSecret=REPLACE_ME_CLIENT_SECRET --env=terminology.authorization.tokenUrl=https://ontology.nhs.uk/authorisation/auth/realms/nhs-digital-terminology/protocol/openid-connect/token --env=terminology.url=https://ontology.nhs.uk/authoring/fhir/ -p 80:9001 --runtime=runc thorlogic/fhir-validator-r4:latest` + + ## Environmental Variables From 1c90fccb0bd5071857bb54b45ee50a3c680c6367 Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Sat, 17 Feb 2024 09:20:24 +0000 Subject: [PATCH 55/67] Linked in frontend app to backend api --- deploy-notes.md | 2 +- pom.xml | 2 +- .../configuration/ValidationConfiguration.kt | 54 ++++++++++++++++--- .../CapabilityStatementInterceptor.kt | 34 ++++++------ .../fhirvalidator/model/FHIRPackage.kt | 14 ++++- .../CapabilityStatementToOpenAPIConversion.kt | 6 +-- .../shared/PrePopulatedValidationSupport.java | 17 ++++-- src/main/resources/application.yaml | 2 +- 8 files changed, 99 insertions(+), 32 deletions(-) diff --git a/deploy-notes.md b/deploy-notes.md index 1f520b9..b3a9f2a 100644 --- a/deploy-notes.md +++ b/deploy-notes.md @@ -5,7 +5,7 @@ Use AWS Toolkit terminal `aws ecr get-login-password --region eu-west-2 | docker login --username AWS --password-stdin 365027538941.dkr.ecr.eu-west-2.amazonaws.com` Do this first if app has changed or app code is not present in the static folder -(may need to run `git submodule update` and `npm install`) +(may need to run `git submodule update` (maybe `git submodule foreach git pull`) and `npm install`) In **interoperability-standards-tools-skunkworks** folder diff --git a/pom.xml b/pom.xml index 9498470..9a566fe 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ uk.nhs.england IOPS-FHIR-Validation-Service - 6.10.34 + 6.10.35 IOPS-FHIR-Validation-Service HAPI FHIR Validator using Spring Boot diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/ValidationConfiguration.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/ValidationConfiguration.kt index 106c3fd..6dacf6f 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/ValidationConfiguration.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/ValidationConfiguration.kt @@ -12,6 +12,7 @@ import mu.KLogging import org.hl7.fhir.common.hapi.validation.support.* import org.hl7.fhir.common.hapi.validation.validator.FhirInstanceValidator import org.hl7.fhir.r4.model.CapabilityStatement +import org.hl7.fhir.r4.model.ImplementationGuide import org.hl7.fhir.r4.model.StructureDefinition import org.hl7.fhir.utilities.json.model.JsonProperty import org.hl7.fhir.utilities.npm.NpmPackage @@ -22,6 +23,7 @@ import org.springframework.context.annotation.Configuration import org.springframework.core.io.ClassPathResource import org.springframework.security.oauth2.client.OAuth2AuthorizedClientManager import uk.nhs.england.fhirvalidator.awsProvider.* +import uk.nhs.england.fhirvalidator.model.DependsOn import uk.nhs.england.fhirvalidator.model.FHIRPackage import uk.nhs.england.fhirvalidator.model.SimplifierPackage import uk.nhs.england.fhirvalidator.service.ImplementationGuideParser @@ -92,17 +94,18 @@ open class ValidationConfiguration( if (messageProperties.getAWSValidationSupport()) supportChain.addValidationSupport( AWSValidationSupport(fhirContext, awsQuestionnaire,awsCodeSystem,awsValueSet, awsConceptMap)) val manifest = getPackages() if (npmPackages != null) { + /* npmPackages!! .filter { !it.name().equals("hl7.fhir.r4.examples") } .map(implementationGuideParser::createPrePopulatedValidationSupport) .forEach(supportChain::addValidationSupport) - //Initialise now instead of when the first message arrives - generateSnapshots(supportChain) - supportChain.fetchCodeSystem("http://snomed.info/sct") - // packages have been processed so remove them - for (pckg in npmPackages) { + */ + val npms = npmPackages!!.filter { !it.name().equals("hl7.fhir.r4.examples") } + for (pckg in npms) { + val support = implementationGuideParser.createPrePopulatedValidationSupport(pckg) + supportChain.addValidationSupport(support) var description = pckg.description() if (description == null) description = "" var derived = true @@ -111,9 +114,48 @@ open class ValidationConfiguration( if (it.packageName.equals(pckg.name())) derived = false } } - var newPckg = FHIRPackage(pckg.name(),pckg.version(),description,pckg.url(),derived) + val dependsOn = ArrayList() + for (dependency in pckg.dependencies()) { + val pckgStrs = dependency.split("#") + if (pckgStrs.size>1) { + // dummy value for now + var uri = "https://example.fhir.org/ImplementationGuide/" + pckgStrs[0] + "|" + pckgStrs[1] + if (pckgStrs[0].contains("hl7.fhir.r4.core")) uri = "https://hl7.org/fhir/R4/" + if (pckgStrs[0].contains("ukcore")) uri = "https://simplifier.net/guide/ukcoreversionhistory" + if (pckgStrs[0].contains("nhsengland")) uri = "https://simplifier.net/guide/nhs-england-implementation-guide-version-history" + val depends = DependsOn( + pckgStrs[0], + pckgStrs[1], + uri + ) + dependsOn.add(depends) + } + } + var packUrl = pckg.url() + if (pckg.name().contains("hl7.fhir.r4.core")) packUrl = "https://hl7.org/fhir/R4/" + if (pckg.name().contains("ukcore")) packUrl = "https://simplifier.net/guide/ukcoreversionhistory" + if (pckg.name().contains("nhsengland")) packUrl = "https://simplifier.net/guide/nhs-england-implementation-guide-version-history" + var newPckg = FHIRPackage(pckg.name(),pckg.version(),description,packUrl,derived,dependsOn) this.fhirPackage.add(newPckg) } + //Initialise now instead of when the first message arrives + generateSnapshots(supportChain) + supportChain.fetchCodeSystem("http://snomed.info/sct") + // Correct dependencies canonical urls + for (pkg in this.fhirPackage) { + if (pkg.canonicalUri !== null && pkg.derived) { + for (otherPkg in this.fhirPackage) { + if (!otherPkg.packageName.equals(pkg.packageName) && !otherPkg.version.equals(pkg.version) && otherPkg.dependencies !== null) { + for (depencyPkg in otherPkg.dependencies) { + if (depencyPkg.packageName.equals(pkg.packageName) && depencyPkg.version.equals(pkg.version)) { + depencyPkg.canonicalUri = pkg.canonicalUri + } + } + } + } + } + } + // packages have been processed so remove them npmPackages = emptyList() return supportChain } else { diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/CapabilityStatementInterceptor.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/CapabilityStatementInterceptor.kt index 36cbd78..f540bcb 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/CapabilityStatementInterceptor.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/CapabilityStatementInterceptor.kt @@ -33,8 +33,8 @@ class CapabilityStatementInterceptor( val cs: CapabilityStatement = theCapabilityStatement as CapabilityStatement // Customize the CapabilityStatement as desired - val apiextension = Extension(); - apiextension.url = "https://fhir.nhs.uk/StructureDefinition/Extension-NHSDigital-CapabilityStatement-Package" + // val apiextension = Extension(); + // apiextension.url = "https://fhir.nhs.uk/StructureDefinition/Extension-NHSDigital-CapabilityStatement-Package" /* if (enhance && fhirPackage !== null && fhirPackage.size > 0) { var igDescription = "\n\n | FHIR Implementation Guide | Version |\n |-----|-----|\n" @@ -57,32 +57,36 @@ class CapabilityStatementInterceptor( fhirPackage.forEach { if (!it.derived) { - /* 27 Jan 2024 Use contained instead - val packageExtension = Extension(); - packageExtension.url = "FHIRPackage" - packageExtension.extension.add(Extension().setUrl("name").setValue(StringType(it.name))) - packageExtension.extension.add(Extension().setUrl("version").setValue(StringType(it.version))) - apiextension.extension.add(packageExtension) */ var implementationGuide = ImplementationGuide() - implementationGuide.packageId = it.name + implementationGuide.packageId = it.packageName implementationGuide.version = it.version implementationGuide.status = Enumerations.PublicationStatus.UNKNOWN - implementationGuide.name = it.name - implementationGuide.url = - "https://example.fhir.org/ImplementationGuide/" + it.name + "|" + it.version - implementationGuide.id = it.name - cs.implementationGuide.add(CanonicalType("#" + it.name)) + implementationGuide.name = it.packageName + implementationGuide.url = it.canonicalUri + implementationGuide.id = it.packageName + if (it.dependencies !== null) { + for (dependency in it.dependencies) { + implementationGuide.dependsOn.add( + ImplementationGuide.ImplementationGuideDependsOnComponent() + .setPackageId(dependency.packageName) + .setVersion(dependency.version) + .setUri(dependency.canonicalUri) + ) + } + } + cs.implementationGuide.add(CanonicalType("#" + it.packageName)) cs.contained.add(implementationGuide) } } + /* val packageExtension = Extension(); packageExtension.url="openApi" packageExtension.extension.add(Extension().setUrl("documentation").setValue(UriType("https://simplifier.net/guide/NHSDigital/Home"))) packageExtension.extension.add(Extension().setUrl("description").setValue(StringType("NHS England FHIR Implementation Guide"))) apiextension.extension.add(packageExtension) cs.extension.add(apiextension) - +*/ for (resourceIG in supportChain.fetchAllConformanceResources()?.filterIsInstance()!!) { if (resourceIG.url.contains(".uk")) { diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/model/FHIRPackage.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/model/FHIRPackage.kt index 00c1aac..ddf11a8 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/model/FHIRPackage.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/model/FHIRPackage.kt @@ -1,3 +1,15 @@ package uk.nhs.england.fhirvalidator.model -data class FHIRPackage(val name: String, val version: String, val description: String, val url: String?, val derived: Boolean) +data class DependsOn( + val packageName: String, + val version: String, + var canonicalUri: String? +) +data class FHIRPackage( + val packageName: String, + val version: String, + val description: String, + var canonicalUri: String?, + val derived: Boolean, + val dependencies: List? +) diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/oas/CapabilityStatementToOpenAPIConversion.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/oas/CapabilityStatementToOpenAPIConversion.kt index 4166af2..0ee4607 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/service/oas/CapabilityStatementToOpenAPIConversion.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/service/oas/CapabilityStatementToOpenAPIConversion.kt @@ -2100,10 +2100,10 @@ class CapabilityStatementToOpenAPIConversion(@Qualifier("R4") private val ctx: F var path = profile for(guide in fhirPackage) { if (!guide.version.contains("0.0.0") && ( - guide.name.contains("england") || - guide.name.contains("ukcore") + guide.packageName.contains("england") || + guide.packageName.contains("ukcore") )) { - path = "https://simplifier.net/resolve?fhirVersion=R4&scope="+ guide.name + "@" + guide.version + "&canonical="+profile + path = "https://simplifier.net/resolve?fhirVersion=R4&scope="+ guide.packageName + "@" + guide.version + "&canonical="+profile } } if (path == null) return "" diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/shared/PrePopulatedValidationSupport.java b/src/main/kotlin/uk/nhs/england/fhirvalidator/shared/PrePopulatedValidationSupport.java index 34c4a70..accdb48 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/shared/PrePopulatedValidationSupport.java +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/shared/PrePopulatedValidationSupport.java @@ -9,10 +9,7 @@ import org.hl7.fhir.instance.model.api.IBase; import org.hl7.fhir.instance.model.api.IBaseResource; import org.hl7.fhir.instance.model.api.IPrimitiveType; -import org.hl7.fhir.r4.model.CodeSystem; -import org.hl7.fhir.r4.model.NamingSystem; -import org.hl7.fhir.r4.model.StructureDefinition; -import org.hl7.fhir.r4.model.ValueSet; +import org.hl7.fhir.r4.model.*; import org.jetbrains.annotations.Nullable; import javax.annotation.Nonnull; @@ -38,6 +35,7 @@ public class PrePopulatedValidationSupport extends BaseStaticResourceValidationS private final Map myValueSets; private final Map myOtherConformanceResources; + /** * Constructor */ @@ -68,6 +66,16 @@ public PrePopulatedValidationSupport(FhirContext theFhirContext, Map Date: Mon, 19 Feb 2024 05:49:34 +0000 Subject: [PATCH 56/67] FHIR Document HTML conversion --- interoperability-standards-tools-skunkworks | 2 +- pom.xml | 18 + .../fhirvalidator/FHIRR4RestfulServer.kt | 2 + .../interceptor/ValidationInterceptor.kt | 3 +- .../provider/CompostionProvider.kt | 91 ++++ src/main/resources/xslt/DocumentToHTML.xslt | 390 ++++++++++++++++++ src/main/resources/xslt/r4DocumentToHTML.xslt | 373 +++++++++++++++++ src/main/resources/xslt/utilities.xsl | 235 +++++++++++ 8 files changed, 1112 insertions(+), 2 deletions(-) create mode 100644 src/main/kotlin/uk/nhs/england/fhirvalidator/provider/CompostionProvider.kt create mode 100644 src/main/resources/xslt/DocumentToHTML.xslt create mode 100644 src/main/resources/xslt/r4DocumentToHTML.xslt create mode 100644 src/main/resources/xslt/utilities.xsl diff --git a/interoperability-standards-tools-skunkworks b/interoperability-standards-tools-skunkworks index 51ec515..baa51a7 160000 --- a/interoperability-standards-tools-skunkworks +++ b/interoperability-standards-tools-skunkworks @@ -1 +1 @@ -Subproject commit 51ec5159f0ebda87c39ace5f61b7a436d89da8af +Subproject commit baa51a7d7a2f6be4258e05116205a3a696da566c diff --git a/pom.xml b/pom.xml index 9a566fe..a130ddc 100644 --- a/pom.xml +++ b/pom.xml @@ -185,6 +185,24 @@ 1.12.252 + + + xalan + xalan + 2.7.3 + + + xalan + serializer + 2.7.3 + + + + org.xhtmlrenderer + flying-saucer-pdf + 9.1.22 + +
diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRR4RestfulServer.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRR4RestfulServer.kt index 2ac1e24..e5d373e 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRR4RestfulServer.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRR4RestfulServer.kt @@ -39,6 +39,7 @@ class FHIRR4RestfulServer( private val namingSystemProvider: NamingSystemProvider, private val valueSetProvider: ValueSetProvider, private val codeSystemProvider: CodeSystemProvider, + private val compostionProvider: CompostionProvider, @Qualifier("SupportChain") private val supportChain: IValidationSupport, val fhirServerProperties: FHIRServerProperties, private val messageProperties: MessageProperties @@ -62,6 +63,7 @@ class FHIRR4RestfulServer( registerProvider(namingSystemProvider) registerProvider(valueSetProvider) registerProvider(codeSystemProvider) + registerProvider(compostionProvider) diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/ValidationInterceptor.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/ValidationInterceptor.kt index 008aa99..f57c506 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/ValidationInterceptor.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/ValidationInterceptor.kt @@ -37,7 +37,8 @@ class ValidationInterceptor(val ctx : FhirContext, val messageProperties: Messag fun incomingRequest(request: HttpServletRequest, requestDetails: RequestDetails?, resource: IBaseResource?) :Boolean { // Don't validate validate! - if ((request.method.equals("POST") || request.method.equals("PUT")) && !request.pathInfo.startsWith("/$") ) { + if ((request.method.equals("POST") || request.method.equals("PUT")) + && !request.pathInfo.contains("/$") ) { val encoding = RestfulServerUtils.determineRequestEncodingNoDefault(requestDetails) if (encoding == null) { log.trace("Incoming request does not appear to be FHIR, not going to validate") diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/CompostionProvider.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/CompostionProvider.kt new file mode 100644 index 0000000..5feab6e --- /dev/null +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/CompostionProvider.kt @@ -0,0 +1,91 @@ +package uk.nhs.england.fhirvalidator.provider + +import ca.uhn.fhir.context.FhirContext +import ca.uhn.fhir.rest.annotation.* +import ca.uhn.fhir.rest.server.IResourceProvider +import ca.uhn.fhir.rest.server.exceptions.UnprocessableEntityException +import org.apache.commons.io.output.ByteArrayOutputStream +import org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain +import org.hl7.fhir.r4.model.BooleanType +import org.hl7.fhir.r4.model.Bundle +import org.hl7.fhir.r4.model.Composition +import org.slf4j.LoggerFactory +import org.springframework.beans.factory.annotation.Qualifier +import org.springframework.stereotype.Component +import uk.nhs.england.fhirvalidator.service.ImplementationGuideParser +import java.io.ByteArrayInputStream +import javax.servlet.http.HttpServletRequest +import javax.servlet.http.HttpServletResponse +import javax.xml.transform.Transformer +import javax.xml.transform.TransformerFactory +import javax.xml.transform.stream.StreamResult +import javax.xml.transform.stream.StreamSource + + +@Component +class CompostionProvider(@Qualifier("R4") private val fhirContext: FhirContext, + private val supportChain: ValidationSupportChain) : IResourceProvider { + /** + * The getResourceType method comes from IResourceProvider, and must + * be overridden to indicate what type of resource this provider + * supplies. + */ + override fun getResourceType(): Class { + return Composition::class.java + } + var implementationGuideParser: ImplementationGuideParser? = ImplementationGuideParser(fhirContext) + + private val log = LoggerFactory.getLogger("FHIRAudit") + + + @Operation(name = "\$convert", idempotent = true,manualResponse=true, manualRequest=false) + fun convertOpenAPI( + servletRequest: HttpServletRequest, + servletResponse: HttpServletResponse, + @ResourceParam document: Bundle, + @OperationParam(name = "enhance") abstract: BooleanType?, + ) { + if (document.type !== Bundle.BundleType.DOCUMENT) { + throw UnprocessableEntityException("Not a FHIR Document") + } + // Set the property to use xalan processor + System.setProperty( + "javax.xml.transform.TransformerFactory", + "org.apache.xalan.processor.TransformerFactoryImpl" + ) + val xml = this.fhirContext.newXmlParser().encodeResourceToString(document) + + val xmlSource = StreamSource(xml.byteInputStream()) + val classLoader = javaClass.classLoader + // val inputStream = classLoader.getResourceAsStream("xslt/DocumentToHTML.xslt") + val inputStream = classLoader.getResourceAsStream("xslt/r4DocumentToHTML.xslt") + val xsltSource = StreamSource(inputStream) + + val transformerFactory = TransformerFactory.newInstance() + val transformer: Transformer = transformerFactory.newTransformer(xsltSource) + + val os = ByteArrayOutputStream() + val result: StreamResult = StreamResult(os) + try { + transformer.transform(xmlSource, result) + println("XSLT transformation completed successfully.") + } catch (ex : Exception) { + log.error(ex.message) + } + val output = ByteArrayInputStream(os.toByteArray()) + + servletResponse.setContentType("text/html") + servletResponse.setCharacterEncoding("UTF-8") + + val buffer = ByteArray(1024*8) + + var j = -1 + while (output.read(buffer).also { j = it } > 0) { + servletResponse.writer.write(buffer.decodeToString(0,j)) + } + + servletResponse.writer.flush() + return + } + +} diff --git a/src/main/resources/xslt/DocumentToHTML.xslt b/src/main/resources/xslt/DocumentToHTML.xslt new file mode 100644 index 0000000..c12e18d --- /dev/null +++ b/src/main/resources/xslt/DocumentToHTML.xslt @@ -0,0 +1,390 @@ + + + + + + + + + + + + + + + + + Source document must be a bundle + + + Bundle must start with a Composition resource + + + Warning: Bundle type does not indicate it is a document. + + + + + + + + + + + + + + + + + + + + + <xsl:value-of select="$title"/> + + + + +

+ +

+
+ +
+ + + + + + +
+ + + + + + + + + + + + +

+ +

+
+ +

+ +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Y + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + +

+ +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Warning: Headings exceed 6 levels deep. Remaining headings converted to simple paragraphs + p + + + + + + + +
diff --git a/src/main/resources/xslt/r4DocumentToHTML.xslt b/src/main/resources/xslt/r4DocumentToHTML.xslt new file mode 100644 index 0000000..b4a544f --- /dev/null +++ b/src/main/resources/xslt/r4DocumentToHTML.xslt @@ -0,0 +1,373 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <xsl:value-of select="$titleStr"/> + + + +

+ +

+
+ +
+ + + + + + +
+ + + + + + + + + + + + +

+ +

+
+ +

+ + + +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Y + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + +

+ + + +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + p + + + + + + + +
diff --git a/src/main/resources/xslt/utilities.xsl b/src/main/resources/xslt/utilities.xsl new file mode 100644 index 0000000..4561d38 --- /dev/null +++ b/src/main/resources/xslt/utilities.xsl @@ -0,0 +1,235 @@ + + + + + Created on: May 11, 2017 + Author: ahenket + + + + + + + Vocabulary file containing language dependant strings such as labels + + + + + + + Cache language dependant strings + + + + + + + Retrieves a language dependant string from our language file such as a label based on a key. Returns string based on textLang, textLangDefault, the first two characters of the textLangDefault, e.g. 'en' in 'en-US' and finally if all else fails just the key text. + + Some text or space to prefix our string with + The key to find our text with + Some text like a colon or space to postfix our text with + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Converts Latin characters in input to lower case and returns the result + + Input string + + + + + + + + + + + Converts Latin characters in input to upper case and returns the result + + Input string + + + + + + + + + + + Converts first character in input to upper case if it is a Latin character and returns the result + + Input string + + + + + + + + + + + + + + Tokenize based on delimiters, or if no delimiter do character tokenization + + String to tokenize + Optional delimiter string + Optional prefix for every 'array' item + + + + + + + + + + + + + + + + + + + + + + + + + + Tokenize every character + + String to tokenize + Optional prefix for every 'array' item + + + + + + + + + + + + + + + + + + Tokenize based on delimiters + + String to tokenize + Required delimiter string + Optional prefix for every 'array' item + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From c996e464360f87e99b4544d3b8de2553b90e7ecc Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Mon, 19 Feb 2024 08:13:15 +0000 Subject: [PATCH 57/67] FHIR Document HTML conversion. Doesn't like IPS, so using EU Labs for examples --- pom.xml | 14 +- .../provider/CompostionProvider.kt | 13 +- .../fhirvalidator/util/MyUriResolver.kt | 19 + src/main/resources/xslt/DocumentToHTML.xslt | 119 +- src/main/resources/xslt/r4DocumentToHTML.xslt | 373 - src/main/resources/xslt/utilities-l10n.xml | 10684 ++++++++++++++++ src/main/resources/xslt/utilities-l10n.xsd | 46 + 7 files changed, 10821 insertions(+), 447 deletions(-) create mode 100644 src/main/kotlin/uk/nhs/england/fhirvalidator/util/MyUriResolver.kt delete mode 100644 src/main/resources/xslt/r4DocumentToHTML.xslt create mode 100644 src/main/resources/xslt/utilities-l10n.xml create mode 100644 src/main/resources/xslt/utilities-l10n.xsd diff --git a/pom.xml b/pom.xml index a130ddc..2a18fd5 100644 --- a/pom.xml +++ b/pom.xml @@ -185,17 +185,25 @@ 1.12.252 - + xalan xalan - 2.7.3 + 2.7.2 xalan serializer - 2.7.3 + 2.7.2 + + + net.sf.saxon + Saxon-HE + 12.4 + + + org.xhtmlrenderer diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/CompostionProvider.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/CompostionProvider.kt index 5feab6e..44dc359 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/CompostionProvider.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/CompostionProvider.kt @@ -13,6 +13,7 @@ import org.slf4j.LoggerFactory import org.springframework.beans.factory.annotation.Qualifier import org.springframework.stereotype.Component import uk.nhs.england.fhirvalidator.service.ImplementationGuideParser +import uk.nhs.england.fhirvalidator.util.MyUriResolver import java.io.ByteArrayInputStream import javax.servlet.http.HttpServletRequest import javax.servlet.http.HttpServletResponse @@ -48,7 +49,10 @@ class CompostionProvider(@Qualifier("R4") private val fhirContext: FhirContext, if (document.type !== Bundle.BundleType.DOCUMENT) { throw UnprocessableEntityException("Not a FHIR Document") } - // Set the property to use xalan processor + // Set the property to use saxon processor + System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.BasicTransformerFactory") + + // Saxon is hanging at the moment so using xalan System.setProperty( "javax.xml.transform.TransformerFactory", "org.apache.xalan.processor.TransformerFactoryImpl" @@ -57,11 +61,14 @@ class CompostionProvider(@Qualifier("R4") private val fhirContext: FhirContext, val xmlSource = StreamSource(xml.byteInputStream()) val classLoader = javaClass.classLoader - // val inputStream = classLoader.getResourceAsStream("xslt/DocumentToHTML.xslt") - val inputStream = classLoader.getResourceAsStream("xslt/r4DocumentToHTML.xslt") + + val inputStream = classLoader.getResourceAsStream("xslt/DocumentToHTML.xslt") val xsltSource = StreamSource(inputStream) val transformerFactory = TransformerFactory.newInstance() + //val transformerFactory = net.sf.saxon.TransformerFactoryImpl() + transformerFactory.setURIResolver(MyUriResolver()) + val transformer: Transformer = transformerFactory.newTransformer(xsltSource) val os = ByteArrayOutputStream() diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/util/MyUriResolver.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/util/MyUriResolver.kt new file mode 100644 index 0000000..86b5ee3 --- /dev/null +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/util/MyUriResolver.kt @@ -0,0 +1,19 @@ +package uk.nhs.england.fhirvalidator.util + +import javax.xml.transform.Source +import javax.xml.transform.TransformerException +import javax.xml.transform.URIResolver +import javax.xml.transform.stream.StreamSource + +internal class MyUriResolver : URIResolver { + @Throws(TransformerException::class) + override fun resolve(href: String, base: String?): Source? { + try { + val inputStream = this.javaClass.classLoader.getResourceAsStream("xslt/$href") + return StreamSource(inputStream) + } catch (ex: Exception) { + ex.printStackTrace() + return null + } + } +} diff --git a/src/main/resources/xslt/DocumentToHTML.xslt b/src/main/resources/xslt/DocumentToHTML.xslt index c12e18d..3698112 100644 --- a/src/main/resources/xslt/DocumentToHTML.xslt +++ b/src/main/resources/xslt/DocumentToHTML.xslt @@ -26,26 +26,38 @@ - limitations under the License. --> - + + - - - - - - - - Source document must be a bundle + + + + + - Bundle must start with a Composition resource + + + + + - Warning: Bundle type does not indicate it is a document. + + + + + @@ -53,73 +65,28 @@ - + - + + + - <xsl:value-of select="$title"/> + <xsl:value-of select="$titleStr"/> -

- +


@@ -154,7 +121,9 @@

- + + +

@@ -201,7 +170,10 @@ - We *could* use document(@value) to try to retrieve the remote resource, but seeing as the - document's obviously non-conformant, we'll raise an error instead. --> - + + + + @@ -242,7 +214,10 @@ - + + + + @@ -298,7 +273,9 @@ - + + + @@ -322,7 +299,9 @@

- + + +

@@ -378,7 +357,11 @@ - Warning: Headings exceed 6 levels deep. Remaining headings converted to simple paragraphs + + + + + p diff --git a/src/main/resources/xslt/r4DocumentToHTML.xslt b/src/main/resources/xslt/r4DocumentToHTML.xslt deleted file mode 100644 index b4a544f..0000000 --- a/src/main/resources/xslt/r4DocumentToHTML.xslt +++ /dev/null @@ -1,373 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <xsl:value-of select="$titleStr"/> - - - -

- -

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

- -

-
- -

- - - -

-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Y - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - -

- - - -

-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - p - - - - - - - -
diff --git a/src/main/resources/xslt/utilities-l10n.xml b/src/main/resources/xslt/utilities-l10n.xml new file mode 100644 index 0000000..f2d7485 --- /dev/null +++ b/src/main/resources/xslt/utilities-l10n.xml @@ -0,0 +1,10684 @@ + + + + + + + + + + + + + Label: Display disclaimer + + Disclaimer: the purpose of this stylesheet and the results it produces from xml messages is exclusively for testing. They are explicitly NOT suited for use in a medical practise. + Disclaimer: Deze stylesheet en de resulterende html weergave van xml berichten zijn uitsluitend bedoeld voor testdoeleinden. Zij zijn uitdrukkelijk niet bedoeld voor gebruik in de medische praktijk. + + + + Label: Table of Contents + + Table of Contents + Inhoudsopgave + Inhaltsverzeichnis + + + + Label: Signed + + Signed + Ondertekend + Unterzeichnet + + + + Label: show revisions + + Show revisions + Toon revisies + Zeige Revisionen + + + + Label: hide revisions + + Hide revisions + Verberg revisies + Verberg Revisionen + + + + Label: ClinicalDocument + + ClinicalDocument + + + + + Label: Authenticator + + Authenticator + Unterzeichnet + Signé + Firmato + Ondertekenaar + + + + Label: Legal Authenticator + + Legal Authenticator + Rechtsgültig unterzeichnet + Légal signataires + Efficace legge firmato + Juridische ondertekenaar + + + + Label: Information Recipient + + Information Recipient + Ontvanger + + + + Label: Author + + Author + Autor + Auteur + Autore + Auteur + + + + Label: Custodian + + Custodian + Verwalter + Beheerder + + + + Label: Data enterer + + Data Enterer + Erfasser + Saisie par + Registrati da + Ingevoerd door + + + + Label: Overseer + + Overseer + Mandaterende/eindverantwoordelijke + + + + Label: recordTarget + + Patient + Paziente + Patiënt + + + + Label: Informant - An informant (or source of information) is a person that provides relevant information + + Informant + Informiert + Informé + Informati + + + + Label: Participant + + Participant + + + + Label: Custodian Organization + + Custodian Organization + Verwaltende Organisation + Organisme de gestion + Organismo di gestione + Beherende organisatie + + + + Label: Performer + + Performer + Heilberufler + Zorgverlener + + + + Label: responsibleParty + + Responsible Party + Verantwoordelijke + + + + Label: encounterParticipant + + Encounter Participant + Deelnemer contact + + + + Label: location + + Location + Lokatie + + + + Label: subject + + Subject + Onderwerp + + + + + + Label: OrganizationPartOf + + Organization Part Of + Organisatie deel van + + + + Label: Organization + + Organization + Organisatie + + + + Label: Person + + Person + Persoon + + + + Label: AuthoringDevice + + Device + Apparaat + + + + Label: Place + + Place + Plaats + + + + Label: HealthCareFacility + + Health Care Facility + Zorginstelling + + + + + + Label: Patient-ID short + + MRN + PID + PID + + + + Label: Patient-ID long + + Patient-ID + Patienten ID + ID patient + ID paziente + Patiëntnummer + + + + Label: Patient-IDs long + + Patient-IDs + Patienten IDs + IDs patient + ID paziente + Patiëntnummers + + + + Label: Birthplace long + + Birthplace + Geburtsplatz + Place de naissance + Geboorteplaats + + + + Label: Birthdate long + + Birthdate + Geburtsdatum + Date de naissance + Data di nascita + Geboortedatum + + + + Label: Birthdate long and deceased + + Birthdate/deceased + Geburtsdatum/verstorben + Date de naissance/décédé + Data di nascita/defunto + Geboren/overleden + + + + Label: Deceased + + Deceased + Overleden + + + + Label: date_unknown - used for saying you know patient has died, but unknown when + + date unknown + Datum unbekannt + date inconnue + data sconosciuto + datum onbekend + + + + Label: boolean-true - used for saying Deceased: yes + + yes + ja + oui + si + ja + + + + Label: boolean-false - used for saying Deceased: no + + no + nein + non + no + nee + + + + Label: yr as in the age of someone in years + + yr + jr + Jahre + + + + Title on age to tell us to what the age is relative to. As XSL 1.0 doesn't have date functions we need content based based relativity + + At the time of death + Bij overlijden + + + + Title on age to tell us to what the age is relative to. As XSL 1.0 doesn't have date functions we need content based based relativity + + At document creation time + Bij aanmaken van het document + + + + Label: DOB (Date of birth) short + + DOB + Geburtsdatum + Geboortedatum + + + + Label: person is part of a multiple birth + + Multiple birth + Meerling + + + + Label: AdministrativeGenderCode + + Gender + Geschlecht + Geslacht + + + + Label: MaritalStatusCode + + Marital Status + Burgerlijke staat + + + + Label: LanguageCommunication + + Language Communication + Taal + + + + Label: Ethnicity + + Ethnicity + Etniciteit + + + + Label: ProficiencyLevelCode + + Proficiency Level Code + Mate van beheersing + + + + Label: Guardian (for recordTarget) + + Guardian + Voogd + + + + + + Label: relatedDocument + + Related Document + Gerelateerd document + + + + Label: ParentDocument + + Parent Document + Voorgaand document + + + + Label: documentationOf + + Documentation Of + Documentatie van + + + + Label: ServiceEvent + + Service Event + Uitgevoerde handeling + + + + Label: InFulfillmentOf + + In Fulfillment Of + Conform + + + + Label: Order + + Order + + + + Label: Authorization + + Authorization + Autorisatie + + + + Label: Consent + + Consent + Einverständniserklärung + Consentement éclairé + Dichiarazione di consenso + Toestemmingsverklaring + + + + Label: componentOf + + Component Of + Component van + + + + Label: encompassingEncounter + + Encounter + Contact + + + + Label: Encounter Id + + Encounter Id + Contact-id + + + + Label: Encounter Type + + Encounter Type + Contacttype + + + + Label: Encounter Date + + Encounter Date + Contactdatum + + + + Label: Encounter Location + + Encounter Location + Contactlocatie + + + + + + Label: Document Id + + Document Id + Document-id + + + + Label: SetId and Version + + SetId and Version + Set-Id en versie + + + + Label: ID + + ID + Id + + + + Label: setId + + Set-ID + Set-Id + + + + Label: versionNumber + + Version + Versie + + + + Label: Code + + Code + + + + Label: Title + + Title + Titel + + + + Label: effectiveTime + + Date/time + Datum/tijd + + + + Label: versionCode + + Version code + Versiecode + + + + Label: acknowledgement + + Acknowledgement + + + + Label: acknowledgementDetail + + Acknowledgement detail + + + + Label: attentionLine + + Attention line + + + + Label: keyWordText + + Key word + + + + Label: sender + + Sender + Verzender + + + + Label: receiver + + Receiver + Ontvanger + + + + Label: interactionId + + Interaction ID + Interactie-id + + + + Label: profileId + + Profile ID + Profile-id + + + + Label: transmissionQuantity + + Batch message count + Aantal berichten in de batch + + + + Label: resultTotalQuantity + + Result count total + Aantal resultaten totaal + + + + Label: resultCurrentQuantity + + Result count current + Aantal resultaten huidig + + + + Label: resultRemainingQuantity + + Result count remaining + Aantal resultaten resterend + + + + Label: justifiedDetectedIssue + + Detected issue + Gedetecteerd probleem + + + + Label: queryAck + + Query ack + + + + Label: queryByParameter + + Query by parameter + + + + Label: queryId + + Query ID + Query-id + + + + Label: queryResponseCode + + Query response code + Query antwoordcode + + + + Label: responseModalityCode + + Response modality + Antwoordmodus code + + + + Label: responsePriorityCode + + Response priority + Antwoordprioriteit + + + + Label: initialQuantity + + Initial quantity + Initiële hoeveelheid + + + + Label: initialQuantityCode + + Initial quantity code + Initiële hoeveelheid code + + + + Label: executionAndDeliveryTime + + Execution and delivery time + Antwoord sturen vóór + + + + Label: functionCode + + Function + Functie + + + + Label: copyTime + + Copy Date/time + Kopiedatum/tijd + + + + Label: time + + Time + Tijd + + + + Label: confidentialityCode + + Confidentiality + Vertrouwelijkheid + + + + Label: languageCode + + Language + Taal + + + + Label: signatureCode + + Signature Code + Handtekeningcode + + + + Label: signatureCode-S + + Signed + Getekend + + + + Label: signatureCode-I + + Intended + Zal nog tekenen + + + + Label: signatureCode-X + + Signature required + Handtekening vereist + + + + Label: addr + + Address + Adres + + + + Label: address not available + + address not available + adres niet beschikbaar + + + + Label: telecom + + Telecom + + + + Label: telecom information not available + + telecom information not available + telecominformatie niet beschikbaar + + + + Label: name + + Name + Naam + + + + Label: statusCode + + Status + + + + Label: text + + Text + Tekst + + + + Label: priorityCode + + Priority + Prioriteit + + + + Label: dischargeDispositionCode + + Discharge Disposition + Ontslagstatus + + + + + + Label: Contents (i.e. bodyChoice NonXMLBody/StructuredBody or Section) + + Contents + Contents + Contents + Contents + Inhoud + + + + Label: Section + + Section + Sectie + + + + Label: Section Author + + Section Author + Auteur sectie + + + + Label: Section Subject + + Section Subject + Subject sectie + + + + Label: Section Informant + + Section Informant + Informant sectie + + + + + + Label: Supporting author + + Supporting author + Mitbehandelnde Heilberufler + Ondersteunend zorgverlener + + + + Label: Payer + + Payer + Betaler + + + + Label: Policy Number (for payer) + + Policy Number + Polisnummer + + + + Label: Insured + + Insured + Versicherungsnehmer + Assuré + Assicurati + Verzekerde + + + + Label: Insurance Company + + Insurance Company + Versicherung + Assurance + Assicurazione + Verzekeraar + + + + Title for documents + + Clinical Document + Klinisch document + + + + Label: Created on + + Created on + Erzeugt am + Création + Generata + Gemaakt op + + + + Label: Authored on + + Authored on + Gemaakt op + + + + Label: Exam Date + + Exam Date + Datum onderzoek + + + + Label: Exam Time + + Exam Time + Tijd onderzoek + + + + Label: Next of Kin (for recordTarget) + + Next of Kin + Familie + + + + Title: Table of Contents + + Table of Contents + Inhoud + + + + Dates: January + + January + Januar + Janvier + Gennaio + januari + + + + Dates: February + + February + Februar + Février + Febbraio + februari + + + + Dates: March + + March + März + Mars + März + maart + + + + Dates: April + + April + Avril + Marzo + april + + + + Dates: May + + May + Mai + Mai + Maggio + mei + + + + Dates: June + + June + Juni + Juin + Giugno + juni + + + + Dates: July + + July + Juli + Juillet + Luglio + juli + + + + Dates: August + + August + Août + Agosto + augustus + + + + Dates: September + + September + Septembre + Settembre + september + + + + Dates: October + + October + Oktober + Octobre + Ottobre + oktober + + + + Dates: November + + November + Novembre + Novembre + november + + + + Dates: December + + December + Dezember + Décembre + Dicembre + december + + + + Dates: Monday + + Monday + maandag + + + + Dates: Tuesday + + Tuesday + dinsdag + + + + Dates: Wednesday + + Wednesday + woensdag + + + + Dates: Thursday + + Thursday + donderdag + + + + Dates: Friday + + Friday + vrijdag + + + + Dates: Saturday + + Saturday + zaterdag + + + + Dates: Sunday + + Sunday + zondag + + + + Dates: Monday (short) + + Mon + maa + + + + Dates: Tuesday (short) + + Tue + din + + + + Dates: Wednesday (short) + + Wed + woe + + + + Dates: Thursday (short) + + Thu + don + + + + Dates: Friday (short) + + Fri + vri + + + + Dates: Saturday (short) + + Sat + zat + + + + Dates: Sunday (short) + + Sun + zon + + + + Time: h for hours in 14h in English or 14u in Dutch + + h + u + + + + Label: Electronically generated by + + Electronically generated by + Elektronisch gegenereerd door + + + + Label: Cannot display the text + + Cannot display the text + Kan tekst niet weergeven + + + + Label: Coded Entries + + Coded Entries + Gecodeerde onderdelen + + + + Label: displayname + + Displayname + Weergavenaam + + + + Label: qualifier + + qualifier + + + + Label: value + + value + waarde + + + + Label: Value + + Value + Waarde + + + + Label: Quantity + + Quantity + Hoeveelheid + + + + Label: Unit + + Unit + Eenheid + + + + Label: Units + + Units + Eenheden + + + + Label: unit + + unit + eenheid + + + + Label: units + + units + eenheden + + + + Label: x units per y unit + + per + per + + + + Label: Reference + + Reference + Verwijzing + + + + Dates: Time + + Time + Zeit + Tijd + + + + Dates: from (as in from/to) + + from + von + van + + + + Dates: From (as in from/to) + + From + Von + Van + + + + Dates: to (as in from/to) + + to + zu + tot + + + + Dates: To (as in from/to) + + To + Zu + Tot + + + + Dates: Up To (as in from/to) + + Up To + tot + + + + Intervals @inclusive="true" + + inclusive + inclusief + + + + Interval width: for (for 3 days) + + for + voor + + + + Interval: every (as every 6 hours) + + every + elke + + + + Label: NHS Number + + NHS Number + NHS nummer + + + + Label: Document Created + + Document Created + Aanmaakdatum + + + + Label: Document Owner + + Document Owner + Eigenaar + + + + Dates: on + + on + am + le + il + op + + + + Dates: On (on August 2) + + On + Am + Le + Il + Op + + + + Dates: at + + at + am + le + il + op + + + + Dates: At (as in At 7PM) + + At + Am + Le + Il + Op + + + + Label: Encounter Type + + Encounter Type + Type contact + + + + Label: Encounter Time + + Encounter Time + Datum/tijd contact + + + + Label: Care Setting Type + + Care Setting Type + Type zorginstelling + + + + Label: Recipient + + Recipient + Ontvanger + + + + Label: Referrer + + Referrer + Verwijzer + + + + Label: Referring Organization + + Referring Organization + Verwijzende organisatie + + + + Label: Document ID + + Document ID + Document-id + + + + Label: Version + + Version + Versie + + + + Label: Primary Recipient + + Primary Recipient + Empfänger + Destinataire + Destinatario + Ontvanger + + + + Label: Primary Recipients + + Primary Recipients + Empfänger + Destinataires + Destinatario + Ontvangers + + + + Label: Copy Recipient + + Copy Recipient + Kopie an + Copie à + In copia a + Kopie naar + + + + Label: Copy Recipients + + Copy Recipients + Kopie an + Copie à + In copia a + Kopie naar + + + + Label: Tel (telecom type) + + Tel + + + + Label: Fax (telecom type) + + Fax + + + + Label: Email (telecom type) + + Email + Mail + E-mail + + + + Label: Web (telecom type) + + Web + + + + Label: Contact details + + Contact details + Contactgegevens + + + + Label: Diagnostic Radiology + + Diagnostic Radiology + Diagnostische radiologie + + + + Label: Consultant + + Consultant + + + + Label: Cannot display the text + + Cannot display the text + Kan de tekst niet weergeven + + + + Label: Facility ID + + Facility ID + Lokatie-id + + + + Label: Not available + + Not available + Niet beschikbaar + + + + Label: First day of period reported + + First day of period reported + Eerste dag van verslagperiode + + + + Label: Last day of period reported + + Last day of period reported + Laatste dag van verslagperiode + + + + Label: Footnote + + Footnote + Voetnoot + + + + Label: Information not available + + Information not available + Informatie niet beschikbaar + + + + Label: Race + + Race + Ras + + + + + + Label: AdministrativeGender: Male + + Male + Männlich + Masculin + Maschile + Man + + + + Label: AdministrativeGender: Female + + Female + Weiblich + Féminin + Femminile + Vrouw + + + + Label: AdministrativeGender: Undifferentiated + + Undifferentiated + Ongedifferentieerd + + + + Label: ActCode: ActEncounterCode: Ambulatory + + ambulatory + ambulant + + + + Label: ActCode: ActEncounterCode: Emergency + + emergency + noodgeval + + + + Label: ActCode: ActEncounterCode: Field + + field + buiten + + + + Label: ActCode: ActEncounterCode: Home Health + + home health + thuiszorg + + + + Label: ActCode: ActEncounterCode: Inpatient + + inpatient + klinisch + + + + Label: ActCode: ActEncounterCode: Acute + + acute + spoed + + + + Label: ActCode: ActEncounterCode: Inpatient non-acute + + inpatient non-acute + klinisch niet-acuut + + + + Label: ActCode: ActEncounterCode: Short stay + + short stay + dagbehandeling + + + + Label: ActCode: ActEncounterCode: Virtual + + virtual + virtueel + + + + Label: ActClass act + + act + + + + Label: ActClass accommodation + + accommodation + accommodatie + + + + Label: ActClass account + + account + + + + Label: ActClass accession + + accession + accessie + + + + Label: ActClass financial adjudication + + financial adjudication + financiële adjudicatie + + + + Label: ActClass control act + + control act + + + + Label: ActClass action + + action + actie + + + + Label: ActClass information + + information + informatie + + + + Label: ActClass state transition control + + state transition control + statusovergang control + + + + Label: ActClass contract + + contract + + + + Label: ActClass financial contract + + financial contract + financieel contract + + + + Label: ActClass coverage + + coverage + verzekeringsdekking + + + + Label: ActClass consent + + consent + toestemming + + + + Label: ActClass container registration + + container registration + containerregistratie + + + + Label: ActClass clinical trial timepoint event + + clinical trial timepoint event + + + + Label: ActClass disciplinary action + + disciplinary action + disciplinaire maatregel + + + + Label: ActClass exposure + + exposure + blootstelling + + + + Label: ActClass acquisition exposure + + acquisition exposure + acquisitie blootstelling + + + + Label: ActClass transmission exposure + + transmission exposure + overdracht blootstelling + + + + Label: ActClass incident + + incident + + + + Label: ActClass inform + + inform + informeren + + + + Label: ActClass invoice element + + invoice element + + + + Label: ActClass working list + + working list + werklijst + + + + Label: ActClass monitoring program + + monitoring program + monitoring programma + + + + Label: ActClass observation + + observation + observatie + + + + Label: ActClass detected issue + + detected issue + gedetecteerd probleem + + + + Label: ActClass battery + + battery + batterij + + + + Label: ActClass clinical trial + + clinical trial + + + + Label: ActClass Condition Node + + Condition Node + Conditienode + + + + Label: ActClass concern + + concern + aandachtspunt + + + + Label: ActClass Condition + + Condition + Conditie + + + + Label: ActClass public health case + + public health case + volksgezondheidsgeval + + + + Label: ActClass outbreak + + outbreak + uitbraak + + + + Label: ActClass diagnostic image + + diagnostic image + diagnostiekbeeld + + + + Label: ActClass genomic observation + + genomic observation + genetische observatie + + + + Label: ActClass determinant peptide + + determinant peptide + + + + Label: ActClass expression level + + expression level + uitdrukkingsniveau + + + + Label: ActClass locus + + locus + + + + Label: ActClass phenotype + + phenotype + fenotype + + + + Label: ActClass polypeptide + + polypeptide + + + + Label: ActClass bio sequence + + bio sequence + + + + Label: ActClass bio sequence variation + + bio sequence variation + bio sequence variatia + + + + Label: ActClass investigation + + investigation + onderzoek + + + + Label: ActClass observation series + + observation series + observatieserie + + + + Label: ActClass correlated observation sequences + + correlated observation sequences + gecorreleerde observatie sequenties + + + + Label: ActClass position + + position + positie + + + + Label: ActClass position accuracy + + position accuracy + + + + Label: ActClass position coordinate + + position coordinate + + + + Label: ActClass specimen observationActClassSpecObs + + specimen observationActClassSpecObs + + + + Label: ActClass Verification + + Verification + Verificatie + + + + Label: ActClass bounded ROI + + bounded ROI + vaste ROI + + + + Label: ActClass overlay ROI + + overlay ROI + overliggende ROI + + + + Label: ActClass left lateral decubitus + + left lateral decubitus + linker laterale decubitus + + + + Label: ActClass prone + + prone + + + + Label: ActClass right lateral decubitus + + right lateral decubitus + rechter laterale decubitus + + + + Label: ActClass Semi-Fowler's + + Semi-Fowler's + + + + Label: ActClass sitting + + sitting + zittend + + + + Label: ActClass standing + + standing + staand + + + + Label: ActClass supine + + supine + + + + Label: ActClass reverse trendelenburg + + reverse trendelenburg + omgekeerde trendelenburg + + + + Label: ActClass trendelenburg + + trendelenburg + + + + Label: ActClass care provision + + care provision + + + + Label: ActClass encounter + + encounter + bezoek + + + + Label: ActClass policy + + policy + + + + Label: ActClass jurisdictional policy + + jurisdictional policy + juridische policy + + + + Label: ActClass organizational policy + + organizational policy + organisatie policy + + + + Label: ActClass scope of practice policy + + scope of practice policy + behandelpolicy + + + + Label: ActClass standard of practice policy + + standard of practice policy + standaard behandelpolicy + + + + Label: ActClass procedure + + procedure + + + + Label: ActClass substance administration + + substance administration + substantie toediening + + + + Label: ActClass Substance Extraction + + Substance Extraction + substantie extractie + + + + Label: ActClass Specimen Collection + + Specimen Collection + Monster collectie + + + + Label: ActClass registration + + registration + registratie + + + + Label: ActClass review + + review + + + + Label: ActClass specimen treatment + + specimen treatment + monmster behandeling + + + + Label: ActClass supply + + supply + middel + + + + Label: ActClass diet + + diet + dieet + + + + Label: ActClass storage + + storage + opslag + + + + Label: ActClass Substitution + + Substitution + Substitutie + + + + Label: ActClass transfer + + transfer + overplaatsing + + + + Label: ActClass transportation + + transportation + transport + + + + Label: ActClass financial transaction + + financial transaction + financiële transactie + + + + Label: ActClass compositionAttestable unit + + composition + compositie + + + + Label: ActClass document + + document + + + + Label: ActClass clinical document + + clinical document + klinisch document + + + + Label: ActClass CDA Level One clinical document + + CDA Level One clinical document + CDA Level One klinisch document + + + + Label: ActClass record container + + record container + + + + Label: ActClass category + + category + categorie + + + + Label: ActClass document body + + document body + documentinhoud + + + + Label: ActClass document sectionSection + + document section + documentsectie + + + + Label: ActClass topic + + topic + onderwerp + + + + Label: ActClass extract + + extract + + + + Label: ActClass electronic health record + + electronic health record + electronisch gezondheidsdossier + + + + Label: ActClass folder + + folder + map + + + + Label: ActClass grouper + + grouper + groepering + + + + Label: ActClass Cluster + + cluster + + + + Label: OID AcknowledgementType CA + + Commit Accept + Technische bevestiging + + + + Label: OID AcknowledgementType CE + + Commit Error + Technische fout + + + + Label: OID AcknowledgementType CR + + Commit Reject + Technische weigering + + + + Label: OID AcknowledgementType AA + + Application Accept + Applicatie bevestiging + + + + Label: OID AcknowledgementType AE + + Application Error + Applicatie bevestiging + + + + Label: OID AcknowledgementType AR + + Application Reject + Applicatie weigering + + + + Label: OID AcknowledgementDetail W + + Warning + Waarschuwing + + + + Label: OID AcknowledgementDetail I + + Information + Informatie + + + + Label: OID AcknowledgementDetail E + + Error + Fout + + + + Label: QueryResponse AE + + AE (Application error, query aborted) + AE (Applicatie probleem, beantwoording afgebroken) + + + + Label: QueryResponse NF + + NF (Nothing found, no errors) + NF (Niets gevonden, geen fouten) + + + + Label: QueryResponse OK + + OK (Data found) + OK (Data gevonden) + + + + Label: QueryResponse QE + + QE (Query Parameter Error, query aborted) + QE (Queryparameter fout, beantwoording afgebroken) + + + + Label: OID ResponseModality-B + + B (Batch) + + + + Label: OID ResponseModality-R + + R (Realtime) + + + + Label: OID ResponseModality-T + + T (Bolus) + T (Bolus, niet gebruiken) + + + + Label: QueryPriority D + + D (Deferred) + + + + Label: QueryPriority I + + I (Immediate) + + + + Label: QueryRequestLimit RD + + RD (Records) + + + + Label: Confidentiality: Normal + + Normal + Normaal + + + + Label: Confidentiality: Restricted + + Restricted + Vertrouwelijk + + + + Label: Confidentiality: Very restricted + + Very restricted + Zeer vertrouwelijk + + + + Label: NullFlavor NI + + Unknown + Unbekannt + Inconnu + Sconosciuta + Onbekend + + + + Label: NullFlavor INV + + Invalid + Ongeldig + + + + Label: NullFlavor MSK + + Masked + Afgeschermd + + + + Label: NullFlavor NA + + Not Applicable + n.v.t. + + + + Label: NullFlavor NINF + + Negative Infinity + Negatief oneindig + + + + Label: NullFlavor PINF + + Positive Infinity + Positief oneindig + + + + Label: NullFlavor UNC + + Un-encoded + Niet gecodeerd + + + + Label: NullFlavor UNK + + Unknown + Onbekend + + + + Label: Status active + + Active + Actief + + + + Label: Status completed + + Completed + Afgerond + + + + Label: Status cancelled + + Cancelled + Geannuleerd + + + + Label: Status nullified + + Nullified + Opgeheven + + + + Label: Status aborted + + Aborted + Afgebroken + + + + Label: Status obsolete + + Obsolete + Obsoleet + + + + Label: Status suspended + + Suspended + Opgeschort + + + + Label: Status new + + New + Nieuw + + + + Label: Status normal + + Normal + Normaal + + + + Label: Status pending + + Pending + Voorlopig + + + + Label: Status terminated + + Terminated + Beëindigd + + + + Label: Status inactive + + Inactive + Inactief + + + + Label: Status executing + + Executing + In uitvoering + + + + Label: Status waitContinuedQueryResponse + + Wait continued query response + Wacht op volgende antwoord op vraag + + + + Label: Status deliveredResponse + + Delivered response + Afgeleverd antwoord + + + + Label: ParticipationFunction caregiver information receiver + + caregiver information receiver + zorgverlener informatieontvanger + + + + Label: ParticipationFunction legitimate relationship information receiver + + legitimate relationship information receiver + legitieme relatie informatieontvanger + + + + Label: ParticipationFunction care team information receiver + + care team information receiver + zorgteam informatieontvanger + + + + Label: ParticipationFunction work area information receiver + + work area information receiver + werkomgeving informatieontvanger + + + + Label: ParticipationFunction legal guardian consent author + + legal guardian consent author + wettelijke vertegenwoordiger toestemming auteur + + + + Label: ParticipationFunction healthcare power of attorney consent author + + healthcare power of attorney consent author + zorgadvocaat toestemming auteur + + + + Label: ParticipationFunction personal representative consent author + + personal representative consent author + persoonlijke vertegenwoordiger toestemming auteur + + + + Label: ParticipationFunction authorized provider masking author + + authorized provider masking author + geautoriseerde zorgverlener gemaskeerd auteur + + + + Label: ParticipationFunction subject of consent author + + subject of consent author + onderwerp van toestemming auteur + + + + Label: ParticipationFunction consent overrider + + consent overrider + toestemming verbreker + + + + Label: ParticipationFunction emergency overrider + + emergency overrider + verbreker in noodgeval + + + + Label: ParticipationFunction claims adjudication + + claims adjudication + claim adjudicatie + + + + Label: ParticipationFunction enrollment broker + + enrollment broker + + + + Label: ParticipationFunction ffs management + + ffs management + + + + Label: ParticipationFunction managed care management + + managed care management + + + + Label: ParticipationFunction provider management + + provider management + + + + Label: ParticipationFunction utilization management + + utilization management + + + + Label: ParticipationFunction fully insured + + fully insured + volledig verzekerd + + + + Label: ParticipationFunction self insured + + self insured + zelf verzekerd + + + + Label: ParticipationFunction payor contracting + + payor contracting + + + + Label: ParticipationFunction reinsures + + reinsures + + + + Label: ParticipationFunction retrocessionaires + + retrocessionaires + + + + Label: ParticipationFunction subcontracting risk + + subcontracting risk + + + + Label: ParticipationFunction underwriting + + underwriting + + + + Label: ParticipationFunction admitting physician + + admitting physician + opnamearts + + + + Label: ParticipationFunction anesthesist + + anesthesist + + + + Label: ParticipationFunction anesthesia nurse + + anesthesia nurse + anesthesie-verpleegkundige + + + + Label: ParticipationFunction attending physician + + attending physician + behandelend arts + + + + Label: ParticipationFunction discharging physician + + discharging physician + ontslagarts + + + + Label: ParticipationFunction first assistant surgeon + + first assistant surgeon + eerste chirurgisch assistent + + + + Label: ParticipationFunction midwife + + midwife + verloskundige + + + + Label: ParticipationFunction nurse assistant + + nurse assistant + verpleegkundig assistent + + + + Label: ParticipationFunction primary care physician + + primary care physician + eerstelijns arts + + + + Label: ParticipationFunction primary surgeon + + primary surgeon + eerste chirurg + + + + Label: ParticipationFunction rounding physician + + rounding physician + afrondende chirurg + + + + Label: ParticipationFunction second assistant surgeon + + second assistant surgeon + tweede chirurgisch assistent + + + + Label: ParticipationFunction scrub nurse + + scrub nurse + verpleegster + + + + Label: ParticipationFunction third assistant + + third assistant + derde assistent + + + + Label: OID ParticipationSignature + + intended + heeft de intentie + + + + Label: OID ParticipationSignature + + signed + heeft getekend + + + + Label: OID ParticipationSignature + + required + moet tekenen + + + + Label: ParticipationType Participation + + Participation + Participatie + + + + Label: ParticipationType admitter + + admitter + opgenomen door + + + + Label: ParticipationType attender + + attender + behandeld door + + + + Label: ParticipationType callback contact + + callback contact + contactpersoon + + + + Label: ParticipationType consultant + + consultant + + + + Label: ParticipationType discharger + + discharger + ontslagen door + + + + Label: ParticipationType escort + + escort + begeleider + + + + Label: ParticipationType referrer + + referrer + verwijzer + + + + Label: ParticipationType author (originator) + + author (originator) + auteur (oorspronkelijk) + + + + Label: ParticipationType informant + + informant + + + + Label: ParticipationType Transcriber + + Transcriber + transscribent + + + + Label: ParticipationType data entry person + + data entry person + ingevoerd door + + + + Label: ParticipationType witness + + witness + getuige + + + + Label: ParticipationType custodian + + custodian + beheerder + + + + Label: ParticipationType direct target + + direct target + direct doel + + + + Label: ParticipationType baby + + baby + + + + Label: ParticipationType consumable + + consumable + eet- of drinkbaar + + + + Label: ParticipationType device + + device + apparaat + + + + Label: ParticipationType non-reuseable device + + non-reuseable device + niet-herbruikbaar apparaat + + + + Label: ParticipationType reusable device + + reusable device + herbruikbaar apparaat + + + + Label: ParticipationType donor + + donor + + + + Label: ParticipationType ExposureAgent + + ExposureAgent + + + + Label: ParticipationType ExposureParticipation + + ExposureParticipation + + + + Label: ParticipationType ExposureTarget + + ExposureTarget + + + + Label: ParticipationType ExposureSource + + ExposureSource + + + + Label: ParticipationType product + + product + + + + Label: ParticipationType subject + + subject + + + + Label: ParticipationType specimen + + specimen + monster + + + + Label: ParticipationType indirect target + + indirect target + indirect doel + + + + Label: ParticipationType beneficiary + + beneficiary + begunstigde + + + + Label: ParticipationType causative agent + + causative agent + veroorzakende agent + + + + Label: ParticipationType coverage target + + coverage target + verzekerde + + + + Label: ParticipationType guarantor party + + guarantor party + garantstaande partij + + + + Label: ParticipationType holder + + holder + verzekeringshouder + + + + Label: ParticipationType record target + + record target + patiënt + + + + Label: ParticipationType receiver + + receiver + ontvanger + + + + Label: ParticipationType information recipient + + information recipient + informatieontvanger + + + + Label: ParticipationType ugent notification contact + + urgent notification contact + contactpersoon bij nood + + + + Label: ParticipationType primary information recipient + + primary information recipient + bedoelde informatieontvanger + + + + Label: ParticipationType Referred By + + Referred By + Verwezen door + + + + Label: ParticipationType Referred to + + Referred to + Verwezen naar + + + + Label: ParticipationType tracker + + tracker + kopie-ontvanger + + + + Label: ParticipationType location + + location + lokatie + + + + Label: ParticipationType destination + + destination + bestemming + + + + Label: ParticipationType entry location + + entry location + invoerlokatie + + + + Label: ParticipationType origin + + origin + oorsprong + + + + Label: ParticipationType remote + + remote + extern + + + + Label: ParticipationType via + + via + + + + Label: ParticipationType performer + + performer + uitvoerende + + + + Label: ParticipationType distributor + + distributor + distributeur + + + + Label: ParticipationType primary performer + + primary performer + eerste uitvoerende + + + + Label: ParticipationType secondary performer + + secondary performer + tweede uitvoerende + + + + Label: ParticipationType responsible party + + responsible party + verantwoordelijke partij + + + + Label: ParticipationType verifier + + verifier + toezichthouder + + + + Label: ParticipationType authenticator + + authenticator + onderetkenaar + + + + Label: ParticipationType legal authenticator + + legal authenticator + wettelijke ondertekenaar + + + + Label: RoleClass child + + child + kind + + + + Label: RoleClass credentialed entity + + credentialed entity + bevoegde entiteit + + + + Label: RoleClass nurse practitioner + + nurse practitioner + + + + Label: RoleClass nurse + + nurse + verpleegkundige + + + + Label: RoleClass physician assistant + + physician assistant + arts-assistent + + + + Label: RoleClass physician + + physician + arts + + + + Label: RoleClass role + + role + rol + + + + Label: RoleClass affiliate + + affiliate + geaffilieerde + + + + Label: RoleClass agent + + agent + + + + Label: RoleClass assigned entity + + assigned entity + benoemde entiteit + + + + Label: RoleClass commissioning party + + commissioning party + + + + Label: RoleClass signing authority or officer + + signing authority or officer + ondertekenende autoriteit of functionaris + + + + Label: RoleClass contact + + contact + + + + Label: RoleClass emergency contact + + emergency contact + noodcontact + + + + Label: RoleClass next of kin + + next of kin + familie + + + + Label: RoleClass guardian + + guardian + voogd + + + + Label: RoleClass citizen + + citizen + burger + + + + Label: RoleClass covered party + + covered party + verzekerde + + + + Label: RoleClass claimant + + claimant + + + + Label: RoleClass named insured + + named insured + benoemde verzekerde + + + + Label: RoleClass dependent + + dependent + afhankelijke + + + + Label: RoleClass individual + + individual + individu + + + + Label: RoleClass subscriber + + subscriber + abonnmenthouder + + + + Label: RoleClass program eligible + + program eligible + + + + Label: RoleClass clinical research investigator + + clinical research investigator + klinisch onderzoeker + + + + Label: RoleClass clinical research sponsor + + clinical research sponsor + klinisch onderzoek sponsor + + + + Label: RoleClass employee + + employee + werknemer + + + + Label: RoleClass military person + + military person + militair + + + + Label: RoleClass Investigation Subject + + Investigation Subject + Onderzoek subject + + + + Label: RoleClass Case Subject + + Case Subject + Case subject + + + + Label: RoleClass research subject + + research subject + + + + Label: RoleClass licensed entity + + licensed entity + gelicenseerde entiteit + + + + Label: RoleClass notary public + + notary public + + + + Label: RoleClass healthcare provider + + healthcare provider + zorgaanbieder + + + + Label: RoleClass patient + + patient + patiënt + + + + Label: RoleClass payee + + payee + begunstigde + + + + Label: RoleClass invoice payor + + invoice payor + rekening betaler + + + + Label: RoleClass policy holder + + policy holder + polishouder + + + + Label: RoleClass qualified entity + + qualified entity + gekwalificeerde entiteit + + + + Label: RoleClass coverage sponsor + + coverage sponsor + verzerkering sponsor + + + + Label: RoleClass student + + student + + + + Label: RoleClass underwriter + + underwriter + + + + Label: RoleClass caregiver + + caregiver + zorgverlener + + + + Label: RoleClass personal relationship + + personal relationship + persoonlijke relatie + + + + Label: RoleClass access + + access + toegang + + + + Label: RoleClass Administerable Material + + Administerable Material + Toedienbaar materiaal + + + + Label: RoleClass birthplace + + birthplace + geboorteplaats + + + + Label: RoleClass place of death + + place of death + plaats overlijden + + + + Label: RoleClass distributed material + + distributed material + gedistribueerd materiaal + + + + Label: RoleClass retailed material + + retailed material + verkocht materiaal + + + + Label: RoleClass exposed entity + + exposed entity + blootgestelde entiteit + + + + Label: RoleClass held entity + + held entity + + + + Label: RoleClass health chart + + health chart + + + + Label: RoleClass identified entity + + identified entity + geïdentificeerde entiteit + + + + Label: RoleClass manufactured product + + manufactured product + geproduceerd product + + + + Label: RoleClass therapeutic agent + + therapeutic agent + therapeutisch agent + + + + Label: RoleClass maintained entity + + maintained entity + beheerde entiteit + + + + Label: RoleClass owned entity + + owned entity + bezitte entiteit + + + + Label: RoleClass regulated product + + regulated product + gereguleerd product + + + + Label: RoleClass service delivery location + + service delivery location + zorgverleningslokatie + + + + Label: RoleClass dedicated service delivery location + + dedicated service delivery location + lokatie bedoeld voor zorgverlening + + + + Label: RoleClass incidental service delivery location + + incidental service delivery location + toevallige zorgverleningslokatie + + + + Label: RoleClass territory of authority + + territory of authority + autoriteitsregio + + + + Label: RoleClass used entity + + used entity + gebruikte entiteit + + + + Label: RoleClass warranted product + + warranted product + product onder garantie + + + + Label: RoleClass equivalent entity + + equivalent entity + equivalente entiteit + + + + Label: RoleClass same + + same + dezelfde + + + + Label: RoleClass subsumed by + + subsumed by + opgevolgd door + + + + Label: RoleClass has generalization + + has generalization + heeft generalisatie + + + + Label: RoleClass has generic + + has generic + heeft generiekere + + + + Label: RoleClass instance + + instance + instantie + + + + Label: RoleClass subsumer + + subsumer + opvolger van + + + + Label: RoleClass content + + content + inhoud + + + + Label: RoleClass exposure agent carrier + + exposure agent carrier + + + + Label: RoleClass exposure vector + + exposure vector + + + + Label: RoleClass fomite + + fomite + + + + Label: RoleClass ingredient + + ingredient + ingrediënt + + + + Label: RoleClass active ingredient + + active ingredient + actief ingrediënt + + + + Label: RoleClass active ingredient - basis of strength + + active ingredient - basis of strength + actief ingrediënt - op basis van sterkte + + + + Label: RoleClass active ingredient - moiety is basis of strength + + active ingredient - moiety is basis of strength + actief ingrediënt - moiety is basis of strength + + + + Label: RoleClass active ingredient - reference substance is basis of strength + + active ingredient - reference substance is basis of strength + actief ingrediënt - reference substance is basis of strength + + + + Label: RoleClass additive + + additive + additief + + + + Label: RoleClass base + + base + basis + + + + Label: RoleClass inactive ingredient + + inactive ingredient + inactief ingrediënt + + + + Label: RoleClass color additive + + color additive + kleuradditief + + + + Label: RoleClass flavor additive + + flavor additive + smaakadditief + + + + Label: RoleClass preservative + + preservative + conserveringsmiddel + + + + Label: RoleClass stabilizer + + stabilizer + stabilisator + + + + Label: RoleClass located entity + + located entity + gelokaliseerde entiteit + + + + Label: RoleClass stored entity + + stored entity + opgeslagen entiteit + + + + Label: RoleClass member + + member + lid + + + + Label: RoleClass part + + part + deel + + + + Label: RoleClass active moiety + + active moiety + + + + Label: RoleClass specimen + + specimen + monster + + + + Label: RoleClass aliquot + + aliquot + + + + Label: RoleClass isolate + + isolate + isolaat + + + + Label: RoleCode Family Member + + Family Member + Familielid + + + + Label: RoleCode Child + + Child + Kind + + + + Label: RoleCode adopted child + + adopted child + geadopteerd kind + + + + Label: RoleCode adopted daughter + + adopted daughter + geadopteerde dochter + + + + Label: RoleCode adopted son + + adopted son + geadopteerde zoon + + + + Label: RoleCode foster child + + foster child + pleegkind + + + + Label: RoleCode foster daughter + + foster daughter + pleegdochter + + + + Label: RoleCode foster son + + foster son + pleegzoon + + + + Label: RoleCode child in-law + + child in-law + aangetrouwd kind + + + + Label: RoleCode daughter in-law + + daughter in-law + schoondochter + + + + Label: RoleCode son in-law + + son in-law + schoonzoon + + + + Label: RoleCode Daughter + + Daughter + Dochter + + + + Label: RoleCode natural daughterDaughter + + natural daughter + natuurlijke dochter + + + + Label: RoleCode stepdaughter + + stepdaughter + stiefdochter + + + + Label: RoleCode natural child + + natural child + natuurlijk kind + + + + Label: RoleCode natural sonSon + + natural son + naturlijke zoon + + + + Label: RoleCode son + + son + zoon + + + + Label: RoleCode stepson + + stepson + stiefzoon + + + + Label: RoleCode step child + + step child + stiefkind + + + + Label: RoleCode extended family member + + extended family member + ver familielid + + + + Label: RoleCode aunt + + aunt + tante + + + + Label: RoleCode MaternalAunt + + Maternal Aunt + Tante via moeder + + + + Label: RoleCode PaternalAunt + + Paternal Aunt + Tante via vader + + + + Label: RoleCode cousin + + cousin + neef/nicht + + + + Label: RoleCode MaternalCousin + + Maternal Cousin + Neef/nicht via moeder + + + + Label: RoleCode PaternalCousin + + Paternal Cousin + Neef/nicht via vader + + + + Label: RoleCode great grandparent + + great grandparent + overgrootouder + + + + Label: RoleCode great grandfather + + great grandfather + overgrootvader + + + + Label: RoleCode great grandmother + + great grandmother + overgrootmoeder + + + + Label: RoleCode MaternalGreatgrandfather + + Maternal Greatgrandfather + overgrootvader via moeder + + + + Label: RoleCode MaternalGreatgrandmother + + Maternal Greatgrandmother + overgrootmoeder via moeder + + + + Label: RoleCode MaternalGreatgrandparent + + Maternal Greatgrandparent + overgrootouder via moeder + + + + Label: RoleCode PaternalGreatgrandfather + + Paternal Greatgrandfather + overgrootvader via vader + + + + Label: RoleCode PaternalGreatgrandmother + + Paternal Greatgrandmother + overgrootmoeder via vader + + + + Label: RoleCode PaternalGreatgrandparent + + Paternal Greatgrandparent + overgrootouder via vader + + + + Label: RoleCode grandchild + + grandchild + kleinkind + + + + Label: RoleCode granddaughter + + granddaughter + kleindochter + + + + Label: RoleCode grandson + + grandson + kleinzoon + + + + Label: RoleCode Grandparent + + Grandparent + grootouder + + + + Label: RoleCode Grandfather + + Grandfather + grootvader + + + + Label: RoleCode Grandmother + + Grandmother + grootmoeder + + + + Label: RoleCode MaternalGrandfather + + MaternalGrandfather + grootvader via moeder + + + + Label: RoleCode MaternalGrandmother + + MaternalGrandmother + grootmoeder via moeder + + + + Label: RoleCode MaternalGrandparent + + Maternal Grandparent + grootouder via moeder + + + + Label: RoleCode PaternalGrandfather + + Paternal Grandfather + grootvader via vader + + + + Label: RoleCode PaternalGrandmother + + Paternal Grandmother + grootmoeder via vader + + + + Label: RoleCode PaternalGrandparent + + Paternal Grandparent + grootouder via vader + + + + Label: RoleCode niece/nephew + + niece/nephew + nicht/neef + + + + Label: RoleCode nephew + + nephew + neef + + + + Label: RoleCode niece + + niece + nicht + + + + Label: RoleCode uncle + + uncle + oom + + + + Label: RoleCode MaternalUncle + + Maternal Uncle + oom via moeder + + + + Label: RoleCode PaternalUncle + + Paternal Uncle + oom via vader + + + + Label: RoleCode Parent + + Parent + ouder + + + + Label: RoleCode Father + + Father + vader + + + + Label: RoleCode Mother + + Mother + moeder + + + + Label: RoleCode natural parent + + natural parent + natuurlijke ouder + + + + Label: RoleCode natural father + + natural father + natuurlijke vader + + + + Label: RoleCode natural father of fetus + + natural father of fetus + natuurlijke vader van foetus + + + + Label: RoleCode natural mother + + natural mother + natuurlijke moeder + + + + Label: RoleCode parent in-law + + parent in-law + schoonouder + + + + Label: RoleCode father-in-law + + father-in-law + schoonvader + + + + Label: RoleCode mother-in-law + + mother-in-law + schoonmoeder + + + + Label: RoleCode step parent + + step parent + stiefouder + + + + Label: RoleCode stepfather + + stepfather + stiefvader + + + + Label: RoleCode stepmother + + stepmother + stiefmoeder + + + + Label: RoleCode Sibling + + Sibling + broer/zus + + + + Label: RoleCode Brother + + Brother + broer + + + + Label: RoleCode half-sibling + + half-sibling + halfbroer/zus + + + + Label: RoleCode half-brother + + half-brother + halfbroer + + + + Label: RoleCode half-sister + + half-sister + halfzus + + + + Label: RoleCode natural sibling + + natural sibling + natuurlijke broer/zus + + + + Label: RoleCode natural brother + + natural brother + natuurlijke broer + + + + Label: RoleCode natural sister + + natural sister + natuurlijke zus + + + + Label: RoleCode sibling in-law + + sibling in-law + schoonbroer/zus + + + + Label: RoleCode brother-in-law + + brother-in-law + zwager + + + + Label: RoleCode sister-in-law + + sister-in-law + schoonzus + + + + Label: RoleCode Sister + + Sister + zus + + + + Label: RoleCode step sibling + + step sibling + stiefbroer/zus + + + + Label: RoleCode stepbrother + + stepbrother + stiefbroer + + + + Label: RoleCode stepsister + + stepsister + stiefzus + + + + Label: RoleCode significant other + + significant other + significante derde + + + + Label: RoleCode domestic partner + + domestic partner + huisgenoot + + + + Label: RoleCode spouse + + spouse + echtgenoot + + + + Label: RoleCode husband + + husband + echtgenoot + + + + Label: RoleCode wife + + wife + echtgenote + + + + Label: RoleCode unrelated friend + + unrelated friend + niet-gerelateerde vriend + + + + Label: RoleCode neighbor + + neighbor + buur + + + + Label: RoleCode Roommate + + Roommate + kamergenoot + + + + Label: RoleCode Next of Kin + + Next of Kin + familielid + + + + Label: RoleCode Emergency contact + + Emergency contact + Contact in nood + + + + Label: RoleCode General + + General + Algemeen + + + + Label: OID HL7 v2 Table 443 Provider Role code system + + consulting provider + adviserende zorgverlener + + + + Label: OID HL7 v2 Table 443 Provider Role code system + + primary care provider + eerstelijns zorgverlener + + + + Label: OID HL7 v2 Table 443 Provider Role code system + + referring provider + verwijzende zorgverlener + + + + Label: OID HL7 v2 Table 443 Provider Role code system + + medical home provider + verplegende/verzorgende zorgverlener + + + + Label: ParticipationType Author + + Author + Autor + Auteur + Autore + Auteur + + + + Label: ParticipationType Entered by + + Data Enterer + Erfasser + Saisie par + Registrati da + Ingevoerd door + + + + Label: In Fulfillment Of + + In fulfillment of + Conform + + + + Label: Informant - An informant (or source of information) is a person that provides relevant information + + Informant + Informiert + Informé + Informati + + + + Label: ParticipationType authenticator + + Authenticator + Unterzeichnet + Signataires + Ondertekenaar + + + + Label: ParticipationType Legal Authenticator + + Legal Authenticator + Rechtsgültig unterzeichnet + Légal signataires + Efficace legge firmato + Juridische ondertekenaar + + + + Label: ParticipationType Information Recipient + + Information Recipient + Ontvanger + + + + Label: ServiceEventPerformer Performer + + Performer + Uitvoerende + + + + Label: ServiceEventPerformer Primary Performer + + Primary Performer + Eerste uitvoerende + + + + Label: ParticipationType Record Target + + Patient + Paziente + Patiënt + + + + Label: ParticipationType Responsible party + + Responsible party + Verantwoordelijke + + + + Label: ServiceEventPerformer Supporting Performer + + Supporting Performer + Ondersteunend uitvoerende + + + + Label: ParticipationType Tracker + + Secondary Information Recipient + Kopie-ontvanger + + + + Label: Alphabetic transcription of name (Japanese: romaji) + + Alphabetic + alphabetisch + + + + Label: Ideographic representation of name (e.g., Japanese kanji, Chinese characters) + + Ideographic + ideographisch + + + + Label: Syllabic transcription of name (e.g., Japanese kana, Korean hangul) + + Syllabic + syllabisch + + + + Label: A name assigned to a person. Reasons some organizations assign alternate names may include not knowing the person's name, or to maintain anonymity. Some, but not necessarily all, of the name types that people call "alias" may fit into this category. + + assigned + toegekend + + + + Label: As recorded on a license, record, certificate, etc. (only if different from legal name) + + License + licentie + + + + Label: e.g. Chief Red Cloud + + Indigenous/Tribal + inheems/tribaal + + + + Label: Known as/conventional/the one you use + + Legal + Bekend als + + + + Label: The formal name as registered in an official (government) registry, but which name might not be commonly used. Particularly used in countries with a law system based on Napoleonic law. + + official registry + officieel + + + + Label: A self asserted name that the person is using or has used. + + pseudonym + pseudoniem + + + + Label: Includes writer's pseudonym, stage name, etc + + Artist/Stage + artiest/stage + + + + Label: e.g. Sister Mary Francis, Brother John + + Religious + religieus + + + + Label: A name intended for use in searching or matching. + + search + zoek + + + + Label: A name spelled phonetically. + + phonetic + fonetisch + + + + Label: A name spelled according to the SoundEx algorithm. + + Soundex + soundex + + + + Label: Home (e.g. address, or telecom type) + + Home + p + p + C + Privé + + + + Label: Vacation Home (e.g. address, or telecom type) + + Vacation Home + p + p + C + Vakantieadres + + + + Label: Home Primary (e.g. address, or telecom type) + + Home Primary + p + p + C + Privé (hoofd) + + + + Label: Workplace (e.g. address, telecom type) + + Workplace + g + g + U + Werk + + + + Label: Workplace Public (e.g. address, telecom type) + + Public + g + g + U + Werk algemeen + + + + Label: Emergency Contact (e.g. address, or telecom type) + + Emergency + Noodgevallen + + + + Label: Mobile Contact (e.g. telecom type) + + Mobile + Mobiel + + + + Label: Pager (e.g. telecom type) + + Pager + + + + Label: Postal (e.g. address type) + + Postal + Post + + + + Label: Temporary (e.g. address type) + + Temporary + Tijdelijk + + + + Label: Confidential (e.g. address type) + + Confidential + Geheim + + + + Label: Physical (e.g. address type) + + Physical + Bezoek + + + + Label: Direct (e.g. address type) + + Direct + + + + Label: BAD (e.g. address type) + + Bad address + Verkeerd adres + + + + + + Label: LOINC DOC code 11534-5 + + Temperature charts + Temperatuuroverzicht + + + + Label: LOINC DOC code 11536-0 + + Notes (Nursing) + Verslag (verpleging) + + + + Label: LOINC DOC code 11538-6 + + Study.total (CT) + Onderzoek.volledig (CT) + + + + Label: LOINC DOC code 11539-4 + + Study.total (CT) + Onderzoek.volledig (CT) + + + + Label: LOINC DOC code 11540-2 + + Study.total (CT) + Onderzoek.volledig (CT) + + + + Label: LOINC DOC code 11541-0 + + Study report (MRI) + Onderzoeksverslag (MRI) + + + + Label: LOINC DOC code 11542-8 + + Subsequent visit evaluation note ({Provider}) + Vervolgbezoek evaluatieaantekeningen ({Instelling}) + + + + Label: LOINC DOC code 11543-6 + + Nursery records + Verpleegkundig dossier + + + + Label: LOINC DOC code 11485-0 + + Anesthesia records + Anesthesiedossier + + + + Label: LOINC DOC code 11486-8 + + Chemotherapy records + Chemotherapiedossier + + + + Label: LOINC DOC code 11488-4 + + Consultation note ({Provider}) + Consultverslag ({Instelling}) + + + + Label: LOINC DOC code 11490-0 + + Discharge summarization note (Physician) + Samenvattende ontslagbrief ({Arts}) + + + + Label: LOINC DOC code 11492-6 + + History and physical note ({Provider}) + Geschiedenis en lichamelijk onderzoeksverslag ({Instelling}) + + + + Label: LOINC DOC code 11494-2 + + Initial assessment note (Physician) + Verslag eerste anamnese ({Arts}) + + + + Label: LOINC DOC code 11495-9 + + Initial assessment note (Physical therapy) + Verslag eerste anamnese (Lichamelijke oefening) + + + + Label: LOINC DOC code 11496-7 + + Initial assessment note (Podiatry) + Verslag eerste anamnese (Podologie) + + + + Label: LOINC DOC code 11497-5 + + Initial assessment note (Psychology) + Verslag eerste anamnese (Psychologie) + + + + Label: LOINC DOC code 11498-3 + + Initial assessment note (Social service) + Verslag eerste anamnese (Sociale dienst) + + + + Label: LOINC DOC code 11499-1 + + Initial assessment note (Speech therapy) + Verslag eerste anamnese (Spraaktherapie) + + + + Label: LOINC DOC code 11500-6 + + Initial assessment note (Occupational therapy) + Verslag eerste anamnese (Bezigheidstherapie) + + + + Label: LOINC DOC code 11502-2 + + Laboratory report.total + Laboratoriumrapport.volledig + + + + Label: LOINC DOC code 11503-0 + + Medical records + Medisch dossier + + + + Label: LOINC DOC code 11504-8 + + Surgical operation note ({Provider}) + Verslag chirurgische operatie ({Instelling}) + + + + Label: LOINC DOC code 11505-5 + + Procedure note (Physician) + Verslag procedure ({Arts}) + + + + Label: LOINC DOC code 11506-3 + + Subsequent evaluation note ({Provider}) + Verslag vervolgonderzoek ({Instelling}) + + + + Label: LOINC DOC code 11507-1 + + Subsequent evaluation note (Occupational therapy) + Verslag vervolgonderzoek (Bezigheidstherapie) + + + + Label: LOINC DOC code 11508-9 + + Subsequent evaluation note (Physical therapy) + Verslag vervolgonderzoek (Lichamelijke oefening) + + + + Label: LOINC DOC code 11509-7 + + Subsequent evaluation note (Podiatry) + Verslag vervolgonderzoek (Podologie) + + + + Label: LOINC DOC code 11510-5 + + Subsequent evaluation note (Psychology) + Verslag vervolgonderzoek (Psychologie) + + + + Label: LOINC DOC code 11512-1 + + Subsequent evaluation note (Speech therapy) + Verslag vervolgonderzoek (Spraaktherapie) + + + + Label: LOINC DOC code 11514-7 + + Records.total (Chiropractic) + Dossier.volledig (Chiropractie) + + + + Label: LOINC DOC code 11515-4 + + Records.total (Physical therapy) + Dossier.volledig (Lichamelijke oefening) + + + + Label: LOINC DOC code 11516-2 + + Records.total (Physician) + Dossier.volledig ({Arts}) + + + + Label: LOINC DOC code 11517-0 + + Records.total (Podiatry) + Dossier.volledig (Podologie) + + + + Label: LOINC DOC code 11518-8 + + Records.total (Psychology) + Dossier.volledig (Psychologie) + + + + Label: LOINC DOC code 11519-6 + + Records.total (Social service) + Dossier.volledig (Sociale dienst) + + + + Label: LOINC DOC code 11520-4 + + Records.total (Speech therapy) + Dossier.volledig (Spraaktherapie) + + + + Label: LOINC DOC code 11521-2 + + Records.total (Occupational therapy) + Dossier.volledig (Bezigheidstherapie) + + + + Label: LOINC DOC code 11522-0 + + Study report (Cardiac echo) + Onderzoeksverslag (Cardiac echo) + + + + Label: LOINC DOC code 11523-8 + + Study report (EEG) + Onderzoeksverslag (EEG) + + + + Label: LOINC DOC code 11524-6 + + Study report (EKG) + Onderzoeksverslag (EKG) + + + + Label: LOINC DOC code 11525-3 + + Study report (OB US) + Onderzoeksverslag (OB US) + + + + Label: LOINC DOC code 11526-1 + + Study report (Pathology) + Onderzoeksverslag (Pathologie) + + + + Label: LOINC DOC code 11527-9 + + Study report (Psychiatry) + Onderzoeksverslag (Psychiatrie) + + + + Label: LOINC DOC code 11528-7 + + Study.total (Radiology.XXX) + Onderzoek.volledig (Radiology.XXX) + + + + Label: LOINC DOC code 11529-5 + + Study report (Surgical pathology) + Onderzoeksverslag (Surgical pathology) + + + + Label: LOINC DOC code 15507-7 + + Subsequent evaluation note ({Provider}) + Verslag vervolgonderzoek ({Instelling}) + + + + Label: LOINC DOC code 15508-5 + + Labor and delivery records + Dossier zwangerschap en bevalling + + + + Label: LOINC DOC code 17787-3 + + Study report (Radnuc) + Onderzoeksverslag (Radnuc) + + + + Label: LOINC DOC code 18765-8 + + Subsequent visit evaluation note (Podiatry) + Verslag vervolgonderzoek (Podologie) + + + + Label: LOINC DOC code 18766-6 + + Subsequent visit evaluation note (Psychology) + Verslag vervolgonderzoek (Psychologie) + + + + Label: LOINC DOC code 18733-6 + + Subsequent evaluation note (Attending physician) + Verslag vervolgonderzoek (Behandelend arts) + + + + Label: LOINC DOC code 18734-4 + + Initial evaluation note (Occupational therapy) + Verslag eerste onderzoek (Bezigheidstherapie) + + + + Label: LOINC DOC code 18735-1 + + Initial evaluation note (Physical therapy) + Verslag eerste onderzoek (Lichamelijke oefening) + + + + Label: LOINC DOC code 18736-9 + + Initial evaluation note (Physician) + Verslag eerste onderzoek ({Arts}) + + + + Label: LOINC DOC code 18737-7 + + Initial evaluation note (Podiatry) + Verslag eerste onderzoek (Podologie) + + + + Label: LOINC DOC code 18738-5 + + Initial evaluation note (Psychology) + Verslag eerste onderzoek (Psychologie) + + + + Label: LOINC DOC code 18739-3 + + Initial evaluation note (Social service) + Verslag eerste onderzoek (Sociale dienst) + + + + Label: LOINC DOC code 18740-1 + + Initial evaluation note (Speech therapy) + Verslag eerste onderzoek (Spraaktherapie) + + + + Label: LOINC DOC code 18741-9 + + Subsequent visit evaluation note (Attending physician) + Verslag vervolgonderzoek (Behandelend arts) + + + + Label: LOINC DOC code 18742-7 + + Study report (Arthroscopy) + Onderzoeksverslag (Arthroscopy) + + + + Label: LOINC DOC code 18743-5 + + Autopsy report ({Provider}) + Autopsy report ({Instelling}) + + + + Label: LOINC DOC code 18744-3 + + Study report (Bronchoscopy) + Onderzoeksverslag (Bronchoscopy) + + + + Label: LOINC DOC code 18745-0 + + Study report (Cardiac catheterization) + Onderzoeksverslag (Cardiac catheterization) + + + + Label: LOINC DOC code 18746-8 + + Study report (Colonoscopy) + Onderzoeksverslag (Colonoscopy) + + + + Label: LOINC DOC code 18747-6 + + Study (CT) + Onderzoek (CT) + + + + Label: LOINC DOC code 18748-4 + + Study report (Diagnostic imaging) + Onderzoeksverslag (Diagnostic imaging) + + + + Label: LOINC DOC code 18749-2 + + Study report (Electromyogram) + Onderzoeksverslag (Electromyogram) + + + + Label: LOINC DOC code 18750-0 + + Study report (Electrophysiology) + Onderzoeksverslag (Electrophysiology) + + + + Label: LOINC DOC code 18751-8 + + Study report (Endoscopy) + Onderzoeksverslag (Endoscopy) + + + + Label: LOINC DOC code 18752-6 + + Study report (Exercise stress test) + Onderzoeksverslag (Exercise stress test) + + + + Label: LOINC DOC code 18753-4 + + Study report (Flexible sigmoidoscopy) + Onderzoeksverslag (Flexible sigmoidoscopy) + + + + Label: LOINC DOC code 18754-2 + + Study report (Holter monitor) + Onderzoeksverslag (Holter monitor) + + + + Label: LOINC DOC code 18755-9 + + Study report (MRI) + Onderzoeksverslag (MRI) + + + + Label: LOINC DOC code 18756-7 + + Study report (MRI) + Onderzoeksverslag (MRI) + + + + Label: LOINC DOC code 18757-5 + + Study report (Radnuc) + Onderzoeksverslag (Radnuc) + + + + Label: LOINC DOC code 18758-3 + + Study (PET scan) + Onderzoek (PET scan) + + + + Label: LOINC DOC code 18759-1 + + Study report (Spirometry) + Onderzoeksverslag (Spirometry) + + + + Label: LOINC DOC code 18760-9 + + Study (US) + Onderzoek (US) + + + + Label: LOINC DOC code 18761-7 + + Transfer summarization note ({Provider}) + Samenvattend verslag overplaatsing ({Instelling}) + + + + Label: LOINC DOC code 18762-5 + + Subsequent evaluation note (Chiropractor) + Verslag vervolgonderzoek (Chiropractor) + + + + Label: LOINC DOC code 18763-3 + + Initial evaluation note (Consulting physician) + Verslag eerste onderzoek (Behandelend arts) + + + + Label: LOINC DOC code 18764-1 + + Subsequent evaluation note (Nurse practitioner) + Verslag vervolgonderzoek (Nurse practitioner) + + + + Label: LOINC DOC code 18836-7 + + Procedure (*) + Ingreep (*) + + + + Label: LOINC DOC code 18841-7 + + Hospital consultations + Ziekenhuisbezoeken + + + + Label: LOINC DOC code 18842-5 + + Discharge summarization note ({Provider}) + Samenvattende ontslagbrief ({Instelling}) + + + + Label: LOINC DOC code 24611-6 + + Confirmatory consultation note ({Provider}) + Consultverslag ter bevestiging ({Instelling}) + + + + Label: LOINC DOC code 28032-1 + + Report.total (Cardiac echo) + Verslag.volledig (Hart echo) + + + + Label: LOINC DOC code 28570-0 + + Procedure note ({Provider}) + Procedure note ({Instelling}) + + + + Label: LOINC DOC code 28571-8 + + Visit note (Speech therapy) + Bezoekverslag (Spraaktherapie) + + + + Label: LOINC DOC code 28572-6 + + Initial evaluation note (Dentistry) + Verslag eerste onderzoek (Tandheelkunde) + + + + Label: LOINC DOC code 28573-4 + + Surgical operation note (Physician) + Verslag chirurgische operatie ({Arts}) + + + + Label: LOINC DOC code 28574-2 + + Discharge note ({Provider}) + Ontslagbrief ({Instelling}) + + + + Label: LOINC DOC code 28575-9 + + Progress note (Nurse practitioner) + Voortgangsrapport (Nurse practitioner) + + + + Label: LOINC DOC code 28577-5 + + Procedure note (Dentistry) + Procedure note (Tandheelkunde) + + + + Label: LOINC DOC code 28578-3 + + Visit note (Occupational therapy) + Bezoekverslag (Bezigheidstherapie) + + + + Label: LOINC DOC code 28579-1 + + Visit note (Physical therapy) + Bezoekverslag (Lichamelijke oefening) + + + + Label: LOINC DOC code 28580-9 + + Progress note (Chiropractor) + Voortgangsrapport (Chiropractor) + + + + Label: LOINC DOC code 28581-7 + + Initial evaluation note (Chiropractor) + Verslag eerste onderzoek (Chiropractor) + + + + Label: LOINC DOC code 28583-3 + + Surgical operation note (Dentistry) + Verslag chirurgische operatie (Tandheelkunde) + + + + Label: LOINC DOC code 28651-8 + + Transfer summarization note (Nursing) + Samenvattend verslag overplaatsing (Verpleging) + + + + Label: LOINC DOC code 28653-4 + + Visit note (Social service) + Bezoekverslag (Sociale dienst) + + + + Label: LOINC DOC code 28568-4 + + Visit note (Physician) + Bezoekverslag ({Arts}) + + + + Label: LOINC DOC code 28569-2 + + Subsequent evaluation note (Consulting physician) + Verslag vervolgonderzoek (Behandelend arts) + + + + Label: LOINC DOC code 28615-3 + + Audiology study + Audiologisch onderzoek + + + + Label: LOINC DOC code 28616-1 + + Transfer summarization note (Physician) + Samenvattend overplaatsingsverslag ({Arts}) + + + + Label: LOINC DOC code 28617-9 + + Subsequent evaluation note (Dentistry) + Verslag vervolgonderzoek (Tandheelkunde) + + + + Label: LOINC DOC code 28618-7 + + Visit note (Dentistry) + Bezoekverslag (Tandheelkunde) + + + + Label: LOINC DOC code 28621-1 + + Initial evaluation note (Nurse practitioner) + Verslag eerste onderzoek (Nurse practitioner) + + + + Label: LOINC DOC code 28622-9 + + Discharge assessment note (Nursing) + Discharge assessment note (Verpleging) + + + + Label: LOINC DOC code 28623-7 + + Subsequent evaluation note (Nursing) + Verslag vervolgonderzoek (Verpleging) + + + + Label: LOINC DOC code 28624-5 + + Surgical operation note (Podiatry) + Verslag chirurgische operatie (Podologie) + + + + Label: LOINC DOC code 28625-2 + + Procedure note (Podiatry) + Procedure note (Podologie) + + + + Label: LOINC DOC code 28626-0 + + History and physical note (Physician) + Verslag voorschiedenis en lichaam ({Arts}) + + + + Label: LOINC DOC code 28627-8 + + Subsequent evaluation note (Psychiatry) + Verslag vervolgonderzoek (Psychiatrie) + + + + Label: LOINC DOC code 28628-6 + + Visit note (Psychiatry) + Bezoekverslag (Psychiatrie) + + + + Label: LOINC DOC code 28633-6 + + Study report (Polysomnography) + Onderzoeksverslag (Polysomnography) + + + + Label: LOINC DOC code 28635-1 + + Initial evaluation note (Psychiatry) + Verslag eerste onderzoek (Psychiatrie) + + + + Label: LOINC DOC code 28636-9 + + Initial evaluation note ({Provider}) + Verslag eerste onderzoek ({Instelling}) + + + + Label: LOINC DOC code 28654-2 + + Initial evaluation note (Attending physician) + Verslag eerste onderzoek (Behandelend arts) + + + + Label: LOINC DOC code 28655-9 + + Discharge summarization note (Attending physician) + Samenvattende ontslagbrief (Behandelend arts) + + + + Label: LOINC DOC code 28656-7 + + Subsequent evaluation note (Social service) + Verslag vervolgonderzoek (Sociale dienst) + + + + Label: LOINC DOC code 29749-9 + + Dialysis records + Dialysedossier + + + + Label: LOINC DOC code 29750-7 + + Neonatal intensive care records + Neonataal intensieve zorg-dossier + + + + Label: LOINC DOC code 29751-5 + + Critical care records + IC-dossier + + + + Label: LOINC DOC code 29752-3 + + Perioperative records + Peri-operatief dossier + + + + Label: LOINC DOC code 29753-1 + + Initial evaluation note (Nursing) + Verslag eerste onderzoek (Verpleging) + + + + Label: LOINC DOC code 29754-9 + + Study report (Nystagmogram) + Onderzoeksverslag (Nystagmogram) + + + + Label: LOINC DOC code 29755-6 + + Study report (Nerve conduction) + Onderzoeksverslag (Zenuwconductie) + + + + Label: LOINC DOC code 29756-4 + + Study report (Peritoneoscopy) + Onderzoeksverslag (Peritoneoscopie) + + + + Label: LOINC DOC code 29757-2 + + Study report (Colposcopy) + Onderzoeksverslag (Colposcopie) + + + + Label: LOINC DOC code 29761-4 + + Discharge summarization note (Dentistry) + Samenvattende ontslagbrief (Tandheelkunde) + + + + Label: LOINC DOC code 34134-7 + + Supervisory note (Attending physician) + Supervisory note (Behandelend arts) + + + + Label: LOINC DOC code 34135-4 + + Supervisory note (Attending physician.cardiology) + Verslag van toezicht (Behandelend arts.cardiologie) + + + + Label: LOINC DOC code 34136-2 + + Supervisory note (Attending physician.gastroenterology) + Verslag van toezicht (Behandelend arts.gastro-enterologie) + + + + Label: LOINC DOC code 34137-0 + + Surgical operation note ({Provider}) + Verslag chirurgische operatie ({Instelling}) + + + + Label: LOINC DOC code 34138-8 + + Targeted history and physical note ({Provider}) + Targeted history and physical note ({Instelling}) + + + + Label: LOINC DOC code 34125-5 + + Subsequent evaluation note (Case manager) + Verslag vervolgonderzoek (Case manager) + + + + Label: LOINC DOC code 34126-3 + + Subsequent evaluation note ({Provider}) + Verslag vervolgonderzoek ({Instelling}) + + + + Label: LOINC DOC code 34127-1 + + Subsequent evaluation note (Dental hygienist) + Verslag vervolgonderzoek (Dental hygienist) + + + + Label: LOINC DOC code 34128-9 + + Subsequent evaluation note (Dentistry) + Verslag vervolgonderzoek (Tandheelkunde) + + + + Label: LOINC DOC code 34129-7 + + Subsequent evaluation note ({Provider}) + Verslag vervolgonderzoek ({Instelling}) + + + + Label: LOINC DOC code 34130-5 + + Subsequent evaluation note ({Provider}) + Verslag vervolgonderzoek ({Instelling}) + + + + Label: LOINC DOC code 34131-3 + + Subsequent evaluation note ({Provider}) + Verslag vervolgonderzoek ({Instelling}) + + + + Label: LOINC DOC code 34132-1 + + Subsequent evaluation note (Pharmacy) + Verslag vervolgonderzoek (Apotheek) + + + + Label: LOINC DOC code 34133-9 + + Summarization of episode note ({Provider}) + Summarization of episode note ({Instelling}) + + + + Label: LOINC DOC code 34798-9 + + Consultation note (Neurosurgery) + Consultverslag (Neurosurgery) + + + + Label: LOINC DOC code 34799-7 + + Evaluation and management note (Neurosurgery) + Evaluatie en voortgangsverslag (Neurosurgery) + + + + Label: LOINC DOC code 34800-3 + + Consultation note (Nutrition+Dietetics) + Consultverslag (Nutrition+Dietetics) + + + + Label: LOINC DOC code 34801-1 + + Evaluation and management note (Nutrition+Dietetics) + Evaluatie en voortgangsverslag (Nutrition+Dietetics) + + + + Label: LOINC DOC code 34802-9 + + Evaluation and management note (Occupational health) + Evaluatie en voortgangsverslag (Occupational health) + + + + Label: LOINC DOC code 34803-7 + + Consultation note (Occupational health) + Consultverslag (Occupational health) + + + + Label: LOINC DOC code 34804-5 + + Evaluation and management note (Occupational therapy) + Evaluatie en voortgangsverslag (Bezigheidstherapie) + + + + Label: LOINC DOC code 34805-2 + + Consultation note (Oncology) + Consultverslag (Oncology) + + + + Label: LOINC DOC code 33716-2 + + Study report (Cytology.non-gyn) + Onderzoeksverslag (Cytology.non-gyn) + + + + Label: LOINC DOC code 33717-0 + + Study report (Cytology) + Onderzoeksverslag (Cytology) + + + + Label: LOINC DOC code 33718-8 + + Cytology report (Cyto stain) + Cytologieverslag (Cyto stain) + + + + Label: LOINC DOC code 33719-6 + + Study report (Flow cytometry) + Onderzoeksverslag (Flow cytometry) + + + + Label: LOINC DOC code 33720-4 + + Blood bank consult + Bloedbank bezoek + + + + Label: LOINC DOC code 33721-2 + + Bone marrow biopsy report + Verslag beenmergbioptie + + + + Label: LOINC DOC code 34094-3 + + Admission history and physical note (Cardiology) + Admission history and physical note (Cardiologie) + + + + Label: LOINC DOC code 34095-0 + + Comprehensive history and physical note ({Provider}) + Comprehensive history and physical note ({Instelling}) + + + + Label: LOINC DOC code 34096-8 + + Comprehensive history and physical note + Uitgebreid verslag voorgeschiedenis en lichaam + + + + Label: LOINC DOC code 34097-6 + + Conference evaluation note ({Provider}) + Vergadering evaluatieverslag ({Instelling}) + + + + Label: LOINC DOC code 34098-4 + + Conference evaluation note ({Provider}) + Vergadering evaluatieverslag ({Instelling}) + + + + Label: LOINC DOC code 34099-2 + + Consultation note (Cardiology) + Consultverslag (Cardiologie) + + + + Label: LOINC DOC code 34100-8 + + Consultation note ({Provider}) + Consultverslag ({Instelling}) + + + + Label: LOINC DOC code 34101-6 + + Consultation note (General medicine) + Consultverslag (Algemene geneeskunde) + + + + Label: LOINC DOC code 34102-4 + + Consultation note (Psychiatry) + Consultverslag (Psychiatrie) + + + + Label: LOINC DOC code 34103-2 + + Consultation note (Pulmonary) + Consultverslag (Pulmonary) + + + + Label: LOINC DOC code 34104-0 + + Consultation note ({Provider}) + Consultverslag ({Instelling}) + + + + Label: LOINC DOC code 34105-7 + + Discharge summarization note ({Provider}) + Samenvattende ontslagbrief ({Instelling}) + + + + Label: LOINC DOC code 34106-5 + + Discharge summarization note (Physician) + Samenvattende ontslagbrief ({Arts}) + + + + Label: LOINC DOC code 34107-3 + + Education procedure note ({Provider}) + Education procedure note ({Instelling}) + + + + Label: LOINC DOC code 34108-1 + + Evaluation and management note ({Provider}) + Evaluatie en voortgangsverslag ({Instelling}) + + + + Label: LOINC DOC code 34109-9 + + Evaluation and management note ({Provider}) + Evaluatie en voortgangsverslag ({Instelling}) + + + + Label: LOINC DOC code 34110-7 + + Evaluation and management note (Diabetology) + Evaluatie en voortgangsverslag (Diabetologie) + + + + Label: LOINC DOC code 34111-5 + + Evaluation and management note ({Provider}) + Evaluatie en voortgangsverslag ({Instelling}) + + + + Label: LOINC DOC code 34112-3 + + Evaluation and management note ({Provider}) + Evaluatie en voortgangsverslag ({Instelling}) + + + + Label: LOINC DOC code 34113-1 + + Evaluation and management note ({Provider}) + Evaluatie en voortgangsverslag ({Instelling}) + + + + Label: LOINC DOC code 34114-9 + + Group counseling note ({Provider}) + Verslag groepstherapie ({Instelling}) + + + + Label: LOINC DOC code 34115-6 + + History and physical note (Medical student) + Verslag voorschiedenis en lichaam (Medisch student) + + + + Label: LOINC DOC code 34116-4 + + History and physical note (Physician) + Verslag voorschiedenis en lichaam ({Arts}) + + + + Label: LOINC DOC code 34117-2 + + History and physical note ({Provider}) + Verslag voorschiedenis en lichaam ({Instelling}) + + + + Label: LOINC DOC code 34118-0 + + Initial evaluation note ({Provider}) + Verslag eerste onderzoek ({Instelling}) + + + + Label: LOINC DOC code 34119-8 + + Initial evaluation note ({Provider}) + Verslag eerste onderzoek ({Instelling}) + + + + Label: LOINC DOC code 34120-6 + + Initial evaluation note ({Provider}) + Verslag eerste onderzoek ({Instelling}) + + + + Label: LOINC DOC code 34121-4 + + Interventional procedure note + Verslag interventieprocedure + + + + Label: LOINC DOC code 34122-2 + + Pathology procedure note (Pathology) + Verslag pathologische procedure (Pathologie) + + + + Label: LOINC DOC code 34123-0 + + Pre-operative evaluation and management note (Anesthesia) + Preoperatief onderzoek en voortgangsverslag (Anesthesie) + + + + Label: LOINC DOC code 34124-8 + + Subsequent evaluation note (Cardiology) + Verslag vervolgonderzoek (Cardiologie) + + + + Label: LOINC DOC code 34139-6 + + Telephone encounter note (Nursing) + Telephone encounter note (Verpleging) + + + + Label: LOINC DOC code 34140-4 + + Transfer of care referral note ({Provider}) + Transfer of care referral note ({Instelling}) + + + + Label: LOINC DOC code 34876-3 + + Pre-operative evaluation and management note (Surgery) + Preoperatief onderzoek en voortgangsverslag (Chirurgie) + + + + Label: LOINC DOC code 34877-1 + + Surgical operation note (Urology) + Verslag chirurgische operatie (Urologie) + + + + Label: LOINC DOC code 34878-9 + + Evaluation and management note (Emergency medicine) + Evaluatie en voortgangsverslag (Emergency medicine) + + + + Label: LOINC DOC code 34879-7 + + Consultation note (Endocrinology) + Consultverslag (Endocrinologie) + + + + Label: LOINC DOC code 34880-5 + + Post-operative evaluation and management note (Nurse.surgery) + Postoperatief onderzoek en voortgangsverslag (Operatieverpleegkundige) + + + + Label: LOINC DOC code 34881-3 + + Pre-operative evaluation and management note (Nurse.surgery) + Preoperatief onderzoek en voortgangsverslag (Operatieverpleegkundige) + + + + Label: LOINC DOC code 34861-5 + + Evaluation and management note (Diabetology) + Evaluatie en voortgangsverslag (Diabetologie) + + + + Label: LOINC DOC code 34862-3 + + Admission evaluation note (Attending physician.general medicine) + Voortgangsverslag opname (Behandelend arts.algemene geneeskunde) + + + + Label: LOINC DOC code 34863-1 + + Post-operative evaluation and management note (General surgery) + Postoperatief onderzoek en voortgangsverslag (Algemene chirurgie) + + + + Label: LOINC DOC code 34864-9 + + Counseling note (Mental health) + Counseling note (Geestelijke gezondheidszorg) + + + + Label: LOINC DOC code 34865-6 + + Counseling note (Psychiatry) + Counseling note (Psychiatrie) + + + + Label: LOINC DOC code 34866-4 + + Counseling note (Psychology) + Counseling note (Psychologie) + + + + Label: LOINC DOC code 34867-2 + + Post-operative evaluation and management note (Ophthalmology) + Postoperatief onderzoek en voortgangsverslag (Ophthalmologie) + + + + Label: LOINC DOC code 34868-0 + + Surgical operation note (Orthopedics) + Verslag chirurgische operatie (Orthopedie) + + + + Label: LOINC DOC code 34869-8 + + Counseling note (Pharmacy) + Verslag advies (Apotheek) + + + + Label: LOINC DOC code 34870-6 + + Surgical operation note (Plastic surgery) + Verslag chirurgische operatie (Plastic surgery) + + + + Label: LOINC DOC code 34871-4 + + Surgical operation note (Podiatry) + Verslag chirurgische operatie (Podologie) + + + + Label: LOINC DOC code 34872-2 + + Counseling note (Social work) + Counseling note (Sociaal werk) + + + + Label: LOINC DOC code 34873-0 + + Admission evaluation note (Surgery) + Admission evaluation note (Chirurgie) + + + + Label: LOINC DOC code 34874-8 + + Surgical operation note (Surgery) + Verslag chirurgische operatie (Chirurgie) + + + + Label: LOINC DOC code 34875-5 + + Post-operative evaluation and management note (Surgery) + Postoperatief onderzoek en voortgangsverslag (Chirurgie) + + + + Label: LOINC DOC code 34744-3 + + Admission evaluation note (Nursing) + Admission evaluation note (Verpleging) + + + + Label: LOINC DOC code 34745-0 + + Discharge summarization note (Nursing) + Samenvattende ontslagbrief (Verpleging) + + + + Label: LOINC DOC code 34746-8 + + Evaluation and management note (Nursing) + Evaluatie en voortgangsverslag (Verpleging) + + + + Label: LOINC DOC code 34747-6 + + Pre-operative evaluation and management note (Nursing) + Preoperatief onderzoek en voortgangsverslag (Verpleging) + + + + Label: LOINC DOC code 34748-4 + + Telephone encounter note ({Provider}) + Telephone encounter note ({Instelling}) + + + + Label: LOINC DOC code 34749-2 + + Consultation note (Anesthesia) + Consultverslag (Anasthesie) + + + + Label: LOINC DOC code 34750-0 + + Evaluation and management note (Anesthesia) + Evaluatie en voortgangsverslag (Anesthesie) + + + + Label: LOINC DOC code 34751-8 + + Pre-operative evaluation and management note (Anesthesia) + Preoperatief onderzoek en voortgangsverslag (Anesthesie) + + + + Label: LOINC DOC code 34752-6 + + Evaluation and management note (Cardiology) + Evaluatie en voortgangsverslag (Cardiologie) + + + + Label: LOINC DOC code 34753-4 + + Evaluation and management note (Cardiology) + Evaluatie en voortgangsverslag (Cardiologie) + + + + Label: LOINC DOC code 34754-2 + + Evaluation and management note (Critical care) + Evaluatie en voortgangsverslag (Spoedeisende hulp) + + + + Label: LOINC DOC code 34755-9 + + Transfer summarization note (Critical care) + Samenvattend verslag overplaatsing (Spoedeisende hulp) + + + + Label: LOINC DOC code 34756-7 + + Consultation note (Dentistry) + Consultverslag (Tandheelkunde) + + + + Label: LOINC DOC code 34757-5 + + Evaluation and management note (Dentistry) + Evaluatie en voortgangsverslag (Tandheelkunde) + + + + Label: LOINC DOC code 34758-3 + + Consultation note (Dermatology) + Consultverslag (Dermatologie) + + + + Label: LOINC DOC code 34759-1 + + Evaluation and management note (Dermatology) + Evaluatie en voortgangsverslag (Dermatologie) + + + + Label: LOINC DOC code 34760-9 + + Consultation note (Diabetology) + Consultverslag (Diabetologie) + + + + Label: LOINC DOC code 34761-7 + + Consultation note (Gastroenterology) + Consultverslag (Gastro-enterologie) + + + + Label: LOINC DOC code 34762-5 + + Evaluation and management note (Gastroenterology) + Evaluatie en voortgangsverslag (Gastro-enterologie) + + + + Label: LOINC DOC code 34763-3 + + Admission history and physical note (General medicine) + Admission history and physical note (Algemene geneeskunde) + + + + Label: LOINC DOC code 34764-1 + + Consultation note (General medicine) + Consultverslag (Algemene geneeskunde) + + + + Label: LOINC DOC code 34765-8 + + Evaluation and management note (General medicine) + Evaluatie en voortgangsverslag (Algemene geneeskunde) + + + + Label: LOINC DOC code 34766-6 + + Evaluation and management note (General medicine) + Evaluatie en voortgangsverslag (Algemene geneeskunde) + + + + Label: LOINC DOC code 34767-4 + + Evaluation and management note (Medical student.general medicine) + Evaluatie en voortgangsverslag (Medisch student.algemene geneeskunde) + + + + Label: LOINC DOC code 34768-2 + + Evaluation and management note (Nurse.general medicine) + Evaluatie en voortgangsverslag (Verpleegkundige.algemene geneeskunde) + + + + Label: LOINC DOC code 34769-0 + + Evaluation and management note (Attending physician.general medicine) + Evaluatie en voortgangsverslag (Behandelend arts.algemene geneeskunde) + + + + Label: LOINC DOC code 34770-8 + + Transfer summarization note (General medicine) + Samenvattend verslag overplaatsing (Algemene geneeskunde) + + + + Label: LOINC DOC code 34771-6 + + Consultation note (General surgery) + Consultverslag (Algemene chirurgie) + + + + Label: LOINC DOC code 34772-4 + + Evaluation and management note (General surgery) + Evaluatie en voortgangsverslag (Algemene chirurgie) + + + + Label: LOINC DOC code 34773-2 + + Evaluation and management note (Attending physician.general surgery) + Evaluatie en voortgangsverslag (Attending physician.general surgery) + + + + Label: LOINC DOC code 34774-0 + + History and physical note (General surgery) + Verslag voorschiedenis en lichaam (Algemene chirurgie) + + + + Label: LOINC DOC code 34775-7 + + Pre-operative evaluation and management note (General surgery) + Preoperatief onderzoek en voortgangsverslag (Algemene chirurgie) + + + + Label: LOINC DOC code 34776-5 + + Consultation note (Gerontology) + Consultverslag (Gerontologie) + + + + Label: LOINC DOC code 34777-3 + + Consultation note (Gynecology) + Consultverslag (Gynecology) + + + + Label: LOINC DOC code 34778-1 + + Evaluation and management note (Gynecology) + Evaluatie en voortgangsverslag (Gynecology) + + + + Label: LOINC DOC code 34779-9 + + Consultation note (Hematology+Oncology) + Consultverslag (Hematology+Oncology) + + + + Label: LOINC DOC code 34780-7 + + Evaluation and management note (Hematology+Oncology) + Evaluatie en voortgangsverslag (Hematology+Oncology) + + + + Label: LOINC DOC code 34781-5 + + Consultation note (Infectious disease) + Consultverslag (Infectious disease) + + + + Label: LOINC DOC code 34782-3 + + Evaluation and management note (Infectious disease) + Evaluatie en voortgangsverslag (Infectious disease) + + + + Label: LOINC DOC code 34783-1 + + Consultation note (Kinesiotherapy) + Consultverslag (Kinesiotherapy) + + + + Label: LOINC DOC code 34784-9 + + Evaluation and management note (Kinesiotherapy) + Evaluatie en voortgangsverslag (Kinesiotherapy) + + + + Label: LOINC DOC code 34785-6 + + Consultation note (Mental health) + Consultverslag (Geestelijke gezondheidszorg) + + + + Label: LOINC DOC code 34786-4 + + Evaluation and management note (Mental health) + Evaluatie en voortgangsverslag (Geestelijke gezondheidszorg) + + + + Label: LOINC DOC code 34787-2 + + Group counseling note (Mental health) + Group counseling note (Geestelijke gezondheidszorg) + + + + Label: LOINC DOC code 34788-0 + + Consultation note (Psychiatry) + Consultverslag (Psychiatrie) + + + + Label: LOINC DOC code 34789-8 + + Evaluation and management note (Psychiatry) + Evaluatie en voortgangsverslag (Psychiatrie) + + + + Label: LOINC DOC code 34790-6 + + Group counseling note (Psychiatry) + Group counseling note (Psychiatrie) + + + + Label: LOINC DOC code 34791-4 + + Consultation note (Psychology) + Consultverslag (Psychologie) + + + + Label: LOINC DOC code 34792-2 + + Evaluation and management note (Psychology) + Evaluatie en voortgangsverslag (Psychologie) + + + + Label: LOINC DOC code 34793-0 + + Group counseling note (Psychology) + Group counseling note (Psychologie) + + + + Label: LOINC DOC code 34794-8 + + Evaluation and management note (Multidisciplinary) + Evaluatie en voortgangsverslag (Multidisciplinary) + + + + Label: LOINC DOC code 34795-5 + + Consultation note (Nephrology) + Consultverslag (Nephrology) + + + + Label: LOINC DOC code 34796-3 + + Evaluation and management note (Nephrology) + Evaluatie en voortgangsverslag (Nephrology) + + + + Label: LOINC DOC code 34797-1 + + Consultation note (Neurology) + Consultverslag (Neurologie) + + + + Label: LOINC DOC code 34806-0 + + Evaluation and management note (Oncology) + Evaluatie en voortgangsverslag (Oncology) + + + + Label: LOINC DOC code 34807-8 + + Consultation note (Ophthalmology) + Consultverslag (Oogheelkunde) + + + + Label: LOINC DOC code 34808-6 + + Evaluation and management note (Ophthalmology) + Evaluatie en voortgangsverslag (Oogheelkunde) + + + + Label: LOINC DOC code 34809-4 + + Pre-operative evaluation and management note (Ophthalmology) + Preoperatief onderzoek en voortgangsverslag (Oogheelkunde) + + + + Label: LOINC DOC code 34810-2 + + Consultation note (Optometry) + Consultverslag (Optometrie) + + + + Label: LOINC DOC code 34811-0 + + Evaluation and management note (Optometry) + Evaluatie en voortgangsverslag (Optometrie) + + + + Label: LOINC DOC code 34812-8 + + Consultation note (Oromaxillofacial surgery) + Consultverslag (Oromaxillofaciale chirurgie) + + + + Label: LOINC DOC code 34813-6 + + Evaluation and management note (Oromaxillofacial surgery) + Evaluatie en voortgangsverslag (Oromaxillofaciale chirurgie) + + + + Label: LOINC DOC code 34814-4 + + Consultation note (Orthopedics) + Consultverslag (Orthopedie) + + + + Label: LOINC DOC code 34815-1 + + Evaluation and management note (Orthopedics) + Evaluatie en voortgangsverslag (Orthopedie) + + + + Label: LOINC DOC code 34816-9 + + Consultation note (Otorhinolaryngology) + Consultverslag (Otorhinolaryngologie) + + + + Label: LOINC DOC code 34817-7 + + Evaluation and management note (Otorhinolaryngology) + Evaluatie en voortgangsverslag (Otorhinolaryngologie) + + + + Label: LOINC DOC code 34818-5 + + Surgical operation note (Otorhinolaryngology) + Verslag chirurgische operatie (Otorhinolaryngologie) + + + + Label: LOINC DOC code 34819-3 + + Evaluation and management note (Pathology) + Evaluatie en voortgangsverslag (Pathologie) + + + + Label: LOINC DOC code 34820-1 + + Consultation note (Pharmacy) + Consultverslag (Apotheek) + + + + Label: LOINC DOC code 34821-9 + + Evaluation and management note (Pharmacy) + Evaluatie en voortgangsverslag (Apotheek) + + + + Label: LOINC DOC code 34822-7 + + Consultation note (Physical medicine and rehabilitation) + Consultverslag (Physical medicine and rehabilitation) + + + + Label: LOINC DOC code 34823-5 + + Evaluation and management note (Physical medicine and rehabilitation) + Evaluatie en voortgangsverslag (Physical medicine and rehabilitation) + + + + Label: LOINC DOC code 34824-3 + + Consultation note (Physical therapy) + Consultverslag (Lichamelijke oefening) + + + + Label: LOINC DOC code 34825-0 + + Evaluation and management note (Physical therapy) + Evaluatie en voortgangsverslag (Lichamelijke oefening) + + + + Label: LOINC DOC code 34826-8 + + Consultation note (Plastic surgery) + Consultverslag (Plastic surgery) + + + + Label: LOINC DOC code 34827-6 + + Evaluation and management note (Plastic surgery) + Evaluatie en voortgangsverslag (Plastic surgery) + + + + Label: LOINC DOC code 34828-4 + + Consultation note (Podiatry) + Consultverslag (Podologie) + + + + Label: LOINC DOC code 34829-2 + + Evaluation and management note (Podiatry) + Evaluatie en voortgangsverslag (Podologie) + + + + Label: LOINC DOC code 34830-0 + + Evaluation and management note (Pulmonary) + Evaluatie en voortgangsverslag (Pulmonary) + + + + Label: LOINC DOC code 34831-8 + + Consultation note (Radiation oncology) + Consultverslag (Radiation oncology) + + + + Label: LOINC DOC code 34832-6 + + Evaluation and management note (Radiation oncology) + Evaluatie en voortgangsverslag (Radiation oncology) + + + + Label: LOINC DOC code 34833-4 + + Consultation note (Recreational therapy) + Consultverslag (Recreational therapy) + + + + Label: LOINC DOC code 34834-2 + + Evaluation and management note (Recreational therapy) + Evaluatie en voortgangsverslag (Recreational therapy) + + + + Label: LOINC DOC code 34835-9 + + Consultation note (Rehabilitation) + Consultverslag (Rehabilitation) + + + + Label: LOINC DOC code 34836-7 + + Evaluation and management note (Rehabilitation) + Evaluatie en voortgangsverslag (Rehabilitation) + + + + Label: LOINC DOC code 34837-5 + + Consultation note (Respiratory therapy) + Consultverslag (Respiratory therapy) + + + + Label: LOINC DOC code 34838-3 + + Evaluation and management note (Respiratory therapy) + Evaluatie en voortgangsverslag (Respiratory therapy) + + + + Label: LOINC DOC code 34839-1 + + Consultation note (Rheumatology) + Consultverslag (Rheumatology) + + + + Label: LOINC DOC code 34840-9 + + Evaluation and management note (Rheumatology) + Evaluatie en voortgangsverslag (Rheumatology) + + + + Label: LOINC DOC code 34841-7 + + Consultation note (Social work) + Consultverslag (Sociaal werk) + + + + Label: LOINC DOC code 34842-5 + + Evaluation and management note (Social work) + Evaluatie en voortgangsverslag (Sociaal werk) + + + + Label: LOINC DOC code 34843-3 + + Group counseling note (Social work) + Group counseling note (Sociaal werk) + + + + Label: LOINC DOC code 34844-1 + + Telephone encounter note (Social work) + Telephone encounter note (Sociaal werk) + + + + Label: LOINC DOC code 34845-8 + + Consultation note (Speech therapy+Audiology) + Consultverslag (Spraaktherapie+Audiologie) + + + + Label: LOINC DOC code 34846-6 + + Evaluation and management note (Speech therapy+Audiology) + Evaluatie en voortgangsverslag (Spraaktherapie+Audiologie) + + + + Label: LOINC DOC code 34847-4 + + Consultation note (Surgery) + Consultverslag (Chirurgie) + + + + Label: LOINC DOC code 34848-2 + + Evaluation and management note (Surgery) + Evaluatie en voortgangsverslag (Chirurgie) + + + + Label: LOINC DOC code 34849-0 + + Consultation note (Thoracic surgery) + Consultverslag (Thorax chirurgie) + + + + Label: LOINC DOC code 34850-8 + + Evaluation and management note (Thoracic surgery) + Evaluatie en voortgangsverslag (Thorax chirurgie) + + + + Label: LOINC DOC code 34851-6 + + Consultation note (Urology) + Consultverslag (Urologie) + + + + Label: LOINC DOC code 34852-4 + + Evaluation and management note (Urology) + Evaluatie en voortgangsverslag (Urologie) + + + + Label: LOINC DOC code 34853-2 + + Consultation note (Vascular surgery) + Consultverslag (Vaatchirurgie) + + + + Label: LOINC DOC code 34854-0 + + Evaluation and management note (Vascular surgery) + Evaluatie en voortgangsverslag (Vaatchirurgie) + + + + Label: LOINC DOC code 34855-7 + + Consultation note (Occupational therapy) + Consultverslag (Bezigheidstherapie) + + + + Label: LOINC DOC code 34856-5 + + Evaluation and management note (Anticoagulation) + Evaluatie en voortgangsverslag (Anticoagulatie) + + + + Label: LOINC DOC code 34857-3 + + Evaluation and management note (Substance abuse) + Evaluatie en voortgangsverslag (Misbruik van substanties) + + + + Label: LOINC DOC code 34858-1 + + Evaluation and management note (Pain management) + Evaluatie en voortgangsverslag (Pijnbestrijding) + + + + Label: LOINC DOC code 34859-9 + + Evaluation and management note (Hyperlipidemia) + Evaluatie en voortgangsverslag (Hyperlipidemia) + + + + Label: LOINC DOC code 34860-7 + + Evaluation and management note (Hypertension) + Evaluatie en voortgangsverslag (Hypertensie) + + + + Label: LOINC DOC code 34895-3 + + Education note ({Provider}) + Opleidingsverslag ({Instelling}) + + + + Label: LOINC DOC code 34896-1 + + Interventional procedure note (Cardiology) + Interventional procedure note (Cardiologie) + + + + Label: LOINC DOC code 34897-9 + + Education note (Diabetology) + Opleidingsverslag (Diabetologie) + + + + Label: LOINC DOC code 34898-7 + + Evaluation and management note (Endocrinology) + Evaluatie en voortgangsverslag (Endocrinologie) + + + + Label: LOINC DOC code 34899-5 + + Interventional procedure note (Gastroenterology) + Interventional procedure note (Gastro-enterologie) + + + + Label: LOINC DOC code 34900-1 + + Subsequent evaluation note (General medicine) + Verslag vervolgonderzoek (Algemene geneeskunde) + + + + Label: LOINC DOC code 34901-9 + + Subsequent evaluation note (General medicine) + Verslag vervolgonderzoek (Algemene geneeskunde) + + + + Label: LOINC DOC code 34902-7 + + Education note (Gerontology) + Opleidingsverslag (Gerontologie) + + + + Label: LOINC DOC code 34903-5 + + Note (Mental health) + Verslag (Geestelijke gezondheidszorg) + + + + Label: LOINC DOC code 34904-3 + + Subsequent evaluation note (Mental health) + Verslag vervolgonderzoek (Geestelijke gezondheidszorg) + + + + Label: LOINC DOC code 34905-0 + + Evaluation and management note (Neurology) + Evaluatie en voortgangsverslag (Neurologie) + + + + Label: LOINC DOC code 34906-8 + + Note (Pastoral care) + Verslag (Pastoral care) + + + + Label: LOINC DOC code 38269-7 + + Study report (XR.DEXA) + Onderzoeksverslag (XR.DEXA) + + + + Label: LOINC DOC code 38932-0 + + VA C&P exam.acromegaly ({Provider}) + VA C&P exam.acromegaly ({Instelling}) + + + + Label: LOINC DOC code 38933-8 + + VA C&P exam.aid and attendance &or housebound ({Provider}) + VA C&P exam.aid and attendance &or housebound ({Instelling}) + + + + Label: LOINC DOC code 38934-6 + + VA C&P exam.arrhythmias ({Provider}) + VA C&P exam.arrhythmias ({Instelling}) + + + + Label: LOINC DOC code 38935-3 + + VA C&P exam.miscellaneous arteries &or veins ({Provider}) + VA C&P exam.miscellaneous arteries &or veins ({Instelling}) + + + + Label: LOINC DOC code 38936-1 + + VA C&P exam.audio ({Provider}) + VA C&P exam.audio ({Instelling}) + + + + Label: LOINC DOC code 38937-9 + + VA C&P exam.bones fractures &or bone disease ({Provider}) + VA C&P exam.bones fractures &or bone disease ({Instelling}) + + + + Label: LOINC DOC code 38938-7 + + VA C&P exam.brain &or spinal cord ({Provider}) + VA C&P exam.brain &or spinal cord ({Instelling}) + + + + Label: LOINC DOC code 38939-5 + + VA C&P exam.chronic fatigue syndrome ({Provider}) + VA C&P exam.chronic fatigue syndrome ({Instelling}) + + + + Label: LOINC DOC code 38940-3 + + VA C&P exam.cold injury protocol ({Provider}) + VA C&P exam.cold injury protocol ({Instelling}) + + + + Label: LOINC DOC code 38941-1 + + VA C&P exam.cranial nerves ({Provider}) + VA C&P exam.cranial nerves ({Instelling}) + + + + Label: LOINC DOC code 38942-9 + + VA C&P exam.Cushings syndrome ({Provider}) + VA C&P exam.Cushings syndrome ({Instelling}) + + + + Label: LOINC DOC code 38985-8 + + VA C&P exam.social &or industrial survey ({Provider}) + VA C&P exam.social &or industrial survey ({Instelling}) + + + + Label: LOINC DOC code 38986-6 + + VA C&P exam.spine ({Provider}) + VA C&P exam.spine ({Instelling}) + + + + Label: LOINC DOC code 38987-4 + + VA C&P exam.stomach &or duodenum &or peritoneal adhesions ({Provider}) + VA C&P exam.stomach &or duodenum &or peritoneal adhesions ({Instelling}) + + + + Label: LOINC DOC code 38988-2 + + VA C&P exam.thyroid &or parathyroid diseases ({Provider}) + VA C&P exam.thyroid &or parathyroid diseases ({Instelling}) + + + + Label: LOINC DOC code 38943-7 + + VA C&P exam.dental &or oral ({Provider}) + VA C&P exam.dental &or oral ({Instelling}) + + + + Label: LOINC DOC code 38944-5 + + VA C&P exam.diabetes mellitus ({Provider}) + VA C&P exam.diabetes mellitus ({Instelling}) + + + + Label: LOINC DOC code 38945-2 + + VA C&P exam.miscellaneous digestive conditions ({Provider}) + VA C&P exam.miscellaneous digestive conditions ({Instelling}) + + + + Label: LOINC DOC code 38946-0 + + VA C&P exam.ear disease ({Provider}) + VA C&P exam.ear disease ({Instelling}) + + + + Label: LOINC DOC code 38947-8 + + VA C&P exam.mental health eating disorders ({Provider}) + VA C&P exam.mental health eating disorders ({Instelling}) + + + + Label: LOINC DOC code 38948-6 + + VA C&P exam.miscellaneous endocrine diseases ({Provider}) + VA C&P exam.miscellaneous endocrine diseases ({Instelling}) + + + + Label: LOINC DOC code 38949-4 + + VA C&P exam.epilepsy &or narcolepsy ({Provider}) + VA C&P exam.epilepsy &or narcolepsy ({Instelling}) + + + + Label: LOINC DOC code 38950-2 + + VA C&P exam.esophagus &or hiatal hernia ({Provider}) + VA C&P exam.esophagus &or hiatal hernia ({Instelling}) + + + + Label: LOINC DOC code 38951-0 + + VA C&P exam.eye ({Provider}) + VA C&P exam.eye ({Instelling}) + + + + Label: LOINC DOC code 38952-8 + + VA C&P exam.feet ({Provider}) + VA C&P exam.feet ({Instelling}) + + + + Label: LOINC DOC code 38953-6 + + VA C&P exam.fibromyalgia ({Provider}) + VA C&P exam.fibromyalgia ({Instelling}) + + + + Label: LOINC DOC code 38954-4 + + VA C&P exam.general medical ({Provider}) + VA C&P exam.general medical ({Instelling}) + + + + Label: LOINC DOC code 38955-1 + + VA C&P exam.genitourinary ({Provider}) + VA C&P exam.genitourinary ({Instelling}) + + + + Label: LOINC DOC code 38956-9 + + VA C&P exam.disability in gulf war veterans ({Provider}) + VA C&P exam.disability in gulf war veterans ({Instelling}) + + + + Label: LOINC DOC code 38957-7 + + VA C&P exam.gynecological conditions &or disorders of the breast ({Provider}) + VA C&P exam.gynecological conditions &or disorders of the breast ({Instelling}) + + + + Label: LOINC DOC code 38958-5 + + VA C&P exam.hand &or thumb &or fingers ({Provider}) + VA C&P exam.hand &or thumb &or fingers ({Instelling}) + + + + Label: LOINC DOC code 38959-3 + + VA C&P exam.heart ({Provider}) + VA C&P exam.heart ({Instelling}) + + + + Label: LOINC DOC code 38960-1 + + VA C&P exam.hemic disorders ({Provider}) + VA C&P exam.hemic disorders ({Instelling}) + + + + Label: LOINC DOC code 38961-9 + + VA C&P exam.HIV-related illness ({Provider}) + VA C&P exam.HIV-related illness ({Instelling}) + + + + Label: LOINC DOC code 38962-7 + + VA C&P exam.hypertension ({Provider}) + VA C&P exam.hypertension ({Instelling}) + + + + Label: LOINC DOC code 38963-5 + + VA C&P exam.infectious &or immune &or nutritional disabilities ({Provider}) + VA C&P exam.infectious &or immune &or nutritional disabilities ({Instelling}) + + + + Label: LOINC DOC code 38964-3 + + VA C&P exam.initial evaluation post-traumatic stress disorder ({Provider}) + VA C&P exam.initial evaluation post-traumatic stress disorder ({Instelling}) + + + + Label: LOINC DOC code 38965-0 + + VA C&P exam.large &or small intestines ({Provider}) + VA C&P exam.large &or small intestines ({Instelling}) + + + + Label: LOINC DOC code 38966-8 + + VA C&P exam.extremity joints ({Provider}) + VA C&P exam.extremity joints ({Instelling}) + + + + Label: LOINC DOC code 38967-6 + + VA C&P exam.liver &or gall bladder &or pancreas ({Provider}) + VA C&P exam.liver &or gall bladder &or pancreas ({Instelling}) + + + + Label: LOINC DOC code 38968-4 + + VA C&P exam.lymphatic disorders ({Provider}) + VA C&P exam.lymphatic disorders ({Instelling}) + + + + Label: LOINC DOC code 38969-2 + + VA C&P exam.general mental disorders ({Provider}) + VA C&P exam.general mental disorders ({Instelling}) + + + + Label: LOINC DOC code 38970-0 + + VA C&P exam.mouth &or lips &or tongue ({Provider}) + VA C&P exam.mouth &or lips &or tongue ({Instelling}) + + + + Label: LOINC DOC code 38971-8 + + VA C&P exam.muscles ({Provider}) + VA C&P exam.muscles ({Instelling}) + + + + Label: LOINC DOC code 38972-6 + + VA C&P exam.miscellaneous neurological disorders ({Provider}) + VA C&P exam.miscellaneous neurological disorders ({Instelling}) + + + + Label: LOINC DOC code 38973-4 + + VA C&P exam.nose &or sinus &or larynx &or pharynx ({Provider}) + VA C&P exam.nose &or sinus &or larynx &or pharynx ({Instelling}) + + + + Label: LOINC DOC code 38974-2 + + VA C&P exam.peripheral nerves ({Provider}) + VA C&P exam.peripheral nerves ({Instelling}) + + + + Label: LOINC DOC code 38975-9 + + VA C&P exam.prisoner of war protocol ({Provider}) + VA C&P exam.prisoner of war protocol ({Instelling}) + + + + Label: LOINC DOC code 38976-7 + + VA C&P exam.pulmonary tuberculosis &or mycobacterial diseases ({Provider}) + VA C&P exam.pulmonary tuberculosis &or mycobacterial diseases ({Instelling}) + + + + Label: LOINC DOC code 38977-5 + + VA C&P exam.rectum &or anus ({Provider}) + VA C&P exam.rectum &or anus ({Instelling}) + + + + Label: LOINC DOC code 38978-3 + + VA C&P exam.residuals of amputations ({Provider}) + VA C&P exam.residuals of amputations ({Instelling}) + + + + Label: LOINC DOC code 38979-1 + + VA C&P exam.obstructive &or restrictive &or interstitial respiratory diseases ({Provider}) + VA C&P exam.obstructive &or restrictive &or interstitial respiratory diseases ({Instelling}) + + + + Label: LOINC DOC code 38980-9 + + VA C&P exam.miscellaneous respiratory diseases ({Provider}) + VA C&P exam.miscellaneous respiratory diseases ({Instelling}) + + + + Label: LOINC DOC code 38981-7 + + VA C&P exam.review evaluation post-traumatic stress disorder ({Provider}) + VA C&P exam.review evaluation post-traumatic stress disorder ({Instelling}) + + + + Label: LOINC DOC code 38982-5 + + VA C&P exam.scars ({Provider}) + VA C&P exam.scars ({Instelling}) + + + + Label: LOINC DOC code 38983-3 + + VA C&P exam.sense of smell &or taste ({Provider}) + VA C&P exam.sense of smell &or taste ({Instelling}) + + + + Label: LOINC DOC code 38984-1 + + VA C&P exam.skin diseases other than scars ({Provider}) + VA C&P exam.skin diseases other than scars ({Instelling}) + + + + Label: LOINC DOC code 46208-5 + + Nursing notes + Verpleegkundig verslag + + + + Label: LOINC DOC code 46209-3 + + Provider orders + + + + Label: LOINC DOC code 46210-1 + + Note (Case manager) + Verslag (Case manager) + + + + Label: LOINC DOC code 46213-5 + + Tilt table study + + + + Label: LOINC DOC code 46214-3 + + Intracardiac ablation study + + + + Label: LOINC DOC code 46215-0 + + Note (Wound care management) + Verslag (Wound care management) + + + + Label: LOINC DOC code 46242-4 + + Vital signs measurements + + + + Label: LOINC DOC code 46264-8 + + History of medical device use ({Provider}) + History of medical device use ({Instelling}) + + + + Label: LOINC DOC code 47039-3 + + Admission history and physical note ({Provider}) + Admission history and physical note ({Instelling}) + + + + Label: LOINC DOC code 47040-1 + + Confirmatory consultation note ({Provider}) + Confirmatory consultation note ({Instelling}) + + + + Label: LOINC DOC code 47041-9 + + Confirmatory consultation note ({Provider}) + Confirmatory consultation note ({Instelling}) + + + + Label: LOINC DOC code 47042-7 + + Counseling note ({Provider}) + Counseling note ({Instelling}) + + + + Label: LOINC DOC code 47043-5 + + Group counseling note ({Provider}) + Group counseling note ({Instelling}) + + + + Label: LOINC DOC code 47044-3 + + Initial evaluation note ({Provider}) + Verslag eerste onderzoek ({Instelling}) + + + + Label: LOINC DOC code 47045-0 + + Study report ({Provider}) + Onderzoeksverslag ({Instelling}) + + + + Label: LOINC DOC code 47046-8 + + Summary of death ({Provider}) + Summary of death ({Instelling}) + + + + Label: LOINC DOC code 47047-6 + + Supervisory note ({Provider}) + Supervisory note ({Instelling}) + + + + Label: LOINC DOC code 47048-4 + + Diagnostic interventional study report (Interventional radiology) + + + + Label: LOINC DOC code 47049-2 + + Communication ({Non-patient}) + + + + Label: LOINC DOC code 47245-6 + + HIV Rx Form + HIV Rx formulier + + + + Label: LOINC DOC code 47420-5 + + Functional status assessment ({Provider}) + Functional status assessment ({Instelling}) + + + + Label: LOINC DOC code 47519-4 + + History of Procedures ({Provider}) + History of Procedures ({Instelling}) + + + + Label: LOINC DOC code 47520-2 + + Cytology report (Cyto stain) + Cytologieverslag (Cyto stain) + + + + Label: LOINC DOC code 47521-0 + + Cytology report (Cyto stain) + Cytologieverslag (Cyto stain) + + + + Label: LOINC DOC code 47522-8 + + Cytology report (Cyto stain) + Cytologieverslag (Cyto stain) + + + + Label: LOINC DOC code 47523-6 + + Cytology report (Cyto stain) + Cytologieverslag (Cyto stain) + + + + Label: LOINC DOC code 47524-4 + + Cytology report (Cyto stain) + Cytologieverslag (Cyto stain) + + + + Label: LOINC DOC code 47525-1 + + Cytology report (Cyto stain) + Cytologieverslag (Cyto stain) + + + + Label: LOINC DOC code 47526-9 + + Cytology report (Cyto stain) + Cytologieverslag (Cyto stain) + + + + Label: LOINC DOC code 47527-7 + + Cytology report (Cyto stain.thin prep) + Cytologieverslag (Cyto stain.thin prep) + + + + Label: LOINC DOC code 47528-5 + + Cytology report (Cyto stain) + Cytologieverslag (Cyto stain) + + + + Label: LOINC DOC code 47529-3 + + Cytology report (XXX stain) + Cytologieverslag (XXX stain) + + + + Label: LOINC DOC code 47530-1 + + Cytology report (Cyto stain) + Cytologieverslag (Cyto stain) + + + + Label: LOINC DOC code 48768-6 + + Payment sources + + + + Label: LOINC DOC code 48764-5 + + Summary purpose + Samenvatting doel + + + + Label: LOINC DOC code 48765-2 + + Allergies, adverse reactions, alerts + Allergieën, allergische reacties, waarschuwingen + + + + Label: LOINC DOC code 48807-2 + + Bone marrow aspiration report + + + + Label: LOINC DOC code 50007-4 + + Cytology report (Cyto stain) + Cytologieverslag (Cyto stain) + + + + Label: LOINC DOC code 51969-4 + + Genetic analysis summary report (Molgen) + + + + Label: LOINC DOC code 52030-4 + + Explanation of benefits attachment + + + + Label: LOINC DOC code 52031-2 + + Explanation of benefits to subscriber attachment + + + + Label: LOINC DOC code 52032-0 + + Appeal denial letter attachment + + + + Label: LOINC DOC code 52033-8 + + General correspondence attachment + + + + Label: LOINC DOC code 52034-6 + + Payer letter attachment + + + + Label: LOINC DOC code 52035-3 + + Home health claims attachment + + + + Label: LOINC DOC code 52036-1 + + Home health prior authorization attachment + + + + Label: LOINC DOC code 52037-9 + + Member ID card copy attachment + + + + Label: LOINC DOC code 52038-7 + + Subscriber Information including retroactive and presumptive eligibility attachment + + + + Label: LOINC DOC code 52039-5 + + Skilled Nursing Facility record attachment + + + + Label: LOINC DOC code 52040-3 + + Dental X-rays and other images (not DICOM) attachment + + + + Label: LOINC DOC code 52041-1 + + Blood glucose monitors attachment + + + + Label: LOINC DOC code 50971-1 + + Cytology report (Cyto stain) + Cytologieverslag (Cyto stain) + + + + Label: LOINC DOC code 51897-7 + + Healthcare Associated Infection report ({Provider}) + Healthcare Associated Infection report ({Instelling}) + + + + Label: LOINC DOC code 51898-5 + + Risk factors ({Provider}) + Risk factors ({Instelling}) + + + + Label: LOINC DOC code 51899-3 + + Details ({Provider}) + Details ({Instelling}) + + + + Label: LOINC DOC code 51900-9 + + Summary ({Provider}) + Samenvatting ({Instelling}) + + + + Label: LOINC DOC code 51845-6 + + Consultation note ({Provider}) + Consultverslag ({Instelling}) + + + + Label: LOINC DOC code 51846-4 + + Consultation note ({Provider}) + Consultverslag ({Instelling}) + + + + Label: LOINC DOC code 51847-2 + + Assessment+Plan note ({Provider}) + Assessment+Plan note ({Instelling}) + + + + Label: LOINC DOC code 51848-0 + + Assessment note ({Provider}) + Assessment note ({Instelling}) + + + + Label: LOINC DOC code 51849-8 + + Admission history and physical note ({Provider}) + Admission history and physical note ({Instelling}) + + + + Label: LOINC DOC code 51850-6 + + Physical findings (Observed) + + + + Label: LOINC DOC code 51851-4 + + Administrative note ({Provider}) + Administratief verslag ({Instelling}) + + + + Label: LOINC DOC code 51852-2 + + Letter ({Provider}) + Brief ({Instelling}) + + + + Label: LOINC DOC code 51853-0 + + Consultation note ({Provider}) + Consultverslag ({Instelling}) + + + + Label: LOINC DOC code 51854-8 + + Consultation note ({Provider}) + Consultverslag ({Instelling}) + + + + Label: LOINC DOC code 51855-5 + + Note (Patient) + Verslag (Patiënt) + + + + Label: LOINC DOC code 51965-2 + + Pharmacogenetic analysis report (Molgen) + + + + Label: LOINC DOC code 52027-0 + + Abortion consent attachment + + + + Label: LOINC DOC code 52028-8 + + Hysterectomy consent attachment + + + + Label: LOINC DOC code 52029-6 + + Sterilization consent attachment + + + + Label: LOINC DOC code 52042-9 + + Continuous positive airway pressure attachment + + + + Label: LOINC DOC code 52043-7 + + Enteral nutrition attachment + + + + Label: LOINC DOC code 52044-5 + + External infusion pump attachment + + + + Label: LOINC DOC code 52045-2 + + Gait trainers attachment + + + + Label: LOINC DOC code 52046-0 + + Hospital beds attachment + + + + Label: LOINC DOC code 52047-8 + + Immunosuppressive drugs attachment + + + + Label: LOINC DOC code 52048-6 + + Lymphedema pumps attachment + + + + Label: LOINC DOC code 52049-4 + + Manual wheelchair attachment + + + + Label: LOINC DOC code 52050-2 + + Motorized wheelchair attachment + + + + Label: LOINC DOC code 52051-0 + + Orthotics + prosthetics attachment + + + + Label: LOINC DOC code 52052-8 + + Osteogenesis stimulators attachment + + + + Label: LOINC DOC code 52053-6 + + Oxygen attachment + + + + Label: LOINC DOC code 52054-4 + + Parenteral attachment + + + + Label: LOINC DOC code 52055-1 + + Power operated vehicles attachment + + + + Label: LOINC DOC code 52056-9 + + Repair of durable medical equipment attachment + + + + Label: LOINC DOC code 52057-7 + + Seat lift mechanism attachment + + + + Label: LOINC DOC code 52058-5 + + Seating systems attachment + + + + Label: LOINC DOC code 52059-3 + + Speech generating device attachment + + + + Label: LOINC DOC code 52060-1 + + Standers + standing frames attachment + + + + Label: LOINC DOC code 52061-9 + + Support surfaces attachment + + + + Label: LOINC DOC code 52062-7 + + Transcutaneous electrical neural stimulation attachment + + + + Label: LOINC DOC code 52063-5 + + Prescription for durable medical equipment attachment + + + + Label: LOINC DOC code 52064-3 + + First report of injury attachment + + + + Label: LOINC DOC code 52065-0 + + Automobile liability attachment + + + + Label: LOINC DOC code 52066-8 + + Notice of Discharge Medicare Appeal Rights Form attachment + + + + Label: LOINC DOC code 52067-6 + + Past filing limit justification attachment + + + + Label: LOINC DOC code 52068-4 + + Property and casualty state mandated forms attachment + + + + Label: LOINC DOC code 52069-2 + + Tax ID number - IRS form W9 attachment + + + + Label: LOINC DOC code 52070-0 + + Workers compensation attachment + + + + Label: LOINC DOC code 52071-8 + + Employee assistance program attachment + + + + Label: LOINC DOC code 52072-6 + + Non-emergency transportation attachment + + + + Label: LOINC DOC code 52073-4 + + Vision attachment + + + + Label: LOINC DOC code 52075-9 + + Purchase invoice attachment + + + + Label: LOINC DOC code 53242-4 + + Charge ticket or encounter form attachment + + + + Label: LOINC DOC code 53243-2 + + Advanced beneficiary notice attachment + + + + Label: LOINC DOC code 53244-0 + + Notice of privacy practices receipt attachment + + + + Label: LOINC DOC code 53245-7 + + Driver license image attachment + Bijlage afbeelding rijbewijs + + + + Label: LOINC DOC code 53246-5 + + Non-medical services attachment + + + + Label: LOINC DOC code 53247-3 + + Eligibility acknowledgement attachment + + + + Label: LOINC DOC code 53576-5 + + Personal health monitoring report ({Provider}) + Personal health monitoring report ({Instelling}) + + + + Label: LOINC DOC code 54094-8 + + Triage note + Triageverslag + + + + Label: LOINC DOC code 54095-5 + + Chemotherapy effectiveness panel + Chemotherapie effectiviteitspanel + + + + Label: LOINC DOC code 54096-3 + + Identity testing (Molgen) + Identiteitstesten (Molgen) + + + + Label: LOINC DOC code 55107-7 + + Addendum + + + + Label: LOINC DOC code 55108-5 + + Clinical presentation + Klinische presentatie + + + + Label: LOINC DOC code 55109-3 + + Complications + Complicaties + + + + Label: LOINC DOC code 55110-1 + + Conclusions + Conclusies + + + + Label: LOINC DOC code 55111-9 + + Current imaging procedure descriptions + + + + Label: LOINC DOC code 55112-7 + + Document summary + Documentsamenvatting + + + + Label: LOINC DOC code 55113-5 + + Key images (Radiology) + Sleutelbeelden (Radiologie) + + + + Label: LOINC DOC code 55114-3 + + Prior imaging procedure descriptions + + + + Label: LOINC DOC code 55115-0 + + Requested imaging studies information + + + + Label: LOINC DOC code 55182-0 + + Quality Reporting Document Architecture incidence report + + + + Label: LOINC DOC code 55183-8 + + Quality Reporting Document Architecture patient list report + + + + Label: LOINC DOC code 55184-6 + + Quality Reporting Document Architecture calculated summary report + + + + Label: LOINC DOC code 55185-3 + + Measure set + Metingenset + + + + Label: LOINC DOC code 55186-1 + + Measure + Metingen + + + + Label: LOINC DOC code 55187-9 + + Reporting parameters + + + + Label: LOINC DOC code 55188-7 + + Patient data + Patiëntgegevens + + + + Label: LOINC DOC code 55228-1 + + Study report (Cytogenetics) + Onderzoeksverslag (Cytogenetics) + + + + Label: LOINC DOC code 55229-9 + + Study report (Immune stain) + Onderzoeksverslag (Immune stain) + + + + Label: LOINC DOC code 55230-7 + + Study report (Immunophenotyping) + Onderzoeksverslag (Immunophenotyping) + + + + Label: LOINC DOC code 55750-4 + + Patient safety report + Verslag patiëntveiligheid + + + + Label: LOINC DOC code 55751-2 + + Public health case report + Volksgezondheid incidentverslag + + + + Label: LOINC DOC code 57056-4 + + Labor and delivery admission history and physical ({Provider}) + Voorgeschiedenis en lichamelijke conditie bij opname zwangerschap en geboorte ({Instelling}) + + + + Label: LOINC DOC code 57057-2 + + Labor and delivery summary ({Provider}) + Samenvatting zwangerschap en geboorte ({Instelling}) + + + + Label: LOINC DOC code 57058-0 + + Maternal Discharge Summary ({Provider}) + Samenvattende ontslagbrief na zwangerschap ({Instelling}) + + + + Label: LOINC DOC code 56444-3 + + Healthcare communication + Zorginstellingsbrief + + + + Label: LOINC DOC code 56445-0 + + Medication summary + Medicijnkaart + + + + Label: LOINC DOC code 56446-8 + + Appointment summary + Afsprakenkaart + + + + Label: LOINC DOC code 56447-6 + + Treatment plan + Behandelplan + + + + Label: LOINC DOC code 57016-8 + + Privacy policy acknowledgment + Onderschrijving privacybeleid (Patiënt) + + + + Label: LOINC DOC code 57017-6 + + Privacy policy + Privacybeleid ({Instelling}) + + + + Label: LOINC DOC code 57024-2 + + Health Quality Measure document + Document voor meting van zorgkwaliteit + + + + Label: LOINC DOC code 57053-1 + + Note (Nursing) + Verslag (Verpleging) + + + + Label: LOINC DOC code 57054-9 + + Triage and nursing note ({Provider}) + Verslag triage en verpleging ({Instelling}) + + + + Label: LOINC DOC code 57055-6 + + Antepartum summary ({Provider}) + Antepartum samenvatting ({Instelling}) + + + + Label: LOINC DOC code 57129-9 + + Full newborn screening summary report for display or printing + Volledig verslag screening nieuwgeborene voor weergave en afdrukken + + + + Label: LOINC DOC code 57133-1 + + Referral note + Verwijsbrief + + + + Label: LOINC DOC code 57134-9 + + Referral note (Dentistry) + Verwijsbrief (Tandheelkunde) + + + + Label: LOINC DOC code 57135-6 + + Referral note (Dermatology) + Verwijsbrief (Dermatologie) + + + + Label: LOINC DOC code 57136-4 + + Referral note (Diabetology) + Verwijsbrief (Diabeteszorg) + + + + Label: LOINC DOC code 57137-2 + + Referral note (Endocrinology) + Verwijsbrief (Endocrinologie) + + + + Label: LOINC DOC code 57138-0 + + Referral note (Gastroenterology) + Verwijsbrief (Gastro-enterologie) + + + + Label: LOINC DOC code 57139-8 + + Referral note (General medicine) + Verwijsbrief (Algemene geneeskunde) + + + + Label: LOINC DOC code 57140-6 + + Referral note (General surgery) + Verwijsbrief (Algemene chirurgie) + + + + Label: LOINC DOC code 57141-4 + + Referral note (Infectious disease) + Verwijsbrief (Infectieziekten) + + + + Label: LOINC DOC code 57142-2 + + Referral note (Kinesiotherapy) + Verwijsbrief (Kinesiotherapie) + + + + Label: LOINC DOC code 57143-0 + + Referral note (Mental health) + Verwijsbrief (Geestelijke gezondheidszorg) + + + + Label: LOINC DOC code 57144-8 + + Referral note (Nephrology) + Verwijsbrief (Nephrologie) + + + + Label: LOINC DOC code 57145-5 + + Referral note (Neurology) + Verwijsbrief (Neurologie) + + + + Label: LOINC DOC code 57146-3 + + Referral note (Neurosurgery) + Verwijsbrief (Neurochirurgie) + + + + Label: LOINC DOC code 57147-1 + + Referral note (Occupational health) + Verwijsbrief (Bezigheidszorg) + + + + Label: LOINC DOC code 57148-9 + + Referral note (Occupational therapy) + Verwijsbrief (Bezigheidstherapie) + + + + Label: LOINC DOC code 57149-7 + + Referral note (Oncology) + Verwijsbrief (Oncologie) + + + + Label: LOINC DOC code 57150-5 + + Referral note (Ophthalmology) + Verwijsbrief (Oogheelkunde) + + + + Label: LOINC DOC code 57151-3 + + Referral note (Optometry) + Verwijsbrief (Optometrie) + + + + Label: LOINC DOC code 57152-1 + + Referral note (Pharmacy) + Verwijsbrief (Apotheek) + + + + Label: LOINC DOC code 57153-9 + + Referral note (Physical medicine and rehabilitation) + Verwijsbrief (Lichaamsgeneeskunde en revalidatie) + + + + Label: LOINC DOC code 57154-7 + + Referral note (Physical therapy) + Verwijsbrief (Lichamelijke oefening) + + + + Label: LOINC DOC code 57155-4 + + Referral note (Plastic surgery) + Verwijsbrief (Plastische chirurgie) + + + + Label: LOINC DOC code 57156-2 + + Referral note (Podiatry) + Verwijsbrief (Podologie) + + + + Label: LOINC DOC code 57157-0 + + Referral note (Psychiatry) + Verwijsbrief (Psychiatrie) + + + + Label: LOINC DOC code 57158-8 + + Referral note (Psychology) + Verwijsbrief (Psychologie) + + + + Label: LOINC DOC code 57159-6 + + Referral note (Radiation oncology) + Verwijsbrief (Radiologische oncologie) + + + + Label: LOINC DOC code 57160-4 + + Referral note (Recreational therapy) + Verwijsbrief (Recreationele therapie) + + + + Label: LOINC DOC code 57161-2 + + Referral note (Rehabilitation) + Verwijsbrief (Revalidatie) + + + + Label: LOINC DOC code 57162-0 + + Referral note (Respiratory therapy) + Verwijsbrief (Ademhalingstherapie) + + + + Label: LOINC DOC code 57163-8 + + Referral note (Rheumatology) + Verwijsbrief (Reumatologie) + + + + Label: LOINC DOC code 57164-6 + + Referral note (Social Work) + Verwijsbrief (Sociaal werk) + + + + Label: LOINC DOC code 57165-3 + + Referral note (Speech therapy) + Verwijsbrief (Spraaktherapie) + + + + Label: LOINC DOC code 57166-1 + + Referral note (Surgery) + Verwijsbrief (Chirurgie) + + + + Label: LOINC DOC code 57167-9 + + Referral note (Thoracic surgery) + Verwijsbrief (Thorax chirurgie) + + + + Label: LOINC DOC code 57168-7 + + Referral note (Urology) + Verwijsbrief (Urologie) + + + + Label: LOINC DOC code 57169-5 + + Referral note (Vascular surgery) + Verwijsbrief (Vasculaire chirurgie) + + + + Label: LOINC DOC code 57170-3 + + Referral note (Cardiovascular disease) + Verwijsbrief (Cardiovasculaire geneeskunde) + + + + Label: LOINC DOC code 57171-1 + + Referral note (Geriatric medicine) + Verwijsbrief (Geriatrie) + + + + Label: LOINC DOC code 57172-9 + + Referral note (Hematology and Oncology) + Verwijsbrief (Hematologie en oncologie) + + + + Label: LOINC DOC code 57173-7 + + Referral note (Nutrition and Dietetics) + Verwijsbrief (Voeding en diëtetiek) + + + + Label: LOINC DOC code 57174-5 + + Referral note (Oral surgery) + Verwijsbrief (Mondchirurgie) + + + + Label: LOINC DOC code 57175-2 + + Referral note (Orthopedic surgery) + Verwijsbrief (Orthopedische chirurgie) + + + + Label: LOINC DOC code 57176-0 + + Referral note (Otolaryngology) + Verwijsbrief (KNO) + + + + Label: LOINC DOC code 57177-8 + + Referral note (Pulmonary disease) + Verwijsbrief (Vaatziekten) + + + + Label: LOINC DOC code 57178-6 + + Referral note (Critical care medicine) + Verwijsbrief (Acute zorg) + + + + Label: LOINC DOC code 57179-4 + + Referral note (Obstetrics and Gynecology) + Verwijsbrief (Obstetrie en gynaecologie) + + + + Label: LOINC DOC code 57829-4 + + Prescription for medical equipment or product + Indicatie voor medische hulpmiddelen of producten + + + + Label: LOINC DOC code 57830-2 + + Admission request + Opnameverzoek + + + + Label: LOINC DOC code 57831-0 + + Prescription for rehabilitation + Indicatie voor revalidatie + + + + Label: LOINC DOC code 57832-8 + + Prescription for diagnostic or specialist care + Indicatie voor diagnostische of specialistische zorg + + + + Label: LOINC DOC code 57833-6 + + Prescription for medication + Medicatievoorschrift + + + + Label: LOINC DOC code 57834-4 + + Patient transportation request + Patiënt transportverzoek + + + + Label: LOINC DOC code 58477-1 + + Study report (Pulmonary function) + Onderzoeksverslag (Vaatfunctie) + + + + Label: LOINC DOC code 59258-4 + + Discharge summarization note ({Provider}) + Samenvattende ontslagbrief ({Instelling}) + + + + Label: LOINC DOC code 59259-2 + + Discharge summarization note (Psychiatry) + Samenvattende ontslagbrief (Psychiatrie) + + + + Label: LOINC DOC code 59268-3 + + Neonatal care report + Verslag neonatale zorg + + + + Label: LOINC DOC code 59281-6 + + Transthoracic cardiac echo study report (US) + Verslag trans-thorax echo-onderzoekt hart (US) + + + + Label: LOINC DOC code 59282-4 + + Stress cardiac echo study report (US) + Verslag echo-onderzoek hartbelasting (US) + + + + Label: LOINC DOC code 59283-2 + + Well child visit note ({Provider}) + Well child visit note ({Instelling}) + + + + Label: LOINC DOC code 59284-0 + + Consent (Patient) + Toestemming (Patiënt) + + + + Label: LOINC DOC code 60280-5 + + Discharge instructions ({Provider}) + Ontslagaanwijzigingen ({Spoedeisende hulp}) + + + + Label: LOINC DOC code 60281-3 + + Discharge Instructions ({Provider}) + Ontslagaanwijzigingen ({Ziekenhuis}) + + + + Label: LOINC DOC code 60568-3 + + Synoptic report + Beknopt verslag report + + + + Label: LOINC DOC code 60569-1 + + Report addendum.synoptic + Toevoeging verslag.beknopt + + + + Label: LOINC DOC code 60570-9 + + Consultation note (Pathology) + Consultverslag (Pathologie) + + + + Label: LOINC DOC code 60571-7 + + Consultation note.synoptic (Pathology) + Consultverslag.beknopt (Pathologie) + + + + Label: LOINC DOC code 60590-7 + + Medication dispensed.brief + Verstrekte medicatie.kort + + + + Label: LOINC DOC code 60591-5 + + Patient summary + Patiënt samenvatting + + + + Label: LOINC DOC code 60592-3 + + Patient summary.unexpected contact + Patiënt samenvatting.onverwacht contact + + + + Label: LOINC DOC code 60593-1 + + Medication dispensed.extended + Verstrekte medicatie.uitgebreid + + + + Label: LOINC DOC code 61143-4 + + Summary (Nursing) + Samenvatting (Verpleging) + + + + Label: LOINC DOC code 61145-9 + + Patient plan of care + Patiënt zorgplan + + + + Label: LOINC DOC code 61356-2 + + Medication pharmaceutical advice.extended + Medicatie farmaceutisch advies.uitgebreid + + + + Label: LOINC DOC code 61357-0 + + Medication pharmaceutical advice.brief + Medicatie farmaceutisch advies.kort + + + + Label: LOINC DOC code 61358-8 + + Surgerical operation consent (Patient) + Toestemming chirugische operatie (Patiënt) + + + + Label: LOINC DOC code 61359-6 + + Anesthesia consent (Patient) + Toestemming anasthesie (Patiënt) + + + + Label: LOINC DOC code 62385-0 + + Recommendation + Aanbeveling + + + + + + Label: LOINC DOC code 10160-0 + + History of medication use + Geschiedenis medicijngebruik + + + + Label: LOINC DOC code 10162-6 + + History of pregnancies + Geschiedenis zwangerschappen + + + + Label: LOINC DOC code 10164-2 + + History of present illness + Geschiedenis van huidige ziekte + + + + Label: LOINC DOC code 10167-5 + + History of surgical procedures + Geschiedenis van chirurgische ingrepen + + + + Label: LOINC DOC code 10830-8 + + Surgical operation note complications + Chirurgisch operatieverslag complicaties + + + + Label: LOINC DOC code 10154-3 + + Chief complaint + Belangrijkste klacht + + + + Label: LOINC DOC code 10155-0 + + History of allergies + Geschiedenis van allergieën + + + + Label: LOINC DOC code 10157-6 + + History of family member diseases + Geschiedenis van ziekte binnen de familie + + + + Label: LOINC DOC code 10183-2 + + Hospital discharge medications + Ziekenhuis ontslagmedicatie + + + + Label: LOINC DOC code 10184-0 + + Hospital discharge physical findings + Ziekenhuis ontslag lichamelijke bevindingen + + + + Label: LOINC DOC code 10187-3 + + Review of systems + Review van systemen + + + + Label: LOINC DOC code 10210-3 + + Physical findings + Lichamelijke bevindingen + + + + Label: LOINC DOC code 10213-7 + + Surgical operation note anesthesia + Chirurgisch operatieverslag anesthesie + + + + Label: LOINC DOC code 10215-2 + + Surgical operation note findings + Chirurgisch operatieverslag bevindingen + + + + Label: LOINC DOC code 10216-0 + + Surgical operation note fluids + Chirurgisch operatieverslag vloeistoffen + + + + Label: LOINC DOC code 10217-8 + + Surgical operation note indications + Chirurgisch operatieverslag indicaties + + + + Label: LOINC DOC code 10218-6 + + Surgical operation note postoperative Dx + Chirurgisch operatieverslag postoperatieve diagnose + + + + Label: LOINC DOC code 10219-4 + + Surgical operation note preoperative Dx + Chirurgisch operatieverslag preoperatieve diagnose + + + + Label: LOINC DOC code 10221-0 + + Surgical operation note specimens taken + Chirurgisch operatieverslag genomen monsters + + + + Label: LOINC DOC code 10223-6 + + Surgical operation note surgical procedure + Chirurgisch operatieverslag chirurgische ingreep + + + + Label: LOINC DOC code 11535-2 + + Hospital discharge Dx + Ziekenhuis onslagdiagnose + + + + Label: LOINC DOC code 11537-8 + + Surgical drains + Chirurgische drains + + + + Label: LOINC DOC code 11283-9 + + Acuity assessment + Vaststelling acute karakter + + + + Label: LOINC DOC code 11302-7 + + ED disposition + ED dispositie + + + + Label: LOINC DOC code 11329-0 + + History general + Voorgeschiedenis + + + + Label: LOINC DOC code 11332-4 + + History of cognitive function + Cognitieve functiegeschiedenis + + + + Label: LOINC DOC code 11336-5 + + History of hospitalizations + Ziekenhuisopnamegeschiedenis + + + + Label: LOINC DOC code 11346-4 + + History of outpatient visits + Poliklinische bezoekgeschiedenis + + + + Label: LOINC DOC code 11348-0 + + History of past illness + Ziektegeschiedenis + + + + Label: LOINC DOC code 11369-6 + + History of immunization + Inentingsgeschiedenis + + + + Label: LOINC DOC code 11370-4 + + Immunization status + Status inentingen + + + + Label: LOINC DOC code 11450-4 + + Problem list + Probleemlijst + + + + Label: LOINC DOC code 11459-5 + + Transport mode + Transportmodus + + + + Label: LOINC DOC code 11493-4 + + Hospital discharge studies summary + Ziekenhuis ontslag samenvatting onderzoeken + + + + Label: LOINC DOC code 18769-0 + + Microbial susceptibility tests + + + + Label: LOINC DOC code 18610-6 + + Medication.administered + Toegediende medicatie + + + + Label: LOINC DOC code 18776-5 + + Plan of treatment + Behandelplan + + + + Label: LOINC DOC code 18782-3 + + Study observation + Observatieonderzoek + + + + Label: LOINC DOC code 18783-1 + + Study recommendation + Onderzoek aanbeveling + + + + Label: LOINC DOC code 18785-6 + + Reason for study + Reden voor onderzoek + + + + Label: LOINC DOC code 18834-2 + + Comparison.study + Vergelijkend.onderzoek + + + + Label: LOINC DOC code 19005-8 + + Imaging study + Beeldvormend onderzoek study + + + + Label: LOINC DOC code 22029-3 + + Physical exam.total + Lichamelijk onderzoek.volledig + + + + Label: LOINC DOC code 29299-5 + + Reason for visit + Reden voor bezoek + + + + Label: LOINC DOC code 29545-1 + + Physical findings + Lichamelijke bevindingen + + + + Label: LOINC DOC code 29762-2 + + Social history + Sociale geschiedenis + + + + Label: LOINC DOC code 30954-2 + + Relevant diagnostic tests &or laboratory data + Relevante diagnostische tests & or laboratoriumgegevens + + + + Label: LOINC DOC code 38212-7 + + Pain assessment panel + Pijn vaststellingspanel + + + + Label: LOINC DOC code 38227-5 + + Braden scale score.total + Braden schaal score.volledig + + + + Label: LOINC DOC code 42348-3 + + Advanced directives + Advanced aanwijzingen + + + + Label: LOINC DOC code 42349-1 + + Reason for referral + Reden voor overplaatsing + + + + Label: LOINC DOC code 46239-0 + + Chief complaint+Reason for visit + Belangrijkste klacht+Reden voor bezoek + + + + Label: LOINC DOC code 46240-8 + + History of hospitalizations+History of outpatient visits + Geschiedenis van ziekenhuisopnames+Geschiedenis van poliklinische bezoeken + + + + Label: LOINC DOC code 46241-6 + + Hospital admission Dx + Ziekenhuis opnamediagnose + + + + Label: LOINC DOC code 55102-8 + + Surgical operation note disposition + Chirurgisch operatieverslag dispositie + + + + Label: LOINC DOC code 55103-6 + + Surgical operation note estimated blood loss + Chirurgisch operatieverslag geschat bloedverlies + + + + Label: LOINC DOC code 55104-4 + + Surgical operation note planned procedure + Chirurgisch operatieverslag geplande ingreep + + + + Label: LOINC DOC code 5511-1 + + CD62E + + + + Label: LOINC DOC code 57059-8 + + Pregnancy visit summary + Samenvatting zwangerschapbezoek + + + + Label: LOINC DOC code 57060-6 + + Estimated date of delivery + A terme datum + + + + Label: LOINC DOC code 57072-1 + + Intravenous fluids administered + Intraveneus toegediende vloeistoffen + + + + Label: LOINC DOC code 57073-9 + + Prenatal events + Prenatale gebeurtenissen + + + + Label: LOINC DOC code 57074-7 + + Labor and delivery process + Verloop zwangerschap en bevalling + + + + Label: LOINC DOC code 57075-4 + + Newborn delivery information + Informatie bevalling nieuwgeborene + + + + Label: LOINC DOC code 57076-2 + + Postpartum hospitalization treatment + Postpartum ziekenhuisbehandeling + + + + Label: LOINC DOC code 57077-0 + + Newborn status at maternal discharge + Status nieuwgeborene bij ontslag moeder + + + + Label: LOINC DOC code 57078-8 + + Antenatal testing and surveillance + Antenatale testen en toezicht + + + + Label: LOINC DOC code 57079-6 + + Birth plan + Geboorteplan + + + + Label: LOINC DOC code 57080-4 + + Implanted medical device + Geïmplanteerd medisch apparaat + + + + Label: LOINC DOC code 57081-2 + + Anesthesia risk review of systems + Anesthesie risicoreview van systemen + + + + Label: LOINC DOC code 56836-0 + + History of blood transfusion + Geschiedenis van bloedtransfusies + + + + Label: LOINC DOC code 56838-6 + + History of infectious disease + Geschiedenis infectieziekten + + + + Label: LOINC DOC code 57025-9 + + Data criteria + Datacriteria + + + + Label: LOINC DOC code 57026-7 + + Population criteria + Populatiecriteria + + + + Label: LOINC DOC code 57027-5 + + Measure observations + Metingen + + + + Label: LOINC DOC code 57827-8 + + Reason for co-payment exemption + Reden voor vrijstelling co-betaling + + + + Label: LOINC DOC code 5782-8 + + Crystals + Kristalvorming + + + + Label: LOINC DOC code 57828-6 + + Prescriptions + Medicatievoorschriften + + + + Label: LOINC DOC code 57826-0 + + Co-payment amount + Co-betaling bedrag + + + + Label: LOINC DOC code 59768-2 + + Procedure indications + Indicaties ingreep + + + + Label: LOINC DOC code 59769-0 + + Postprocedure diagnosis + Diagnose na ingreep + + + + Label: LOINC DOC code 59770-8 + + Procedure estimated blood loss + Bloedverlies ingreep + + + + Label: LOINC DOC code 59771-6 + + Procedure implants + Ingreep implantaten + + + + Label: LOINC DOC code 59772-4 + + Planned procedure + Geplande ingreep + + + + Label: LOINC DOC code 59773-2 + + Procedure specimens taken + Ingreep afgenomen monsters + + + + Label: LOINC DOC code 59774-0 + + Procedure anesthesia + Ingreep anesthesie + + + + Label: LOINC DOC code 59775-7 + + Procedure disposition + Ingreep dispositie + + + + Label: LOINC DOC code 59776-5 + + Procedure findings + Ingreep bevindingen + + + + Label: LOINC DOC code 61144-2 + + Diet and nutrition + Dieet en voeding + + + + Label: LOINC DOC code 61146-7 + + Goals + Doelen + + + + Label: LOINC DOC code 61147-5 + + Expected outcomes + Verwachte uitkomsten + + + + Label: LOINC DOC code 8724-7 + + Surgical operation note description + Chirurgisch operatieverslag omschrijving + + + + Label: LOINC DOC code 8716-3 + + Physical findings + Lichamelijke bevindingen + + + + Label: LOINC DOC code 8648-8 + + Hospital course + Ziekenhuis verloop + + + + Label: LOINC DOC code 8658-7 + + History of allergies + Geschiedenis allergieën + + + + Label: LOINC DOC code 8658-7 + + Fluid intake.intravascular + Vloeistof inname.intravasculair + + + + + + Label: OID ISO 3166 Alpha 2 + + ISO 3166 Alpha 2 + + + + Label: OID ISO 639-1 + + ISO 639-1 + + + + Label: OID EAN Artikelcodes + + EAN Artikelcodes + + + + Label: OID UZI-Zorgverlener + + UZI-Zorgverlener + + + + Label: OID UZI-Systemen + + UZI-Systemen + + + + Label: OID UZI-Registernummer + + UZI-Registernummer + + + + Label: OID RoleCodeNL - zorgaanbiedertype (organisaties) + + RoleCodeNL Zorgaanbiedertype + + + + Label: OID RoleCodeNL - zorgverlenertype (natuurlijke personen) + + RoleCodeNL Zorgverlenertype + + + + Label: OID RoleCodeNL-organisatiedeeltyperingen + + RoleCodeNL Organisatiedeeltype + + + + Label: OID Mate van overgevoeligheid + + Mate van overgevoeligheid + + + + Label: OID ActRegistry:x_DataDomainNL + + ActRegistryNL Gegevenssoort + + + + Label: OID Indicatie geheim + + Indicatie geheim + + + + Label: OID RoleCodeWettelijkeVertegenwoordigerNL + + RoleCodeNL WettelijkeVertegenwoordiger + + + + Label: OID Rolcode tabel Toegang Patiënt + + RolCodeNL Toegang Patiënt + + + + Label: OID Vektis AGB-Z + + Vektis AGB-Z + + + + Label: OID Burgerservicenummer BSN + + NL National PID + Burgerservicenummer + + + + Label: OID UZOVI + + NL UZOVI + UZOVI + + + + Label: OID PALGA servicetypes + + PALGA servicetypes + + + + Label: OID PALGA types obductie + + PALGA types obductie + + + + Label: OID Bestand 361 a-tabel (eenheid gebruiksadvies) + + G-Standaard Bestand 361 a-tabel (eenheid gebruiksadvies) + + + + Label: OID G-Standaard Bestand 651 (obsolete) + + G-Standaard Bestand 651 (obsolete) + + + + Label: OID G-Standaard Bestand 652 (obsolete) + + G-Standaard Bestand 652 (obsolete) + + + + Label: OID G-Standaard Bestand 725 + + G-Standaard Bestand 725 + + + + Label: OID G-Standaard Bestand 750 + + G-Standaard Bestand 750 + + + + Label: OID G-Standaard bestand 902 Thesaurus 2 + + G-Standaard bestand 902 Thesaurus 2 + + + + Label: OID G-Standaard Tabel 122 + + G-Standaard Tabel 122 + + + + Label: OID G-Standaard Tabel 40 + + G-Standaard Tabel 40 + + + + Label: OID G-Standaard GPK + + G-Standaard GPK + + + + Label: OID G-Standaard PRK + + G-Standaard PRK + + + + Label: OID G-Standaard tabel 902 thesaurus 0006 + + G-Standaard tabel 902 thesaurus 0006 + + + + Label: OID G-Standaard tabel 902 thesaurus 4 + + G-Standaard tabel 902 thesaurus 4 + + + + Label: OID Perinatologische observatiecodes + + Perinatologische observatiecodes + + + + Label: OID Perinatologische procedurecodes + + Perinatologische procedurecodes + + + + Label: OID Nederlandse postcodes + + Nederlandse postcodes + + + + Label: OID GBA Landcodes + + GBA Landcodes + + + + Label: OID LMR ontslagbestemmingen + + LMR ontslagbestemmingen + + + + Label: OID Tabel 25 + + Tabel 25 + + + + Label: OID Tabel 25 Tijdseenheden + + Tabel 25 Tijdseenheden + + + + Label: OID Gecodeerde antwoorden bij Code diagnostische bepalingen + + Gecodeerde antwoorden bij Code diagnostische bepalingen + + + + Label: OID NHG Tabel 11 Code sociale laag + + NHG Tabel 11 Code sociale laag + + + + Label: OID NHG Tabel 12 Code specialisme + + NHG Tabel 12 Code specialisme + + + + Label: OID NHG Tabel 14 Code contact + + NHG Tabel 14 Code contact + + + + Label: OID Code verrichtingen + + Code verrichtingen + + + + Label: OID NHG Tabel 20 Code opleiding + + NHG Tabel 20 Code opleiding + + + + Label: OID Code diagnostische bepalingen + + Code diagnostische bepalingen + + + + Label: OID ICPC-1-2000NL + + ICPC-1-2000NL + + + + Label: OID Journaalregeltypen + + Journaalregeltypen + + + + Label: OID Tabel 25 Eenheden gebruiksadvies + + Tabel 25 Eenheden gebruiksadvies + + + + Label: OID Tabel 25 B-codes + + NHG Tabel 25 B-codes + + + + Label: OID Tabel 25 Aanvullende teksten bij medicatiedosering (numcode) + + NHG Tabel 25 Aanvullende teksten + + + + Label: OID G-Standaard HPK + + G-Standaard HPK + + + + Label: OID G-Standaard ZI_nummer + + G-Standaard ZI_nummer + + + + Label: OID Cliq catalogus van hulpmiddelen + + Cliq catalogus van hulpmiddelen + + + + Label: OID G-Standaard thesaurus subtabel 0007 + + G-Standaard thesaurus subtabel 0007 + + + + Label: OID JGZ Regio's + + JGZ Regio's + + + + Label: OID Nederlandse Ministeriële Departementen (Ministeries) + + Nederlands Ministerie + + + + Label: OID SBV-Z Identificatiedocumenttypes + + SBV-Z Identificatiedocumenttypes + + + + Label: OID US Social Security Number + + SSN + + + + Label: OID US National Provider Identifier + + NPI + + + + Label: OID AdministrativeGender + + AdministrativeGender + + + + Label: OID ActMood + + ActMood + + + + Label: OID NullFlavor + + NullFlavor + + + + Label: OID Soort telefoonnummer + + Phone type + Soort telefoonnummer + + + + Label: OID Soort adres + + Address type + Soort adres + + + + Label: OID ActUncertainty + + ActUncertainty + + + + Label: OID ContextControl + + ContextControl + + + + Label: OID EntityCode + + EntityCode + + + + Label: OID ParticipationMode + + ParticipationMode + + + + Label: QueryResponse + + QueryResponse + + + + Label: OID RoleStatus + + RoleStatus + + + + Label: OID SubstitutionCondition + + SubstitutionCondition + + + + Label: OID EducationLevel + + EducationLevel + + + + Label: OID AcknowledgementDetail + + AcknowledgementDetail + + + + Label: OID AcknowledgementDetailCode + + AcknowledgementDetailCode + + + + Label: QueryRequestLimit + + QueryRequestLimit + + + + Label: QueryPriority + + QueryPriority + + + + Label: OID RoleCode + + RoleCode + + + + Label: OID RouteOfAdministration + + RouteOfAdministration + + + + Label: OID TimingEvent + + TimingEvent + + + + Label: OID ActStatus + + ActStatus + + + + Label: OID AcknowledgementType + + AcknowledgementType + + + + Label: OID MaritalStatus + + MaritalStatus + + + + Label: OID Confidentiality + + Confidentiality + + + + Label: OID DocumentCompletion + + DocumentCompletion + + + + Label: OID DocumentStorage + + DocumentStorage + + + + Label: OID ResponseModality + + ResponseModality + + + + Label: OID ActCode + + ActCode + + + + Label: OID ActClass + + ActClass + + + + Label: OID LanguageAbilityMode + + LanguageAbilityMode + + + + Label: OID LanguageAbilityProficiency + + LanguageAbilityProficiency + + + + Label: OID ActPriority + + ActPriority + + + + Label: OID Observation Interpretation + + Observation Interpretation + + + + Label: OID OrderableDrugForm + + OrderableDrugForm + + + + Label: OID ParticipationFunction + + ParticipationFunction + + + + Label: OID ParticipationSignature + + ParticipationSignature + + + + Label: OID LOINC + + LOINC + + + + Label: OID US National Uniform Claim Committee for Provider Types + + NUCC Provider Types + + + + Label: OID HumanLanguage + + HumanLanguage + + + + Label: OID WHO ATC + + WHO ATC + + + + Label: OID HL7 v2 Table 443 Provider Role code system + + HL7v2 Table 443 Provider Role Code + + + + Label: OID Examples + + Examples + Voorbeelden + + + + + Label: security warning text + + WARNING: Javascript injection attempt detected in source CDA document. Terminating + WAARSCHUWING: Javascript-injectiepoging gedetecteerd in bron CDA-document. Einde verwerking + + + + Label: security warning text + + WARNING: Potentially malicious content found in CDA document. + WAARSCHUWING: potentieel kwaadaardige inhoud gevonden in CDA-document. + + + + Label: security warning text + + is in the whitelist + staat op de whitelist + + + + Label: security warning text part1 + + WARNING: non-local image found + WAARSCHUWING: niet-lokale afbeelding gevonden + + + + Label: security warning text part2 + + . Removing. If you wish non-local images preserved please set the limit-external-images param to 'no'. + . Wordt niet verwerkt. Als u niet-lokale afbeelding wilt behouden, dan stelt u de parameter limit-external-images in op 'no'. + + + + Label: logicalOR (e.g. query params with multiple value elements) + + OR + OF + + + + Label: logicalAND (e.g. multiple sibling query params) + + AND + AND + + + + Label: when a document has no name + + Untitled Document + Naamloos document + + + + Label: when a document has no human readable text + + No human-readable content available + Geen voor-mensen-leesbare content beschikbaar + + + + Label: starting point for subject details + + Subject Details + Patiëntgegevens + + + + Label: starting point for author details + + Author Details + Auteurgegevens + + + + Label: starting point for encounter details + + Encounter Details + Bezoekgegevens + + + + Label: starting point for untitled section + + Untitled Section + Naamloze sectie + + + + Error message: Source document must be a bundle + + Source document must be a bundle + Brondocument moet een bundle zijn + + + + Error message: Bundle must start with a Composition resource + + Bundle must start with a Composition resource + Bundle moet beginnen met een Composition resource + + + + Error message: Warning: Bundle type does not indicate it is a document. + + Warning: Bundle type does not indicate it is a document. + Waarschuwing: Bundle type zegt niet dat dit een document is. + + + + Error message: Error: The document composition includes a reference to a resource not contained inside the document bundle: + + Error: The document composition includes a reference to a resource not contained inside the document bundle: + Fout: Er is een verwijzing in de document Composition naar een resource die ontbreekt in de Bundle: + + + + Error message: Error: A referenced resource is not contained and is not fully qualified: + + Error: A referenced resource is not contained and is not fully qualified: + Fout: Er is een verwijzing naar een resource die ontbreekt en waarvan de verwijzing niet volledig is: + + + + Error message: Warning: Headings exceed 6 levels deep. Remaining headings converted to simple paragraphs + + Warning: Headings exceed 6 levels deep. Remaining headings converted to simple paragraphs + Waarschuwing: Kopniveau's gaan dieper dan 6. De overgebleven kopniveau's worden omgezet naar normale paragrafen + + + + Error message: Source document must be a composition + + Source document must be a composition + Brondocument moet een composition zijn + + + diff --git a/src/main/resources/xslt/utilities-l10n.xsd b/src/main/resources/xslt/utilities-l10n.xsd new file mode 100644 index 0000000..38c43f5 --- /dev/null +++ b/src/main/resources/xslt/utilities-l10n.xsd @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From f72f35b9f51dab5a7e9523f9ecf4705355767f13 Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Mon, 19 Feb 2024 13:23:47 +0000 Subject: [PATCH 58/67] Automating docker build and deply Added configurable package parameter fhir.igs --- pom.xml | 2 +- src/main/resources/application.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 2a18fd5..eabc2a8 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ uk.nhs.england IOPS-FHIR-Validation-Service - 6.10.35 + 6.10.37 IOPS-FHIR-Validation-Service HAPI FHIR Validator using Spring Boot diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 81a32b3..74b4e14 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -20,7 +20,7 @@ fhir: server: name: FHIR Development and Testing (FHIR Validation) Skunkworks baseUrl: http://localhost:9001 - version: 6.10.35 + version: 6.10.37 services: R4: true From 8616145ba975660701490a0d30aced88bf028e09 Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Tue, 20 Feb 2024 16:27:26 +0000 Subject: [PATCH 59/67] Automating docker build and deply Added configurable package parameter fhir.igs --- deploy-notes.md | 3 +++ pom.xml | 2 +- src/main/resources/application.yaml | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/deploy-notes.md b/deploy-notes.md index b3a9f2a..a5ef0bc 100644 --- a/deploy-notes.md +++ b/deploy-notes.md @@ -15,6 +15,9 @@ In root folder `mvn clean install -P dockerBuild,dockerRelease,awsRelease` +Run + +`mvn spring-boot:run` and check correct app is working on http://localhost:9001 ### Cloud Formation Notes diff --git a/pom.xml b/pom.xml index eabc2a8..c0402c0 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ uk.nhs.england IOPS-FHIR-Validation-Service - 6.10.37 + 6.10.39 IOPS-FHIR-Validation-Service HAPI FHIR Validator using Spring Boot diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 74b4e14..78f8b06 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -20,7 +20,7 @@ fhir: server: name: FHIR Development and Testing (FHIR Validation) Skunkworks baseUrl: http://localhost:9001 - version: 6.10.37 + version: 6.10.39 services: R4: true From 9eb89ce6f75b54a584888cc7d925a8878b5cc09e Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Tue, 20 Feb 2024 16:35:54 +0000 Subject: [PATCH 60/67] Automating docker build and deply Added configurable package parameter fhir.igs --- interoperability-standards-tools-skunkworks | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interoperability-standards-tools-skunkworks b/interoperability-standards-tools-skunkworks index baa51a7..14adf87 160000 --- a/interoperability-standards-tools-skunkworks +++ b/interoperability-standards-tools-skunkworks @@ -1 +1 @@ -Subproject commit baa51a7d7a2f6be4258e05116205a3a696da566c +Subproject commit 14adf87e737aade3004b1826b72346d1d7ba2f49 From bc97833a8074cd4ca9e53cdb74f55ae9d074f0e0 Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Thu, 22 Feb 2024 15:30:14 +0000 Subject: [PATCH 61/67] HAPI FHIR 7.0.0 and Spring 3 Conversion --- interoperability-standards-tools-skunkworks | 2 +- pom.xml | 65 +++++++++++++++++-- .../england/fhirvalidator/FHIRLOINCServer.kt | 3 +- .../fhirvalidator/FHIRR4BRestfulServer.kt | 3 +- .../fhirvalidator/FHIRR4RestfulServer.kt | 7 +- .../fhirvalidator/FHIRSTU3RestfulServer.kt | 2 +- .../configuration/ApplicationConfiguration.kt | 36 ++++------ .../configuration/FHIRServerProperties.kt | 3 +- .../OAuth2ClientConfiguration.kt | 2 +- .../configuration/SecurityConfiguration.kt | 11 +++- .../configuration/ServicesProperties.kt | 3 +- .../TerminologyValidationProperties.kt | 2 - .../controller/ErrorController.kt | 6 +- .../AWSAuditEventLoggingInterceptor.kt | 6 +- .../interceptor/BasicAuthInterceptor.kt | 2 +- .../interceptor/ValidationInterceptor.kt | 2 +- .../provider/CapabilityStatementProvider.kt | 4 +- .../provider/CodeSystemProvider.kt | 2 +- .../provider/CompostionProvider.kt | 4 +- .../provider/FHIRtoTextProvider.kt | 4 +- .../provider/MarkdownProvider.kt | 4 +- .../fhirvalidator/provider/OpenAPIProvider.kt | 4 +- .../provider/StructureDefinitionProvider.kt | 2 +- .../provider/ValidateR4Provider.kt | 2 +- .../provider/ValueSetProvider.kt | 2 +- .../providerLOINC/CodeSystemLOINCProvider.kt | 2 +- .../providerLOINC/QuestionnaireProvider.kt | 2 +- .../providerLOINC/ValueSetLOINCProvider.kt | 2 +- .../providerSTU3/ConversionProviderSTU3.kt | 2 +- .../providerSTU3/ValidateProviderSTU3.kt | 2 +- .../england/fhirvalidator/util/CorsFilter.kt | 36 ---------- src/main/resources/application.yaml | 2 +- src/main/resources/logback-spring.xml | 2 +- 33 files changed, 126 insertions(+), 107 deletions(-) delete mode 100644 src/main/kotlin/uk/nhs/england/fhirvalidator/util/CorsFilter.kt diff --git a/interoperability-standards-tools-skunkworks b/interoperability-standards-tools-skunkworks index 14adf87..01f8c0d 160000 --- a/interoperability-standards-tools-skunkworks +++ b/interoperability-standards-tools-skunkworks @@ -1 +1 @@ -Subproject commit 14adf87e737aade3004b1826b72346d1d7ba2f49 +Subproject commit 01f8c0dc8da892b3cc9d4a6a9ea966089addaa18 diff --git a/pom.xml b/pom.xml index c0402c0..22c3e73 100644 --- a/pom.xml +++ b/pom.xml @@ -5,20 +5,20 @@ org.springframework.boot spring-boot-starter-parent - 2.7.12 + 3.2.2 uk.nhs.england IOPS-FHIR-Validation-Service - 6.10.39 + 7.0.0 IOPS-FHIR-Validation-Service HAPI FHIR Validator using Spring Boot 20 1.9.22 - 6.10.4 - 2.1.12 + 7.0.0 + 2.2.19 2.0.30 2.15.3 @@ -80,6 +80,63 @@
+ + + jakarta.activation + jakarta.activation-api + 2.1.2 + + + jakarta.annotation + jakarta.annotation-api + 2.1.1 + + + jakarta.ejb + jakarta.ejb-api + 4.0.1 + + + jakarta.interceptor + jakarta.interceptor-api + 2.1.0 + + + jakarta.servlet + jakarta.servlet-api + 6.0.0 + + + jakarta.transaction + jakarta.transaction-api + 2.0.1 + + + jakarta.websocket + jakarta.websocket-client-api + 2.1.1 + + + jakarta.ws.rs + jakarta.ws.rs-api + 3.1.0 + + + jakarta.xml.bind + jakarta.xml.bind-api + 4.0.1 + + + jakarta.validation + jakarta.validation-api + 3.0.2 + + + javax.json + javax.json-api + 1.1.4 + + ca.uhn.hapi.fhir hapi-fhir-base diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRLOINCServer.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRLOINCServer.kt index 57140b7..d6985b7 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRLOINCServer.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRLOINCServer.kt @@ -5,6 +5,7 @@ import ca.uhn.fhir.rest.api.EncodingEnum import ca.uhn.fhir.rest.server.RestfulServer import com.amazonaws.services.sqs.AmazonSQS import com.fasterxml.jackson.databind.ObjectMapper +import jakarta.servlet.annotation.WebServlet import org.springframework.beans.factory.annotation.Autowired import org.springframework.beans.factory.annotation.Qualifier import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty @@ -16,7 +17,7 @@ import uk.nhs.england.fhirvalidator.providerLOINC.CodeSystemLOINCProvider import uk.nhs.england.fhirvalidator.providerLOINC.QuestionnaireProvider import uk.nhs.england.fhirvalidator.providerLOINC.ValueSetLOINCProvider import java.util.* -import javax.servlet.annotation.WebServlet + @ConditionalOnProperty(prefix = "services", name = ["LOINC"]) @WebServlet("/LOINC/R4/*", loadOnStartup = 1) diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRR4BRestfulServer.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRR4BRestfulServer.kt index e6034ed..ceaad0a 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRR4BRestfulServer.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRR4BRestfulServer.kt @@ -3,13 +3,14 @@ package uk.nhs.england.fhirvalidator import ca.uhn.fhir.context.FhirContext import ca.uhn.fhir.rest.api.EncodingEnum import ca.uhn.fhir.rest.server.RestfulServer +import jakarta.servlet.annotation.WebServlet import org.springframework.beans.factory.annotation.Qualifier import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty import uk.nhs.england.fhirvalidator.providerR4B.CapabilityStatementInterceptorR4B import uk.nhs.england.fhirvalidator.providerR4B.MedicinalProductDefinitionProviderR4B import uk.nhs.england.fhirvalidator.providerR4B.PackagedProductDefinitionProviderR4B import java.util.* -import javax.servlet.annotation.WebServlet + @ConditionalOnProperty(prefix = "services", name = ["R4B"]) @WebServlet("/FHIR/R4B/*", loadOnStartup = 1) diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRR4RestfulServer.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRR4RestfulServer.kt index e5d373e..5721cba 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRR4RestfulServer.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRR4RestfulServer.kt @@ -6,6 +6,7 @@ import ca.uhn.fhir.rest.api.EncodingEnum import ca.uhn.fhir.rest.server.RestfulServer import com.amazonaws.services.sqs.AmazonSQS import com.fasterxml.jackson.databind.ObjectMapper +import jakarta.servlet.annotation.WebServlet import org.hl7.fhir.utilities.npm.NpmPackage import org.springframework.beans.factory.annotation.Autowired import org.springframework.beans.factory.annotation.Qualifier @@ -18,10 +19,12 @@ import uk.nhs.england.fhirvalidator.interceptor.ValidationInterceptor import uk.nhs.england.fhirvalidator.model.FHIRPackage import uk.nhs.england.fhirvalidator.provider.* import java.util.* -import javax.servlet.annotation.WebServlet + + @ConditionalOnProperty(prefix = "services", name = ["R4"]) -@WebServlet("/FHIR/R4/*", loadOnStartup = 1) +@WebServlet + ("/FHIR/R4/*", loadOnStartup = 1) class FHIRR4RestfulServer( @Qualifier("R4") fhirContext: FhirContext, @Autowired(required = false) val sqs : AmazonSQS?, diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRSTU3RestfulServer.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRSTU3RestfulServer.kt index b79b1ff..7f4de6f 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRSTU3RestfulServer.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/FHIRSTU3RestfulServer.kt @@ -9,7 +9,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty import uk.nhs.england.fhirvalidator.providerSTU3.ConversionProviderSTU3 import uk.nhs.england.fhirvalidator.providerSTU3.ValidateProviderSTU3 import java.util.* -import javax.servlet.annotation.WebServlet +import jakarta.servlet.annotation.WebServlet @ConditionalOnProperty(prefix = "services", name = ["STU3"]) @WebServlet("/FHIR/STU3/*", loadOnStartup = 1) diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/ApplicationConfiguration.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/ApplicationConfiguration.kt index 868acda..5f2a025 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/ApplicationConfiguration.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/ApplicationConfiguration.kt @@ -13,12 +13,10 @@ import org.springframework.boot.web.servlet.FilterRegistrationBean import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.web.client.RestTemplate -import org.springframework.web.cors.CorsConfiguration -import org.springframework.web.cors.UrlBasedCorsConfigurationSource import uk.nhs.england.fhirvalidator.interceptor.BasicAuthInterceptor import uk.nhs.england.fhirvalidator.interceptor.CognitoAuthInterceptor -import uk.nhs.england.fhirvalidator.util.CorsFilter -import javax.servlet.Filter + + @Configuration open class ApplicationConfiguration( @@ -26,6 +24,7 @@ open class ApplicationConfiguration( ) { private val logger = LoggerFactory.getLogger(MessageProperties::class.java) + @Bean("R4") open fun fhirR4Context(): FhirContext { val fhirContext = FhirContext.forR4Cached() @@ -52,30 +51,25 @@ open class ApplicationConfiguration( return RestTemplate() } - @Bean - open fun corsFilter(): FilterRegistrationBean<*>? { - val source = UrlBasedCorsConfigurationSource() - val config = CorsConfiguration() - config.allowCredentials = true - config.addAllowedOrigin("*") - config.addAllowedHeader("*") - config.addAllowedMethod("*") - source.registerCorsConfiguration("/**", config) - val bean: FilterRegistrationBean<*> = FilterRegistrationBean(CorsFilter()) - bean.order = 0 - return bean - } @Bean - fun getAWSclient(cognitoIdpInterceptor: CognitoAuthInterceptor?, messageProperties: MessageProperties, @Qualifier("R4") ctx : FhirContext): IGenericClient? { + fun getAWSclient( + cognitoIdpInterceptor: CognitoAuthInterceptor?, + messageProperties: MessageProperties, + @Qualifier("R4") ctx: FhirContext + ): IGenericClient? { val client: IGenericClient = ctx.newRestfulGenericClient(messageProperties.getCdrFhirServer()) client.registerInterceptor(cognitoIdpInterceptor) return client } @Bean - fun getBasicAuth(messageProperties: MessageProperties, fhirServerProperties: FHIRServerProperties,@Qualifier("R4") ctx : FhirContext) : BasicAuthInterceptor { - return BasicAuthInterceptor(messageProperties, fhirServerProperties , ctx) + fun getBasicAuth( + messageProperties: MessageProperties, + fhirServerProperties: FHIRServerProperties, + @Qualifier("R4") ctx: FhirContext + ): BasicAuthInterceptor { + return BasicAuthInterceptor(messageProperties, fhirServerProperties, ctx) } @Bean @@ -104,6 +98,4 @@ open class ApplicationConfiguration( return null } } - - } diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/FHIRServerProperties.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/FHIRServerProperties.kt index 1efc450..792c5a5 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/FHIRServerProperties.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/FHIRServerProperties.kt @@ -1,9 +1,8 @@ package uk.nhs.england.fhirvalidator.configuration import org.springframework.boot.context.properties.ConfigurationProperties -import org.springframework.boot.context.properties.ConstructorBinding -@ConstructorBinding + @ConfigurationProperties(prefix = "fhir") data class FHIRServerProperties( var server: Server, diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OAuth2ClientConfiguration.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OAuth2ClientConfiguration.kt index 484a03f..c34be37 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OAuth2ClientConfiguration.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/OAuth2ClientConfiguration.kt @@ -21,7 +21,7 @@ open class OAuth2ClientConfiguration(private val terminologyValidationProperties return ClientRegistration.withRegistrationId(REGISTRATION_ID) .clientId(authorization.clientId) .clientSecret(authorization.clientSecret) - .clientAuthenticationMethod(ClientAuthenticationMethod.POST) + .clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_BASIC) .authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS) .tokenUri(authorization.tokenUrl) .build() diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/SecurityConfiguration.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/SecurityConfiguration.kt index 58b4d45..ef11b8b 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/SecurityConfiguration.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/SecurityConfiguration.kt @@ -1,14 +1,19 @@ package uk.nhs.england.fhirvalidator.configuration +import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.security.config.annotation.web.builders.HttpSecurity import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter + +import org.springframework.security.web.SecurityFilterChain + @Configuration @EnableWebSecurity -open class SecurityConfiguration : WebSecurityConfigurerAdapter() { - override fun configure(http: HttpSecurity) { +open class SecurityConfiguration { + @Bean + public fun configure(http: HttpSecurity): SecurityFilterChain { http.authorizeRequests().anyRequest().permitAll().and().csrf().disable() + return http.build() } } diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/ServicesProperties.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/ServicesProperties.kt index 93afda4..0ab5902 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/ServicesProperties.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/ServicesProperties.kt @@ -1,9 +1,8 @@ package uk.nhs.england.fhirvalidator.configuration import org.springframework.boot.context.properties.ConfigurationProperties -import org.springframework.boot.context.properties.ConstructorBinding -@ConstructorBinding + @ConfigurationProperties(prefix = "services") data class ServicesProperties( var STU3: Boolean, diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/TerminologyValidationProperties.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/TerminologyValidationProperties.kt index 857efd6..931ddb0 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/TerminologyValidationProperties.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/TerminologyValidationProperties.kt @@ -1,9 +1,7 @@ package uk.nhs.england.fhirvalidator.configuration import org.springframework.boot.context.properties.ConfigurationProperties -import org.springframework.boot.context.properties.ConstructorBinding -@ConstructorBinding @ConfigurationProperties(prefix = "terminology") data class TerminologyValidationProperties( var url: String?, diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/controller/ErrorController.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/controller/ErrorController.kt index 47aff1b..0a3f7fd 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/controller/ErrorController.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/controller/ErrorController.kt @@ -4,9 +4,9 @@ import mu.KLogging import org.springframework.boot.web.servlet.error.ErrorController import org.springframework.stereotype.Controller import org.springframework.web.bind.annotation.RequestMapping -import javax.servlet.RequestDispatcher -import javax.servlet.http.HttpServletRequest -import javax.servlet.http.HttpServletResponse +import jakarta.servlet.RequestDispatcher +import jakarta.servlet.http.HttpServletRequest +import jakarta.servlet.http.HttpServletResponse @Controller diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/AWSAuditEventLoggingInterceptor.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/AWSAuditEventLoggingInterceptor.kt index 0e93139..395c289 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/AWSAuditEventLoggingInterceptor.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/AWSAuditEventLoggingInterceptor.kt @@ -20,9 +20,9 @@ import uk.nhs.england.fhirvalidator.configuration.FHIRServerProperties import uk.nhs.england.fhirvalidator.configuration.MessageProperties import java.io.IOException import java.util.* -import javax.servlet.ServletException -import javax.servlet.http.HttpServletRequest -import javax.servlet.http.HttpServletResponse +import jakarta.servlet.ServletException +import jakarta.servlet.http.HttpServletRequest +import jakarta.servlet.http.HttpServletResponse @Interceptor class AWSAuditEventLoggingInterceptor( diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/BasicAuthInterceptor.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/BasicAuthInterceptor.kt index 3302b72..02f0bd5 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/BasicAuthInterceptor.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/BasicAuthInterceptor.kt @@ -26,7 +26,7 @@ import java.io.IOException import java.io.InputStreamReader import java.net.HttpURLConnection import java.net.URL -import javax.servlet.http.HttpServletRequest +import jakarta.servlet.http.HttpServletRequest class BasicAuthInterceptor(val messageProperties: MessageProperties, diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/ValidationInterceptor.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/ValidationInterceptor.kt index f57c506..23a2ed3 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/ValidationInterceptor.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/interceptor/ValidationInterceptor.kt @@ -21,7 +21,7 @@ import java.io.IOException import java.io.InputStreamReader import java.net.HttpURLConnection import java.net.URL -import javax.servlet.http.HttpServletRequest +import jakarta.servlet.http.HttpServletRequest @Interceptor diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/CapabilityStatementProvider.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/CapabilityStatementProvider.kt index b922985..cb1bbc0 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/CapabilityStatementProvider.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/CapabilityStatementProvider.kt @@ -15,8 +15,8 @@ import org.springframework.stereotype.Component import uk.nhs.england.fhirvalidator.service.ImplementationGuideParser import uk.nhs.england.fhirvalidator.service.oas.CapabilityStatementToOpenAPIConversion import java.nio.charset.StandardCharsets -import javax.servlet.http.HttpServletRequest -import javax.servlet.http.HttpServletResponse +import jakarta.servlet.http.HttpServletRequest +import jakarta.servlet.http.HttpServletResponse @Component diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/CodeSystemProvider.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/CodeSystemProvider.kt index 58f0d35..be78a4a 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/CodeSystemProvider.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/CodeSystemProvider.kt @@ -20,7 +20,7 @@ import uk.nhs.england.fhirvalidator.service.CodingSupport import uk.nhs.england.fhirvalidator.service.ImplementationGuideParser import uk.nhs.england.fhirvalidator.shared.LookupCodeResultUK import java.nio.charset.StandardCharsets -import javax.servlet.http.HttpServletRequest +import jakarta.servlet.http.HttpServletRequest @Component class CodeSystemProvider (@Qualifier("R4") private val fhirContext: FhirContext, diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/CompostionProvider.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/CompostionProvider.kt index 44dc359..a813307 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/CompostionProvider.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/CompostionProvider.kt @@ -15,8 +15,8 @@ import org.springframework.stereotype.Component import uk.nhs.england.fhirvalidator.service.ImplementationGuideParser import uk.nhs.england.fhirvalidator.util.MyUriResolver import java.io.ByteArrayInputStream -import javax.servlet.http.HttpServletRequest -import javax.servlet.http.HttpServletResponse +import jakarta.servlet.http.HttpServletRequest +import jakarta.servlet.http.HttpServletResponse import javax.xml.transform.Transformer import javax.xml.transform.TransformerFactory import javax.xml.transform.stream.StreamResult diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/FHIRtoTextProvider.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/FHIRtoTextProvider.kt index 5a7319c..b910c07 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/FHIRtoTextProvider.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/FHIRtoTextProvider.kt @@ -6,6 +6,8 @@ import ca.uhn.fhir.context.support.ValidationSupportContext import ca.uhn.fhir.model.api.IElement import ca.uhn.fhir.rest.annotation.Operation import ca.uhn.fhir.rest.annotation.ResourceParam +import jakarta.servlet.http.HttpServletRequest +import jakarta.servlet.http.HttpServletResponse import org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain import org.hl7.fhir.instance.model.api.IBaseResource import org.hl7.fhir.r4.model.* @@ -15,8 +17,6 @@ import uk.nhs.england.fhirvalidator.service.CodingSupport import java.net.URI import java.nio.charset.StandardCharsets import java.text.SimpleDateFormat -import javax.servlet.http.HttpServletRequest -import javax.servlet.http.HttpServletResponse import kotlin.reflect.KClass import kotlin.reflect.full.memberProperties import kotlin.reflect.jvm.isAccessible diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/MarkdownProvider.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/MarkdownProvider.kt index a496c4f..ba79db4 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/MarkdownProvider.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/MarkdownProvider.kt @@ -10,8 +10,8 @@ import org.springframework.beans.factory.annotation.Qualifier import org.springframework.stereotype.Component import uk.nhs.england.fhirvalidator.service.oas.CapabilityStatementToOpenAPIConversion import java.nio.charset.StandardCharsets -import javax.servlet.http.HttpServletRequest -import javax.servlet.http.HttpServletResponse +import jakarta.servlet.http.HttpServletRequest +import jakarta.servlet.http.HttpServletResponse @Component class MarkdownProvider ( diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/OpenAPIProvider.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/OpenAPIProvider.kt index f355202..192ef95 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/OpenAPIProvider.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/OpenAPIProvider.kt @@ -14,8 +14,8 @@ import org.springframework.beans.factory.annotation.Qualifier import org.springframework.stereotype.Component import uk.nhs.england.fhirvalidator.service.oas.OpenAPItoCapabilityStatementConversion import uk.nhs.england.fhirvalidator.util.createOperationOutcome -import javax.servlet.http.HttpServletRequest -import javax.servlet.http.HttpServletResponse +import jakarta.servlet.http.HttpServletRequest +import jakarta.servlet.http.HttpServletResponse @Component diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/StructureDefinitionProvider.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/StructureDefinitionProvider.kt index d91f67f..ded07b9 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/StructureDefinitionProvider.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/StructureDefinitionProvider.kt @@ -19,7 +19,7 @@ import org.springframework.stereotype.Component import uk.nhs.england.fhirvalidator.service.ImplementationGuideParser import java.net.URLDecoder import java.nio.charset.StandardCharsets -import javax.servlet.http.HttpServletRequest +import jakarta.servlet.http.HttpServletRequest @Component class StructureDefinitionProvider ( diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/ValidateR4Provider.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/ValidateR4Provider.kt index bd967d5..e8d669b 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/ValidateR4Provider.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/ValidateR4Provider.kt @@ -24,7 +24,7 @@ import uk.nhs.england.fhirvalidator.service.interactions.FHIRRESTful import uk.nhs.england.fhirvalidator.util.createOperationOutcome import java.net.URLDecoder import java.nio.charset.StandardCharsets -import javax.servlet.http.HttpServletRequest +import jakarta.servlet.http.HttpServletRequest @Component class ValidateR4Provider ( diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/ValueSetProvider.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/ValueSetProvider.kt index b320c37..06b2e74 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/ValueSetProvider.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/provider/ValueSetProvider.kt @@ -32,7 +32,7 @@ import uk.nhs.england.fhirvalidator.util.AccessTokenInterceptor import uk.nhs.england.fhirvalidator.util.FhirSystems import java.nio.charset.StandardCharsets import java.util.* -import javax.servlet.http.HttpServletRequest +import jakarta.servlet.http.HttpServletRequest @Component class ValueSetProvider (@Qualifier("R4") private val fhirContext: FhirContext, diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/providerLOINC/CodeSystemLOINCProvider.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/providerLOINC/CodeSystemLOINCProvider.kt index 8f967e5..c2be685 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/providerLOINC/CodeSystemLOINCProvider.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/providerLOINC/CodeSystemLOINCProvider.kt @@ -21,7 +21,7 @@ import uk.nhs.england.fhirvalidator.service.CodingSupport import uk.nhs.england.fhirvalidator.service.ImplementationGuideParser import uk.nhs.england.fhirvalidator.shared.LookupCodeResultUK import java.nio.charset.StandardCharsets -import javax.servlet.http.HttpServletRequest +import jakarta.servlet.http.HttpServletRequest @Component class CodeSystemLOINCProvider (@Qualifier("R4") private val fhirContext: FhirContext, diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/providerLOINC/QuestionnaireProvider.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/providerLOINC/QuestionnaireProvider.kt index b90c45e..7a4aabd 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/providerLOINC/QuestionnaireProvider.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/providerLOINC/QuestionnaireProvider.kt @@ -10,7 +10,7 @@ import org.hl7.fhir.r4.model.* import org.springframework.beans.factory.annotation.Qualifier import org.springframework.stereotype.Component import uk.nhs.england.fhirvalidator.interceptor.BasicAuthInterceptor -import javax.servlet.http.HttpServletRequest +import jakarta.servlet.http.HttpServletRequest @Component class QuestionnaireProvider (@Qualifier("R4") private val fhirContext: FhirContext, diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/providerLOINC/ValueSetLOINCProvider.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/providerLOINC/ValueSetLOINCProvider.kt index 94686c3..ef5861b 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/providerLOINC/ValueSetLOINCProvider.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/providerLOINC/ValueSetLOINCProvider.kt @@ -33,7 +33,7 @@ import uk.nhs.england.fhirvalidator.util.AccessTokenInterceptor import uk.nhs.england.fhirvalidator.util.FhirSystems import java.nio.charset.StandardCharsets import java.util.* -import javax.servlet.http.HttpServletRequest +import jakarta.servlet.http.HttpServletRequest @Component class ValueSetLOINCProvider( @Qualifier("R4") private val fhirContext: FhirContext, diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/providerSTU3/ConversionProviderSTU3.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/providerSTU3/ConversionProviderSTU3.kt index 0aa175a..38e8e3d 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/providerSTU3/ConversionProviderSTU3.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/providerSTU3/ConversionProviderSTU3.kt @@ -17,7 +17,7 @@ import org.hl7.fhir.dstu3.model.Resource import org.hl7.fhir.dstu3.model.ResourceType import org.springframework.stereotype.Component import uk.nhs.england.fhirvalidator.util.createSTU3OperationOutcome -import javax.servlet.http.HttpServletRequest +import jakarta.servlet.http.HttpServletRequest @Component class ConversionProviderSTU3 () { diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/providerSTU3/ValidateProviderSTU3.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/providerSTU3/ValidateProviderSTU3.kt index e5c4ce5..ceff260 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/providerSTU3/ValidateProviderSTU3.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/providerSTU3/ValidateProviderSTU3.kt @@ -18,7 +18,7 @@ import org.hl7.fhir.dstu3.model.ResourceType import org.springframework.stereotype.Component import uk.nhs.england.fhirvalidator.util.createSTU3OperationOutcome import uk.nhs.england.fhirvalidator.util.createSTU3OperationOutcomeR4 -import javax.servlet.http.HttpServletRequest +import jakarta.servlet.http.HttpServletRequest @Component class ValidateProviderSTU3 ( diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/util/CorsFilter.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/util/CorsFilter.kt deleted file mode 100644 index 71e7324..0000000 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/util/CorsFilter.kt +++ /dev/null @@ -1,36 +0,0 @@ -package uk.nhs.england.fhirvalidator.util - -import org.slf4j.Logger -import org.slf4j.LoggerFactory -import org.springframework.http.HttpHeaders -import java.io.IOException -import javax.servlet.* -import javax.servlet.http.HttpServletRequest -import javax.servlet.http.HttpServletResponse - -class CorsFilter :Filter { - - - @Throws(IOException::class, ServletException::class) - override fun doFilter(req: ServletRequest, res: ServletResponse, chain: FilterChain) { - val response = res as HttpServletResponse - val request = req as HttpServletRequest - if ("OPTIONS" != request.method) { - response.setHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, "*") - chain.doFilter(req, res) - } else { - // log.debug("Cors Filter: {}", request.method) - response.setHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, "*") - response.setHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, "POST, PUT, GET, OPTIONS, DELETE") - response.setHeader(HttpHeaders.ACCESS_CONTROL_MAX_AGE, "3600") - response.setHeader( - HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, - "X-FHIR-Starter,authorization,Prefer,Origin,Accept,X-Requested-With,Content-Type,Access-Control-Request-Method,Access-Control-Request-Headers" - ) - } - } - - override fun init(filterConfig: FilterConfig?) {} - - override fun destroy() {} -} diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 78f8b06..67ce064 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -20,7 +20,7 @@ fhir: server: name: FHIR Development and Testing (FHIR Validation) Skunkworks baseUrl: http://localhost:9001 - version: 6.10.39 + version: 7.0.0 services: R4: true diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml index 1856896..aa69cce 100644 --- a/src/main/resources/logback-spring.xml +++ b/src/main/resources/logback-spring.xml @@ -16,7 +16,7 @@ class="ch.qos.logback.core.ConsoleAppender"> - %-5level %C{1.}: %msg%n + %-5level %C{1}: %msg%n From f21731d84a5ac4b5bda03440544e3c2b8413fc29 Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Thu, 22 Feb 2024 16:58:19 +0000 Subject: [PATCH 62/67] HAPI FHIR 7.0.0 and Spring 3 Conversion --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 22c3e73..d0f58c2 100644 --- a/pom.xml +++ b/pom.xml @@ -20,7 +20,7 @@ 7.0.0 2.2.19 2.0.30 - 2.15.3 + 2.16.1 From 9f4ab097ea4ef93483b9a6a9cd432721d7bd4182 Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Fri, 23 Feb 2024 07:28:31 +0000 Subject: [PATCH 63/67] HAPI FHIR 7.0.0 and Spring 3 Conversion --- deploy-notes.md | 18 +-- pom.xml | 103 ++++++++++++++++-- .../configuration/ApplicationConfiguration.kt | 10 +- .../configuration/SecurityConfiguration.kt | 32 +++++- 4 files changed, 140 insertions(+), 23 deletions(-) diff --git a/deploy-notes.md b/deploy-notes.md index a5ef0bc..af6e0a6 100644 --- a/deploy-notes.md +++ b/deploy-notes.md @@ -1,19 +1,19 @@ -## AWS - -Use AWS Toolkit terminal - -`aws ecr get-login-password --region eu-west-2 | docker login --username AWS --password-stdin 365027538941.dkr.ecr.eu-west-2.amazonaws.com` +## General Do this first if app has changed or app code is not present in the static folder (may need to run `git submodule update` (maybe `git submodule foreach git pull`) and `npm install`) -In **interoperability-standards-tools-skunkworks** folder +Run these separately as the angular has different location for the swagger pages -`ng build --configuration production --output-path ../src/main/resources/static --base-href ./` +### docker -In root folder +`mvn clean install -P dockerBuild,dockerRelease` + +### AWS ECR + +`aws ecr get-login-password --region eu-west-2 | docker login --username AWS --password-stdin 365027538941.dkr.ecr.eu-west-2.amazonaws.com` -`mvn clean install -P dockerBuild,dockerRelease,awsRelease` +`mvn clean install -P dockerBuild,awsRelease` Run diff --git a/pom.xml b/pom.xml index d0f58c2..f39af41 100644 --- a/pom.xml +++ b/pom.xml @@ -18,8 +18,8 @@ 20 1.9.22 7.0.0 - 2.2.19 - 2.0.30 + 2.2.20 + 2.1.20 2.16.1 @@ -136,6 +136,11 @@ javax.json-api 1.1.4 + + javax.xml.bind + jaxb-api + 2.3.1 + ca.uhn.hapi.fhir @@ -182,6 +187,11 @@ hapi-fhir-validation-resources-dstu3 ${fhir.version} + + ca.uhn.hapi.fhir + hapi-fhir-caching-caffeine + ${fhir.version} + io.github.microutils kotlin-logging @@ -215,8 +225,8 @@ org.springdoc - springdoc-openapi-ui - 1.6.4 + springdoc-openapi-starter-webmvc-ui + 2.3.0 @@ -225,11 +235,6 @@ 2.5.5 - - org.jetbrains.kotlin - kotlin-reflect - - com.amazonaws @@ -246,7 +251,7 @@ xalan xalan - 2.7.2 + 2.7.3 xalan @@ -371,6 +376,45 @@ dockerRelease + + maven-clean-plugin + 3.0.0 + + + + src/main/resources/static + false + + + + + + org.codehaus.mojo + exec-maven-plugin + 1.6.0 + + + running ng build docker + generate-sources + + exec + + + interoperability-standards-tools-skunkworks + ng + + build + --configuration + docker + --output-path + ../src/main/resources/static + --base-href + ./ + + + + + org.apache.maven.plugins maven-antrun-plugin @@ -427,6 +471,45 @@ awsRelease + + maven-clean-plugin + 3.0.0 + + + + src/main/resources/static + false + + + + + + org.codehaus.mojo + exec-maven-plugin + 1.6.0 + + + running ng build production + generate-sources + + exec + + + interoperability-standards-tools-skunkworks + ng + + build + --configuration + production + --output-path + ../src/main/resources/static + --base-href + ./ + + + + + org.apache.maven.plugins maven-antrun-plugin diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/ApplicationConfiguration.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/ApplicationConfiguration.kt index 5f2a025..4f0abac 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/ApplicationConfiguration.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/ApplicationConfiguration.kt @@ -9,13 +9,15 @@ import com.amazonaws.services.sqs.model.AmazonSQSException import com.amazonaws.services.sqs.model.CreateQueueRequest import org.slf4j.LoggerFactory import org.springframework.beans.factory.annotation.Qualifier -import org.springframework.boot.web.servlet.FilterRegistrationBean import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.web.client.RestTemplate +import org.springframework.web.cors.CorsConfiguration +import org.springframework.web.cors.CorsConfigurationSource +import org.springframework.web.cors.UrlBasedCorsConfigurationSource import uk.nhs.england.fhirvalidator.interceptor.BasicAuthInterceptor import uk.nhs.england.fhirvalidator.interceptor.CognitoAuthInterceptor - +import java.util.* @Configuration @@ -98,4 +100,8 @@ open class ApplicationConfiguration( return null } } + + + + } diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/SecurityConfiguration.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/SecurityConfiguration.kt index ef11b8b..73ed4f8 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/SecurityConfiguration.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/SecurityConfiguration.kt @@ -4,8 +4,11 @@ import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.security.config.annotation.web.builders.HttpSecurity import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity - import org.springframework.security.web.SecurityFilterChain +import org.springframework.web.cors.CorsConfiguration +import org.springframework.web.cors.CorsConfigurationSource +import org.springframework.web.cors.UrlBasedCorsConfigurationSource +import java.util.* @Configuration @@ -13,7 +16,32 @@ import org.springframework.security.web.SecurityFilterChain open class SecurityConfiguration { @Bean public fun configure(http: HttpSecurity): SecurityFilterChain { - http.authorizeRequests().anyRequest().permitAll().and().csrf().disable() + http + .authorizeHttpRequests { authorize -> + authorize + .anyRequest().permitAll() + } + .csrf { csrf -> + csrf + .disable() + } + .cors{ cors -> corsConfigurationSource()}; return http.build() } + + @Bean + fun corsConfigurationSource(): CorsConfigurationSource { + val configuration = CorsConfiguration() + configuration.addAllowedMethod("GET") + configuration.addAllowedMethod("PATCH") + configuration.addAllowedMethod("PUT") + configuration.addAllowedMethod("POST") + configuration.addAllowedMethod("OPTIONS") + configuration.allowedOrigins = Arrays.asList("*") + configuration.allowedMethods = Arrays.asList("*") + configuration.allowedHeaders = Arrays.asList("*") + val source = UrlBasedCorsConfigurationSource() + source.registerCorsConfiguration("/**", configuration) + return source + } } From 4330bb7a17fc59779e4204ebffd56432d552bbce Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Fri, 23 Feb 2024 08:45:54 +0000 Subject: [PATCH 64/67] HAPI FHIR 7.0.0 and Spring 3 Conversion --- pom.xml | 2 +- .../configuration/SecurityConfiguration.kt | 14 +++++++++++--- src/main/resources/application.yaml | 2 +- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index f39af41..0f75de7 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ uk.nhs.england IOPS-FHIR-Validation-Service - 7.0.0 + 7.0.1 IOPS-FHIR-Validation-Service HAPI FHIR Validator using Spring Boot diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/SecurityConfiguration.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/SecurityConfiguration.kt index 73ed4f8..5873adc 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/SecurityConfiguration.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/SecurityConfiguration.kt @@ -5,6 +5,7 @@ import org.springframework.context.annotation.Configuration import org.springframework.security.config.annotation.web.builders.HttpSecurity import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity import org.springframework.security.web.SecurityFilterChain +import org.springframework.http.HttpHeaders import org.springframework.web.cors.CorsConfiguration import org.springframework.web.cors.CorsConfigurationSource import org.springframework.web.cors.UrlBasedCorsConfigurationSource @@ -25,7 +26,7 @@ open class SecurityConfiguration { csrf .disable() } - .cors{ cors -> corsConfigurationSource()}; + .cors{ cors -> corsConfigurationSource()} return http.build() } @@ -33,13 +34,20 @@ open class SecurityConfiguration { fun corsConfigurationSource(): CorsConfigurationSource { val configuration = CorsConfiguration() configuration.addAllowedMethod("GET") - configuration.addAllowedMethod("PATCH") + configuration.addAllowedMethod("PUT") configuration.addAllowedMethod("PUT") configuration.addAllowedMethod("POST") configuration.addAllowedMethod("OPTIONS") configuration.allowedOrigins = Arrays.asList("*") - configuration.allowedMethods = Arrays.asList("*") + //configuration.allowedMethods = Arrays.asList("*") configuration.allowedHeaders = Arrays.asList("*") + configuration.maxAge = 3600 + configuration.exposedHeaders = Arrays.asList( + HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, + HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, + HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, + HttpHeaders.ACCESS_CONTROL_MAX_AGE, + HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS) val source = UrlBasedCorsConfigurationSource() source.registerCorsConfiguration("/**", configuration) return source diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 67ce064..4f03f78 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -20,7 +20,7 @@ fhir: server: name: FHIR Development and Testing (FHIR Validation) Skunkworks baseUrl: http://localhost:9001 - version: 7.0.0 + version: 7.0.1 services: R4: true From fcd7b78eb9c1015b29de5da5f5ca0048e636e18b Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Fri, 23 Feb 2024 16:15:57 +0000 Subject: [PATCH 65/67] CORS changes --- interoperability-standards-tools-skunkworks | 2 +- pom.xml | 2 +- .../configuration/SecurityConfiguration.kt | 15 ++++++++------- src/main/resources/application.yaml | 2 +- src/main/resources/manifest.json | 16 ---------------- 5 files changed, 11 insertions(+), 26 deletions(-) diff --git a/interoperability-standards-tools-skunkworks b/interoperability-standards-tools-skunkworks index 01f8c0d..14adf87 160000 --- a/interoperability-standards-tools-skunkworks +++ b/interoperability-standards-tools-skunkworks @@ -1 +1 @@ -Subproject commit 01f8c0dc8da892b3cc9d4a6a9ea966089addaa18 +Subproject commit 14adf87e737aade3004b1826b72346d1d7ba2f49 diff --git a/pom.xml b/pom.xml index 0f75de7..67b5925 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ uk.nhs.england IOPS-FHIR-Validation-Service - 7.0.1 + 7.0.2 IOPS-FHIR-Validation-Service HAPI FHIR Validator using Spring Boot diff --git a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/SecurityConfiguration.kt b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/SecurityConfiguration.kt index 5873adc..ad40131 100644 --- a/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/SecurityConfiguration.kt +++ b/src/main/kotlin/uk/nhs/england/fhirvalidator/configuration/SecurityConfiguration.kt @@ -6,6 +6,7 @@ import org.springframework.security.config.annotation.web.builders.HttpSecurity import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity import org.springframework.security.web.SecurityFilterChain import org.springframework.http.HttpHeaders +import org.springframework.security.web.header.writers.StaticHeadersWriter import org.springframework.web.cors.CorsConfiguration import org.springframework.web.cors.CorsConfigurationSource import org.springframework.web.cors.UrlBasedCorsConfigurationSource @@ -27,6 +28,12 @@ open class SecurityConfiguration { .disable() } .cors{ cors -> corsConfigurationSource()} + .headers{ + headers -> + headers.addHeaderWriter(StaticHeadersWriter("Access-Control-Allow-Origin", "*")) + headers.addHeaderWriter(StaticHeadersWriter("Access-Control-Allow-Headers", "Content-Type,Authorization,X-Amz-Date,X-Api-Key,X-Amz-Security-Token")) + headers.addHeaderWriter(StaticHeadersWriter("Access-Control-Allow-Methods", "DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT")) + } return http.build() } @@ -39,15 +46,9 @@ open class SecurityConfiguration { configuration.addAllowedMethod("POST") configuration.addAllowedMethod("OPTIONS") configuration.allowedOrigins = Arrays.asList("*") - //configuration.allowedMethods = Arrays.asList("*") configuration.allowedHeaders = Arrays.asList("*") configuration.maxAge = 3600 - configuration.exposedHeaders = Arrays.asList( - HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, - HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, - HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, - HttpHeaders.ACCESS_CONTROL_MAX_AGE, - HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS) + configuration.exposedHeaders = Arrays.asList("Access-Control-Request-Method", "Access-Control-Request-Headers") val source = UrlBasedCorsConfigurationSource() source.registerCorsConfiguration("/**", configuration) return source diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 4f03f78..77d3865 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -20,7 +20,7 @@ fhir: server: name: FHIR Development and Testing (FHIR Validation) Skunkworks baseUrl: http://localhost:9001 - version: 7.0.1 + version: 7.0.2 services: R4: true diff --git a/src/main/resources/manifest.json b/src/main/resources/manifest.json index a6ea009..4f88188 100644 --- a/src/main/resources/manifest.json +++ b/src/main/resources/manifest.json @@ -2,21 +2,5 @@ { "packageName": "fhir.r4.nhsengland.stu1", "version": "1.1.0" - }, - { - "packageName": "hl7.fhir.uv.sdc", - "version": "3.0.0" - }, - { - "packageName": "hl7.fhir.uv.ipa", - "version": "1.0.0" - }, - { - "packageName": "hl7.fhir.eu.laboratory", - "version": "0.1.0-ballot" - }, - { - "packageName": "uk.nhsengland.r4", - "version": "0.0.0-prerelease" } ] From cd3d863d1e78d6c18cdebb00ed3f35dbd32efd70 Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Fri, 15 Mar 2024 08:11:29 +0000 Subject: [PATCH 66/67] Git reset of previous push and version change --- interoperability-standards-tools-skunkworks | 2 +- pom.xml | 2 +- src/main/resources/application.yaml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/interoperability-standards-tools-skunkworks b/interoperability-standards-tools-skunkworks index 14adf87..01f8c0d 160000 --- a/interoperability-standards-tools-skunkworks +++ b/interoperability-standards-tools-skunkworks @@ -1 +1 @@ -Subproject commit 14adf87e737aade3004b1826b72346d1d7ba2f49 +Subproject commit 01f8c0dc8da892b3cc9d4a6a9ea966089addaa18 diff --git a/pom.xml b/pom.xml index 67b5925..ceb8f1b 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ uk.nhs.england IOPS-FHIR-Validation-Service - 7.0.2 + 7.0.3 IOPS-FHIR-Validation-Service HAPI FHIR Validator using Spring Boot diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 77d3865..18eeb80 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -20,7 +20,7 @@ fhir: server: name: FHIR Development and Testing (FHIR Validation) Skunkworks baseUrl: http://localhost:9001 - version: 7.0.2 + version: 7.0.3 services: R4: true From f841b0642472fff1bb936b4e1e7c734167a36d79 Mon Sep 17 00:00:00 2001 From: Kevin Mayfield Date: Fri, 15 Mar 2024 11:34:10 +0000 Subject: [PATCH 67/67] Removed duplicate entry and moved to latest HAPI FHIR version --- interoperability-standards-tools-skunkworks | 2 +- pom.xml | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/interoperability-standards-tools-skunkworks b/interoperability-standards-tools-skunkworks index 01f8c0d..14adf87 160000 --- a/interoperability-standards-tools-skunkworks +++ b/interoperability-standards-tools-skunkworks @@ -1 +1 @@ -Subproject commit 01f8c0dc8da892b3cc9d4a6a9ea966089addaa18 +Subproject commit 14adf87e737aade3004b1826b72346d1d7ba2f49 diff --git a/pom.xml b/pom.xml index ceb8f1b..190f611 100644 --- a/pom.xml +++ b/pom.xml @@ -17,7 +17,7 @@ 20 1.9.22 - 7.0.0 + 7.0.2 2.2.20 2.1.20 2.16.1 @@ -41,10 +41,6 @@ spring-boot-configuration-processor true - - com.fasterxml.jackson.module - jackson-module-kotlin - org.jetbrains.kotlin kotlin-reflect