Colocamos uma camada FHIR na frente dos sistemas que já operam — prontuário, laboratório, imagens, sistemas legados sem API — para que falem o padrão sem serem substituídos, com a conformidade verificada e a operação intacta.
Substituir o sistema nem sempre é a resposta. Deixá-lo mudo, também não.
Os sistemas que sustentam a operação clínica raramente podem ser desligados: têm anos de dados, processos amarrados, contratos vigentes e usuários que dependem de que funcionem amanhã às sete. Mas cada vez mais lhes é pedido participar de um intercâmbio para o qual nunca foram desenhados: expor um resultado, notificar uma autoridade, alimentar uma visão consolidada, conectar-se a uma rede. Uma camada FHIR resolve essa tensão traduzindo entre o que o sistema guarda e o que o ecossistema exige, sem tocar no seu banco de dados nem na sua operação. Bem desenhada, compra anos de margem. Mal desenhada, vira o próximo sistema legado: mais uma caixa que ninguém se atreve a abrir.
Ponto de partida
De onde se parte, concretamente
«Sistemas legados» não diz nada. O que define o trabalho é a forma real da origem e o que se encontra ao abri-la.
Banco de dados do prontuário
Acesso direto ao esquema relacional do sistema clínico, quase sempre somente leitura e contra uma réplica, para não competir com a operação.
Com o que se esbarra
Tabelas sem documentação, campos reaproveitados para duas coisas distintas, flags de status que só quem as escreveu entende e regras de negócio que vivem na aplicação, não no modelo.
HL7 v2 sobre MLLP
Mensageria de admissão, pedidos e resultados que já circula entre sistemas e pode ser aproveitada como fonte em vez de construir uma nova extração.
Com o que se esbarra
Segmentos Z próprios de cada instalação, campos opcionais usados de forma criativa e o fato de que uma mensagem descreve um evento, não o estado atual do paciente.
Arquivos planos e lotes
CSV, posicionais ou XML que o sistema já gera para relatórios ou para outros consumidores, processados em lote.
Com o que se esbarra
Janelas de geração fixas, entregas parciais ou repetidas, codificações de caracteres herdadas e nenhum mecanismo para saber o que mudou desde o arquivo anterior.
Serviços SOAP e APIs proprietárias
Interfaces que o fornecedor já expõe, pensadas para um consumidor específico e com um modelo de dados próprio.
Com o que se esbarra
Granularidade que não coincide com a do recurso FHIR, limites de paginação e concorrência não documentados e mudanças de contrato que chegam sem aviso.
PACS e DICOM
Estudos e laudos de imagem, em que o metadado vive no equipamento e no PACS antes de chegar ao registro clínico.
Com o que se esbarra
Identificadores de paciente diferentes dos do prontuário, laudos em texto livre dentro do estudo e volumes que tornam inviável materializar sem um critério claro.
Planilhas e catálogos manuais
Os catálogos que sustentam processos reais mesmo sem viver em nenhum sistema: serviços, profissionais, equivalências de códigos.
Com o que se esbarra
Sem controle de versão, sem dono formal e com a verdade repartida entre várias cópias que não coincidem entre si.
Modos de entrega
Traduzir ao vivo ou materializar: a decisão que define todo o resto
É a primeira decisão de arquitetura e a que determina o custo, a latência e a quem dói uma indisponibilidade. Quase nunca é uma escolha pura.
Ao vivo
A camada traduz cada consulta contra o sistema de origem, no momento.
Materializado
Os dados são transformados e carregados em um repositório FHIR que atende às consultas.
Frescor do dado
Ao vivoSempre o estado atual da origem. Não há janela de desatualização para explicar nem para defender clinicamente.
MaterializadoTão fresco quanto o último ciclo de carga. Essa janela precisa ser definida, comunicada e confirmada como clinicamente aceitável.
Carga sobre a origem
Ao vivoCada consulta externa bate no sistema que sustenta a operação. Um consumidor mal comportado vira um incidente clínico.
MaterializadoA extração é agendada em janelas de baixa demanda e as consultas externas não tocam a origem.
Acoplamento à disponibilidade
Ao vivoSe a origem cai ou entra em manutenção, a API FHIR cai junto: a janela de manutenção dela passa a ser a sua.
MaterializadoA camada continua respondendo mesmo com a origem parada. A indisponibilidade vira dado mais velho, não serviço fora do ar.
Consulta e desempenho
Ao vivoCada busca FHIR precisa ser traduzida em uma consulta que a origem resolva rápido. O que o esquema dela não indexa não pode ser oferecido.
MaterializadoIndexa-se conforme os parâmetros de busca que o guia exige, e não conforme o esquema da origem ficou há quinze anos.
Histórico e reprocessamento
Ao vivoVê-se o que a origem conserva. Se ela sobrescreve em vez de versionar, o histórico não existe e não há como reconstruí-lo.
MaterializadoÉ possível conservar versão a versão e reprocessar todo o histórico quando o mapeamento muda ou aparece um erro.
Escrita de volta
Ao vivoEscrever na origem exige respeitar as suas regras de negócio e validações, que quase nunca estão documentadas.
MaterializadoA escrita é aceita na camada e propagada de forma diferida, o que obriga a resolver conflitos e declarar qual versão prevalece.
Governança da cópia
Ao vivoNão há cópia: nada a decidir sobre quem é dono da duplicata, por quanto tempo se retém ou como se elimina.
MaterializadoHá uma cópia de dados clínicos, com tudo o que isso implica: dono, retenção, controle de acesso, auditoria e direito de eliminação.
Custo de operar
Ao vivoPouca infraestrutura, mas o desempenho depende de um sistema que não se controla e cada novo consumidor muda o perfil de carga.
MaterializadoInfraestrutura e operação próprias — armazenamento, monitoramento, reprocessamento — em troca de comportamento previsível.
O que se usa na prática
Os extremos puros são pouco frequentes. A maioria das camadas que operam bem são combinações deliberadas das duas.
Cache com validade declarada: traduz-se ao vivo, mas a resposta é conservada por um tempo definido e documentado para o consumidor.
Captura de mudanças por eventos: a origem avisa o que mudou — por mensageria, gatilhos ou CDC — e só isso é transformado.
Leitura ao vivo com escrita diferida: as consultas vão contra a origem e as escritas são enfileiradas e conciliadas, que é onde estão os conflitos.
Materialização parcial: materializa-se apenas o domínio que precisa — resultados, notificações — e o resto se traduz ao vivo.
Índice à parte para o que a origem não resolve: as buscas que o esquema dela não suporta são servidas por uma estrutura própria.
Metodologia
Como construímos a camada
Seis etapas. A primeira decide o que se pode extrair da origem sem arriscar a operação clínica.
01
Análise da origem
Antes de mapear qualquer coisa, entendemos o que o sistema realmente guarda e o que pode ser extraído sem colocar em risco o que já funciona.
Esquema, interfaces e mecanismos de acesso disponíveis
Perfilamento dos dados e da sua qualidade
Janelas operacionais e limites de carga
Regras de negócio que vivem na aplicação
02
Modelo e mapeamento
Decide-se qual recurso representa cada dado, qual perfil se aplica e de onde vem cada elemento — inclusive aquele que a origem não tem.
Mapeamento elemento a elemento
Terminologias e ConceptMap para os códigos locais
Estratégia de identificadores e referências
O que fazer com o dado ausente
03
Desenho da camada
Modo de entrega, alcance por domínio, segurança e contrato com os consumidores. Aqui se fixa o que depois é caro mudar.
Ao vivo, materializado ou híbrido
Autenticação, autorização e auditoria
CapabilityStatement-alvo
Política de versões e compatibilidade
04
Construção e transformação
Implementam-se as transformações, a exposição e o tratamento de erros, com os casos limite tratados como parte do escopo e não como surpresas.
Pipelines de extração e transformação
Endpoints e parâmetros de busca
Idempotência e retentativas
Registro do que não pôde ser transformado
05
Validação de conformidade
A camada é testada contra os perfis que precisa cumprir, com exemplos válidos e com exemplos que devem ser rejeitados.
Validação contra o guia aplicável
Testes de busca e paginação
Comparação contra a origem
Testes de carga em janela real
06
Operação e observabilidade
Uma camada sem monitoramento falha em silêncio e é descoberta quando alguém reclama de um dado que nunca chegou.
Métricas de latência, erro e frescor
Alertas sobre dados não transformados
Rastreabilidade da origem ao recurso
Procedimento diante de uma mudança da origem
Conformidade
Que seja FHIR de verdade, não JSON com nomes de FHIR
A diferença entre uma camada que passa numa demonstração e uma que sustenta um ecossistema está em detalhes que só aparecem quando um terceiro tenta consumi-la.
Validação contra perfis
O atalho habitual
Monta-se o JSON à mão até que «pareça certo» e testa-se apenas contra o cliente próprio.
O que sustenta
Cada recurso é validado contra o perfil do guia aplicável, em integração contínua, com exemplos que devem passar e exemplos que devem falhar.
Um CapabilityStatement honesto
O atalho habitual
Publica-se um CapabilityStatement copiado que declara operações e buscas que ninguém implementou.
O que sustenta
Declara-se exatamente o que a camada suporta. Um consumidor precisa conseguir planejar a integração lendo-o, sem descobrir na marra o que funciona.
Buscas que funcionam
O atalho habitual
Implementam-se dois ou três parâmetros e o resto é ignorado em silêncio, devolvendo tudo como se o filtro não existisse.
O que sustenta
Os parâmetros declarados são implementados, ou não são declarados. E a paginação é testada com os volumes reais da origem, não com dados de teste.
Identificadores, referências e códigos
O atalho habitual
Usam-se chaves internas como se fossem ids FHIR, referenciam-se recursos que a camada nunca expõe e enviam-se códigos locais sem dizer de onde vêm.
O que sustenta
Toda referência resolve ou é declarada lógica, os identificadores de negócio viajam em identifier com o seu system, e todo código leva o seu declarado.
Erros que dá para depurar
O atalho habitual
Diante de um problema devolve-se um 500 genérico ou, pior, um 200 com o recurso incompleto.
O que sustenta
Os erros são devolvidos como OperationOutcome, com severidade, código e uma localização que diga ao consumidor o que corrigir.
O dado que não existe
O atalho habitual
Preenche-se com um valor padrão, uma data inventada ou um código genérico para que o recurso valide.
O que sustenta
O ausente é representado como ausente. Quando o guia exige o elemento, usam-se os mecanismos previstos para dados desconhecidos e documenta-se a lacuna, em vez de fabricar o dado.
Resultados
O que sua organização recebe
A camada em operação e tudo o que é preciso para consumi-la, auditá-la e fazê-la evoluir sem nós.
Camada FHIR em operação
O serviço implantado, com os seus endpoints, a sua segurança e a sua configuração documentada.
Mapeamentos documentados
Correspondência elemento a elemento entre a origem e os recursos, com as decisões registradas.
ConceptMaps e catálogos
Equivalências declaradas entre os códigos locais e as terminologias padrão.
CapabilityStatement
O que a camada realmente suporta: recursos, operações e parâmetros de busca.
Suíte de validação
Exemplos válidos, exemplos que devem falhar e os testes que rodam a cada mudança.
Monitoramento e alertas
Métricas de latência, erro e frescor, com alertas sobre o que não pôde ser transformado.
Guia para consumidores
Como autenticar, o que buscar, o que esperar e quais limites a camada tem.
Rota de evolução
O que se materializa depois, quais domínios seguem e quando convém revisar o modo de entrega.
Experiência
Camadas FHIR em operação
Infraestrutura FHIR construída sobre sistemas e plataformas que já existiam e continuaram funcionando.
O que a camada resolveuRecepção e validação de notificações
Primeiro servidor FHIR nacional — EDUS/CCSS
A Meddyg implementou e colocou em produção o primeiro servidor FHIR que receberia as notificações de doenças de notificação compulsória, vacinas e resultados de laboratório do EDUS/CCSS e, posteriormente, de outros estabelecimentos de saúde.
O que a camada resolveuPonto de entrada para notificação regional
Infraestrutura receptora de ESAVI
Parte da equipe da Meddyg participou como consultora no desenho e na implementação da infraestrutura que receberia as notificações regionais de ESAVI, junto com o guia que define o seu formato.
O que a camada resolveuO padrão sobre transporte nacional
Transações FHIR sobre X-Road
Provas de conceito com a Agência Nacional de Governo Digital para validar transações de recursos FHIR sobre a plataforma nacional X-Road, dentro da demonstração funcional de interoperabilidade da Costa Rica.
O que a camada resolveuNão repúdio na camada de intercâmbio
Assinatura digital de recursos FHIR — BCCR
Assistência técnica para que as equipes do Banco Central da Costa Rica habilitassem a assinatura de recursos FHIR com o formato JAdES dentro do GAUDI, a sua plataforma de assinatura digital e selagem.
Os casos acima são infraestrutura FHIR construída sobre sistemas e plataformas que já operavam. O mesmo método — análise da origem, mapeamento, escolha do modo de entrega e validação de conformidade — é o que aplicamos a uma fachada sobre um prontuário ou um sistema departamental legado.
Perfil
Para quem é este serviço?
Todos compartilham a mesma restrição: o sistema de origem não pode ser parado nem substituído no prazo em que é preciso interoperar.
Hospitais com prontuário legado
Um sistema clínico que não será substituído e ao qual agora se pede expor dados, notificar ou conectar-se a uma rede.
Fornecedores de software de saúde
Produtos que precisam demonstrar capacidade FHIR a clientes e licitações sem refazer o seu banco de dados.
Laboratórios e centros de imagem
Resultados e laudos que precisam chegar a múltiplos receptores externos com a mesma estrutura e os mesmos códigos.
Instituições públicas
Sistemas de missão crítica que precisam participar de um ecossistema nacional sem abrir o seu banco nem parar a operação.
Redes de intercâmbio (HIE)
Ecossistemas que incorporam participantes cujos sistemas não falam o padrão e precisam de um padrão de conexão repetível.
Seguradoras
Intercâmbio com prestadores cujos sistemas expõem formatos próprios e evoluem no seu próprio ritmo.
Autodiagnóstico
Reconhece algum destes problemas?
Pedem-nos uma API FHIR e o nosso sistema não tem API nenhuma.
Substituir o prontuário está fora de questão, mas interoperar não.
Cada nova integração acaba virando uma exportação feita sob medida.
Expomos JSON que chamamos de FHIR e nenhum validador aceita.
Não sabemos se convém traduzir ao vivo ou carregar em um repositório.
A consulta externa bate no mesmo banco que a operação clínica usa.
Quando o sistema de origem cai, cai junto tudo o que expusemos.
Nosso fornecedor não expõe o que precisamos e isso não está no roadmap dele.
Um consumidor avisou de um dado mal mapeado e não soubemos desde quando estava assim.
Publicamos um CapabilityStatement que não coincide com o que a API faz.
Não temos como saber quais registros não conseguiram ser transformados.
Precisamos nos conectar a uma rede nacional e os nossos dados não saem do sistema.
Se alguma destas situações descreve a sua organização, uma camada FHIR pode resolver o intercâmbio sem colocar em risco o que já funciona.
Estão pedindo FHIR a um sistema que não o fala?
Uma camada bem desenhada deixa os sistemas atuais participando do ecossistema, sem tocar na sua operação nem hipotecar a rota de modernização.