Escrito por

Artigo Evandro Wendt · 2 hr atrás 4m read

Criando uma extensão primitiva em um recurso FHIR

Uma extensão “estende” ou aprimora um recurso FHIR ou um elemento de dados de maneira personalizada. A extensão pode ser adicionada à raiz de um recurso, como “Patient.ethnicity” no perfil US Core, e também pode ser adicionada a elementos individuais, como HumanName, Address ou Identifier.

Você sabia que também é possível adicionar uma extensão a um tipo de dado primitivo?

Dados primitivos geralmente armazenam um único valor e são os elementos mais básicos no FHIR. Por exemplo: "Keren", false, 1234, 12/08/2024 etc.

Por exemplo, os recursos do paciente podem ser assim:

Os elementos gender, birthDate ou family são elementos primitivos, baseados em tipos de dados primitivos.

Como você adicionaria uma extensão à propriedade birthDate ou à propriedade deceased?

Você precisará criar um segundo atributo com o mesmo nome, prefixado com um underscore, então a extensão primitiva para a propriedade birthDate será _birthDate.

O underscore indica ao FHIR que você está acessando o Elemento base subjacente para o tipo de dado primitivo.

Todos os elementos no FHIR herdam ou descendem do elemento base. Ele contém dois atributos: extension e id.

No exemplo abaixo, adicionei uma extensão “Time of year” à propriedade birthDate e uma extensão “Is Alive” à propriedade deceasedBoolean.

Existem várias maneiras de criar um recurso FHIR, aqui está um exemplo de como adicionar uma extensão primitiva em cada uma dessas maneiras.

1. Usando um Objeto Dinâmico para construir o recurso FHIR

Se você criar o recurso FHIR usando um objeto dinâmico, você pode simplesmente acessar a nova extensão primitiva diretamente:

    set resource = {}

    set resource.resourceType     = "Patient"
    do resource.%Set("active",1,"boolean")
    set resource.gender           = "female"
    set resource.birthDate        = "1984-12-24"
    set resource."_birthDate"     = {}
    set resource."_birthDate".id  = "123456"
    set resource."_birthDate".extension = []

    set extension               = {}
    set extension.url            = "http://example.org/fhir/StructureDefinition/Holiday"
    set extension.valueString   = "Christmas"
    do resource."_birthDate".extension.%Push(extension)
    write resource.toJson()

e esse será o resultado:

2. Usando a classe HS.FHIR.DTL.VR4.Model.*

Também não é recomendado usar as classes HS.FHIR.DTL.VR4.Model.*, pois você terá uma lista primitiveExtension em cada nível. Você adicionará suas extensões primitivas lá e, em seguida, apenas referenciará sua propriedade para o índice dessa extensão.

Aqui está um exemplo usando o Data Transformation Builder:

e é assim que você faria o mesmo no código:

 // Create a new patient resource
 set resource=##class(HS.FHIR.DTL.vR4.Model.Resource.Patient).%New()

 set resource.active=1
 set resource.gender="female"
 // cretate a new extension
 set extension=##class(HS.FHIR.DTL.vR4.Model.Base.Extension).%New()
 set extension.url="http://example.org/fhir/StructureDefinition/Holiday"
 set extension.valueString="Christmas"
 // Add the extension to the primitive extension list
 do resource.primitiveExtension.Insert(extension)

 // point the property to the extention index (#1 in this example)
 set resource.birthDate=$listbuild("1984-12-24",1)
 write resource.ToJSON().Read()

Basicamente, o valor da propriedade é uma função $listbuild que recebe vários parâmetros:

set resource.property = $listbuild(""original property value",<primitive extension index>,...)

  • O primeiro parâmetro é o valor da propriedade original – se você desejar omitir a propriedade original completamente, basta enviar uma string vazia em vez de um valor.
  • O segundo parâmetro é o número do índice da extensão primitiva necessária na lista de extensões primitivas.
  • Se você quiser adicionar várias extensões primitivas à mesma propriedade, basta adicioná-las também (depois de adicioná-las primeiro à lista de extensões primitivas, é claro):
set resource.birthDate=$listbuild("1984-12-24",1,3,4,7)

3. Usando a classe FHIR Object Mode (a partir da versão 2024.2)

Se você estiver trabalhando no Iris for Health versão 2024.2 ou superior, pode querer fazer o mesmo usando as novas classes do Modelo de Objeto FHIR. Nestas classes, as extensões primitivas já estão definidas para cada propriedade que as possui. Então, no nosso caso, existe a propriedade birthDate e também a propriedade _birthDate.

Você pode usar as estruturas predefinidas para adicionar uma extensão primitiva:

    #dim patient as HS.FHIRModel.R4.Patient
    #dim extension as HS.FHIRModel.R4.Extension

    set patient=##class(HS.FHIRModel.R4.Patient).%New()
    set patient.gender="female"
    set patient.active=1
    set patient.birthDate="1984-12-24"
    // create a new element
    set element=##class(HS.FHIRModel.R4.Element).%New()
    do element.IncludeExtension()

    // create a new extension
    set extension=element.extension.MakeEntry()
    set extension.url="http://example.org/fhir/StructureDefinition/Holiday"
    set extension.valueString="Christmas"
    // add the extension to the element
    do element.extension.add(extension)
    
    // add the element to the resource
    set patient."_birthDate"=element
    
    write patient.toString()

De qualquer forma que você quiser trabalhar, agora você pode criar uma extensão primitiva como um profissional!

Veja os exemplos no Open Exchange para todas as 3 maneiras:

https://openexchange.intersystems.com/package/FHIR-Primitive-Extension

Keren.