RAHLTCPB ; HIRMFO/REL,GJC,BNT,PAV - Rad/Nuc Med HL7 TCP/IP Bridge;05/21/99 ;17 Apr 2019 3:25 PM
;;5.0;Radiology/Nuclear Medicine;**12,17,25,51,71,81,84,106,157**;Mar 16, 1998;Build 2
; 07/05/2006 BAY/KAM Remedy Call 124379 Eliminate unneeded ORM msgs
; 09/01/2006 Accomodate multiple ORC/OBR segments Patch 81
;
;Integration Agreements
;----------------------
;INIT^HLFNC2(2161); GENACK^HLMA1(2165); $$DT^XLFDT(10103)
;
EN1 ; Build the ^TMP("RARPT-REC" global when we receive the
; 07/05/2006 Remedy Call 124379 message from HL7. If RAHLTCPB is defined, do not broadcast ORM messages. As of the writing
; of patch 71, RAHLTCPB is referenced in RAHLTCPB, UPSTAT^RAUTL0, & UP2^RAUTL1 Generic provider: RADIOLOGY,OUTSIDE SERVICE
N RATELE,RATELENM,RATELEPI,RATELEKN,RATELEDR,RATELEDF
D TELE^RAHLRPTT ;Patch 84
;** branch to new HL7 logic when the HL7 version surpasses 2.3 **
I HL("VER")>2.3,($T(^RAHLTCPX))'="" GOTO EN1^RAHLTCPX
S RASUB=HL("MID"),RAHLTCPB=1 K RAERR
;**********************************************
;RACN is Counter - Indication that ORC segment present
N RACN,II,L,RAPRSET,RARRR,XX,RAHLD,RARSDNT,RATRSCRP S (RACN,RAPRSET)=0 ; = Address where we go to store data...
;**********************************************
K ^TMP("RARPT-HL7",$J) ; clean area that holds data from HL7
K ^TMP("RARPT-REC",$J,RASUB) ; kill storage area for new HL7 message id
S ^TMP("RARPT-REC",$J,RASUB,"RADATE")=$$DT^XLFDT()
F I=1:1 X HLNEXT Q:HLQUIT'>0 D
.I '$L(HLNODE),$L($G(HLNODE(1))) S HLNODE=HLNODE(1) K HLNODE(1) F J=2:1 Q:'$D(HLNODE(J)) S HLNODE(J-1)=HLNODE(J) K HLNODE(J)
.S ^TMP("RARPT-HL7",$J,I)=HLNODE,J=0 F S J=$O(HLNODE(J)) Q:'J S ^TMP("RARPT-HL7",$J,I,J)=HLNODE(J)
S CNT=2,SEGMNT=$G(^TMP("RARPT-HL7",$J,CNT))
S:'$$GETSFLAG^RAHLRU($G(HL("SAN")),$G(HL("MTN")),$G(HL("ETN")),$G(HL("VER"))) RANOSEND=$G(HL("SAN"))
S ^TMP("RARPT-REC",$J,RASUB,"VENDOR")=$G(HL("SAN"))
PID ; Pick data off the 'PID' segment.
I $P(SEGMNT,HL("FS"))="PID" D
. S SEGMNT=$P(SEGMNT,HL("FS"),2,99999)
. I $P($P(SEGMNT,HL("FS"),3),$E(HL("ECH")))]"" D
.. S (^TMP("RARPT-REC",$J,RASUB,"RADFN"),RADFN)=$P($P(SEGMNT,HL("FS"),3),$E(HL("ECH")))
.. Q
. I $P(SEGMNT,HL("FS"),19)]"" D
.. S ^TMP("RARPT-REC",$J,RASUB,"RASSN")=$P(SEGMNT,HL("FS"),19)
.. Q
. Q
E S RAERR="Missing PID segment" D XIT Q
I '(+$G(^TMP("RARPT-REC",$J,RASUB,"RADFN"))) D Q
.S RAERR="Invalid Patient ID"
.D XIT
; Save off E-Sig information (if it exists)
S:$D(HL("ESIG")) ^TMP("RARPT-REC",$J,RASUB,"RAESIG")=HL("ESIG")
;********************************
ORC ; Pick data off the 'ORC' segment.
D
.N CNT1 S CNT1=CNT,RARRR=""
111 .K SEGMNT S CNT1=$O(^TMP("RARPT-HL7",$J,CNT1)) Q:CNT1="" S SEGMNT=$G(^(CNT1))
.I $P(SEGMNT,HL("FS"))="PV1" S CNT=CNT1 G 111
.Q:$P(SEGMNT,HL("FS"))'="ORC"
.S CNT=CNT1 Q:$P(SEGMNT,HL("FS"),2)'="CN" ; find the 'ORC' segment
.S RACN=RACN+1,RARRR="RARPT-REC-"_RACN
;********************************
OBR ; Pick data off the 'OBR' segment.
I $L(RARRR) K ^TMP(RARRR,$J) M ^TMP(RARRR,$J)=^TMP("RARPT-REC",$J) ;Merge if OBR without Report
S:'$L(RARRR) RARRR="RARPT-REC"
K SEGMNT F S CNT=$O(^TMP("RARPT-HL7",$J,CNT)) Q:CNT="" S SEGMNT=$G(^(CNT)) Q:$P(SEGMNT,HL("FS"))="OBR" ; find the 'OBR' segment
I $P($G(SEGMNT),HL("FS"))'="OBR" S RAERR="Missing OBR segment" D XIT Q
S SEGMNT=$P(SEGMNT,HL("FS"),2,99999) K RADTI,RACNI
I $P(SEGMNT,HL("FS"),3)]"" D
. N RADTCN S RADTCN=$P(SEGMNT,HL("FS"),3)
. S:$P($P(RADTCN,$E(HL("ECH"))),"-")]"" (^TMP(RARRR,$J,RASUB,"RADTI"),RADTI)=$P($P(RADTCN,$E(HL("ECH"))),"-")
. S:$P($P(RADTCN,$E(HL("ECH"))),"-",2)]"" (^TMP(RARRR,$J,RASUB,"RACNI"),RACNI)=$P($P(RADTCN,$E(HL("ECH"))),"-",2)
. S:$P(RADTCN,$E(HL("ECH")),2)["&L" RADTCN=$TR(RADTCN,"&","^")
. S:$P(RADTCN,$E(HL("ECH")),2)]"" ^TMP(RARRR,$J,RASUB,"RALONGCN")=$P(RADTCN,$E(HL("ECH")),2)
. Q
I $G(RADTI)'>0 S RAERR="Invalid exam registration timestamp" D XIT Q
I $G(RACNI)'>0 S RAERR="Invalid exam record IEN" D XIT Q
S RAHLD=$$PCEXTR^RAHLO4(CNT,SEGMNT,25,HL("FS")) K RAHL70
I RAHLD="" S RAERR="Missing Report Status" D XIT Q
;P106
I "^A^F^R^VAQ^"'[("^"_RAHLD_"^") D D XIT Q
.S RAERR="Invalid Report Status: "_RAHLD QUIT
;
S ^TMP(RARRR,$J,RASUB,"RASTAT")=RAHLD
G:$P(RARRR,"-",3) 112 S RAHLD=$$PCEXTR^RAHLO4(CNT,SEGMNT,32,HL("FS")) K RAHL70
I RAHLD']"" S RAERR="Missing Provider ID" D XIT Q
S RAVERF=RAHLD
; ----- Check the validity of the provider name -----
I '$D(^VA(200,"B",RAVERF)) D ; check for a partial match in file 200
. D VFIER^RAHLO3 ; if one partial match found, return the entry ien
E D ; $D(^VA(200,"B",RAVERF)) true, get the entry ien
. S RAVERF=$O(^VA(200,"B",RAVERF,0))
. S:'RAVERF RAERR="Invalid Provider Name: "_RAHLD
; can't get resident info from medspeak
S RAHLD=$$PCEXTR^RAHLO4(CNT,SEGMNT,33,HL("FS")),RARSDNT="" K RAHL70
I RAHLD]"" D
. S RARSDNT=$P(RAHLD,$E(HL("ECH"),4)) I '$D(^VA(200,+RARSDNT,0)) S RARSDNT=""
S RAHLD="",RAHLD=$$PCEXTR^RAHLO4(CNT,SEGMNT,35,HL("FS")),RATRSCRP="" K RAHL70
I RAHLD]"" D
. S RATRSCRP=$P(RAHLD,$E(HL("ECH"),4)) I '$D(^VA(200,+RATRSCRP,0)) S RATRSCRP=""
S ^TMP(RARRR,$J,RASUB,"RAVERF")=RAVERF
S ^TMP(RARRR,$J,RASUB,"RATRANSCRIPT")=$S(RATRSCRP]"":RATRSCRP,RARSDNT]"":RARSDNT,1:RAVERF)
S:$G(RARSDNT) ^TMP(RARRR,$J,RASUB,"RARESIDENT")=RARSDNT
S ^TMP(RARRR,$J,RASUB,"RASTAFF")=RAVERF,^("RAWHOCHANGE")=RAVERF
I $D(RAERR) D XIT Q
D ESIG^RAHLO3
;
;If last OBR set provider info to all OBRs
K XX F I=1:1:RACN S XX=RARRR_"-"_I D:$D(^TMP(XX,$J,RASUB))
.N XXX M XXX=^TMP(XX,$J,RASUB),^TMP(XX,$J,RASUB)=^TMP(RARRR,$J,RASUB),^TMP(XX,$J,RASUB)=XXX
112 I $D(RADTI),$D(RACNI),$D(RAPRSET(RADTI,RACNI)) K RAPRSET(RADTI,RACNI),^TMP(RARRR,$J) S RACN=RACN-1 G:$P(RARRR,"-",3) ORC M ^TMP(RARRR,$J)=^TMP("RARPT-REC-"_(RACN+1),$J) K ^TMP("RARPT-REC-"_(RACN+1),$J) G OBX
I $D(RADTI),'$D(RAPRSET(RADTI)) D ;Get array of printset for date...
.N RAPRTSET,RACN,RASUB,CNT
.K XX D EN2^RAUTL20(.XX) M:$D(XX) RAPRSET(RADTI)=XX K RAPRSET(RADTI,RACNI)
;
OBX ; Pick data off the 'OBX' segments
K SEGMNT F S CNT=$O(^TMP("RARPT-HL7",$J,CNT)) Q:CNT="" S SEGMNT=$G(^(CNT)) D:$P(SEGMNT,HL("FS"))="OBX" Q:$D(RAERR) I $P(SEGMNT,HL("FS"))="ORC" S CNT=CNT-1 G ORC
. S SEGMNT=$P(SEGMNT,HL("FS"),2,9999)
. Q:SEGMNT?@("1"""_HL("FS")_"""."""_HL("FS")_"""") ;Quit if OBX is something as: OBX||||||||
. I $P(SEGMNT,HL("FS"),3)']"" S RAERR="Missing Observation Identifier" Q
. S OBXTYP=$P($P(SEGMNT,HL("FS"),3),$E(HL("ECH"))),OBXTYP=$E($P(OBXTYP,"&",2))
. S OBX2CE=""
. S:OBXTYP="" OBXTYP=" "
. I OBXTYP=" "&($P(SEGMNT,HL("FS"),2)="CE") D
. . I $P(SEGMNT,HL("FS"),5)=" " S OBXTYP="F" Q
. . S OBX2CE=1,OBXTYP="D" Q
. I "IDRF"'[OBXTYP S RAERR="Invalid Observation Identifier" Q
. D RPT Q
XIT ; RACKYES Indicates that Ack will be sent on the last OBR segment or at Error condition.
N RACKYES
I $D(RAERR) S RACKYES=1 D EN1^RAHLEXF,GENACK G XIT1
I $D(^TMP("RARPT-REC",$J)) S:'RACN RACKYES=1 D G:$D(RAERR) XIT1
.N RACN D EN1^RAHLO I $D(RAERR) S RACKYES=1 D EN1^RAHLEXF,GENACK
F II=1:1:RACN S RARRR="RARPT-REC-"_II D:$D(^TMP(RARRR,$J)) Q:$D(RAERR)
.K ^TMP("RARPT-REC",$J) M ^TMP("RARPT-REC",$J)=^TMP(RARRR,$J) K ^TMP(RARRR,$J)
.S RACKYES=(II=RACN) N II,RACN D EN1^RAHLO I $D(RAERR) S RACKYES=1 D EN1^RAHLEXF,GENACK
XIT1 K ^TMP("RARPT-REC",$J) ; kill storage area for current HL7 message id
F II=1:1:RACN S RARRR="RARPT-REC-"_II K:$D(^TMP(RARRR,$J)) ^TMP(RARRR,$J)
K ^TMP("RARPT-HL7",$J) ; clean up HL7 storage
K CNT,OBXTYP,X1,LIN,RADATE,RADTCN,RAERR,RAESIG,RAHLD,RAHLTCPB,RANODE,RARCNT
K RAVERF,RASUB,SEGMNT,RANOSEND,MSA1,OBX2CE,RADX,RADX1,RADX2,RADX3
Q
RPT ; Save off Report Text data.
N RAXADEDN
S RAXADEDN=^TMP("RARPT-REC",$J,RASUB,"RASTAT")
S RANODE=$S(OBXTYP="D":"RADX",OBXTYP="I":"RAIMP",1:"RATXT"),LIN=""
I OBX2CE D Q
. ; KLM/p157 update DX Code processing for v2.3 to accomodate VR passing a primary designation.
. ; We will need to set LIN (RADX,RADX2,RADX3)to the entire dx code passed (ie 1^NORMAL^P).
. S X=$P(SEGMNT,HL("FS"),5),RADX1=$P(X,$E(HL("ECH"),2))
. S LIN=RADX1,L=999 D P2 S LIN=X
. Q:X'["~" F J=0:0 S J=$O(^TMP("RARPT-HL7",$J,CNT,J)) Q:'J S X1=^(J),LIN=LIN_X1 Q
. S RADX=LIN,RADX2=$P(RADX,"~",2) S:RADX2]"" LIN=RADX2 D P2 ;p157
. S RADX3=$P(RADX,"~",3) Q:RADX3']"" S LIN=RADX3 D P2 Q ;p157
S X=$P(SEGMNT,HL("FS"),5)
I X["\S\"!(X["\R\")!(X["\E\")!(X["\T\") D FORMAT
I $G(RATELE),$D(RATELEKN),X[RATELEKN S X=$P(X,RATELEKN,2),RATELENM=$P(X,"-"),RATELEPI=$TR($P(X,"-",2)," ","") ;SFVAMC/DAD/9-7-2007/Comment out the quit Q ;Patch 84
D PAR
F J=0:0 S J=$O(^TMP("RARPT-HL7",$J,CNT,J)) Q:'J S X1=^(J),X=$E(X1,1,125) D PAR I $L(X1)>125 S X=$E(X1,126,999) D PAR
I X=""!(LIN'="") S L=999 D P2
Q
;
PAR ; Build text paragraph
S LIN=LIN_X
P1 I $L(LIN)<80 Q
F L=80:-1:1 Q:$E(LIN,L)=" "
D P2 S LIN=$E(LIN,L+1,999) G P1
P2 ; Set node
; If Addendum and Report text is a space don't process
I $P(SEGMNT,HL("FS"),1)=1,RAXADEDN="A",RANODE="RATXT",$E(LIN,1,L-1)=" " Q
S RARCNT(OBXTYP)=$G(RARCNT(OBXTYP))+1
;KLM/p157 Setting "PDX" node for the Primary indicator (to be used in RAHLO2)
I RANODE="RADX" D
. I $P($G(LIN),"^",3)="P" S ^TMP("RARPT-REC",$J,RASUB,RANODE,"PDX",RARCNT(OBXTYP))=+LIN
. S LIN=+LIN
. Q
S ^TMP("RARPT-REC",$J,RASUB,RANODE,RARCNT(OBXTYP))=$E(LIN,1,L-1)
F I=1:1:RACN S RARRR="RARPT-REC-"_I S:$D(^TMP(RARRR,$J)) ^TMP(RARRR,$J,RASUB,RANODE,RARCNT(OBXTYP))=$E(LIN,1,L-1)
Q
;
GENACK ; Compile the 'ACK' segment, generate the 'ACK' message.
Q:'$G(RACKYES)
S MSA1="AA"
Q:$E($G(HL("SAN")),1,3)'="RA-" ; Don't allow non RA namespaced interfaces
I $D(RAERR) S MSA1=$S($G(HL("SAN"))="RA-PSCRIBE-TCP"!$G(RATELE):"AE",1:"AR")
; Added next line to support MedSpeak interface. Must re-initialize
; FS and EC's before sending ACK.
D:$G(HL("SAN"))="RA-CLIENT-TCP" INIT^HLFNC2("RA VOICE TCP SERVER RPT",.HL)
S HLA("HLA",1)="MSA"_HL("FS")_MSA1_HL("FS")_HL("MID")_$S($D(RAERR):HL("FS")_RAERR,1:"")
; 06/22/2006 KAM CHANGED NEXT TWO LINES FOR RA*5*71
S HLEID=HL("EID"),HLEIDS=HL("EIDS"),HLARYTYP="LM",HLFORMAT=1
K HLRESLT D GENACK^HLMA1(HLEID,HLMTIENS,HLEIDS,HLARYTYP,HLFORMAT)
Q
;
FORMAT ; Format report text for Escape Character delimited codes.
S Y=X N T,Q
I Y["\S\" S Q=$F(Y,"\S\"),T=Q-4,X=$E(Y,1,T)_$E(HL("ECH"))_$E(Y,Q,$L(X)),Y=X
I Y["\R\" S Q=$F(Y,"\R\"),T=Q-4,X=$E(Y,1,T)_$E(HL("ECH"),2)_$E(Y,Q,$L(X)),Y=X
I Y["\E\" S Q=$F(Y,"\E\"),T=Q-4,X=$E(Y,1,T)_$E(HL("ECH"),3)_$E(Y,Q,$L(X)),Y=X
I Y["\T\" S Q=$F(Y,"\T\"),T=Q-4,X=$E(Y,1,T)_$E(HL("ECH"),4)_$E(Y,Q,$L(X)),Y=X
I X["\S\"!(X["\R\")!(X["\E\")!(X["\T\") D FORMAT
Q
;
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HRAHLTCPB 10668 printed Dec 13, 2024@02:35:39 Page 2
RAHLTCPB ; HIRMFO/REL,GJC,BNT,PAV - Rad/Nuc Med HL7 TCP/IP Bridge;05/21/99 ;17 Apr 2019 3:25 PM
+1 ;;5.0;Radiology/Nuclear Medicine;**12,17,25,51,71,81,84,106,157**;Mar 16, 1998;Build 2
+2 ; 07/05/2006 BAY/KAM Remedy Call 124379 Eliminate unneeded ORM msgs
+3 ; 09/01/2006 Accomodate multiple ORC/OBR segments Patch 81
+4 ;
+5 ;Integration Agreements
+6 ;----------------------
+7 ;INIT^HLFNC2(2161); GENACK^HLMA1(2165); $$DT^XLFDT(10103)
+8 ;
EN1 ; Build the ^TMP("RARPT-REC" global when we receive the
+1 ; 07/05/2006 Remedy Call 124379 message from HL7. If RAHLTCPB is defined, do not broadcast ORM messages. As of the writing
+2 ; of patch 71, RAHLTCPB is referenced in RAHLTCPB, UPSTAT^RAUTL0, & UP2^RAUTL1 Generic provider: RADIOLOGY,OUTSIDE SERVICE
+3 NEW RATELE,RATELENM,RATELEPI,RATELEKN,RATELEDR,RATELEDF
+4 ;Patch 84
DO TELE^RAHLRPTT
+5 ;** branch to new HL7 logic when the HL7 version surpasses 2.3 **
+6 IF HL("VER")>2.3
IF ($TEXT(^RAHLTCPX))'=""
GOTO EN1^RAHLTCPX
+7 SET RASUB=HL("MID")
SET RAHLTCPB=1
KILL RAERR
+8 ;**********************************************
+9 ;RACN is Counter - Indication that ORC segment present
+10 ; = Address where we go to store data...
NEW RACN,II,L,RAPRSET,RARRR,XX,RAHLD,RARSDNT,RATRSCRP
SET (RACN,RAPRSET)=0
+11 ;**********************************************
+12 ; clean area that holds data from HL7
KILL ^TMP("RARPT-HL7",$JOB)
+13 ; kill storage area for new HL7 message id
KILL ^TMP("RARPT-REC",$JOB,RASUB)
+14 SET ^TMP("RARPT-REC",$JOB,RASUB,"RADATE")=$$DT^XLFDT()
+15 FOR I=1:1
XECUTE HLNEXT
if HLQUIT'>0
QUIT
Begin DoDot:1
+16 IF '$LENGTH(HLNODE)
IF $LENGTH($GET(HLNODE(1)))
SET HLNODE=HLNODE(1)
KILL HLNODE(1)
FOR J=2:1
if '$DATA(HLNODE(J))
QUIT
SET HLNODE(J-1)=HLNODE(J)
KILL HLNODE(J)
+17 SET ^TMP("RARPT-HL7",$JOB,I)=HLNODE
SET J=0
FOR
SET J=$ORDER(HLNODE(J))
if 'J
QUIT
SET ^TMP("RARPT-HL7",$JOB,I,J)=HLNODE(J)
End DoDot:1
+18 SET CNT=2
SET SEGMNT=$GET(^TMP("RARPT-HL7",$JOB,CNT))
+19 if '$$GETSFLAG^RAHLRU($GET(HL("SAN")),$GET(HL("MTN")),$GET(HL("ETN")),$GET(HL("VER")))
SET RANOSEND=$GET(HL("SAN"))
+20 SET ^TMP("RARPT-REC",$JOB,RASUB,"VENDOR")=$GET(HL("SAN"))
PID ; Pick data off the 'PID' segment.
+1 IF $PIECE(SEGMNT,HL("FS"))="PID"
Begin DoDot:1
+2 SET SEGMNT=$PIECE(SEGMNT,HL("FS"),2,99999)
+3 IF $PIECE($PIECE(SEGMNT,HL("FS"),3),$EXTRACT(HL("ECH")))]""
Begin DoDot:2
+4 SET (^TMP("RARPT-REC",$JOB,RASUB,"RADFN"),RADFN)=$PIECE($PIECE(SEGMNT,HL("FS"),3),$EXTRACT(HL("ECH")))
+5 QUIT
End DoDot:2
+6 IF $PIECE(SEGMNT,HL("FS"),19)]""
Begin DoDot:2
+7 SET ^TMP("RARPT-REC",$JOB,RASUB,"RASSN")=$PIECE(SEGMNT,HL("FS"),19)
+8 QUIT
End DoDot:2
+9 QUIT
End DoDot:1
+10 IF '$TEST
SET RAERR="Missing PID segment"
DO XIT
QUIT
+11 IF '(+$GET(^TMP("RARPT-REC",$JOB,RASUB,"RADFN")))
Begin DoDot:1
+12 SET RAERR="Invalid Patient ID"
+13 DO XIT
End DoDot:1
QUIT
+14 ; Save off E-Sig information (if it exists)
+15 if $DATA(HL("ESIG"))
SET ^TMP("RARPT-REC",$JOB,RASUB,"RAESIG")=HL("ESIG")
+16 ;********************************
ORC ; Pick data off the 'ORC' segment.
+1 Begin DoDot:1
+2 NEW CNT1
SET CNT1=CNT
SET RARRR=""
111 KILL SEGMNT
SET CNT1=$ORDER(^TMP("RARPT-HL7",$JOB,CNT1))
if CNT1=""
QUIT
SET SEGMNT=$GET(^(CNT1))
+1 IF $PIECE(SEGMNT,HL("FS"))="PV1"
SET CNT=CNT1
GOTO 111
+2 if $PIECE(SEGMNT,HL("FS"))'="ORC"
QUIT
+3 ; find the 'ORC' segment
SET CNT=CNT1
if $PIECE(SEGMNT,HL("FS"),2)'="CN"
QUIT
+4 SET RACN=RACN+1
SET RARRR="RARPT-REC-"_RACN
End DoDot:1
+5 ;********************************
OBR ; Pick data off the 'OBR' segment.
+1 ;Merge if OBR without Report
IF $LENGTH(RARRR)
KILL ^TMP(RARRR,$JOB)
MERGE ^TMP(RARRR,$JOB)=^TMP("RARPT-REC",$JOB)
+2 if '$LENGTH(RARRR)
SET RARRR="RARPT-REC"
+3 ; find the 'OBR' segment
KILL SEGMNT
FOR
SET CNT=$ORDER(^TMP("RARPT-HL7",$JOB,CNT))
if CNT=""
QUIT
SET SEGMNT=$GET(^(CNT))
if $PIECE(SEGMNT,HL("FS"))="OBR"
QUIT
+4 IF $PIECE($GET(SEGMNT),HL("FS"))'="OBR"
SET RAERR="Missing OBR segment"
DO XIT
QUIT
+5 SET SEGMNT=$PIECE(SEGMNT,HL("FS"),2,99999)
KILL RADTI,RACNI
+6 IF $PIECE(SEGMNT,HL("FS"),3)]""
Begin DoDot:1
+7 NEW RADTCN
SET RADTCN=$PIECE(SEGMNT,HL("FS"),3)
+8 if $PIECE($PIECE(RADTCN,$EXTRACT(HL("ECH"))),"-")]""
SET (^TMP(RARRR,$JOB,RASUB,"RADTI"),RADTI)=$PIECE($PIECE(RADTCN,$EXTRACT(HL("ECH"))),"-")
+9 if $PIECE($PIECE(RADTCN,$EXTRACT(HL("ECH"))),"-",2)]""
SET (^TMP(RARRR,$JOB,RASUB,"RACNI"),RACNI)=$PIECE($PIECE(RADTCN,$EXTRACT(HL("ECH"))),"-",2)
+10 if $PIECE(RADTCN,$EXTRACT(HL("ECH")),2)["&L"
SET RADTCN=$TRANSLATE(RADTCN,"&","^")
+11 if $PIECE(RADTCN,$EXTRACT(HL("ECH")),2)]""
SET ^TMP(RARRR,$JOB,RASUB,"RALONGCN")=$PIECE(RADTCN,$EXTRACT(HL("ECH")),2)
+12 QUIT
End DoDot:1
+13 IF $GET(RADTI)'>0
SET RAERR="Invalid exam registration timestamp"
DO XIT
QUIT
+14 IF $GET(RACNI)'>0
SET RAERR="Invalid exam record IEN"
DO XIT
QUIT
+15 SET RAHLD=$$PCEXTR^RAHLO4(CNT,SEGMNT,25,HL("FS"))
KILL RAHL70
+16 IF RAHLD=""
SET RAERR="Missing Report Status"
DO XIT
QUIT
+17 ;P106
+18 IF "^A^F^R^VAQ^"'[("^"_RAHLD_"^")
Begin DoDot:1
+19 SET RAERR="Invalid Report Status: "_RAHLD
QUIT
End DoDot:1
DO XIT
QUIT
+20 ;
+21 SET ^TMP(RARRR,$JOB,RASUB,"RASTAT")=RAHLD
+22 if $PIECE(RARRR,"-",3)
GOTO 112
SET RAHLD=$$PCEXTR^RAHLO4(CNT,SEGMNT,32,HL("FS"))
KILL RAHL70
+23 IF RAHLD']""
SET RAERR="Missing Provider ID"
DO XIT
QUIT
+24 SET RAVERF=RAHLD
+25 ; ----- Check the validity of the provider name -----
+26 ; check for a partial match in file 200
IF '$DATA(^VA(200,"B",RAVERF))
Begin DoDot:1
+27 ; if one partial match found, return the entry ien
DO VFIER^RAHLO3
End DoDot:1
+28 ; $D(^VA(200,"B",RAVERF)) true, get the entry ien
IF '$TEST
Begin DoDot:1
+29 SET RAVERF=$ORDER(^VA(200,"B",RAVERF,0))
+30 if 'RAVERF
SET RAERR="Invalid Provider Name: "_RAHLD
End DoDot:1
+31 ; can't get resident info from medspeak
+32 SET RAHLD=$$PCEXTR^RAHLO4(CNT,SEGMNT,33,HL("FS"))
SET RARSDNT=""
KILL RAHL70
+33 IF RAHLD]""
Begin DoDot:1
+34 SET RARSDNT=$PIECE(RAHLD,$EXTRACT(HL("ECH"),4))
IF '$DATA(^VA(200,+RARSDNT,0))
SET RARSDNT=""
End DoDot:1
+35 SET RAHLD=""
SET RAHLD=$$PCEXTR^RAHLO4(CNT,SEGMNT,35,HL("FS"))
SET RATRSCRP=""
KILL RAHL70
+36 IF RAHLD]""
Begin DoDot:1
+37 SET RATRSCRP=$PIECE(RAHLD,$EXTRACT(HL("ECH"),4))
IF '$DATA(^VA(200,+RATRSCRP,0))
SET RATRSCRP=""
End DoDot:1
+38 SET ^TMP(RARRR,$JOB,RASUB,"RAVERF")=RAVERF
+39 SET ^TMP(RARRR,$JOB,RASUB,"RATRANSCRIPT")=$SELECT(RATRSCRP]"":RATRSCRP,RARSDNT]"":RARSDNT,1:RAVERF)
+40 if $GET(RARSDNT)
SET ^TMP(RARRR,$JOB,RASUB,"RARESIDENT")=RARSDNT
+41 SET ^TMP(RARRR,$JOB,RASUB,"RASTAFF")=RAVERF
SET ^("RAWHOCHANGE")=RAVERF
+42 IF $DATA(RAERR)
DO XIT
QUIT
+43 DO ESIG^RAHLO3
+44 ;
+45 ;If last OBR set provider info to all OBRs
+46 KILL XX
FOR I=1:1:RACN
SET XX=RARRR_"-"_I
if $DATA(^TMP(XX,$JOB,RASUB))
Begin DoDot:1
+47 NEW XXX
MERGE XXX=^TMP(XX,$JOB,RASUB),^TMP(XX,$JOB,RASUB)=^TMP(RARRR,$JOB,RASUB),^TMP(XX,$JOB,RASUB)=XXX
End DoDot:1
112 IF $DATA(RADTI)
IF $DATA(RACNI)
IF $DATA(RAPRSET(RADTI,RACNI))
KILL RAPRSET(RADTI,RACNI),^TMP(RARRR,$JOB)
SET RACN=RACN-1
if $PIECE(RARRR,"-",3)
GOTO ORC
MERGE ^TMP(RARRR,$JOB)=^TMP("RARPT-REC-"_(RACN+1),$JOB)
KILL ^TMP("RARPT-REC-"_(RACN+1),$JOB)
GOTO OBX
+1 ;Get array of printset for date...
IF $DATA(RADTI)
IF '$DATA(RAPRSET(RADTI))
Begin DoDot:1
+2 NEW RAPRTSET,RACN,RASUB,CNT
+3 KILL XX
DO EN2^RAUTL20(.XX)
if $DATA(XX)
MERGE RAPRSET(RADTI)=XX
KILL RAPRSET(RADTI,RACNI)
End DoDot:1
+4 ;
OBX ; Pick data off the 'OBX' segments
+1 KILL SEGMNT
FOR
SET CNT=$ORDER(^TMP("RARPT-HL7",$JOB,CNT))
if CNT=""
QUIT
SET SEGMNT=$GET(^(CNT))
if $PIECE(SEGMNT,HL("FS"))="OBX"
Begin DoDot:1
+2 SET SEGMNT=$PIECE(SEGMNT,HL("FS"),2,9999)
+3 ;Quit if OBX is something as: OBX||||||||
if SEGMNT?@("1"""_HL("FS")_"""."""_HL("FS")_"""")
QUIT
+4 IF $PIECE(SEGMNT,HL("FS"),3)']""
SET RAERR="Missing Observation Identifier"
QUIT
+5 SET OBXTYP=$PIECE($PIECE(SEGMNT,HL("FS"),3),$EXTRACT(HL("ECH")))
SET OBXTYP=$EXTRACT($PIECE(OBXTYP,"&",2))
+6 SET OBX2CE=""
+7 if OBXTYP=""
SET OBXTYP=" "
+8 IF OBXTYP=" "&($PIECE(SEGMNT,HL("FS"),2)="CE")
Begin DoDot:2
+9 IF $PIECE(SEGMNT,HL("FS"),5)=" "
SET OBXTYP="F"
QUIT
+10 SET OBX2CE=1
SET OBXTYP="D"
QUIT
End DoDot:2
+11 IF "IDRF"'[OBXTYP
SET RAERR="Invalid Observation Identifier"
QUIT
+12 DO RPT
QUIT
End DoDot:1
if $DATA(RAERR)
QUIT
IF $PIECE(SEGMNT,HL("FS"))="ORC"
SET CNT=CNT-1
GOTO ORC
XIT ; RACKYES Indicates that Ack will be sent on the last OBR segment or at Error condition.
+1 NEW RACKYES
+2 IF $DATA(RAERR)
SET RACKYES=1
DO EN1^RAHLEXF
DO GENACK
GOTO XIT1
+3 IF $DATA(^TMP("RARPT-REC",$JOB))
if 'RACN
SET RACKYES=1
Begin DoDot:1
+4 NEW RACN
DO EN1^RAHLO
IF $DATA(RAERR)
SET RACKYES=1
DO EN1^RAHLEXF
DO GENACK
End DoDot:1
if $DATA(RAERR)
GOTO XIT1
+5 FOR II=1:1:RACN
SET RARRR="RARPT-REC-"_II
if $DATA(^TMP(RARRR,$JOB))
Begin DoDot:1
+6 KILL ^TMP("RARPT-REC",$JOB)
MERGE ^TMP("RARPT-REC",$JOB)=^TMP(RARRR,$JOB)
KILL ^TMP(RARRR,$JOB)
+7 SET RACKYES=(II=RACN)
NEW II,RACN
DO EN1^RAHLO
IF $DATA(RAERR)
SET RACKYES=1
DO EN1^RAHLEXF
DO GENACK
End DoDot:1
if $DATA(RAERR)
QUIT
XIT1 ; kill storage area for current HL7 message id
KILL ^TMP("RARPT-REC",$JOB)
+1 FOR II=1:1:RACN
SET RARRR="RARPT-REC-"_II
if $DATA(^TMP(RARRR,$JOB))
KILL ^TMP(RARRR,$JOB)
+2 ; clean up HL7 storage
KILL ^TMP("RARPT-HL7",$JOB)
+3 KILL CNT,OBXTYP,X1,LIN,RADATE,RADTCN,RAERR,RAESIG,RAHLD,RAHLTCPB,RANODE,RARCNT
+4 KILL RAVERF,RASUB,SEGMNT,RANOSEND,MSA1,OBX2CE,RADX,RADX1,RADX2,RADX3
+5 QUIT
RPT ; Save off Report Text data.
+1 NEW RAXADEDN
+2 SET RAXADEDN=^TMP("RARPT-REC",$JOB,RASUB,"RASTAT")
+3 SET RANODE=$SELECT(OBXTYP="D":"RADX",OBXTYP="I":"RAIMP",1:"RATXT")
SET LIN=""
+4 IF OBX2CE
Begin DoDot:1
+5 ; KLM/p157 update DX Code processing for v2.3 to accomodate VR passing a primary designation.
+6 ; We will need to set LIN (RADX,RADX2,RADX3)to the entire dx code passed (ie 1^NORMAL^P).
+7 SET X=$PIECE(SEGMNT,HL("FS"),5)
SET RADX1=$PIECE(X,$EXTRACT(HL("ECH"),2))
+8 SET LIN=RADX1
SET L=999
DO P2
SET LIN=X
+9 if X'["~"
QUIT
FOR J=0:0
SET J=$ORDER(^TMP("RARPT-HL7",$JOB,CNT,J))
if 'J
QUIT
SET X1=^(J)
SET LIN=LIN_X1
QUIT
+10 ;p157
SET RADX=LIN
SET RADX2=$PIECE(RADX,"~",2)
if RADX2]""
SET LIN=RADX2
DO P2
+11 ;p157
SET RADX3=$PIECE(RADX,"~",3)
if RADX3']""
QUIT
SET LIN=RADX3
DO P2
QUIT
End DoDot:1
QUIT
+12 SET X=$PIECE(SEGMNT,HL("FS"),5)
+13 IF X["\S\"!(X["\R\")!(X["\E\")!(X["\T\")
DO FORMAT
+14 ;SFVAMC/DAD/9-7-2007/Comment out the quit Q ;Patch 84
IF $GET(RATELE)
IF $DATA(RATELEKN)
IF X[RATELEKN
SET X=$PIECE(X,RATELEKN,2)
SET RATELENM=$PIECE(X,"-")
SET RATELEPI=$TRANSLATE($PIECE(X,"-",2)," ","")
+15 DO PAR
+16 FOR J=0:0
SET J=$ORDER(^TMP("RARPT-HL7",$JOB,CNT,J))
if 'J
QUIT
SET X1=^(J)
SET X=$EXTRACT(X1,1,125)
DO PAR
IF $LENGTH(X1)>125
SET X=$EXTRACT(X1,126,999)
DO PAR
+17 IF X=""!(LIN'="")
SET L=999
DO P2
+18 QUIT
+19 ;
PAR ; Build text paragraph
+1 SET LIN=LIN_X
P1 IF $LENGTH(LIN)<80
QUIT
+1 FOR L=80:-1:1
if $EXTRACT(LIN,L)=" "
QUIT
+2 DO P2
SET LIN=$EXTRACT(LIN,L+1,999)
GOTO P1
P2 ; Set node
+1 ; If Addendum and Report text is a space don't process
+2 IF $PIECE(SEGMNT,HL("FS"),1)=1
IF RAXADEDN="A"
IF RANODE="RATXT"
IF $EXTRACT(LIN,1,L-1)=" "
QUIT
+3 SET RARCNT(OBXTYP)=$GET(RARCNT(OBXTYP))+1
+4 ;KLM/p157 Setting "PDX" node for the Primary indicator (to be used in RAHLO2)
+5 IF RANODE="RADX"
Begin DoDot:1
+6 IF $PIECE($GET(LIN),"^",3)="P"
SET ^TMP("RARPT-REC",$JOB,RASUB,RANODE,"PDX",RARCNT(OBXTYP))=+LIN
+7 SET LIN=+LIN
+8 QUIT
End DoDot:1
+9 SET ^TMP("RARPT-REC",$JOB,RASUB,RANODE,RARCNT(OBXTYP))=$EXTRACT(LIN,1,L-1)
+10 FOR I=1:1:RACN
SET RARRR="RARPT-REC-"_I
if $DATA(^TMP(RARRR,$JOB))
SET ^TMP(RARRR,$JOB,RASUB,RANODE,RARCNT(OBXTYP))=$EXTRACT(LIN,1,L-1)
+11 QUIT
+12 ;
GENACK ; Compile the 'ACK' segment, generate the 'ACK' message.
+1 if '$GET(RACKYES)
QUIT
+2 SET MSA1="AA"
+3 ; Don't allow non RA namespaced interfaces
if $EXTRACT($GET(HL("SAN")),1,3)'="RA-"
QUIT
+4 IF $DATA(RAERR)
SET MSA1=$SELECT($GET(HL("SAN"))="RA-PSCRIBE-TCP"!$GET(RATELE):"AE",1:"AR")
+5 ; Added next line to support MedSpeak interface. Must re-initialize
+6 ; FS and EC's before sending ACK.
+7 if $GET(HL("SAN"))="RA-CLIENT-TCP"
DO INIT^HLFNC2("RA VOICE TCP SERVER RPT",.HL)
+8 SET HLA("HLA",1)="MSA"_HL("FS")_MSA1_HL("FS")_HL("MID")_$SELECT($DATA(RAERR):HL("FS")_RAERR,1:"")
+9 ; 06/22/2006 KAM CHANGED NEXT TWO LINES FOR RA*5*71
+10 SET HLEID=HL("EID")
SET HLEIDS=HL("EIDS")
SET HLARYTYP="LM"
SET HLFORMAT=1
+11 KILL HLRESLT
DO GENACK^HLMA1(HLEID,HLMTIENS,HLEIDS,HLARYTYP,HLFORMAT)
+12 QUIT
+13 ;
FORMAT ; Format report text for Escape Character delimited codes.
+1 SET Y=X
NEW T,Q
+2 IF Y["\S\"
SET Q=$FIND(Y,"\S\")
SET T=Q-4
SET X=$EXTRACT(Y,1,T)_$EXTRACT(HL("ECH"))_$EXTRACT(Y,Q,$LENGTH(X))
SET Y=X
+3 IF Y["\R\"
SET Q=$FIND(Y,"\R\")
SET T=Q-4
SET X=$EXTRACT(Y,1,T)_$EXTRACT(HL("ECH"),2)_$EXTRACT(Y,Q,$LENGTH(X))
SET Y=X
+4 IF Y["\E\"
SET Q=$FIND(Y,"\E\")
SET T=Q-4
SET X=$EXTRACT(Y,1,T)_$EXTRACT(HL("ECH"),3)_$EXTRACT(Y,Q,$LENGTH(X))
SET Y=X
+5 IF Y["\T\"
SET Q=$FIND(Y,"\T\")
SET T=Q-4
SET X=$EXTRACT(Y,1,T)_$EXTRACT(HL("ECH"),4)_$EXTRACT(Y,Q,$LENGTH(X))
SET Y=X
+6 IF X["\S\"!(X["\R\")!(X["\E\")!(X["\T\")
DO FORMAT
+7 QUIT
+8 ;