| [613] | 1 | LA7VHL ;DALOI/DLR - Main Driver for incoming HL7 V1.6 messages ; Jan 12, 2005
 | 
|---|
 | 2 |  ;;5.2;AUTOMATED LAB INSTRUMENTS;**27,46,62,64,67**;Sep 27, 1994
 | 
|---|
 | 3 |  ; This routine is not meant to be invoked by name
 | 
|---|
 | 4 |  ;
 | 
|---|
 | 5 |  QUIT
 | 
|---|
 | 6 |  ;
 | 
|---|
 | 7 |  ; This routine is called by the HL7 package V1.6 to process
 | 
|---|
 | 8 |  ; incoming HL7 messages.  Expected variables are those
 | 
|---|
 | 9 |  ; documented in the HL7 package documentation.  The line
 | 
|---|
 | 10 |  ; tag is called if it is entered into the PROCESSING ROUTINE
 | 
|---|
 | 11 |  ; field for the server protocol.
 | 
|---|
 | 12 |  ;
 | 
|---|
 | 13 | ORR ; Process incoming ORR messages
 | 
|---|
 | 14 | ACK ; Process incoming ACK messages
 | 
|---|
 | 15 | ORM ; Process incoming ORM messages
 | 
|---|
 | 16 | ORU ; Process incoming ORU messages
 | 
|---|
 | 17 |  ;
 | 
|---|
 | 18 |  N HLA,HLL,HLP,X,Y
 | 
|---|
 | 19 |  N LA76248,LA76249,LA7AAT,LA7AERR,LA7CS,LA7DT,LA7ECH,LA7FS,LA7HLS,LA7HLSA,LA7INTYP,LA7MEDT,LA7MTYP,LA7RAP,LA7PRID,LA7RSITE,LA7SAP,LA7SEQ,LA7SSITE,LA7TYPE,LA7VER,LA7VI,LA7VJ,LA7X
 | 
|---|
 | 20 |  ;
 | 
|---|
 | 21 |  S DT=$$DT^XLFDT
 | 
|---|
 | 22 |  S (LA76248,LA76249,LA7INTYP,LA7SEQ)=0
 | 
|---|
 | 23 |  ;
 | 
|---|
 | 24 |  K ^TMP("HLA",$J)
 | 
|---|
 | 25 |  ;
 | 
|---|
 | 26 |  ; Setup DUZ array to 'non-human' user LRLAB,HL
 | 
|---|
 | 27 |  ; If user not found - send alert to G.LAB MESSAGING
 | 
|---|
 | 28 |  S LA7X=$$FIND1^DIC(200,"","OX","LRLAB,HL","B","")
 | 
|---|
 | 29 |  I LA7X<1 D  Q
 | 
|---|
 | 30 |  . N MSG
 | 
|---|
 | 31 |  . S MSG="Lab Messaging - Unable to identify user 'LRLAB,HL' in NEW PERSON file"
 | 
|---|
 | 32 |  . D XQA^LA7UXQA(0,LA76248,0,0,MSG,"",0)
 | 
|---|
 | 33 |  D DUZ^XUP(LA7X)
 | 
|---|
 | 34 |  ;
 | 
|---|
 | 35 |  ; Set up LA7HLS with HL variables to build ACK message.
 | 
|---|
 | 36 |  ; Handle situation when systems use different encoding characters.
 | 
|---|
 | 37 |  D RSPINIT^HLFNC2(HL("EIDS"),.LA7HLS)
 | 
|---|
 | 38 |  ;
 | 
|---|
 | 39 |  ; Move message from HL7 global to Lab global
 | 
|---|
 | 40 |  F LA7VI=1:1 X HLNEXT Q:HLQUIT'>0  D
 | 
|---|
 | 41 |  . K LA7SEG
 | 
|---|
 | 42 |  . I HLNODE="" Q
 | 
|---|
 | 43 |  . S LA7SEG(0)=HLNODE
 | 
|---|
 | 44 |  . S LA7VJ=0
 | 
|---|
 | 45 |  . F  S LA7VJ=$O(HLNODE(LA7VJ)) Q:'LA7VJ  S LA7SEG(LA7VJ)=HLNODE(LA7VJ)
 | 
