Find

Article
· Oct 14 3m read

Instalação e adaptação do EMPI em modo Standalone - Notificando registros e vínculos a sistemas externos

Ao revisar os diversos artigos que publiquei, percebi a necessidade de explicar uma funcionalidade muito prática em nosso EMPI (Enterprise Master Patient Index) que é a notificação de registros e vínculos para sistemas externos ao EMPI.

Essa funcionalidade é extremamente útil em uma ferramenta como o EMPI e, especialmente, em ambientes como o de saúde, nos quais é muito comum que o mesmo paciente tenha seus dados duplicados em diferentes sistemas, e no final seja necessário identificá-lo de forma única. A solução para reduzir esse amálgama de registros é fundir todos esses dados em um único registro que unifique todas as informações disponíveis.

Em geral, este trabalho de decidir quais registros devem ser fundidos é bastante complexo se a intenção é fazê-lo manualmente, pois é muito complicado ter acesso aos vários sistemas que contêm informações do paciente (sistemas como HIS, RIS, LIS, etc. de diferentes fornecedores distribuídos pelos diversos centros da organização de saúde), mas graças ao sistema de vinculação do EMPI, essa tarefa é simplificada, automatizando a grande maioria desses vínculos.

Como podemos informar todo esse ecossistema de aplicações que elas precisam fundir dois registros de pacientes? Bem, vamos ver como:

Conofiguração do EMPI 

O primeiro passo para começar a gerar notificações é configurar o Registro de Notificação PIX:

Aqui podemos ver que, por padrão, temos dois registros de notificação:

Um dos registros é para notificações PIXv3 usando mensagens HL7 v.3 (em XML). O outro será para PIXv2 usando mensagens HL7 v.2.

Para gerar as mensagens necessárias, devemos definir os domínios no campo definido por padrão ou marcar a caixa "All Domains" (Todos os Domínios). Este conceito de domínio corresponderá à Assignment Authority (Autoridade de Atribuição) (serviços de saúde, centros hospitalares, etc.). Com esta etapa, estaremos definindo os consumidores de nossa mensagem de saída; se não definirmos nenhum domínio, a mensagem não será gerada.

Agora, abrimos a produção que gerencia a operação do EMPI. Vamos dar uma olhada no Processo de Negócio HS.IHE.PIX.Manager.Process, que será o encarregado de criar as mensagens de resposta.

Vamos prestar atenção à configuração deste BP. Como você pode ver, temos dois parâmetros, PIXv2Operations e PIXv3Operations, que são configurados com duas Business Operations (BO) de nossa produção. A primeira delas será responsável por receber uma mensagem HL7 v.2 e a segunda, uma mensagem HL7 v.3.

Vejamos agora a BO PIXv2.Notification.Operations

Como você pode ver, definimos uma BO da classe EnsLib.HL7.Operation.FileOperation , pois simplesmente nos limitaremos a escrever a mensagem HL7 para atualização dos dados do paciente gerada em um arquivo no servidor. No entanto, você poderia usar qualquer operação de negócio que tenha desenvolvido e que aceite mensagens HL7 como entrada, podendo encaminhá-las via TCP, embutidas em um SOAP ou através de uma chamada REST para uma API externa.

Testando

Vejamos um exemplo do que acontece com dois pacientes em status de revisão de vínculo após vinculá-los normalmente.

Vamos vincular os dois primeiros, Juan García e Roberto Martín. Uma vez feito o vínculo, vamos ver o rastreamento da mensagem:

Aqui temos nossa mensagem HL7 gerada do tipo ADT_A31, na qual relatamos a atualização do paciente que foi vinculado ao novo MPIID. Agora, o paciente Roberto Martín com MRN 556432 do Hospital 12 de Octubre substituiu seu antigo MPIID (100001000) pelo mesmo que Juan García tem (100000001).

Nosso EMPI manterá um registro para cada paciente, criando apenas o vínculo com o MPIID atribuído a ambos. Com esta mensagem ADT_A31, caberia agora ao serviço de saúde ou hospital fundir ambos os pacientes em um só.

Conclusão

Como vimos neste artigo, o EMPI possui funcionalidades pré-construídas que cobrem as necessidades de qualquer organização de forma simples e ágil, e nos permite expandi-las para cobrir aquelas que são mais específicas de cada cliente. Uma delas seria precisamente as notificações automáticas para qualquer aplicação externa.

Discussion (0)1
Log in or sign up to continue
Question
· Oct 14

Set a dataCombo selection

Hi 

How can I set a default value in a dataCombo?

I  tried 
ClientMethod onloadHandler() [ Language = javascript ]
{

 zenPage.getComponentById('mycombo').setProperty('selectedIndex',0);

 //zenSetProp('mycombo','selectedIndex',0);

}

and didn't work, I can not use the value property because I don't know what the values in my combo are going to because they loaded  OnCreateResultSet,  I'm only looking to make always the first value selected by default 

 

Thanks

1 Comment
Discussion (1)2
Log in or sign up to continue
Announcement
· Oct 14

Ganadores del concurso de InterSystems de .Net, Java, Python y JavaScript

Hola comunidad,

¡Ha llegado el momento de anunciar a los ganadores del concurso de InterSystems de .Net, Java, Python y JavaScript!

Gracias a todos nuestros increíbles participantes que enviaron 11 aplicaciones 🔥

