- SRHLORU ;B'HAM ISC/DLR - Surgery Interface Receiver of ORU messages ; [ 02/06/01 9:27 AM ]
- ;;3.0; Surgery ;**41,100**;24 Jun 93
- ; Per VHA Directive 10-93-142, this routine SHOULD NOT be modified.
- REC N HLCOMP,HLREP,HLSUB,HLFS,HLECH,II,SG,SRERR,SRES,SRESCNT,SRESAR,SRESNR,SRI,SSN,TYPE,SROP,SRNON,SRHL,Z
- K HLMID,PID,SRHL S SRHL("E")=+$G(SRHL("E")),(SRESCNT,SRESAR,SRESNR)=0
- S Z=$G(^SRF(CASE,"TIU")) S:$P(Z,"^",2) SRESNR=1 S:$P(Z,"^",4) SRESAR=1
- F I=1:1 X HLNEXT Q:HLQUIT'>0 S (MSG,X(I))=HLNODE,SG=$E(HLNODE,1,3),J=0 D D PICK
- .S J=0 F S J=$O(HLNODE(J)) Q:'J S X(I,J)=HLNODE(J)
- D:SRHL("E")>0 DSCPANCY^SRHLU(.HL)
- GEN ;generate the message
- D MSA^SRHLUO(1,$S($D(HLP("ERRTEXT")):"AE",1:"AA"))
- ;HLEID - IEN of Server event protocol
- ;HLMTIENS - IEN in 772
- ;HLEIDS - IEN of Client event protocol
- ;HLARYTYP - acknowledgement array (see V. 1.6 HL7 doc)
- ;HLFORMAT - is HLMA is pre-formatted HL7 form
- ;HLRESLTA - message ID and/or the error message (for output)
- ;HLP("ERRTEXT") - Processing error message
- ;HLP("CONTPTR") - continuation pointer field value (not used)
- ;HLP("PRIORITY") - priority field value (not used)
- ;HLP("SECURITY") - security information (not used)
- S HLEID=HL("EID"),HLEIDS=HL("EIDS"),HLARYTYP="GM",HLFORMAT=1,HLRESLTA="",HLMTIENA="",HLP=""
- D GENACK^HLMA1(HLEID,HLMTIENS,HLEIDS,HLARYTYP,HLFORMAT,.HLRESLTA,HLMTIENA,.HLP)
- EXIT ;
- K ^TMP("HLA",$J),SRHL
- Q
- PICK ;check routine for segment entry point
- I $T(@SG)]"" D @SG
- I $T(@SG)="" Q
- Q
- MSH ;;MSH
- ;process the MSH segment
- S (HLFS,HL("FS"))=$E(MSG,4),(HLECH,HL("ECH"))=$E(MSG,5,8)
- S HLCOMP=$E(HL("ECH"),1),HLREP=$E(HL("ECH"),2),HLSUB=$E(HL("ECH"),4)
- S TYPE=$P(MSG,HL("FS"),9)
- Q
- PID ;;PID
- ;process PID segment
- N I,PAT
- S PID("SSN")=$P(MSG,HL("FS"),20),PAT=$$FMNAME^HLFNC($P(MSG,HL("FS"),6))
- I $D(PAT) F I=0:0 S I=$O(^DPT("B",PAT,I)) Q:'I I $P(^DPT(I,0),U,9)=PID("SSN") S PID("DFN")=I
- Q
- OBX ;;OBX
- ;null header for OBR segments sets that are set to ignore or send
- Q:$G(OBR)=""
- D:$G(OBR)'="" OBX^SRHLUI(MSG,OBR,CASE)
- Q
- NTE ;;NTE
- ;null header for OBR segments sets that are set to ignore or send
- Q:$G(OBR)=""
- D NTE^SRHLUI(MSG,OBR,CASE)
- Q
- OBR ;;OBR
- ;process OBR segment as well as underlying OBX's or NTE
- N DFN,ID,IEN,SRII,SRNEXT
- ;set-up the IDentifier and check the mapping file (#133.2) for a match
- S CASE=$P(MSG,HL("FS"),4) I 'CASE S SRDISC="Unknown Surgery Case Number in "_$P(MSG,HL("FS"),1,2)_"." D SETDSC^SRHLU(.HL,SRDISC,.SRHL) Q
- I '$D(^SRF(CASE,0)) S SRDISC="Unknown Surgery Case Number ("_$G(CASE)_") in "_$P(MSG,HL("FS"),1,2)_"." D SETDSC^SRHLU(.HL,SRDISC,.SRHL) Q
- S ID=$P($P(MSG,HL("FS"),5),HLCOMP,2) I $G(ID)="" S SRDISC="Unknown OBR identifier ("_$G(ID)_") for case #"_$G(CASE)_"." D SETDSC^SRHLU(.HL,SRDISC,.SRHL) Q
- S IEN=$O(^SRO(133.2,"AC",ID,0)) I $G(IEN)="" S SRDISC="Invalid OBR identifier ("_$G(ID)_") for case #"_$G(CASE)_"." D SETDSC^SRHLU(.HL,SRDISC,.SRHL) Q
- I $D(^SRF(CASE,0)) S DFN=$P(^SRF(CASE,0),U) I $D(PID("SSN")),$P(^DPT(DFN,0),U,9)'=$G(PID("SSN")) D Q
- .S SRDISC="SSN mismatch for Surgery Case #"_$G(CASE)_". Surgery Patient "_$$GET1^DIQ(2,+DFN_",",.01)_" ("_$$GET1^DIQ(2,+40_",",.09)_") is being sent with invalid ID ("_$G(PID("SSN"))_")."
- .D SETDSC^SRHLU(.HL,SRDISC,.SRHL)
- ;process the OBR identifier that is set to receive
- I $$CHECK(IEN)=1 S OBR=$$OBR^SRHLUI(CASE,DFN,IEN,MSG)
- Q
- CHECK(IEN) ;check for valid receivable segments in file 133.2 (Surgery Interface)
- I $G(IEN)="" Q 0
- Q $P($G(^SRO(133.2,IEN,0)),U,4)["R"
- SRHLORU ;B'HAM ISC/DLR - Surgery Interface Receiver of ORU messages ; [ 02/06/01 9:27 AM ]
- +1 ;;3.0; Surgery ;**41,100**;24 Jun 93
- +2 ; Per VHA Directive 10-93-142, this routine SHOULD NOT be modified.
- REC NEW HLCOMP,HLREP,HLSUB,HLFS,HLECH,II,SG,SRERR,SRES,SRESCNT,SRESAR,SRESNR,SRI,SSN,TYPE,SROP,SRNON,SRHL,Z
- +1 KILL HLMID,PID,SRHL
- SET SRHL("E")=+$GET(SRHL("E"))
- SET (SRESCNT,SRESAR,SRESNR)=0
- +2 SET Z=$GET(^SRF(CASE,"TIU"))
- IF $PIECE(Z,"^",2)
- SET SRESNR=1
- IF $PIECE(Z,"^",4)
- SET SRESAR=1
- +3 FOR I=1:1
- XECUTE HLNEXT
- IF HLQUIT'>0
- QUIT
- SET (MSG,X(I))=HLNODE
- SET SG=$EXTRACT(HLNODE,1,3)
- SET J=0
- Begin DoDot:1
- +4 SET J=0
- FOR
- SET J=$ORDER(HLNODE(J))
- IF 'J
- QUIT
- SET X(I,J)=HLNODE(J)
- End DoDot:1
- DO PICK
- +5 IF SRHL("E")>0
- DO DSCPANCY^SRHLU(.HL)
- GEN ;generate the message
- +1 DO MSA^SRHLUO(1,$SELECT($DATA(HLP("ERRTEXT")):"AE",1:"AA"))
- +2 ;HLEID - IEN of Server event protocol
- +3 ;HLMTIENS - IEN in 772
- +4 ;HLEIDS - IEN of Client event protocol
- +5 ;HLARYTYP - acknowledgement array (see V. 1.6 HL7 doc)
- +6 ;HLFORMAT - is HLMA is pre-formatted HL7 form
- +7 ;HLRESLTA - message ID and/or the error message (for output)
- +8 ;HLP("ERRTEXT") - Processing error message
- +9 ;HLP("CONTPTR") - continuation pointer field value (not used)
- +10 ;HLP("PRIORITY") - priority field value (not used)
- +11 ;HLP("SECURITY") - security information (not used)
- +12 SET HLEID=HL("EID")
- SET HLEIDS=HL("EIDS")
- SET HLARYTYP="GM"
- SET HLFORMAT=1
- SET HLRESLTA=""
- SET HLMTIENA=""
- SET HLP=""
- +13 DO GENACK^HLMA1(HLEID,HLMTIENS,HLEIDS,HLARYTYP,HLFORMAT,.HLRESLTA,HLMTIENA,.HLP)
- EXIT ;
- +1 KILL ^TMP("HLA",$JOB),SRHL
- +2 QUIT
- PICK ;check routine for segment entry point
- +1 IF $TEXT(@SG)]""
- DO @SG
- +2 IF $TEXT(@SG)=""
- QUIT
- +3 QUIT
- MSH ;;MSH
- +1 ;process the MSH segment
- +2 SET (HLFS,HL("FS"))=$EXTRACT(MSG,4)
- SET (HLECH,HL("ECH"))=$EXTRACT(MSG,5,8)
- +3 SET HLCOMP=$EXTRACT(HL("ECH"),1)
- SET HLREP=$EXTRACT(HL("ECH"),2)
- SET HLSUB=$EXTRACT(HL("ECH"),4)
- +4 SET TYPE=$PIECE(MSG,HL("FS"),9)
- +5 QUIT
- PID ;;PID
- +1 ;process PID segment
- +2 NEW I,PAT
- +3 SET PID("SSN")=$PIECE(MSG,HL("FS"),20)
- SET PAT=$$FMNAME^HLFNC($PIECE(MSG,HL("FS"),6))
- +4 IF $DATA(PAT)
- FOR I=0:0
- SET I=$ORDER(^DPT("B",PAT,I))
- IF 'I
- QUIT
- IF $PIECE(^DPT(I,0),U,9)=PID("SSN")
- SET PID("DFN")=I
- +5 QUIT
- OBX ;;OBX
- +1 ;null header for OBR segments sets that are set to ignore or send
- +2 IF $GET(OBR)=""
- QUIT
- +3 IF $GET(OBR)'=""
- DO OBX^SRHLUI(MSG,OBR,CASE)
- +4 QUIT
- NTE ;;NTE
- +1 ;null header for OBR segments sets that are set to ignore or send
- +2 IF $GET(OBR)=""
- QUIT
- +3 DO NTE^SRHLUI(MSG,OBR,CASE)
- +4 QUIT
- OBR ;;OBR
- +1 ;process OBR segment as well as underlying OBX's or NTE
- +2 NEW DFN,ID,IEN,SRII,SRNEXT
- +3 ;set-up the IDentifier and check the mapping file (#133.2) for a match
- +4 SET CASE=$PIECE(MSG,HL("FS"),4)
- IF 'CASE
- SET SRDISC="Unknown Surgery Case Number in "_$PIECE(MSG,HL("FS"),1,2)_"."
- DO SETDSC^SRHLU(.HL,SRDISC,.SRHL)
- QUIT
- +5 IF '$DATA(^SRF(CASE,0))
- SET SRDISC="Unknown Surgery Case Number ("_$GET(CASE)_") in "_$PIECE(MSG,HL("FS"),1,2)_"."
- DO SETDSC^SRHLU(.HL,SRDISC,.SRHL)
- QUIT
- +6 SET ID=$PIECE($PIECE(MSG,HL("FS"),5),HLCOMP,2)
- IF $GET(ID)=""
- SET SRDISC="Unknown OBR identifier ("_$GET(ID)_") for case #"_$GET(CASE)_"."
- DO SETDSC^SRHLU(.HL,SRDISC,.SRHL)
- QUIT
- +7 SET IEN=$ORDER(^SRO(133.2,"AC",ID,0))
- IF $GET(IEN)=""
- SET SRDISC="Invalid OBR identifier ("_$GET(ID)_") for case #"_$GET(CASE)_"."
- DO SETDSC^SRHLU(.HL,SRDISC,.SRHL)
- QUIT
- +8 IF $DATA(^SRF(CASE,0))
- SET DFN=$PIECE(^SRF(CASE,0),U)
- IF $DATA(PID("SSN"))
- IF $PIECE(^DPT(DFN,0),U,9)'=$GET(PID("SSN"))
- Begin DoDot:1
- +9 SET SRDISC="SSN mismatch for Surgery Case #"_$GET(CASE)_". Surgery Patient "_$$GET1^DIQ(2,+DFN_",",.01)_" ("_$$GET1^DIQ(2,+40_",",.09)_") is being sent with invalid ID ("_$GET(PID("SSN"))_")."
- +10 DO SETDSC^SRHLU(.HL,SRDISC,.SRHL)
- End DoDot:1
- QUIT
- +11 ;process the OBR identifier that is set to receive
- +12 IF $$CHECK(IEN)=1
- SET OBR=$$OBR^SRHLUI(CASE,DFN,IEN,MSG)
- +13 QUIT
- CHECK(IEN) ;check for valid receivable segments in file 133.2 (Surgery Interface)
- +1 IF $GET(IEN)=""
- QUIT 0
- +2 QUIT $PIECE($GET(^SRO(133.2,IEN,0)),U,4)["R"