|---|
 | 46 |  . I $E(LA7SEG(0),1,3)="MSH" D MSH
 | 
|---|
 | 47 |  . I LA7SEQ<1 D REJECT("no MSH segment found") Q
 | 
|---|
 | 48 |  . D FILE6249^LA7VHLU(LA76249,.LA7SEG)
 | 
|---|
 | 49 |  ;
 | 
|---|
 | 50 |  ; Update entry in 62.49
 | 
|---|
 | 51 |  ; Change status to (Q)ueued for processing from (B)uilding
 | 
|---|
 | 52 |  I LA76249>0,$P($G(^LAHM(62.49,LA76249,0)),"^",3)'="E" D
 | 
|---|
 | 53 |  . N FDA,LA7ERR
 | 
|---|
 | 54 |  . S FDA(1,62.49,LA76249_",",2)="Q"
 | 
|---|
 | 55 |  . D FILE^DIE("","FDA(1)","LA7ERR(1)")
 | 
|---|
 | 56 |  ;
 | 
|---|
 | 57 |  ; Release lock on file #62.49 entry (tells LA7VIN message is stored).
 | 
|---|
 | 58 |  I LA76249>0 L -^LAHM(62.49,LA76249)
 | 
|---|
 | 59 |  ;
 | 
|---|
 | 60 |  ; Run processing routine
 | 
|---|
 | 61 |  I '$D(^LAHM(62.48,LA76248,1)) D CREATE^LA7LOG(5)
 | 
|---|
 | 62 |  I $D(^LAHM(62.48,LA76248,1)) X ^(1)
 | 
|---|
 | 63 |  ;
 | 
|---|
 | 64 |  ; Don't (ACK)nowledge ACK or ORR messages
 | 
|---|
 | 65 |  I $G(LA7MTYP)="ACK"!($G(LA7MTYP)="ORR") Q
 | 
|---|
 | 66 |  ;
 | 
|---|
 | 67 |  ; No application acknowledgement
 | 
|---|
 | 68 |  I $G(LA7AAT(1))="NE" Q
 | 
|---|
 | 69 |  ;
 | 
|---|
 | 70 |  ; Other system only wants ACK on successful completion condition and we found an error.
 | 
|---|
 | 71 |  I $G(LA7AERR)'="",$G(LA7AAT(1))="SU" Q
 | 
|---|
 | 72 |  ;
 | 
|---|
 | 73 |  ; Other system only wants ACK on error/reject condition
 | 
|---|
 | 74 |  I $G(LA7AERR)="",$G(LA7AAT(1))="ER" Q
 | 
|---|
 | 75 |  ;
 | 
|---|
 | 76 |  ; If POC interface and no error then quit - send application ack after
 | 
|---|
 | 77 |  ; processing message.
 | 
|---|
 | 78 |  I $G(LA7AERR)="",LA7INTYP>19,LA7INTYP<30 S X=$$DONTPURG^HLUTIL() Q
 | 
|---|
 | 79 |  ;
 | 
|---|
 | 80 |  ; If POC interface and error then setup HLL array
 | 
|---|
 | 81 |  I LA7INTYP>19,LA7INTYP<30 D
 | 
|---|
 | 82 |  . S HLL("SET FOR APP ACK")=1
 | 
|---|
 | 83 |  . S HLL("LINKS",1)=HL("EIDS")_"^"_$P(LA76248(0),"^")
 | 
|---|
 | 84 |  ;
 | 
|---|
 | 85 |  ; HL7 returns this as ACK if no errors found
 | 
|---|
 | 86 |  I $G(LA7AERR)="" S HLA("HLA",1)="MSA"_LA7HLS("RFS")_"AA"_LA7HLS("RFS")_HL("MID")
 | 
|---|
 | 87 |  ;
 | 
|---|
 | 88 |  ; Send ACK message
 | 
|---|
 | 89 |  I $D(HLA("HLA")) D
 | 
|---|
 | 90 |  . S HLP("NAMESPACE")="LA"
 | 
|---|
 | 91 |  . D GENACK^HLMA1(HL("EID"),HLMTIENS,HL("EIDS"),"LM",1,.LA7HLSA,"",.HLP)
 | 