¡Ahora es el momento de anunciar a los ganadores!

Nominación de Expertos

🥇 1er lugar $5,000 para la aplicación golang-fiber-iris-realworld-example-app por @Dmitry Maslennikov

🥈 2do lugar y $2,500 para la aplicación python-iris-audio-query por @Yu Han Eng

🥉 3er lugar y $1,000 para la aplicación FHIR Data Explorer with Hybrid Search and AI Summaries por @Pietro Di Leo

🏅 4to lugar $500 para la aplicación IRIStool and Data Manager por @Pietro Di Leo

🏅 5to lugar $300 para la aplicación yaml-adaptor por @Yuri Marx   

🌟 $100 son para gj :: configExplorer por @John Murray

🌟 $100 son para la aplicación  quarkus-iris-monitor-system por @Davi Massaru Teixeira Muta  

🌟 $100 son para la aplicación  Snapshot of free disk space por @Robert Cemper

🌟 $100 son para la aplicación irisconns por @Eric Fortenberry

🌟 $100 son para la aplicación SentinelIris por @André Dienes Friedrich

Nominación de la Comunidad

🥇 1er lugar y $1,000 son para la aplicación FHIR Data Explorer with Hybrid Search and AI Summaries por @Pietro Di Leo

🥈 2do lugar y $600 son para la aplicación yaml-adaptor por @Yuri Marx

🥉 3er lugar y $300 son para la aplicación quarkus-iris-monitor-system por @Davi Massaru Teixeira Muta  

🏅 4to lugar y $200 son para la aplicación golang-fiber-iris-realworld-example-app por @Dmitry Maslennikov

🏅 5to lugar $100 son para la aplicación gj :: configExplorer por @John Murray

¡Nuestras más sinceras felicitaciones a todos los ganadores!

Os esperamos en la siguiente ;)

Discussion (0)1
Log in or sign up to continue
Question
· Oct 14

Data Transform - Looking for two specific pieces of text

Hi,

I have the following transform working but i also want to add another string of text for it to look for but i'm unsure of how to write this in. The two bits of text are "NOT DECTECTED" and "Negative"

2 Comments
Discussion (2)3
Log in or sign up to continue
Article
· Oct 14 3m read

Sample for Beginners with Streams in IRIS

To better understand Streams in IRIS I'll start with a short

History

In the beginning (before IRIS), there was just basic access to external devices.
The 4 commands OPEN, CLOSE, READ, WRITE still work and are documented 
by  Introduction to I/O in detail.
Especially for files, this is a direct access to your actual file system.
You have to take care of any status or other signal in your code.  
Also, any code conversion or similar is up to you. 

Class %Library.File aka %File offers a large collection of methods and queries 
for standard operations on directories and files.
READ, WRITE is there but the content is not touched.

Now we have reached %Stream Classes.
The major difference from before is that they are oriented to the content.
In addition, streams pass the  MAXSTRING limit of 3,641,144 characters.

Streams are typed by storage location (Global, File, Tmp, Null, Dynamic)
and content (Character, Binary) and features, such as Gzip or Compressed.
The difference between file character streams and file binary streams is
that the character stream understands that it is writing character data
and this may be subject to character set translation.
In addition, line terminators for Windows and Unix are adjusted. 

The example

There is an HTML page with an embedded table.
The exercise is to extract all rows from the red-marked table for further processing.
embedded in this HTML page. (most likely generated with DRUPAL)

Preparation

  • Call the page of interest in your browser
  • with <CRTL>+S  store  it in a directory that can be accessed from IRIS
    • in the demo this is my local directory mapped to container as /ext
  • you now have a source for a %Stream.FileCharacter object.

Step 1

Set up your Stream object

 set file="/ext/Stream.html"
 set stream=##class(%Stream.FileCharacter).%New()
 set sc=stream.LinkToFile(file)

Step 2

Find your table

  • you can skip the HTML <head> . . . </head> part
  • also the framing around the <table> . . . </table> part is just noise
  • this also applies for the column headers <thead> . . . </thead>
  • row content starts after the <tbody> tag
  • So you search for it

Searching in streams works with the same logic as $FIND() in ObjectScript
The source to check is your stream, then a start location, and a string to find  
In addition, you can switch off case sensitivity.
Remember, this is a Character stream !

set row=stream.FindAt(1,"<tbody",,1)
if row<0 return '$$$OK

Step 3

Now you begin to loop over the rows. 
The characteristic start is indicated in HTML by <tr . . .  </tr
The class method FindAt() has the nice feature not just to provide
the location but also the remaining characters in the source buffer. 
In this demo example, it always contains the full row.
Identifying the end by HTML tag </tbody is easy.

set row=stream.FindAt(row+1,"<tr",.temp,1)
set txt=$piece(temp,"</tr")

Step 4

Next, the inner loop over the columns between <td .. . </td follows
As you have the complete row test in your hands, this is just normal ObjectScript

Note 1:
In the example, the content of the columns is overloaded by DRUPAlL with
a lot of formatting and other control code. So the content could only be
estimated by characteristic sequences.  e.g. href= 

Note 2:
To verify the result and to visualize it, I display the values and keep them
also in a PPG for further use if required.  Enjoy trying it.

Demo code available on Github
Enjoy trying it. 
 

2 Comments
Discussion (2)2
Log in or sign up to continue