- RGFIPM1 ;ALB/CJM-PROCESS FACILITY INTEGRATION MESSAGE ;08/27/99
- ;;1.0;CLINICAL INFO RESOURCE NETWORK;**5,9**;30 Apr 99
- ;
- RECEIVE ;
- ;Description: Process the Facility Integration Message
- ;
- ;Input:
- ; HL7 variables must be defined
- ;Output: none
- ;Variables:
- ; LEGACY - station # of legacy site
- ; PRIMARY - station # of primary site
- ; ICN - patient ICN from message
- ; CHECKSUM - ICN checksum from message
- ; CMOR - station # of CMOR
- ; CMORIEN - ien of CMOR in Institution file
- ; HERE - ien in Institution file of site this routine is executing on
- ; HERE("STATION#") - station number of this site
- ; FROM - station # of sending site
- ; DFN - ien from the patient file
- ; HLERR - error encountered
- ; LCHKSUM - local checksum
- ;
- N CMOR,CMORIEN,LEGACY,PRIMARY,ICN,FROM,HERE,DFN,CHECKSUM,LCHKSUM
- K HLERR
- D
- .I '$$PARSE(0,.LEGACY,.PRIMARY,.ICN,.CHECKSUM,.FROM,.HLERR) Q
- .S HERE=$$SITE^VASITE(),HERE("STATION#")=$P(HERE,"^",3),HERE=+HERE
- .S DFN=$$DFN^RGFIU(ICN)
- .I ('DFN)!('$D(^DPT(+DFN))) D Q
- ..S HLERR=$$ERROR("PATIENT LOOKUP BASED ON ICN FAILED",228,ICN)
- .;
- .S LCHKSUM=$P($$GETICN^MPIF001(DFN),"V",2)
- .I (+CHECKSUM)'=(+LCHKSUM) D Q
- ..;If this is a local problem notify the local site
- ..I (+LCHKSUM)'=(+$$CHECKDG^MPIFSPC(ICN)) D
- ...S HLERR=$$ERROR("LOCAL DATABASE HAS INCORRECT ICN CHECKSUM",1,ICN)
- ...D EXC^RGFIU(1,$P(HLERR,"^",2),DFN)
- ..E D
- ...S HLERR=$$ERROR("SENT INCORRECT ICN CHECKSUM",1,ICN)
- .;
- .S CMORIEN=$P($$MPINODE^RGFIU(DFN),"^",3)
- .S CMOR=$$STATNUM^RGFIU(CMORIEN)
- .;
- .;Notify site if there is no station number for CMOR
- .I 'CMOR D EXC^RGFIU(221,"ERROR ENCOUNTERED WHILE PROCESSING FACILITY INTEGRATION MESSAGE",DFN)
- .;
- .;If this is the legacy site it does not need to process this message
- .Q:(HERE("STATION#")=LEGACY)
- .;
- .;If this site is the CMOR, it should only be receiving this message
- .;from the legacy site
- .I (CMORIEN=HERE),(FROM'=LEGACY) D Q
- ..S HLERR=$$ERROR("SITE INTEGRATION MSG TO CMOR NOT FROM LEGACY SITE",230,ICN)
- .;
- .;If this site is not the CMOR, the message must be from the CMOR
- .I CMORIEN,HERE'=CMORIEN,FROM'=CMOR D Q
- ..S HLERR=$$ERROR("SITE INTEGRATION MSG NOT FROM CMOR, CMOR IS "_CMOR,226,ICN)
- .;
- .;update database
- .I '$$XCHANGE^RGFIPM(DFN,LEGACY,PRIMARY) ;local exceptins are logged by $$XCHANGE if errors are encountered
- .;
- .;at this point the receiving application has decided that it can accept the message. An AA will be returned to the sender.
- .;
- .I '$D(HLERR),$G(HL("APAT"))="AL" D ACK(FROM,.HLERR)
- .;
- .;if this is the CMOR, notify subscribers & MPI of the site integration
- .I CMORIEN=HERE,'$$SEND^RGFIBM(DFN,LEGACY,PRIMARY) ;local exceptions are logged by $$SEND if errors are encountered
- ;
- I $D(HLERR),$G(HL("APAT"))="AL" D ACK(FROM,.HLERR)
- D:$G(RGLOG) STOP^RGHLLOG(1)
- Q
- ;
- ACK(FROM,HLERR) ;
- ;Description: Send an acknowledment
- ;
- ;Input:
- ; FROM - station number of site that sent the original message
- ; HLERR - error to be returned in format <exception code>^<error text>
- ; HL7 variables - assumed defined
- ;
- N RESULT,HLA,FS,CS,HLL,TOLINK
- S TOLINK=$$GETLINK^RGFIU($$LKUP^XUAF4(FROM))
- S HLL("LINKS",1)="RG FACILITY INTEGRATION CLIENT^"_TOLINK
- S FS=HL("FS"),CS=$E(HL("ECH"),1)
- I $D(HLERR) D
- .;return NAK
- .S HLA("HLA",1)="MSA"_FS_"ER"_FS_HL("MID")_FS_$P($G(HLERR),";;",2)_FS_FS_FS_CS_CS_CS_$P($G(HLERR),";;")
- E D
- .;return ACK
- .S HLA("HLA",1)="MSA"_FS_"AA"_FS_HL("MID")
- D GENACK^HLMA1(HL("EID"),HLMTIENS,HL("EIDS"),"LM",1,.RESULT)
- Q
- ;
- PARSE(SKIPMSH,LEGACY,PRIMARY,ICN,CHECKSUM,FROM,HLERR) ;
- ;Description: Parses the message and returns parameters.
- ;Input:
- ; SKIPMSH - (optional) if set to 1, means that the MSH segment is
- ; not expected to exist. This is the case when the
- ; routing logic is called.
- ; HL7 variables must be defined (assumed)
- ;Output:
- ; Function Value: 1 on success, 0 on failure
- ; LEGACY - station # of legacy site (pass by reference)
- ; PRIMARY - station # of primary site (pass by reference)
- ; ICN - ICN of patient (pass by reference)
- ; CHECKSUM - ICN checksum (pass by reference)
- ; FROM - station # of sendign site (pass by reference)
- ; HLERR - returns a message if an error is encountered (pass by reference)
- ;
- ;Variables:
- ; FS - field seperator
- ; CS - component seperator
- ; ERRFLAG - initially set to 1, set to 0 if message passes all checks
- ;
- N FS,CS,ERRFLAG
- S FS=HL("FS")
- S CS=$E(HL("ECH"),1)
- S ERRFLAG=1
- S (LEGACY,PRIMARY,ICN,CHECKSUM,FROM)=""
- K HLERR
- ;
- D
- .D:'$G(SKIPMSH) Q:$D(HLERR)
- ..X HLNEXT I (HLQUIT'>0) S HLERR=$$SEGERROR("MSH") Q
- ..I $P(HLNODE,FS)'["MSH" S HLERR=$$SEGERROR("MSH") Q
- ..S FROM=$P($P(HLNODE,FS,4),CS)
- ..I 'FROM S HLERR=$$ERROR("MISSING STATION NUMBER IN MSH SEGMENT FOR SENDING SITE",11) Q
- .;
- .X HLNEXT I (HLQUIT'>0) S HLERR=$$SEGERROR("EVN") Q
- .I $P(HLNODE,FS)'["EVN" D Q:$D(HLERR)
- ..I $G(SKIPMSH) X HLNEXT
- ..I $P(HLNODE,FS)'["EVN" S HLERR=$$SEGERROR("EVN") Q
- .I $P(HLNODE,FS,5)'=51 S HLERR=$$ERROR("EVENT REASON CODE NOT 51",9) Q
- .;
- .X HLNEXT I (HLQUIT'>0) S HLERR=$$SEGERROR("PID") Q
- .I $P(HLNODE,FS)'["PID" S HLERR=$$SEGERROR("PID") Q
- .S ICN=$P($P(HLNODE,FS,3),"V")
- .I 'ICN D Q
- ..S HLERR=$$ERROR("MISSING ICN IN PID SEGMENT",10)
- .S CHECKSUM=$P($P(HLNODE,FS,3),"V",2)
- .;
- .X HLNEXT I (HLQUIT'>0) S HLERR=$$SEGERROR("PV1",ICN) Q
- .I $P(HLNODE,FS)'["PV1" S HLERR=$$SEGERROR("PV1",ICN) Q
- .;
- .X HLNEXT I (HLQUIT'>0) S HLERR=$$SEGERROR("NTE",ICN) Q
- .I $P(HLNODE,FS)'["NTE" S HLERR=$$SEGERROR("NTE",ICN) Q
- .S LEGACY=$P($P(HLNODE,FS,4),CS)
- .I 'LEGACY S HLERR=$$ERROR("MISSING LEGACY STATION # IN NTE SEGMENT",8,ICN) Q
- .S PRIMARY=$P($P(HLNODE,FS,4),CS,2)
- .I 'PRIMARY S HLERR=$$ERROR("MISSING PRIMARY STATION # IN NTE SEGMENT",8,ICN) Q
- .S ERRFLAG=0
- Q 'ERRFLAG
- ;
- ERROR(ERRMSG,CODE,ICN) ;
- ;Description: formats ERRMSG in format <exception type>;<error text>
- ;Input:
- ; ERRMSG - text to incorporate into message
- ; CODE - Exception Type
- ; ICN - patient ICN
- ;
- ;
- Q $G(CODE)_";;"_" From Station:"_$P($$SITE^VASITE(),"^",3)_" ICN:"_$G(ICN)_" Code:"_$G(CODE)_" Msg:"_$G(ERRMSG)
- ;
- ;
- SEGERROR(SEGMENT,ICN) ;
- ;Description: formats error if expected segment not there
- S ERRMSG="MISSING SEGMENT: "_SEGMENT
- Q $$ERROR(ERRMSG,7,$G(ICN))
- --- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HRGFIPM1 6389 printed Mar 13, 2025@20:46:31 Page 2
- RGFIPM1 ;ALB/CJM-PROCESS FACILITY INTEGRATION MESSAGE ;08/27/99
- +1 ;;1.0;CLINICAL INFO RESOURCE NETWORK;**5,9**;30 Apr 99
- +2 ;
- RECEIVE ;
- +1 ;Description: Process the Facility Integration Message
- +2 ;
- +3 ;Input:
- +4 ; HL7 variables must be defined
- +5 ;Output: none
- +6 ;Variables:
- +7 ; LEGACY - station # of legacy site
- +8 ; PRIMARY - station # of primary site
- +9 ; ICN - patient ICN from message
- +10 ; CHECKSUM - ICN checksum from message
- +11 ; CMOR - station # of CMOR
- +12 ; CMORIEN - ien of CMOR in Institution file
- +13 ; HERE - ien in Institution file of site this routine is executing on
- +14 ; HERE("STATION#") - station number of this site
- +15 ; FROM - station # of sending site
- +16 ; DFN - ien from the patient file
- +17 ; HLERR - error encountered
- +18 ; LCHKSUM - local checksum
- +19 ;
- +20 NEW CMOR,CMORIEN,LEGACY,PRIMARY,ICN,FROM,HERE,DFN,CHECKSUM,LCHKSUM
- +21 KILL HLERR
- +22 Begin DoDot:1
- +23 IF '$$PARSE(0,.LEGACY,.PRIMARY,.ICN,.CHECKSUM,.FROM,.HLERR)
- QUIT
- +24 SET HERE=$$SITE^VASITE()
- SET HERE("STATION#")=$PIECE(HERE,"^",3)
- SET HERE=+HERE
- +25 SET DFN=$$DFN^RGFIU(ICN)
- +26 IF ('DFN)!('$DATA(^DPT(+DFN)))
- Begin DoDot:2
- +27 SET HLERR=$$ERROR("PATIENT LOOKUP BASED ON ICN FAILED",228,ICN)
- End DoDot:2
- QUIT
- +28 ;
- +29 SET LCHKSUM=$PIECE($$GETICN^MPIF001(DFN),"V",2)
- +30 IF (+CHECKSUM)'=(+LCHKSUM)
- Begin DoDot:2
- +31 ;If this is a local problem notify the local site
- +32 IF (+LCHKSUM)'=(+$$CHECKDG^MPIFSPC(ICN))
- Begin DoDot:3
- +33 SET HLERR=$$ERROR("LOCAL DATABASE HAS INCORRECT ICN CHECKSUM",1,ICN)
- +34 DO EXC^RGFIU(1,$PIECE(HLERR,"^",2),DFN)
- End DoDot:3
- +35 IF '$TEST
- Begin DoDot:3
- +36 SET HLERR=$$ERROR("SENT INCORRECT ICN CHECKSUM",1,ICN)
- End DoDot:3
- End DoDot:2
- QUIT
- +37 ;
- +38 SET CMORIEN=$PIECE($$MPINODE^RGFIU(DFN),"^",3)
- +39 SET CMOR=$$STATNUM^RGFIU(CMORIEN)
- +40 ;
- +41 ;Notify site if there is no station number for CMOR
- +42 IF 'CMOR
- DO EXC^RGFIU(221,"ERROR ENCOUNTERED WHILE PROCESSING FACILITY INTEGRATION MESSAGE",DFN)
- +43 ;
- +44 ;If this is the legacy site it does not need to process this message
- +45 if (HERE("STATION#")=LEGACY)
- QUIT
- +46 ;
- +47 ;If this site is the CMOR, it should only be receiving this message
- +48 ;from the legacy site
- +49 IF (CMORIEN=HERE)
- IF (FROM'=LEGACY)
- Begin DoDot:2
- +50 SET HLERR=$$ERROR("SITE INTEGRATION MSG TO CMOR NOT FROM LEGACY SITE",230,ICN)
- End DoDot:2
- QUIT
- +51 ;
- +52 ;If this site is not the CMOR, the message must be from the CMOR
- +53 IF CMORIEN
- IF HERE'=CMORIEN
- IF FROM'=CMOR
- Begin DoDot:2
- +54 SET HLERR=$$ERROR("SITE INTEGRATION MSG NOT FROM CMOR, CMOR IS "_CMOR,226,ICN)
- End DoDot:2
- QUIT
- +55 ;
- +56 ;update database
- +57 ;local exceptins are logged by $$XCHANGE if errors are encountered
- IF '$$XCHANGE^RGFIPM(DFN,LEGACY,PRIMARY)
- +58 ;
- +59 ;at this point the receiving application has decided that it can accept the message. An AA will be returned to the sender.
- +60 ;
- +61 IF '$DATA(HLERR)
- IF $GET(HL("APAT"))="AL"
- DO ACK(FROM,.HLERR)
- +62 ;
- +63 ;if this is the CMOR, notify subscribers & MPI of the site integration
- +64 ;local exceptions are logged by $$SEND if errors are encountered
- IF CMORIEN=HERE
- IF '$$SEND^RGFIBM(DFN,LEGACY,PRIMARY)
- End DoDot:1
- +65 ;
- +66 IF $DATA(HLERR)
- IF $GET(HL("APAT"))="AL"
- DO ACK(FROM,.HLERR)
- +67 if $GET(RGLOG)
- DO STOP^RGHLLOG(1)
- +68 QUIT
- +69 ;
- ACK(FROM,HLERR) ;
- +1 ;Description: Send an acknowledment
- +2 ;
- +3 ;Input:
- +4 ; FROM - station number of site that sent the original message
- +5 ; HLERR - error to be returned in format <exception code>^<error text>
- +6 ; HL7 variables - assumed defined
- +7 ;
- +8 NEW RESULT,HLA,FS,CS,HLL,TOLINK
- +9 SET TOLINK=$$GETLINK^RGFIU($$LKUP^XUAF4(FROM))
- +10 SET HLL("LINKS",1)="RG FACILITY INTEGRATION CLIENT^"_TOLINK
- +11 SET FS=HL("FS")
- SET CS=$EXTRACT(HL("ECH"),1)
- +12 IF $DATA(HLERR)
- Begin DoDot:1
- +13 ;return NAK
- +14 SET HLA("HLA",1)="MSA"_FS_"ER"_FS_HL("MID")_FS_$PIECE($GET(HLERR),";;",2)_FS_FS_FS_CS_CS_CS_$PIECE($GET(HLERR),";;")
- End DoDot:1
- +15 IF '$TEST
- Begin DoDot:1
- +16 ;return ACK
- +17 SET HLA("HLA",1)="MSA"_FS_"AA"_FS_HL("MID")
- End DoDot:1
- +18 DO GENACK^HLMA1(HL("EID"),HLMTIENS,HL("EIDS"),"LM",1,.RESULT)
- +19 QUIT
- +20 ;
- PARSE(SKIPMSH,LEGACY,PRIMARY,ICN,CHECKSUM,FROM,HLERR) ;
- +1 ;Description: Parses the message and returns parameters.
- +2 ;Input:
- +3 ; SKIPMSH - (optional) if set to 1, means that the MSH segment is
- +4 ; not expected to exist. This is the case when the
- +5 ; routing logic is called.
- +6 ; HL7 variables must be defined (assumed)
- +7 ;Output:
- +8 ; Function Value: 1 on success, 0 on failure
- +9 ; LEGACY - station # of legacy site (pass by reference)
- +10 ; PRIMARY - station # of primary site (pass by reference)
- +11 ; ICN - ICN of patient (pass by reference)
- +12 ; CHECKSUM - ICN checksum (pass by reference)
- +13 ; FROM - station # of sendign site (pass by reference)
- +14 ; HLERR - returns a message if an error is encountered (pass by reference)
- +15 ;
- +16 ;Variables:
- +17 ; FS - field seperator
- +18 ; CS - component seperator
- +19 ; ERRFLAG - initially set to 1, set to 0 if message passes all checks
- +20 ;
- +21 NEW FS,CS,ERRFLAG
- +22 SET FS=HL("FS")
- +23 SET CS=$EXTRACT(HL("ECH"),1)
- +24 SET ERRFLAG=1
- +25 SET (LEGACY,PRIMARY,ICN,CHECKSUM,FROM)=""
- +26 KILL HLERR
- +27 ;
- +28 Begin DoDot:1
- +29 if '$GET(SKIPMSH)
- Begin DoDot:2
- +30 XECUTE HLNEXT
- IF (HLQUIT'>0)
- SET HLERR=$$SEGERROR("MSH")
- QUIT
- +31 IF $PIECE(HLNODE,FS)'["MSH"
- SET HLERR=$$SEGERROR("MSH")
- QUIT
- +32 SET FROM=$PIECE($PIECE(HLNODE,FS,4),CS)
- +33 IF 'FROM
- SET HLERR=$$ERROR("MISSING STATION NUMBER IN MSH SEGMENT FOR SENDING SITE",11)
- QUIT
- End DoDot:2
- if $DATA(HLERR)
- QUIT
- +34 ;
- +35 XECUTE HLNEXT
- IF (HLQUIT'>0)
- SET HLERR=$$SEGERROR("EVN")
- QUIT
- +36 IF $PIECE(HLNODE,FS)'["EVN"
- Begin DoDot:2
- +37 IF $GET(SKIPMSH)
- XECUTE HLNEXT
- +38 IF $PIECE(HLNODE,FS)'["EVN"
- SET HLERR=$$SEGERROR("EVN")
- QUIT
- End DoDot:2
- if $DATA(HLERR)
- QUIT
- +39 IF $PIECE(HLNODE,FS,5)'=51
- SET HLERR=$$ERROR("EVENT REASON CODE NOT 51",9)
- QUIT
- +40 ;
- +41 XECUTE HLNEXT
- IF (HLQUIT'>0)
- SET HLERR=$$SEGERROR("PID")
- QUIT
- +42 IF $PIECE(HLNODE,FS)'["PID"
- SET HLERR=$$SEGERROR("PID")
- QUIT
- +43 SET ICN=$PIECE($PIECE(HLNODE,FS,3),"V")
- +44 IF 'ICN
- Begin DoDot:2
- +45 SET HLERR=$$ERROR("MISSING ICN IN PID SEGMENT",10)
- End DoDot:2
- QUIT
- +46 SET CHECKSUM=$PIECE($PIECE(HLNODE,FS,3),"V",2)
- +47 ;
- +48 XECUTE HLNEXT
- IF (HLQUIT'>0)
- SET HLERR=$$SEGERROR("PV1",ICN)
- QUIT
- +49 IF $PIECE(HLNODE,FS)'["PV1"
- SET HLERR=$$SEGERROR("PV1",ICN)
- QUIT
- +50 ;
- +51 XECUTE HLNEXT
- IF (HLQUIT'>0)
- SET HLERR=$$SEGERROR("NTE",ICN)
- QUIT
- +52 IF $PIECE(HLNODE,FS)'["NTE"
- SET HLERR=$$SEGERROR("NTE",ICN)
- QUIT
- +53 SET LEGACY=$PIECE($PIECE(HLNODE,FS,4),CS)
- +54 IF 'LEGACY
- SET HLERR=$$ERROR("MISSING LEGACY STATION # IN NTE SEGMENT",8,ICN)
- QUIT
- +55 SET PRIMARY=$PIECE($PIECE(HLNODE,FS,4),CS,2)
- +56 IF 'PRIMARY
- SET HLERR=$$ERROR("MISSING PRIMARY STATION # IN NTE SEGMENT",8,ICN)
- QUIT
- +57 SET ERRFLAG=0
- End DoDot:1
- +58 QUIT 'ERRFLAG
- +59 ;
- ERROR(ERRMSG,CODE,ICN) ;
- +1 ;Description: formats ERRMSG in format <exception type>;<error text>
- +2 ;Input:
- +3 ; ERRMSG - text to incorporate into message
- +4 ; CODE - Exception Type
- +5 ; ICN - patient ICN
- +6 ;
- +7 ;
- +8 QUIT $GET(CODE)_";;"_" From Station:"_$PIECE($$SITE^VASITE(),"^",3)_" ICN:"_$GET(ICN)_" Code:"_$GET(CODE)_" Msg:"_$GET(ERRMSG)
- +9 ;
- +10 ;
- SEGERROR(SEGMENT,ICN) ;
- +1 ;Description: formats error if expected segment not there
- +2 SET ERRMSG="MISSING SEGMENT: "_SEGMENT
- +3 QUIT $$ERROR(ERRMSG,7,$GET(ICN))