|---|
 | 92 |  ;
 | 
|---|
 | 93 |  I $D(^TMP("HLA",$J)) D
 | 
|---|
 | 94 |  . S HLP("NAMESPACE")="LA"
 | 
|---|
 | 95 |  . D GENACK^HLMA1(HL("EID"),HLMTIENS,HL("EIDS"),"GM",1,.LA7HLSA,"",.HLP)
 | 
|---|
 | 96 |  ;
 | 
|---|
 | 97 |  Q
 | 
|---|
 | 98 |  ;
 | 
|---|
 | 99 |  ;
 | 
|---|
 | 100 | MSH ;;MSH
 | 
|---|
 | 101 |  ;
 | 
|---|
 | 102 |  N LA7CFIG,LA7MID,LA7NOW,X
 | 
|---|
 | 103 |  ;
 | 
|---|
 | 104 |  S LA7SEQ=1
 | 
|---|
 | 105 |  S LA7FS=$E(LA7SEG(0),4)
 | 
|---|
 | 106 |  S LA7ECH=$E(LA7SEG(0),5,8)
 | 
|---|
 | 107 |  S LA7CS=$E(LA7ECH,1)
 | 
|---|
 | 108 |  ; Sending application
 | 
|---|
 | 109 |  S LA7SAP=$P($$P^LA7VHLU(.LA7SEG,3,LA7FS),LA7CS)
 | 
|---|
 | 110 |  ; Sending facility
 | 
|---|
 | 111 |  S LA7SSITE=$P($$P^LA7VHLU(.LA7SEG,4,LA7FS),LA7CS)
 | 
|---|
 | 112 |  ; Receiving application
 | 
|---|
 | 113 |  S LA7RAP=$P($$P^LA7VHLU(.LA7SEG,5,LA7FS),LA7CS)
 | 
|---|
 | 114 |  ; Receiving facility
 | 
|---|
 | 115 |  S LA7RSITE=$P($$P^LA7VHLU(.LA7SEG,6,LA7FS),LA7CS)
 | 
|---|
 | 116 |  ; Date/time of message
 | 
|---|
 | 117 |  S LA7MEDT=$$P^LA7VHLU(.LA7SEG,7,LA7FS)
 | 
|---|
 | 118 |  ; Message type/trigger event/message structure
 | 
|---|
 | 119 |  S X=$$P^LA7VHLU(.LA7SEG,9,LA7FS)
 | 
|---|
 | 120 |  S LA7MTYP=$P(X,LA7CS),LA7MTYP("EVN")=$P(X,LA7CS,2),LA7MTYP("MSGSTR")=$P(X,LA7CS,3)
 | 
|---|
 | 121 |  ; Message Control ID
 | 
|---|
 | 122 |  S LA7MID=$$P^LA7VHLU(.LA7SEG,10,LA7FS)
 | 
|---|
 | 123 |  ; Processing ID
 | 
|---|
 | 124 |  S LA7PRID=$$P^LA7VHLU(.LA7SEG,11,LA7FS)
 | 
|---|
 | 125 |  ; Version ID
 | 
|---|
 | 126 |  S LA7VER=$$P^LA7VHLU(.LA7SEG,12,LA7FS)
 | 
|---|
 | 127 |  ; Accept acknowledgement type
 | 
|---|
 | 128 |  S LA7AAT(0)=$$P^LA7VHLU(.LA7SEG,15,LA7FS)
 | 
|---|
 | 129 |  ; Application acknowledgement type
 | 
|---|
 | 130 |  S LA7AAT(1)=$$P^LA7VHLU(.LA7SEG,16,LA7FS)
 | 
|---|
 | 131 |  ;
 | 
|---|
 | 132 |  S LA7CFIG=LA7SAP_LA7SSITE_LA7RAP_LA7RSITE
 | 
|---|
 | 133 |  S X=LA7CFIG X ^%ZOSF("LPC")
 | 
|---|
 | 134 |  S LA76248=+$O(^LAHM(62.48,"C",$E(LA7CFIG,1,27)_Y,0))
 | 
