[613] | 1 | RGFIPM1 ;ALB/CJM-PROCESS FACILITY INTEGRATION MESSAGE ;08/27/99
|
---|
| 2 | ;;1.0;CLINICAL INFO RESOURCE NETWORK;**5,9**;30 Apr 99
|
---|
| 3 | ;
|
---|
| 4 | RECEIVE ;
|
---|
| 5 | ;Description: Process the Facility Integration Message
|
---|
| 6 | ;
|
---|
| 7 | ;Input:
|
---|
| 8 | ; HL7 variables must be defined
|
---|
| 9 | ;Output: none
|
---|
| 10 | ;Variables:
|
---|
| 11 | ; LEGACY - station # of legacy site
|
---|
| 12 | ; PRIMARY - station # of primary site
|
---|
| 13 | ; ICN - patient ICN from message
|
---|
| 14 | ; CHECKSUM - ICN checksum from message
|
---|
| 15 | ; CMOR - station # of CMOR
|
---|
| 16 | ; CMORIEN - ien of CMOR in Institution file
|
---|
| 17 | ; HERE - ien in Institution file of site this routine is executing on
|
---|
| 18 | ; HERE("STATION#") - station number of this site
|
---|
| 19 | ; FROM - station # of sending site
|
---|
| 20 | ; DFN - ien from the patient file
|
---|
| 21 | ; HLERR - error encountered
|
---|
| 22 | ; LCHKSUM - local checksum
|
---|
| 23 | ;
|
---|
| 24 | N CMOR,CMORIEN,LEGACY,PRIMARY,ICN,FROM,HERE,DFN,CHECKSUM,LCHKSUM
|
---|
| 25 | K HLERR
|
---|
| 26 | D
|
---|
| 27 | .I '$$PARSE(0,.LEGACY,.PRIMARY,.ICN,.CHECKSUM,.FROM,.HLERR) Q
|
---|
| 28 | .S HERE=$$SITE^VASITE(),HERE("STATION#")=$P(HERE,"^",3),HERE=+HERE
|
---|
| 29 | .S DFN=$$DFN^RGFIU(ICN)
|
---|
| 30 | .I ('DFN)!('$D(^DPT(+DFN))) D Q
|
---|
| 31 | ..S HLERR=$$ERROR("PATIENT LOOKUP BASED ON ICN FAILED",228,ICN)
|
---|
| 32 | .;
|
---|
| 33 | .S LCHKSUM=$P($$GETICN^MPIF001(DFN),"V",2)
|
---|
| 34 | .I (+CHECKSUM)'=(+LCHKSUM) D Q
|
---|
| 35 | ..;If this is a local problem notify the local site
|
---|
| 36 | ..I (+LCHKSUM)'=(+$$CHECKDG^MPIFSPC(ICN)) D
|
---|
| 37 | ...S HLERR=$$ERROR("LOCAL DATABASE HAS INCORRECT ICN CHECKSUM",1,ICN)
|
---|
| 38 | ...D EXC^RGFIU(1,$P(HLERR,"^",2),DFN)
|
---|
| 39 | ..E D
|
---|
| 40 | ...S HLERR=$$ERROR("SENT INCORRECT ICN CHECKSUM",1,ICN)
|
---|
| 41 | .;
|
---|
| 42 | .S CMORIEN=$P($$MPINODE^RGFIU(DFN),"^",3)
|
---|
| 43 | .S CMOR=$$STATNUM^RGFIU(CMORIEN)
|
---|
| 44 | .;
|
---|
| 45 | .;Notify site if there is no station number for CMOR
|
---|
| 46 | .I 'CMOR D EXC^RGFIU(221,"ERROR ENCOUNTERED WHILE PROCESSING FACILITY INTEGRATION MESSAGE",DFN)
|
---|
| 47 | .;
|
---|
| 48 | .;If this is the legacy site it does not need to process this message
|
---|
| 49 | .Q:(HERE("STATION#")=LEGACY)
|
---|
| 50 | .;
|
---|
| 51 | .;If this site is the CMOR, it should only be receiving this message
|
---|
| 52 | .;from the legacy site
|
---|
| 53 | .I (CMORIEN=HERE),(FROM'=LEGACY) D Q
|
---|
| 54 | ..S HLERR=$$ERROR("SITE INTEGRATION MSG TO CMOR NOT FROM LEGACY SITE",230,ICN)
|
---|
| 55 | .;
|
---|
| 56 | .;If this site is not the CMOR, the message must be from the CMOR
|
---|
| 57 | .I CMORIEN,HERE'=CMORIEN,FROM'=CMOR D Q
|
---|
| 58 | ..S HLERR=$$ERROR("SITE INTEGRATION MSG NOT FROM CMOR, CMOR IS "_CMOR,226,ICN)
|
---|
| 59 | .;
|
---|
| 60 | .;update database
|
---|
| 61 | .I '$$XCHANGE^RGFIPM(DFN,LEGACY,PRIMARY) ;local exceptins are logged by $$XCHANGE if errors are encountered
|
---|
| 62 | .;
|
---|
| 63 | .;at this point the receiving application has decided that it can accept the message. An AA will be returned to the sender.
|
---|
| 64 | .;
|
---|
| 65 | .I '$D(HLERR),$G(HL("APAT"))="AL" D ACK(FROM,.HLERR)
|
---|
| 66 | .;
|
---|
| 67 | .;if this is the CMOR, notify subscribers & MPI of the site integration
|
---|
| 68 | .I CMORIEN=HERE,'$$SEND^RGFIBM(DFN,LEGACY,PRIMARY) ;local exceptions are logged by $$SEND if errors are encountered
|
---|
| 69 | ;
|
---|
| 70 | I $D(HLERR),$G(HL("APAT"))="AL" D ACK(FROM,.HLERR)
|
---|
| 71 | D:$G(RGLOG) STOP^RGHLLOG(1)
|
---|
| 72 | Q
|
---|
| 73 | ;
|
---|
| 74 | ACK(FROM,HLERR) ;
|
---|
| 75 | ;Description: Send an acknowledment
|
---|
| 76 | ;
|
---|
| 77 | ;Input:
|
---|
| 78 | ; FROM - station number of site that sent the original message
|
---|
| 79 | ; HLERR - error to be returned in format <exception code>^<error text>
|
---|
| 80 | ; HL7 variables - assumed defined
|
---|
| 81 | ;
|
---|
| 82 | N RESULT,HLA,FS,CS,HLL,TOLINK
|
---|
| 83 | S TOLINK=$$GETLINK^RGFIU($$LKUP^XUAF4(FROM))
|
---|
| 84 | S HLL("LINKS",1)="RG FACILITY INTEGRATION CLIENT^"_TOLINK
|
---|
| 85 | S FS=HL("FS"),CS=$E(HL("ECH"),1)
|
---|
| 86 | I $D(HLERR) D
|
---|
| 87 | .;return NAK
|
---|
| 88 | .S HLA("HLA",1)="MSA"_FS_"ER"_FS_HL("MID")_FS_$P($G(HLERR),";;",2)_FS_FS_FS_CS_CS_CS_$P($G(HLERR),";;")
|
---|
| 89 | E D
|
---|
| 90 | .;return ACK
|
---|
| 91 | .S HLA("HLA",1)="MSA"_FS_"AA"_FS_HL("MID")
|
---|
| 92 | D GENACK^HLMA1(HL("EID"),HLMTIENS,HL("EIDS"),"LM",1,.RESULT)
|
---|
| 93 | Q
|
---|
| 94 | ;
|
---|
| 95 | PARSE(SKIPMSH,LEGACY,PRIMARY,ICN,CHECKSUM,FROM,HLERR) ;
|
---|
| 96 | ;Description: Parses the message and returns parameters.
|
---|
| 97 | ;Input:
|
---|
| 98 | ; SKIPMSH - (optional) if set to 1, means that the MSH segment is
|
---|
| 99 | ; not expected to exist. This is the case when the
|
---|
| 100 | ; routing logic is called.
|
---|
| 101 | ; HL7 variables must be defined (assumed)
|
---|
| 102 | ;Output:
|
---|
| 103 | ; Function Value: 1 on success, 0 on failure
|
---|
| 104 | ; LEGACY - station # of legacy site (pass by reference)
|
---|
| 105 | ; PRIMARY - station # of primary site (pass by reference)
|
---|
| 106 | ; ICN - ICN of patient (pass by reference)
|
---|
| 107 | ; CHECKSUM - ICN checksum (pass by reference)
|
---|
| 108 | ; FROM - station # of sendign site (pass by reference)
|
---|
| 109 | ; HLERR - returns a message if an error is encountered (pass by reference)
|
---|
| 110 | ;
|
---|
| 111 | ;Variables:
|
---|
| 112 | ; FS - field seperator
|
---|
| 113 | ; CS - component seperator
|
---|
| 114 | ; ERRFLAG - initially set to 1, set to 0 if message passes all checks
|
---|
| 115 | ;
|
---|
| 116 | N FS,CS,ERRFLAG
|
---|
| 117 | S FS=HL("FS")
|
---|
| 118 | S CS=$E(HL("ECH"),1)
|
---|
| 119 | S ERRFLAG=1
|
---|
| 120 | S (LEGACY,PRIMARY,ICN,CHECKSUM,FROM)=""
|
---|
| 121 | K HLERR
|
---|
| 122 | ;
|
---|
| 123 | D
|
---|
| 124 | .D:'$G(SKIPMSH) Q:$D(HLERR)
|
---|
| 125 | ..X HLNEXT I (HLQUIT'>0) S HLERR=$$SEGERROR("MSH") Q
|
---|
| 126 | ..I $P(HLNODE,FS)'["MSH" S HLERR=$$SEGERROR("MSH") Q
|
---|
| 127 | ..S FROM=$P($P(HLNODE,FS,4),CS)
|
---|
| 128 | ..I 'FROM S HLERR=$$ERROR("MISSING STATION NUMBER IN MSH SEGMENT FOR SENDING SITE",11) Q
|
---|
| 129 | .;
|
---|
| 130 | .X HLNEXT I (HLQUIT'>0) S HLERR=$$SEGERROR("EVN") Q
|
---|
| 131 | .I $P(HLNODE,FS)'["EVN" D Q:$D(HLERR)
|
---|
| 132 | ..I $G(SKIPMSH) X HLNEXT
|
---|
| 133 | ..I $P(HLNODE,FS)'["EVN" S HLERR=$$SEGERROR("EVN") Q
|
---|
| 134 | .I $P(HLNODE,FS,5)'=51 S HLERR=$$ERROR("EVENT REASON CODE NOT 51",9) Q
|
---|
| 135 | .;
|
---|
| 136 | .X HLNEXT I (HLQUIT'>0) S HLERR=$$SEGERROR("PID") Q
|
---|
| 137 | .I $P(HLNODE,FS)'["PID" S HLERR=$$SEGERROR("PID") Q
|
---|
| 138 | .S ICN=$P($P(HLNODE,FS,3),"V")
|
---|
| 139 | .I 'ICN D Q
|
---|
| 140 | ..S HLERR=$$ERROR("MISSING ICN IN PID SEGMENT",10)
|
---|
| 141 | .S CHECKSUM=$P($P(HLNODE,FS,3),"V",2)
|
---|
| 142 | .;
|
---|
| 143 | .X HLNEXT I (HLQUIT'>0) S HLERR=$$SEGERROR("PV1",ICN) Q
|
---|
| 144 | .I $P(HLNODE,FS)'["PV1" S HLERR=$$SEGERROR("PV1",ICN) Q
|
---|
| 145 | .;
|
---|
| 146 | .X HLNEXT I (HLQUIT'>0) S HLERR=$$SEGERROR("NTE",ICN) Q
|
---|
| 147 | .I $P(HLNODE,FS)'["NTE" S HLERR=$$SEGERROR("NTE",ICN) Q
|
---|
| 148 | .S LEGACY=$P($P(HLNODE,FS,4),CS)
|
---|
| 149 | .I 'LEGACY S HLERR=$$ERROR("MISSING LEGACY STATION # IN NTE SEGMENT",8,ICN) Q
|
---|
| 150 | .S PRIMARY=$P($P(HLNODE,FS,4),CS,2)
|
---|
| 151 | .I 'PRIMARY S HLERR=$$ERROR("MISSING PRIMARY STATION # IN NTE SEGMENT",8,ICN) Q
|
---|
| 152 | .S ERRFLAG=0
|
---|
| 153 | Q 'ERRFLAG
|
---|
| 154 | ;
|
---|
| 155 | ERROR(ERRMSG,CODE,ICN) ;
|
---|
| 156 | ;Description: formats ERRMSG in format <exception type>;;<error text>
|
---|
| 157 | ;Input:
|
---|
| 158 | ; ERRMSG - text to incorporate into message
|
---|
| 159 | ; CODE - Exception Type
|
---|
| 160 | ; ICN - patient ICN
|
---|
| 161 | ;
|
---|
| 162 | ;
|
---|
| 163 | Q $G(CODE)_";;"_" From Station:"_$P($$SITE^VASITE(),"^",3)_" ICN:"_$G(ICN)_" Code:"_$G(CODE)_" Msg:"_$G(ERRMSG)
|
---|
| 164 | ;
|
---|
| 165 | ;
|
---|
| 166 | SEGERROR(SEGMENT,ICN) ;
|
---|
| 167 | ;Description: formats error if expected segment not there
|
---|
| 168 | S ERRMSG="MISSING SEGMENT: "_SEGMENT
|
---|
| 169 | Q $$ERROR(ERRMSG,7,$G(ICN))
|
---|