- RAHLRU ;HISC/GJC - utilities for HL7 messaging ; Apr 26, 2023@12:41:24
- ;;5.0;Radiology/Nuclear Medicine;**10,25,81,103,47,125,162,203**;Mar 16, 1998;Build 1
- ;
- ; 08/13/2010 BP/KAM RA*5*103 Outside Report Status Code needs 'F'
- ;Integration Agreements
- ;----------------------
- ;$$GET1^DIQ(2056); $$HLDATE^HLFNC(10106); INIT^HLFNC2(2161)
- ;GENERATE^HLMA(2164); $$NOW^XLFDT(10103); $$PATCH^XPDUTL(10141)
- ;$$VERSION^XPDUTL(10141); $$HLNAME^XLFNAME(3065)
- ;
- ;IA: global read .01 field, file ^HL(771,
- ;IA: global read .01 field, file ^HL(771.2,
- ;IA: global read .01 field, file ^HL(771.5,
- ;IA: global read .01 field, file ^HL(779.001,
- ;
- ; RA*5.0*203 update NSR 20230216 gjc 04/26/23
- OBR16 ;set OBR-16 Requesting Physician from the exam 70.03;14
- ;RAZXAM is the zero node for the exam (70.03)
- ;called from RAHLR1A & RAHLRPT1
- K RAZNME S RAZNME("FILE")=200,RAZNME("IENS")=$P(RAZXAM,U,14)
- S RAZNME("FIELD")=.01
- S RAOBR(17)=$P(RAZXAM,U,14)_$E(HLECH)_$$HLNAME^XLFNAME(.RAZNME,"S",$E(HLECH,1))
- K RAZNME
- Q
- ;
- OBX11 ; set OBX-11, = 12th piece of string where piece 1 is "OBX"
- N RARPTIEN,Y
- S RARPTIEN=+$G(RARPT)
- S Y=$P($G(^RARPT(RARPTIEN,0)),U,5)
- ; 08/13/2010 BP/KAM RA*5*103 Remedy Call 363538 Changed next line to
- ; test for 'EF' or 'V'
- ;S $P(HLA("HLS",RAN),HLFS,12)=$S(Y="R":"P",Y="V":"F",1:"I")
- S $P(HLA("HLS",RAN),HLFS,12)=$S(Y="R":"P",(Y="V")!(Y="EF"):"F",1:"I")
- ; END *103 CHANGE
- I $D(^RARPT(RARPTIEN,"ERR")) D Q
- .S $P(HLA("HLS",RAN),HLFS,12)="C"
- Q
- ;
- ESCAPE(XDTA) ;apply the appropriate escape sequence to a string of data
- ; Insert a escape sequence place holder, then swap the escape sequence
- ; place holder with the real escape sequence. This action requires two
- ; passes because the escape sequence uses the escape ("\") character.
- ; Input: XDTA=data string to be escaped (if necessary)
- ; HLFS=field separator (global scope; set in INIT^RAHLR)
- ; HLECH=encoding characters (global scope; set in INIT^RAHLR)
- ; Return: XDTA=an escaped data string
- ;
- N UFS,UCS,URS,UEC,USS ;field, component, repetition, escape, & subcomponent
- S UFS=HLFS,UCS=$E(HLECH),URS=$E(HLECH,2),UEC=$E(HLECH,3),USS=$E(HLECH,4)
- F Q:XDTA'[UFS S XDTA=$P(XDTA,UFS)_$C(1)_$P(XDTA,UFS,2,999)
- F Q:XDTA'[UCS S XDTA=$P(XDTA,UCS)_$C(2)_$P(XDTA,UCS,2,999)
- F Q:XDTA'[URS S XDTA=$P(XDTA,URS)_$C(3)_$P(XDTA,URS,2,999)
- F Q:XDTA'[UEC S XDTA=$P(XDTA,UEC)_$C(4)_$P(XDTA,UEC,2,999)
- F Q:XDTA'[USS S XDTA=$P(XDTA,USS)_$C(5)_$P(XDTA,USS,2,999)
- F Q:XDTA'[$C(1) S XDTA=$P(XDTA,$C(1))_UEC_"F"_UEC_$P(XDTA,$C(1),2,999)
- F Q:XDTA'[$C(2) S XDTA=$P(XDTA,$C(2))_UEC_"S"_UEC_$P(XDTA,$C(2),2,999)
- F Q:XDTA'[$C(3) S XDTA=$P(XDTA,$C(3))_UEC_"R"_UEC_$P(XDTA,$C(3),2,999)
- F Q:XDTA'[$C(4) S XDTA=$P(XDTA,$C(4))_UEC_"E"_UEC_$P(XDTA,$C(4),2,999)
- F Q:XDTA'[$C(5) S XDTA=$P(XDTA,$C(5))_UEC_"T"_UEC_$P(XDTA,$C(5),2,999)
- Q XDTA
- ;
- OBXPRC ;Compile 'OBX' Segment for Procedure
- S HLA("HLS",RAN)="OBX"_HLFS_HLFS_"CE"_HLFS_"P"_$E(HLECH)_"PROCEDURE"_$E(HLECH)_"L"_HLFS_HLFS_$P(RACN0,"^",2)
- S X=$S($D(^RAMIS(71,+$P(RACN0,"^",2),0)):$P(^(0),"^"),1:""),HLA("HLS",RAN)=HLA("HLS",RAN)_$E(HLECH)_X_$E(HLECH)_"L" D OBX11
- ; Replace above with following when Imaging can cope with ESC chars
- ; S X=$S($D(^RAMIS(71,+$P(RACN0,"^",2),0)):$P(^(0),"^"),1:""),HLA("HLS",RAN)=HLA("HLS",RAN)_$E(HLECH)_$$ESCAPE(X)_$E(HLECH)_"L" D OBX11
- Q
- OBXMOD ; Compile 'OBX' segments for both types of modifiers
- ; Procedure modifiers
- N X3
- D MODS^RAUTL2 S HLA("HLS",RAN)="OBX"_HLFS_HLFS_"TX"_HLFS_"M"_$E(HLECH)_"MODIFIERS"_$E(HLECH)_"L"_HLFS_HLFS_Y D OBX11
- Q:Y(1)="None"
- ; CPT Modifiers
- F RAI=1:1 S X0=$P(Y(1),", ",RAI),X1=$P(Y(2),", ",RAI) Q:X0="" D
- . S RAN=RAN+1
- . S X3=$$BASICMOD^RACPTMSC(X1,DT)
- . S HLA("HLS",RAN)="OBX"_HLFS_HLFS_"CE"_HLFS_"C4"_$E(HLECH)_"CPT MODIFIERS"_$E(HLECH)_"C4"_HLFS_HLFS_X0_$E(HLECH)_$P(X3,"^",3)_$E(HLECH)_"C4"
- . ; Replace above with following when Imaging can cope with ESC chars
- . ;S HLA("HLS",RAN)="OBX"_HLFS_HLFS_"CE"_HLFS_"C4"_$E(HLECH)_"CPT MODIFIERS"_$E(HLECH)_"C4"_HLFS_HLFS_X0_$E(HLECH)_$$ESCAPE($P(X3,"^",3))_$E(HLECH)_"C4"
- . I $P(X3,"^",4)]"" S HLA("HLS",RAN)=HLA("HLS",RAN)_$E(HLECH)_$P(X3,"^",4)_$E(HLECH)_$P(X3,"^",3)_$E(HLECH)_"C4"
- . ; Replace above with following when Imaging can cope with ESC chars
- . ;I $P(X3,"^",4)]"" S HLA("HLS",RAN)=HLA("HLS",RAN)_$E(HLECH)_$P(X3,"^",4)_$E(HLECH)_$$ESCAPE($P(X3,"^",3))_$E(HLECH)_"C4"
- . D OBX11
- . Q
- Q
- ;
- OBXTCM ; Compile 'OBX' segment for latest TECH COMMENT
- ;
- ; Only Released version of Imaging 2.5 able to handle Tech Comments
- Q:'($$PATCH^XPDUTL("MAG*2.5*1")!(+$$VERSION^XPDUTL("MAG")>2.5))
- ;
- N X4,X3
- S X4=$$GETTCOM^RAUTL11(RADFN,RADTI,RACNI)
- Q:X4=""
- S RAN=RAN+1
- S HLA("HLS",RAN)="OBX"_HLFS_HLFS_"TX"_HLFS_"TCM"_$E(HLECH)_"TECH COMMENT"_$E(HLECH)_"L"_HLFS_HLFS
- D OBX11
- I $L(X4)+$L(HLA("HLS",RAN))'>245 D Q
- .S $P(HLA("HLS",RAN),HLFS,6)=X4
- ;
- ; If Tech Comment is v. long it will need to be
- ; split into two parts. Do not split words if possible....
- ;
- S X3=$E(X4,1,245-$L(HLA("HLS",RAN)))
- I $L(X3," ")>1 S X3=$P(X3," ",1,$L(X3," ")-1)
- S X4=$P(X4,X3,2)
- S $P(HLA("HLS",RAN),HLFS,6)=X3
- S HLA("HLS",RAN,1)=X4_HLFS_$P(HLA("HLS",RAN),HLFS,7,12)
- S HLA("HLS",RAN)=$P(HLA("HLS",RAN),HLFS,1,6)
- Q
- ;
- INIT ; initialize HL7 variables; called from RAHLR & RAHLRPT
- Q:'$G(RAEID) ;undefined server application
- S HLDT=$$NOW^XLFDT(),HLDT1=$$HLDATE^HLFNC(HLDT),EID=RAEID
- S HL="HLS(""HLS"")",INT=1
- D INIT^HLFNC2(EID,.HL,INT)
- Q:'$D(HL("Q")) ;improperly defined server application
- S HLQ=HL("Q"),HLFS=HL("FS"),HLECH=HL("ECH") K EID,INT
- S HLCS=$E(HL("ECH"))
- S HLSCS=$E(HL("ECH"),4)
- S HLREP=$E(HL("ECH"),2)
- Q
- ;
- DOB(X) ;strip off trailing "0"'s from the date of birth
- I $E(X,5,6)="00" S X=$E(X,1,4) ;if no month then no day, return year
- E I $E(X,7,8)="00" S X=$E(X,1,6) ;if month & no day, return month/year
- Q X
- ;
- CPTMOD(RAIEN,HLECH,DT) ;return OBX-5 as it pertains to CPT Modifiers
- ;called from: RAHLRPT2 & RAHLR1A
- ;input: RAIEN=IEN of the record in file 81.3
- ; HLECH=HL7 encoding characters
- ; DT=today's date
- N X S X=$$BASICMOD^RACPTMSC(RAIEN,DT)
- ;1st piece=IEN #81.3; 3rd piece=versioned name; 5th piece=coding sys
- ;Q RAIEN_$E(HLECH,1)_$$ESCAPE^RAHLRU($P(X,U,3))_$E(HLECH,1)_$P(X,U,5)
- ;9/5/08 the above line changed to below per IMAGING
- Q $P(X,U,2)_$E(HLECH,1)_$$ESCAPE^RAHLRU($P(X,U,3))_$E(HLECH,1)_"C4"
- ;
- GETSFLAG(SAN,MTN,ETN,VER) ;Return HL message flag (79.721,1)
- Q:'$L(SAN)!'$L(MTN)!'$L(ETN)!'$L(VER) 0
- S SAN=$O(^HL(771,"B",SAN,0)) Q:'SAN 0
- S MTN=$O(^HL(771.2,"B",MTN,0)) Q:'MTN 0
- S ETN=$O(^HL(779.001,"B",ETN,0)) Q:'ETN 0
- S VER=$O(^HL(771.5,"B",VER,0)) Q:'VER 0
- Q +$P($G(^RA(79.7,SAN,1,MTN,1,ETN,1,VER,0)),U,2)
- ;
- OBR21(HLECH,RA7002) ;builds the OBR-21 field; called from RAHLR1A
- ;Input
- ; HLECH=encoding characters (required for $$ESCAPE^RAHLRU)
- ; RA7002=zero node of the REGISTERED EXAMS sub-file of the RAD/NUC MED
- ; PATIENT (#70) file.
- ;Return:
- ; Component one (derived from file #79.2)
- ; ABBREVIATION(#3)_NAME(#.01)
- ; Component two (derived from file #79.1)
- ; File 79.1 IEN_NAME(#.01) of the HOSPITAL LOCATION(#44) record.
- ; Component three (derived from file #79)
- ; DIVISION(#.01)_NAME(#.01) of the INSTITUTION(#4) record.
- ;
- ;Components as separated by the accent grave "`" (RAPCS); subcomponents by the
- ;underscore "_" (RAPSS)
- ;
- ; Ex: RAD_GENERAL RADIOLOGY`1_TD-RAD`660_SALT LAKE CITY
- ;
- N RAX S RAPCS="`",RAPSS="_",RAX=""
- S RA792Q=+$P(RA7002,U,2) ;imaging type pointer
- S RA792Q(0)=$G(^RA(79.2,RA792Q,0)) ;imaging type zero node
- ;create the i-type abbreviation, component separator, and full name string
- S RAX=$P(RA792Q(0),U,3)_RAPSS_$P(RA792Q(0),U)
- ;get hospital location and institution file data...
- S RA791Q=+$P(RA7002,U,4) ;imaging location pointer
- S RA44Q=+$P($G(^RA(79.1,RA791Q,0)),U) ;hospital location pointer
- S RA44Q(0)=$$GET1^DIQ(44,RA44Q,.01) ;hospital location name
- S RA4Q=+$P(RA7002,U,3) ;rad/nuc med division pointer dinum'd to INSTITUTION (#4) file
- S RA4Q(0)=$$GET1^DIQ(4,RA4Q,.01) ;institution name
- S RAX=RAX_RAPCS_RA791Q_RAPSS_RA44Q(0)_RAPCS_RA4Q_RAPSS_RA4Q(0)
- K RA4Q,RA44Q,RA791Q,RA792Q,RAPCS,RAPSS
- Q $$ESCAPE^RAHLRU(RAX)
- ;
- BLDHLP ;build the HLP("EXCLUDE SUBSCRIBER",n) array
- ; is HLP("EXCLUDE SUBSCRIBER",n) defined? If yes get 'n'
- N RAX,RAY S RAX="EXCLUDE SUBSCRIBER"
- S RAY=$$HLPEXSUB(.HLP)
- I RAY="" M HLP(RAX)=RASSS(RAX) Q
- N RAI S RAI=0
- F S RAI=$O(RASSS(RAX,RAI)) Q:RAI'>0 D
- .S RAY=RAY+1,HLP(RAX,RAY)=RASSS(RAX,RAI)
- .Q
- Q
- ;
- HLPEXSUB(A) ;determine the last subscript (n) of a local array
- ;whose format is: A("EXCLUDE SUBSCRIBER",n)
- ;Input: A = local array name;
- Q $O(A("EXCLUDE SUBSCRIBER",$C(32)),-1)
- ;
- GENERATE ;Broadcast the HL7 message (courtesy of the VistA HL7 application)
- N HLEID,HLARYTYP,HLFORMAT,HLMTIEN,HLP
- S HLEID=RAEID,HLARYTYP="LM",HLFORMAT=1,HLMTIEN="",HLP("PRIORITY")="I"
- ;
- ;1 - RASSSX is set by the 'Resend Radiology HL7 Messages By Date Range'
- ; option. GETHLP sets the HLP("EXCLUDE SUBSCRIBER" array
- D:$D(RASSSX(HLEID)) GETHLP^RAHLRS1(HLEID,.HLP,"RASSSX") ;RA5P125
- ;
- ;2 - Do we return this HL7 message to the application that broadcasted
- ; it? The following code also sets the HLP("EXCLUDE SUBSCRIBER" array
- D:$D(RASSS("EXCLUDE SUBSCRIBER"))\10 BLDHLP ;RA5P125
- ;
- ;Note: Events 1 & 2 are independent of one another. They will never
- ; set the HLP array in the same process.
- ;
- ;//RA5P162 update //
- ;3 - exclude subscribers that are not teleradiology (file: 79.7)
- D:$D(RASSSX1(HLEID)) GETHLP^RAHLRS1(HLEID,.HLP,"RASSSX1")
- ;//RA5P162 update end //
- ;
- D GENERATE^HLMA(RAEID,HLARYTYP,HLFORMAT,.HLRESLT,HLMTIEN,.HLP)
- D GSTATUS^RAHLACK(.HLRESLT,RAEID) K HLRESLT
- ;
- EXIT ;kill the variables; exit the process...
- K HL771RF,HL771SF,HL7STRG,HLA,HLARYTYP,HLCS,HLDOM,HLECH,HLEID,HLES,HLES2,HLFORMAT
- K HLFS,HLINSTN,HLMTIEN,HLN,HLP,HLPARAM,HLPID,HLQ,HLREC,HLREP,HLRFREQ,HLSAN,HLSCS
- K HLSFREQ,HLTYPE,HLX,OCXSEG,OCXTSPI,RAOBR,RAORC,RAPID,RAPURGE,RAPV1,RAREFDOC,RAZCPT
- K RAZDAYCS,RAZDTE,RAZMODE,RAZNME,RAZORD,RAZORD1,RAZPHONE,RAZPMOD,RAZPREG,RAZPROC
- K RAZRPT,RAZRXAM,RAZTRANS,RAZXAM,HLRESLT
- K ^UTILITY($J,"W") ;note HLCS, HLREP, & HLSCS are set in INIT^RAHLRU
- Q
- ;
- --- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HRAHLRU 10398 printed Mar 13, 2025@21:40:22 Page 2
- RAHLRU ;HISC/GJC - utilities for HL7 messaging ; Apr 26, 2023@12:41:24
- +1 ;;5.0;Radiology/Nuclear Medicine;**10,25,81,103,47,125,162,203**;Mar 16, 1998;Build 1
- +2 ;
- +3 ; 08/13/2010 BP/KAM RA*5*103 Outside Report Status Code needs 'F'
- +4 ;Integration Agreements
- +5 ;----------------------
- +6 ;$$GET1^DIQ(2056); $$HLDATE^HLFNC(10106); INIT^HLFNC2(2161)
- +7 ;GENERATE^HLMA(2164); $$NOW^XLFDT(10103); $$PATCH^XPDUTL(10141)
- +8 ;$$VERSION^XPDUTL(10141); $$HLNAME^XLFNAME(3065)
- +9 ;
- +10 ;IA: global read .01 field, file ^HL(771,
- +11 ;IA: global read .01 field, file ^HL(771.2,
- +12 ;IA: global read .01 field, file ^HL(771.5,
- +13 ;IA: global read .01 field, file ^HL(779.001,
- +14 ;
- +15 ; RA*5.0*203 update NSR 20230216 gjc 04/26/23
- OBR16 ;set OBR-16 Requesting Physician from the exam 70.03;14
- +1 ;RAZXAM is the zero node for the exam (70.03)
- +2 ;called from RAHLR1A & RAHLRPT1
- +3 KILL RAZNME
- SET RAZNME("FILE")=200
- SET RAZNME("IENS")=$PIECE(RAZXAM,U,14)
- +4 SET RAZNME("FIELD")=.01
- +5 SET RAOBR(17)=$PIECE(RAZXAM,U,14)_$EXTRACT(HLECH)_$$HLNAME^XLFNAME(.RAZNME,"S",$EXTRACT(HLECH,1))
- +6 KILL RAZNME
- +7 QUIT
- +8 ;
- OBX11 ; set OBX-11, = 12th piece of string where piece 1 is "OBX"
- +1 NEW RARPTIEN,Y
- +2 SET RARPTIEN=+$GET(RARPT)
- +3 SET Y=$PIECE($GET(^RARPT(RARPTIEN,0)),U,5)
- +4 ; 08/13/2010 BP/KAM RA*5*103 Remedy Call 363538 Changed next line to
- +5 ; test for 'EF' or 'V'
- +6 ;S $P(HLA("HLS",RAN),HLFS,12)=$S(Y="R":"P",Y="V":"F",1:"I")
- +7 SET $PIECE(HLA("HLS",RAN),HLFS,12)=$SELECT(Y="R":"P",(Y="V")!(Y="EF"):"F",1:"I")
- +8 ; END *103 CHANGE
- +9 IF $DATA(^RARPT(RARPTIEN,"ERR"))
- Begin DoDot:1
- +10 SET $PIECE(HLA("HLS",RAN),HLFS,12)="C"
- End DoDot:1
- QUIT
- +11 QUIT
- +12 ;
- ESCAPE(XDTA) ;apply the appropriate escape sequence to a string of data
- +1 ; Insert a escape sequence place holder, then swap the escape sequence
- +2 ; place holder with the real escape sequence. This action requires two
- +3 ; passes because the escape sequence uses the escape ("\") character.
- +4 ; Input: XDTA=data string to be escaped (if necessary)
- +5 ; HLFS=field separator (global scope; set in INIT^RAHLR)
- +6 ; HLECH=encoding characters (global scope; set in INIT^RAHLR)
- +7 ; Return: XDTA=an escaped data string
- +8 ;
- +9 ;field, component, repetition, escape, & subcomponent
- NEW UFS,UCS,URS,UEC,USS
- +10 SET UFS=HLFS
- SET UCS=$EXTRACT(HLECH)
- SET URS=$EXTRACT(HLECH,2)
- SET UEC=$EXTRACT(HLECH,3)
- SET USS=$EXTRACT(HLECH,4)
- +11 FOR
- if XDTA'[UFS
- QUIT
- SET XDTA=$PIECE(XDTA,UFS)_$CHAR(1)_$PIECE(XDTA,UFS,2,999)
- +12 FOR
- if XDTA'[UCS
- QUIT
- SET XDTA=$PIECE(XDTA,UCS)_$CHAR(2)_$PIECE(XDTA,UCS,2,999)
- +13 FOR
- if XDTA'[URS
- QUIT
- SET XDTA=$PIECE(XDTA,URS)_$CHAR(3)_$PIECE(XDTA,URS,2,999)
- +14 FOR
- if XDTA'[UEC
- QUIT
- SET XDTA=$PIECE(XDTA,UEC)_$CHAR(4)_$PIECE(XDTA,UEC,2,999)
- +15 FOR
- if XDTA'[USS
- QUIT
- SET XDTA=$PIECE(XDTA,USS)_$CHAR(5)_$PIECE(XDTA,USS,2,999)
- +16 FOR
- if XDTA'[$CHAR(1)
- QUIT
- SET XDTA=$PIECE(XDTA,$CHAR(1))_UEC_"F"_UEC_$PIECE(XDTA,$CHAR(1),2,999)
- +17 FOR
- if XDTA'[$CHAR(2)
- QUIT
- SET XDTA=$PIECE(XDTA,$CHAR(2))_UEC_"S"_UEC_$PIECE(XDTA,$CHAR(2),2,999)
- +18 FOR
- if XDTA'[$CHAR(3)
- QUIT
- SET XDTA=$PIECE(XDTA,$CHAR(3))_UEC_"R"_UEC_$PIECE(XDTA,$CHAR(3),2,999)
- +19 FOR
- if XDTA'[$CHAR(4)
- QUIT
- SET XDTA=$PIECE(XDTA,$CHAR(4))_UEC_"E"_UEC_$PIECE(XDTA,$CHAR(4),2,999)
- +20 FOR
- if XDTA'[$CHAR(5)
- QUIT
- SET XDTA=$PIECE(XDTA,$CHAR(5))_UEC_"T"_UEC_$PIECE(XDTA,$CHAR(5),2,999)
- +21 QUIT XDTA
- +22 ;
- OBXPRC ;Compile 'OBX' Segment for Procedure
- +1 SET HLA("HLS",RAN)="OBX"_HLFS_HLFS_"CE"_HLFS_"P"_$EXTRACT(HLECH)_"PROCEDURE"_$EXTRACT(HLECH)_"L"_HLFS_HLFS_$PIECE(RACN0,"^",2)
- +2 SET X=$SELECT($DATA(^RAMIS(71,+$PIECE(RACN0,"^",2),0)):$PIECE(^(0),"^"),1:"")
- SET HLA("HLS",RAN)=HLA("HLS",RAN)_$EXTRACT(HLECH)_X_$EXTRACT(HLECH)_"L"
- DO OBX11
- +3 ; Replace above with following when Imaging can cope with ESC chars
- +4 ; S X=$S($D(^RAMIS(71,+$P(RACN0,"^",2),0)):$P(^(0),"^"),1:""),HLA("HLS",RAN)=HLA("HLS",RAN)_$E(HLECH)_$$ESCAPE(X)_$E(HLECH)_"L" D OBX11
- +5 QUIT
- OBXMOD ; Compile 'OBX' segments for both types of modifiers
- +1 ; Procedure modifiers
- +2 NEW X3
- +3 DO MODS^RAUTL2
- SET HLA("HLS",RAN)="OBX"_HLFS_HLFS_"TX"_HLFS_"M"_$EXTRACT(HLECH)_"MODIFIERS"_$EXTRACT(HLECH)_"L"_HLFS_HLFS_Y
- DO OBX11
- +4 if Y(1)="None"
- QUIT
- +5 ; CPT Modifiers
- +6 FOR RAI=1:1
- SET X0=$PIECE(Y(1),", ",RAI)
- SET X1=$PIECE(Y(2),", ",RAI)
- if X0=""
- QUIT
- Begin DoDot:1
- +7 SET RAN=RAN+1
- +8 SET X3=$$BASICMOD^RACPTMSC(X1,DT)
- +9 SET HLA("HLS",RAN)="OBX"_HLFS_HLFS_"CE"_HLFS_"C4"_$EXTRACT(HLECH)_"CPT MODIFIERS"_$EXTRACT(HLECH)_"C4"_HLFS_HLFS_X0_$EXTRACT(HLECH)_$PIECE(X3,"^",3)_$EXTRACT(HLECH)_"C4"
- +10 ; Replace above with following when Imaging can cope with ESC chars
- +11 ;S HLA("HLS",RAN)="OBX"_HLFS_HLFS_"CE"_HLFS_"C4"_$E(HLECH)_"CPT MODIFIERS"_$E(HLECH)_"C4"_HLFS_HLFS_X0_$E(HLECH)_$$ESCAPE($P(X3,"^",3))_$E(HLECH)_"C4"
- +12 IF $PIECE(X3,"^",4)]""
- SET HLA("HLS",RAN)=HLA("HLS",RAN)_$EXTRACT(HLECH)_$PIECE(X3,"^",4)_$EXTRACT(HLECH)_$PIECE(X3,"^",3)_$EXTRACT(HLECH)_"C4"
- +13 ; Replace above with following when Imaging can cope with ESC chars
- +14 ;I $P(X3,"^",4)]"" S HLA("HLS",RAN)=HLA("HLS",RAN)_$E(HLECH)_$P(X3,"^",4)_$E(HLECH)_$$ESCAPE($P(X3,"^",3))_$E(HLECH)_"C4"
- +15 DO OBX11
- +16 QUIT
- End DoDot:1
- +17 QUIT
- +18 ;
- OBXTCM ; Compile 'OBX' segment for latest TECH COMMENT
- +1 ;
- +2 ; Only Released version of Imaging 2.5 able to handle Tech Comments
- +3 if '($$PATCH^XPDUTL("MAG*2.5*1")!(+$$VERSION^XPDUTL("MAG")>2.5))
- QUIT
- +4 ;
- +5 NEW X4,X3
- +6 SET X4=$$GETTCOM^RAUTL11(RADFN,RADTI,RACNI)
- +7 if X4=""
- QUIT
- +8 SET RAN=RAN+1
- +9 SET HLA("HLS",RAN)="OBX"_HLFS_HLFS_"TX"_HLFS_"TCM"_$EXTRACT(HLECH)_"TECH COMMENT"_$EXTRACT(HLECH)_"L"_HLFS_HLFS
- +10 DO OBX11
- +11 IF $LENGTH(X4)+$LENGTH(HLA("HLS",RAN))'>245
- Begin DoDot:1
- +12 SET $PIECE(HLA("HLS",RAN),HLFS,6)=X4
- End DoDot:1
- QUIT
- +13 ;
- +14 ; If Tech Comment is v. long it will need to be
- +15 ; split into two parts. Do not split words if possible....
- +16 ;
- +17 SET X3=$EXTRACT(X4,1,245-$LENGTH(HLA("HLS",RAN)))
- +18 IF $LENGTH(X3," ")>1
- SET X3=$PIECE(X3," ",1,$LENGTH(X3," ")-1)
- +19 SET X4=$PIECE(X4,X3,2)
- +20 SET $PIECE(HLA("HLS",RAN),HLFS,6)=X3
- +21 SET HLA("HLS",RAN,1)=X4_HLFS_$PIECE(HLA("HLS",RAN),HLFS,7,12)
- +22 SET HLA("HLS",RAN)=$PIECE(HLA("HLS",RAN),HLFS,1,6)
- +23 QUIT
- +24 ;
- INIT ; initialize HL7 variables; called from RAHLR & RAHLRPT
- +1 ;undefined server application
- if '$GET(RAEID)
- QUIT
- +2 SET HLDT=$$NOW^XLFDT()
- SET HLDT1=$$HLDATE^HLFNC(HLDT)
- SET EID=RAEID
- +3 SET HL="HLS(""HLS"")"
- SET INT=1
- +4 DO INIT^HLFNC2(EID,.HL,INT)
- +5 ;improperly defined server application
- if '$DATA(HL("Q"))
- QUIT
- +6 SET HLQ=HL("Q")
- SET HLFS=HL("FS")
- SET HLECH=HL("ECH")
- KILL EID,INT
- +7 SET HLCS=$EXTRACT(HL("ECH"))
- +8 SET HLSCS=$EXTRACT(HL("ECH"),4)
- +9 SET HLREP=$EXTRACT(HL("ECH"),2)
- +10 QUIT
- +11 ;
- DOB(X) ;strip off trailing "0"'s from the date of birth
- +1 ;if no month then no day, return year
- IF $EXTRACT(X,5,6)="00"
- SET X=$EXTRACT(X,1,4)
- +2 ;if month & no day, return month/year
- IF '$TEST
- IF $EXTRACT(X,7,8)="00"
- SET X=$EXTRACT(X,1,6)
- +3 QUIT X
- +4 ;
- CPTMOD(RAIEN,HLECH,DT) ;return OBX-5 as it pertains to CPT Modifiers
- +1 ;called from: RAHLRPT2 & RAHLR1A
- +2 ;input: RAIEN=IEN of the record in file 81.3
- +3 ; HLECH=HL7 encoding characters
- +4 ; DT=today's date
- +5 NEW X
- SET X=$$BASICMOD^RACPTMSC(RAIEN,DT)
- +6 ;1st piece=IEN #81.3; 3rd piece=versioned name; 5th piece=coding sys
- +7 ;Q RAIEN_$E(HLECH,1)_$$ESCAPE^RAHLRU($P(X,U,3))_$E(HLECH,1)_$P(X,U,5)
- +8 ;9/5/08 the above line changed to below per IMAGING
- +9 QUIT $PIECE(X,U,2)_$EXTRACT(HLECH,1)_$$ESCAPE^RAHLRU($PIECE(X,U,3))_$EXTRACT(HLECH,1)_"C4"
- +10 ;
- GETSFLAG(SAN,MTN,ETN,VER) ;Return HL message flag (79.721,1)
- +1 if '$LENGTH(SAN)!'$LENGTH(MTN)!'$LENGTH(ETN)!'$LENGTH(VER)
- QUIT 0
- +2 SET SAN=$ORDER(^HL(771,"B",SAN,0))
- if 'SAN
- QUIT 0
- +3 SET MTN=$ORDER(^HL(771.2,"B",MTN,0))
- if 'MTN
- QUIT 0
- +4 SET ETN=$ORDER(^HL(779.001,"B",ETN,0))
- if 'ETN
- QUIT 0
- +5 SET VER=$ORDER(^HL(771.5,"B",VER,0))
- if 'VER
- QUIT 0
- +6 QUIT +$PIECE($GET(^RA(79.7,SAN,1,MTN,1,ETN,1,VER,0)),U,2)
- +7 ;
- OBR21(HLECH,RA7002) ;builds the OBR-21 field; called from RAHLR1A
- +1 ;Input
- +2 ; HLECH=encoding characters (required for $$ESCAPE^RAHLRU)
- +3 ; RA7002=zero node of the REGISTERED EXAMS sub-file of the RAD/NUC MED
- +4 ; PATIENT (#70) file.
- +5 ;Return:
- +6 ; Component one (derived from file #79.2)
- +7 ; ABBREVIATION(#3)_NAME(#.01)
- +8 ; Component two (derived from file #79.1)
- +9 ; File 79.1 IEN_NAME(#.01) of the HOSPITAL LOCATION(#44) record.
- +10 ; Component three (derived from file #79)
- +11 ; DIVISION(#.01)_NAME(#.01) of the INSTITUTION(#4) record.
- +12 ;
- +13 ;Components as separated by the accent grave "`" (RAPCS); subcomponents by the
- +14 ;underscore "_" (RAPSS)
- +15 ;
- +16 ; Ex: RAD_GENERAL RADIOLOGY`1_TD-RAD`660_SALT LAKE CITY
- +17 ;
- +18 NEW RAX
- SET RAPCS="`"
- SET RAPSS="_"
- SET RAX=""
- +19 ;imaging type pointer
- SET RA792Q=+$PIECE(RA7002,U,2)
- +20 ;imaging type zero node
- SET RA792Q(0)=$GET(^RA(79.2,RA792Q,0))
- +21 ;create the i-type abbreviation, component separator, and full name string
- +22 SET RAX=$PIECE(RA792Q(0),U,3)_RAPSS_$PIECE(RA792Q(0),U)
- +23 ;get hospital location and institution file data...
- +24 ;imaging location pointer
- SET RA791Q=+$PIECE(RA7002,U,4)
- +25 ;hospital location pointer
- SET RA44Q=+$PIECE($GET(^RA(79.1,RA791Q,0)),U)
- +26 ;hospital location name
- SET RA44Q(0)=$$GET1^DIQ(44,RA44Q,.01)
- +27 ;rad/nuc med division pointer dinum'd to INSTITUTION (#4) file
- SET RA4Q=+$PIECE(RA7002,U,3)
- +28 ;institution name
- SET RA4Q(0)=$$GET1^DIQ(4,RA4Q,.01)
- +29 SET RAX=RAX_RAPCS_RA791Q_RAPSS_RA44Q(0)_RAPCS_RA4Q_RAPSS_RA4Q(0)
- +30 KILL RA4Q,RA44Q,RA791Q,RA792Q,RAPCS,RAPSS
- +31 QUIT $$ESCAPE^RAHLRU(RAX)
- +32 ;
- BLDHLP ;build the HLP("EXCLUDE SUBSCRIBER",n) array
- +1 ; is HLP("EXCLUDE SUBSCRIBER",n) defined? If yes get 'n'
- +2 NEW RAX,RAY
- SET RAX="EXCLUDE SUBSCRIBER"
- +3 SET RAY=$$HLPEXSUB(.HLP)
- +4 IF RAY=""
- MERGE HLP(RAX)=RASSS(RAX)
- QUIT
- +5 NEW RAI
- SET RAI=0
- +6 FOR
- SET RAI=$ORDER(RASSS(RAX,RAI))
- if RAI'>0
- QUIT
- Begin DoDot:1
- +7 SET RAY=RAY+1
- SET HLP(RAX,RAY)=RASSS(RAX,RAI)
- +8 QUIT
- End DoDot:1
- +9 QUIT
- +10 ;
- HLPEXSUB(A) ;determine the last subscript (n) of a local array
- +1 ;whose format is: A("EXCLUDE SUBSCRIBER",n)
- +2 ;Input: A = local array name;
- +3 QUIT $ORDER(A("EXCLUDE SUBSCRIBER",$CHAR(32)),-1)
- +4 ;
- GENERATE ;Broadcast the HL7 message (courtesy of the VistA HL7 application)
- +1 NEW HLEID,HLARYTYP,HLFORMAT,HLMTIEN,HLP
- +2 SET HLEID=RAEID
- SET HLARYTYP="LM"
- SET HLFORMAT=1
- SET HLMTIEN=""
- SET HLP("PRIORITY")="I"
- +3 ;
- +4 ;1 - RASSSX is set by the 'Resend Radiology HL7 Messages By Date Range'
- +5 ; option. GETHLP sets the HLP("EXCLUDE SUBSCRIBER" array
- +6 ;RA5P125
- if $DATA(RASSSX(HLEID))
- DO GETHLP^RAHLRS1(HLEID,.HLP,"RASSSX")
- +7 ;
- +8 ;2 - Do we return this HL7 message to the application that broadcasted
- +9 ; it? The following code also sets the HLP("EXCLUDE SUBSCRIBER" array
- +10 ;RA5P125
- if $DATA(RASSS("EXCLUDE SUBSCRIBER"))\10
- DO BLDHLP
- +11 ;
- +12 ;Note: Events 1 & 2 are independent of one another. They will never
- +13 ; set the HLP array in the same process.
- +14 ;
- +15 ;//RA5P162 update //
- +16 ;3 - exclude subscribers that are not teleradiology (file: 79.7)
- +17 if $DATA(RASSSX1(HLEID))
- DO GETHLP^RAHLRS1(HLEID,.HLP,"RASSSX1")
- +18 ;//RA5P162 update end //
- +19 ;
- +20 DO GENERATE^HLMA(RAEID,HLARYTYP,HLFORMAT,.HLRESLT,HLMTIEN,.HLP)
- +21 DO GSTATUS^RAHLACK(.HLRESLT,RAEID)
- KILL HLRESLT
- +22 ;
- EXIT ;kill the variables; exit the process...
- +1 KILL HL771RF,HL771SF,HL7STRG,HLA,HLARYTYP,HLCS,HLDOM,HLECH,HLEID,HLES,HLES2,HLFORMAT
- +2 KILL HLFS,HLINSTN,HLMTIEN,HLN,HLP,HLPARAM,HLPID,HLQ,HLREC,HLREP,HLRFREQ,HLSAN,HLSCS
- +3 KILL HLSFREQ,HLTYPE,HLX,OCXSEG,OCXTSPI,RAOBR,RAORC,RAPID,RAPURGE,RAPV1,RAREFDOC,RAZCPT
- +4 KILL RAZDAYCS,RAZDTE,RAZMODE,RAZNME,RAZORD,RAZORD1,RAZPHONE,RAZPMOD,RAZPREG,RAZPROC
- +5 KILL RAZRPT,RAZRXAM,RAZTRANS,RAZXAM,HLRESLT
- +6 ;note HLCS, HLREP, & HLSCS are set in INIT^RAHLRU
- KILL ^UTILITY($JOB,"W")
- +7 QUIT
- +8 ;