|---|
 | 135 |  I 'LA76248 S LA76248=+$O(^LAHM(62.48,"B",LA7SAP,0))
 | 
|---|
 | 136 |  I 'LA76248,$E(LA7SAP,1,11)="LA7V REMOTE" S LA76248=+$O(^LAHM(62.48,"B","LA7V COLLECTION "_$P(LA7SAP," ",3),0))
 | 
|---|
 | 137 |  I 'LA76248 D  Q
 | 
|---|
 | 138 |  . D CREATE^LA7LOG(1)
 | 
|---|
 | 139 |  . D REJECT("no config in 62.48")
 | 
|---|
 | 140 |  ;
 | 
|---|
 | 141 |  ; Determine interface type
 | 
|---|
 | 142 |  S LA7INTYP=+$P(^LAHM(62.48,LA76248,0),"^",9)
 | 
|---|
 | 143 |  ;
 | 
|---|
 | 144 |  I '$P($G(^LAHM(62.48,LA76248,0)),"^",3) D
 | 
|---|
 | 145 |  . D CREATE^LA7LOG(3)
 | 
|---|
 | 146 |  . D REJECT("config is inactive")
 | 
|---|
 | 147 |  ;
 | 
|---|
 | 148 |  ; store incoming message in ^LAHM(62.49)
 | 
|---|
 | 149 |  S LA76249=$$INIT6249^LA7VHLU
 | 
|---|
 | 150 |  I LA76249<1 Q
 | 
|---|
 | 151 |  ;
 | 
|---|
 | 152 |  ; update entry in 62.49
 | 
|---|
 | 153 |  N FDA,LA7ERR
 | 
|---|
 | 154 |  I $G(LA76248) S FDA(1,62.49,LA76249_",",.5)=LA76248
 | 
|---|
 | 155 |  S FDA(1,62.49,LA76249_",",1)="I"
 | 
|---|
 | 156 |  S FDA(1,62.49,LA76249_",",3)=3
 | 
|---|
 | 157 |  S FDA(1,62.49,LA76249_",",102)=LA7SAP
 | 
|---|
 | 158 |  S FDA(1,62.49,LA76249_",",103)=LA7SSITE
 | 
|---|
 | 159 |  S FDA(1,62.49,LA76249_",",104)=LA7RAP
 | 
|---|
 | 160 |  S FDA(1,62.49,LA76249_",",105)=LA7RSITE
 | 
|---|
 | 161 |  S FDA(1,62.49,LA76249_",",106)=LA7MEDT
 | 
|---|
 | 162 |  S FDA(1,62.49,LA76249_",",108)=LA7MTYP
 | 
|---|
 | 163 |  S FDA(1,62.49,LA76249_",",109)=LA7MID
 | 
|---|
 | 164 |  S FDA(1,62.49,LA76249_",",110)=LA7PRID
 | 
|---|
 | 165 |  S FDA(1,62.49,LA76249_",",111)=LA7VER
 | 
|---|
 | 166 |  S FDA(1,62.49,LA76249_",",700)=HL("EID")_";"_HLMTIENS_";"_HL("EIDS")
 | 
|---|
 | 167 |  D FILE^DIE("","FDA(1)","LA7ERR(1)")
 | 
|---|
 | 168 |  ;
 | 
|---|
 | 169 |  Q
 | 
|---|
 | 170 |  ;
 | 
|---|
 | 171 |  ;
 | 
|---|
 | 172 | REJECT(LA7AR) ; Build a reject segment if the incoming message could not be processed.
 | 
|---|
 | 173 |  ; Setting HLA("HLA",1) conforms to HL7 package rules for acknowledgements
 | 
|---|
 | 174 |  ; LA7AR is a free text string that is included in the reject
 | 
|---|
 | 175 |  ; message for debugging purposes.
 | 
|---|
 | 176 |  ;
 | 
|---|
 | 177 |  S HLA("HLA",1)="MSA"_LA7HLS("RFS")_"AR"_LA7HLS("RFS")_HL("MID")_LA7HLS("RFS")_LA7AR
 | 
|---|
 | 178 |  S LA7AERR=LA7AR
 | 
|---|
 | 179 |  Q
 | 
|---|