Guia de Implementação da SES GO - EXAME
0.0.4 - draft
Guia de Implementação da SES GO - EXAME - Local Development build (v0.0.4) built by the FHIR (HL7® FHIR® Standard) Build Tools. See the Directory of published versions
Historicamente, os resultados de um hemograma são impressos em diversas páginas que registram os dados obtidos a partir de uma amostra. Essas páginas são, em geral, fisicamente transferidas do laboratório até os profissionais de saúde que as consultam e, muitas vezes, manualmente inserem as informações nos sistemas que utilizam.
O caso de uso Consultando resultado promove mudança significativa neste cenário, no qual a transferência física é substituída pela transferência eletrônica de resultado de exame. A comunicação ocorre entre um Sistema de Informação em Saúde (SIS) de um laboratório de análises clínicas e os serviços oferecidos pela SES-GO. Cabe ao integrador, responsável pela manutenção do SIS do laboratório, implementar a funcionalidade que realiza esta comunicação.
Um hemograma completo (fictício) está disponível aqui.
Este portal detalha o formato do payload e como ele pode ser enviado para a SES-GO (API).
Formato. O hemograma será enviado em um documento JSON que deve obedecer a perfis FHIR bem definidos. Neste guia, são fornecidas orientações detalhadas sobre como montar um payload JSON correspondente a um hemograma completo, o que permite orientar o integrador.
API FHIR. O envio de dados para a SES-GO é realizado por meio de uma API REST, utilizando uma requisição POST que inclui o payload em questão. Essa requisição somente será aceita se acompanhada do cabeçalho Authorization
com um token de acesso. O token é obtido por intermédio do Servidor de Autorização, que está acessível apenas a sistemas de estabelecimentos de saúde previamente credenciados. O credenciamento dos estabelecimentos e a obtenção do token são tratados em um Guia de Implementação específico para segurança, disponível em segurança.
O presente guia usa definições básicas existente em br.go.ses.core, enquanto o guia br.go.ses.seguranca fornece definições de pertinentes à segurança que devem ser observadas pelo integrador.
Um hemograma completo é um exame composto que inclui, em geral, 24 exames simples e uma amostra. Cada um destes exames e amostra é um objeto JSON. Estes objetos são reunidos em um malote autocontido, que é um objeto JSON que reúne todos os demais. Um payload JSON correspondente a um hemograma completo está disponível aqui. Ou seja, este é um exemplo que ilustra um hemograma completo típico a ser enviado para a SES-GO.
Os objetos JSON satisfazem a esquemas bem definidos denominados de perfis. Os relacionamentos entre os perfis é ilustrado abaixo.
Exame composto, exame simples e amostra são perfis definidos no guia base da SES-GO (br.go.ses.core). O presente guia acrescenta os perfis transferência e malote.
O exemplo (payload), portanto, é um objeto JSON que satisfaz a a estrutura ilustrada acima. No restante da seção é detalhado, passo a passo, como montar um hemograma completo.
A estrutura parcial do documento JSON para registro de um hemograma completo é exibida abaixo. Três das propriedades são
predefinidas para um malote contendo um hemograma: (a) resourceType
, (b) meta
e (c)
type
. Elas indicam que este JSON registra uma instância do recurso Bundle,
contendo uma coleção de objetos (collection
) e que atende o perfil indicado em
meta.profile
. O perfil define a estrutura esperada do conteúdo oferecido na propriedade
entry
.
{
"resourceType" : "Bundle",
"meta" : {
"profile" : [
"https://fhir.saude.go.gov.br/r4/exame/StructureDefinition/malote"
]
},
"type" : "collection",
...
"entry" : [
... vários objetos aqui ...
]
}
A outra propriedade presente no exemplo e não comentada acima é entry
, um vetor (array) onde os dados propriamente
ditos do hemograma são fornecidos, ou seja, uma instância de exame composto e várias instâncias de exame simples. Ainda inclui uma instância de amostra, mas esta estará
embutida (contained
) nas demais instâncias.
A amostra é referenciada pelo exame simples que, por sua vez, é referenciado pelo exame composto. Antes de acomodá-los todos em entradas (entry
) do Bundle, cada um destes é esclarecido abaixo.
A amostra empregada no hemograma deve atender o perfil
Amostra.
De acordo com este perfil, as únicas propriedades obrigatórias são type
e collectedDateTime
. Uma instância em conformidade com este perfil é ilustrada
abaixo (apenas parcialmente). A versão completa da instância pode ser baixada aqui. Neste caso, o tipo indica uma amostra de sangue coletada
no dia 24/07/2024 às 10h, horário de Brasília (UTC-3).
{
"resourceType" : "Specimen",
...
"type" : {
"coding" : [
{
"system" : "http://terminology.hl7.org/CodeSystem/v2-0487",
"code" : "BLD"
}
]
},
"collection" : {
"collectedDateTime" : "2024-07-24T10:00:00-03:00"
}
}
Muitas outras informações podem ser registradas para uma amostra em um laboratório de análises clínicas. Contudo, conforme o perfil, apenas este subconjunto incluindo o tipo e a data da coleta é suficiente para ser enviado.
Dentre as dezenas de exames simples que podem compor um hemograma está a contagem de hemácias. Este exame deve atender o perfil exame simples. Em vez de apresentar todo o conteúdo JSON de uma única vez, dezenas de linhas, o que pode ser baixado aqui, seguem vários trechos, contendo cada um apenas parte de todo o objeto JSON. Cada trecho segue acompanhado da explanação correspondente.
O primeiro ilustra várias propriedades. Uma delas identifica o exame pelo código 789-8
correspondente a eritrócitos (hemácias) na codificação LOINC. Em particular, este exame é
categorizado como um diagnóstico em laboratório clínico, ou seja, código 0202.
O status
é final, indicando que o exame está completo.
O paciente é identificado pelo CPF e, por fim, o instante em que o resultado é produzido, neste caso, 02/08/2024, às 11h41min do horário de Brasília.
{
"resourceType" : "Observation",
...
"category" : [
{
"coding" : [
{
"system" : "http://www.saude.gov.br/fhir/r4/CodeSystem/BRSubgrupoTabelaSUS",
"code" : "0202"
}
]
}
],
"code" : {
"coding" : [
{
"system" : "http://loinc.org",
"code" : "789-8"
}
]
},
"subject" : {
"identifier" : {
"system" : "https://fhir.saude.go.gov.br/sid/cpf",
"value" : "01234567891"
}
},
"status" : "final",
"issued" : "2024-08-02T11:41:00-03:00",
...
}
O trecho abaixo exibe apenas a faixa de referência (referenceRange
) para o resultado.
Por meio desta propriedade é
fornecido o valor inferior 4.5 e o superior 6 para a normalidade (normal).
Neste caso a unidade de medida é 10*12/L conforme o sistema de medidas
UCUM identificado por http://unitsofmeasure.org.
{
"resourceType" : "Observation",
...
"referenceRange" : [
{
"low" : {
"value" : 4.5,
"system" : "http://unitsofmeasure.org",
"code" : "10*12/L"
},
"high" : {
"value" : 6,
"system" : "http://unitsofmeasure.org",
"code" : "10*12/L"
},
"type" : {
"coding" : [
{
"system" : "http://terminology.hl7.org/CodeSystem/referencerange-meaning",
"code" : "normal"
}
]
}
}
]
}
O resultado desta medida propriamente dito é fornecido na propriedade valueQuantity
, conforme o trecho abaixo. Neste caso, com o valor 5.9, que está contido na faixa de referência.
Este trecho ainda fornece, embora não obrigatório, a descrição do método utilizado.
{
...
"valueQuantity" : {
"value" : 5.9,
"system" : "http://unitsofmeasure.org",
"code" : "10*12/L"
},
"method" : {
"text" : "Automatizado – Cell-Dyn Ruby, Abbott e Microscopia"
}
...
}
O perfil exige a identificação do laboratório, do responsável técnico e do responsável pelo resultado.
Estas informações são fornecidas na propriedade performer
, que é um vetor (array). Há uma
entrada para cada uma destas informações neste vetor. Cada entrada possui a propriedade
id
. Para identificar o laboratório o valor desta propriedade deve ser laboratorio, para
identificar o responsável técnico o valor é responsavelTecnico e, por fim, para identificar o
responsável pelo resultado o valor é responsavelResultado. Abaixo segue cada uma das
informações isoladamente.
A identificação do laboratório é realizada pelo código CNES correspondente, conforme abaixo.
Esse trecho JSON é um objeto que, novamente, fará parte do vetor performer
.
{
"id" : "laboratorio",
"identifier" : {
"system" : "https://fhir.saude.go.gov.br/sid/cnes",
"value" : "2337991"
}
}
A identificação tanto do responsável técnico quanto do responsável pelo resultado são similares.
Ambas são feitas pelo CPF do profissional de saúde e pelo conselho profissional correspondente.
A identificação do conselho é realizada ple fornecimento do identificador do conselho, a região
e a inscrição do profissional em questão. Conforme ilustrado abaixo, o objeto JSON para identificar
cada um destes profissionais contém as propriedades id
,
extension
e identifier
.
{
"id" : "responsavelTecnico",
"extension" : [
{
"extension" : [
{
"url" : "conselhoProfissional",
"valueCode" : "69"
},
{
"url" : "regiao",
"valueCode" : "52"
},
{
"url" : "inscricao",
"valueString" : "1234"
}
],
"url" : "https://fhir.saude.go.gov.br/r4/core/StructureDefinition/conselho-profissional"
}
],
"identifier" : {
"system" : "https://fhir.saude.go.gov.br/sid/cpf",
"value" : "12345678900"
}
}
Os dois trechos acima, conforme já orientado anteriormente, são objetos que fazem parte
da propriedade performer
, juntamente com o objeto correspondente para o responsável pelo
resultado, cujo trecho correspondente não é exibido por ter a mesma estrutura do trecho
acima. A instância completa em conformidade com o perfil pode ser consultada
para ilustrar a propriedade performer
conforme esperada pelo perfil em questão, contendo as identificações dos responsáveis e do laboratório.
O último trecho ilustrado estabelece a relação entre o exame simples e a amostra sobre a qual
o resultado do exame foi obtido. Esta relação é estabelecida de duas formas, conforme ilustrado abaixo.
A propriedade contained
deve conter a instância da amostra, cujo conteúdo foi esclarecido na
seção anterior. Isto não é suficiente. Na propriedade specimen
deve ser fornecida a
referência para este objeto contido, neste caso, com o valor #amostra. Observe o uso de #
precedendo o identificador amostra, para indicar que a referência é interna. Noutras palavras,
que o objeto JSON em questão é fornecido na propriedade contained
.
{
"resourceType" : "Observation",
...
"contained" : [
{
"resourceType" : "Specimen",
"id" : "amostra",
"type" : {
"coding" : [
{
"system" : "http://terminology.hl7.org/CodeSystem/v2-0487",
"code" : "BLD"
}
]
},
"collection" : {
"collectedDateTime" : "2024-07-24T10:00:00-03:00"
}
}
],
"specimen" : {
"reference" : "#amostra"
}
...
}
Novamente, uma instância completa e o perfil esperado estão disponíveis.
Convém esclarecer que, em boa parte dos casos, o conteúdo a ser enviado para a contagem de hemácias é similar ao ilustrado, com ajuste dos valores correspondentes para refletir o exame real em questão. Por exemplo, para o último trecho ilustrado acima, a alteração da data da coleta talvez seja suficiente, permanecendo todo o resto inalterado. Isso porque outras informações podem ser fornecidas, possivelmente para atender outros cenários.
Na seção anterior vimos em detalhes um exame simples completo (contagem de hemácias). Nesta seção segue um outro exame simples, concentração de hemoglobina, cujo exemplo completo está disponível. A concentração de hemoglobina também é um exame simples e, portanto, também deve satisfazer o mesmo perfil.
Tendo em vista que são exames cujos dados são similares, o paciente é o mesmo, o laboratório e vários outros, será
ressaltado apenas o que difere do exemplo anterior.
A identificação do exame, naturalmente, é diferente. Neste caso, o código LOINC para a concentração de hemoglobina é 718-7, a faixa de referência é outra e o valor também, conforme ilustrado no trecho abaixo.
{
"resourceType" : "Observation",
...
"code" : {
"coding" : [
{
"system" : "http://loinc.org",
"code" : "789-8"
}
]
},
"valueQuantity" : {
"value" : 5.9,
"system" : "http://unitsofmeasure.org",
"code" : "g/dL"
},
"referenceRange" : [
{
"low" : {
"value" : 13.5,
"system" : "http://unitsofmeasure.org",
"code" : "g/dL"
},
"high" : {
"value" : 17.5,
"system" : "http://unitsofmeasure.org",
"code" : "g/dL"
},
"type" : {
"coding" : [
{
"system" : "http://terminology.hl7.org/CodeSystem/referencerange-meaning",
"code" : "normal"
}
]
}
}
]
...
}
O objeto JSON completo referente à concentração de hemoglobina também está disponível. O que foi fornecido acima é apenas um trecho, parte do JSON completo, cujos valores diferem do exemplo anterior.
A porcentagem de volume do sangue ocupado pelas hemácias, ou hematócrito, é registrado de forma similar à hemoglobina. O que muda é o identificador do exame, código LOINC 4544-3, a unidade de medida (%), a faixa de referência e o valor obtido pelo exame, conforme ilustrado abaixo. Novamente, o trecho omite o laboratório e demais valores repetidos. O objeto JSON completo está disponível. De forma similar, também atende ao perfil](https://fhir.saude.go.gov.br/r4/core/StructureDefinition-exame-simples.html) esperado.
{
"resourceType" : "Observation",
...
"code" : {
"coding" : [
{
"system" : "http://loinc.org",
"code" : "4544-3"
}
]
},
"valueQuantity" : {
"value" : 52.2,
"system" : "http://unitsofmeasure.org",
"code" : "%"
},
"referenceRange" : [
{
"low" : {
"value" : 41,
"system" : "http://unitsofmeasure.org",
"code" : "%"
},
"high" : {
"value" : 50,
"system" : "http://unitsofmeasure.org",
"code" : "%"
},
"type" : {
"coding" : [
{
"system" : "http://terminology.hl7.org/CodeSystem/referencerange-meaning",
"code" : "normal"
}
]
}
}
]
...
}
Todos os exames simples que fazem parte do hemograma são registrados de forma similar aos exemplos detalhados acima, o que dispensa a repetição. Abaixo segue uma tabela com a identificação de todos os 24 exames que compõem um hemograma completo. A tabela inclui: (a) o nome (com link para o exame completo dos casos ilustrados acima); (b) o código LOINC que o identifica e (c) a unidade de medida correspondente. Em tempo, o hemograma completo, devidamente empacotado para transferência ilustra todos os 24 exames simples.
# | Nome | LOINC | Unidade |
---|---|---|---|
1 | Hemácias | 789-8 | 10*12/L |
2 | Hemoglobina | 718-7 | g/dL |
3 | Hematócrito | 4544-3 | % |
4 | VCM (Volume Corpouscular Médio) | 787-2 | fL |
5 | HCM (Hemoglobina Corpuscular Média) | 785-6 | pg |
6 | CHCM (Concentração da hemoglobina corpuscular média) | 786-4 | g/dL |
7 | RDW (Red Cell Distribution Width) | 788-0 | % |
8 | Leucócitos totais | 6690-2 | /uL |
9 | Promielócitos | 781-5 | /uL |
10 | Mielócitos | 748-4 | /uL |
11 | Metamielócitos | 739-3 | /uL |
12 | Bastonetes | 763-3 | /uL |
13 | Segmentados | 768-2 | /uL |
14 | Monócitos | 742-7 | /uL |
15 | Eosinófilos | 711-2 | /uL |
16 | Basófilos | 704-7 | /uL |
17 | Linfócitos | 731-0 | /uL |
18 | Linfócitos atípicos ou reativos | 29262-3 | /uL |
19 | Pró-linfócitos | 6863-5 | /uL |
20 | Blastos | 708-8 | /uL |
21 | Plaquetas | 777-3 | /uL |
22 | Plaquetócrito | 777-3 | % |
23 | VPM (Volume Plaquetário Médio) | 32623-1 | fL |
24 | PDW (Platelet Distribution Width) | 32207-3 | % |
Tanto exames simples quanto compostos utilizam o mesmo recurso FHIR, Observation
, o que explica suas similaridades. Ambos compartilham a mesma categoria, por exemplo. No entanto, o código que identifica cada exame é diferente. Para o exame composto, como o Hemograma Completo (CBC), usamos o código LOINC 58410-2 (CBC panel - Blood by Automated count).
Um exame composto não possui um valor único nem faixa de referência próprios. A amostra (espécime) é referenciada e incluída (contained
) da mesma forma que nos exames simples.
Veja o exemplo completo do Exame Composto para mais detalhes.
A principal diferença entre exames simples e compostos reside em como eles se relacionam. Um exame composto referencia vários exames simples. Essa referência é feita usando o tipo de dados Reference
do FHIR, o mesmo tipo usado para referenciar a amostra (specimen
). A referência para a amostra, contudo, é uma referência interna, para uma instância disponível na própria instância que faz a referência, na propriedade contained
. No caso do exame composto, a propriedade hasMember
usa referências para apontar para os exames simples que o compõem, mas estes exames
não estão contidos, ao contrário da amostra.
Conforme o Exame Composto, as referências
para os exames simples, propriedade hasMember
, seguem o formato urn:uuid:[uuid]
, onde [uuid]
é um Identificador Único Universal (UUID). Por exemplo: urn:uuid:45f8b159-1100-4daf-b2b9-c8a61e928400
.
O UUID 45f8b159-1100-4daf-b2b9-c8a61e928400
empregado no exemplo
acima não é um identificador fixo para um tipo de exame (como hemácias). É um identificador atribuído a uma instância específica de exame simples.
De fato, para cada novo hemograma, cada exame simples (hemácias, leucócitos, etc.) receberá um UUID único próprio, gerado para o hemograma.
A atribuição do UUID à instância correspondente (exame simples ou composto) é
estabelecida dentro de um Bundle
FHIR ("pacote").
O Bundle
age como um "pacote" que contém todos os recursos relacionados
a um hemograma. Ou seja, um exame composto, os 24 exames simples
e a amostra. Todos os exames simples e o composto, cada um destes, é registrado em
uma entrada própria do Bundle (entry
).
{
"resourceType" : "Bundle",
"meta" : {
"profile" : [
"https://fhir.saude.go.gov.br/r4/exame/StructureDefinition/malote"
]
},
"type" : "collection",
...
"entry" : [
... vários objetos (um para cada exame simples e um composto) ...
]
}
Cada entry
possui, dentre outras propriedades, fullURL
e resource
.
A propriedade fullURL
define como a instância do recurso fornecido em resource
pode ser referenciada. Para ilustrar, conside o trecho abaixo. Se a primeira
instância faz referência para a segunda instância, então a referência terá
como valor urn:uuid:45f8b159-1100-4daf-b2b9-c8a61e928400.
{
"resourceType" : "Bundle",
...
"entry" : [
{
"fullUrl" : "urn:uuid:c47949a4-22eb-4f2a-8e7b-2f81c9729598",
"resource" : {
"resourceType" : "Observation"
...
}
},
{
"fullUrl" : "urn:uuid:45f8b159-1100-4daf-b2b9-c8a61e928400",
"resource" : {
"resourceType" : "Observation",
...
}
}
...
]
}
O trecho abaixo permite esclarecer melhor esta relação. Nele são exibidas
apenas duas entradas empregadas pelo Bundle. A primeira delas é o
exame composto do hemograma. Observe que a referência para a amostra
é uma referência interna #amostra, enquanto a referência para
o primeiro exame simples (única exibida) é urn:uuid:45f8b159-1100-4daf-b2b9-c8a61e928400, que é o valor da
propriedade fullUrl
da segunda entrada. Ou seja, o exame composto
tem um membro (hasMember
) que é o segundo elemento do vetor entry
.
{
"resourceType" : "Bundle",
"identifier" : {
"system" : "https://fhir.go.gov.br/sid/romulo-rocha",
"value" : "ebc2f6dd-473e-43bb-b67a-0694f5b1e086"
},
"type" : "collection",
"entry" : [
{
"fullUrl" : "urn:uuid:c47949a4-22eb-4f2a-8e7b-2f81c9729598",
"resource" : {
"resourceType" : "Observation",
...
"specimen" : {
"reference" : "#amostra"
},
"hasMember" : [
{
"reference" : "urn:uuid:45f8b159-1100-4daf-b2b9-c8a61e928400"
},
... seguem outras 23 referências para exames simples ...
]
}
},
{
"fullUrl" : "urn:uuid:45f8b159-1100-4daf-b2b9-c8a61e928400",
"resource" : {
"resourceType" : "Observation",
...
}
}
...
}
Novamente, o JSON completo correspondente ao hemograma ilustrado acima pode ser encontrado aqui.
A transferência eletrônica de hemograma compreende duas atividades:
O token de acesso é obtido por meio de uma requisição HTTPS utilizando o método GET. O serviço de autorização que atende esta requisição implementa autenticação mútua TLS (mTLS) ou Two-Way TLS. Este serviço exige a apresentação de um certificado digital válido. Especificamente, um certificado digital ICP-Brasil (e-CPF ou e-CNPJ) é requerido. Uma resposta positiva, contendo o token de acesso será retornada somente se o certificado digital fornecido tiver sido previamente aprovado no processo de credenciamento da SES-GO.
Outras informações sobre o credenciamento e obtenção de token, em detalhes, podem ser obtidas aqui.
O token de acesso é obtido por requisição GET para o serviço de autorização https://fhir.saude.go.gov.br/api/token
Um objeto JSON típico retornado pelo serviço de autorização em caso de sucesso é fornecido abaixo. As propriedades podem variar, mas duas delas são fundamentais, access_token cujo valor é o token e expires_in, neste caso, indicando que o token vale por 60 minutos. Neste período é esperado que o token seja reutilizado em requisições ao Servidor FHIR.
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"expires_in": 3600,
"token_type": "Bearer"
}
O serviço disponível em https://fhir.saude.go.gov.br/api/token é empregado apenas para a obtenção do token de acesso. O envio propriamente dito ocorre por meio do Servidor FHIR, conforme comentado abaixo.
Após produzido um hemograma similar ao exemplo, o conteúdo (payload) deve ser submetido para a SES-GO. O Servidor FHIR disponível em https://fhir.saude.go.gov.br/exame espera por requisições POST com tal conteúdo. Adicionalmente, o token de acesso, obtido pela atividade anterior, deve ser fornecido em header específico, no formato abaixo e conforme extraído do objeto JSON obtido do Serviço de Autorização.
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
No cenário perfeito terá como resposta o status 201 (created), indicando que o hemograma foi enviado de forma satisfatória. Em header específico, Location, será indicado o código único gerado pelo Servidor FHIR (SES-GO) e atribuído ao hemograma submetido para eventual referência posterior.
No presente guia são definidos dois perfis empregados para envio de hemogramas de laboratórios de análises clínicas para a SES-GO:
Contudo, vários outros artefatos de conformidade são empregados e estão definidos em outros guias. Convém esclarecer que aqueles abaixo não estabelecem o domínio do que pode eventualmente ser empregado. Estes foram os artefatos necessários para os exemplos fornecidos, outros artefatos podem ser utilizados para outros cenários.