| 1 | LA7VIN1 ;DALOI/JMC - Process Incoming UI Msgs, continued ; 01/14/99
 | 
|---|
| 2 |  ;;5.2;AUTOMATED LAB INSTRUMENTS;**46,64**;Sep 27, 1994
 | 
|---|
| 3 |  ; This routine is a continuation of LA7VIN and is only called from there.
 | 
|---|
| 4 |  ; It is called with each message found in the incoming queue.  
 | 
|---|
| 5 |  Q
 | 
|---|
| 6 |  ;
 | 
|---|
| 7 | NXTMSG ;
 | 
|---|
| 8 |  N FDA,LA7ABORT,LA7CNT,LA7END,LA7ERR
 | 
|---|
| 9 |  N LA7INDX,LA7QUIT,LA7SEG,LA7STYP
 | 
|---|
| 10 |  ;
 | 
|---|
| 11 |  S LA7ERR=""
 | 
|---|
| 12 |  S (LA7ABORT,LA7CNT,LA7END,LA7INDX,LA7QUIT,LA7SEQ)=0
 | 
|---|
| 13 |  S DT=$$DT^XLFDT
 | 
|---|
| 14 |  S LA7ID="UNKNOWN-I-"
 | 
|---|
| 15 |  ;
 | 
|---|
| 16 |  ; Message built but no text.
 | 
|---|
| 17 |  I '$O(^LAHM(62.49,LA76249,150,0)) D  Q
 | 
|---|
| 18 |  . S (LA7ABORT,LA7ERR)=6
 | 
|---|
| 19 |  . D CREATE^LA7LOG(LA7ERR)
 | 
|---|
| 20 |  . D SETID^LA7VHLU1(LA76249,LA7ID,"UNKNOWN")
 | 
|---|
| 21 |  ;
 | 
|---|
| 22 |  ; Process message segments
 | 
|---|
| 23 |  ; Lab currently does not accept segments beginning with the letter "Z"
 | 
|---|
| 24 |  ; which are reserved for locally-defined messages. "Z" segments will be
 | 
|---|
| 25 |  ; ignored by this software.
 | 
|---|
| 26 |  F  S LA7END=$$GETSEG^LA7VHLU2(LA76249,.LA7INDX,.LA7SEG) Q:LA7END!(LA7ABORT)  D
 | 
|---|
| 27 |  . S LA7STYP=$E(LA7SEG(0),1,3) ; Segment type
 | 
|---|
| 28 |  . I $E(LA7STYP,1)="Z" Q
 | 
|---|
| 29 |  . ; Not a valid segment type
 | 
|---|
| 30 |  . I LA7STYP'?2U1UN D  Q
 | 
|---|
| 31 |  . . S LA7ERR=34
 | 
|---|
| 32 |  . . D CREATE^LA7LOG(LA7ERR)
 | 
|---|
| 33 |  . ; Segment encoded wrong - field separator does not match
 | 
|---|
| 34 |  . I "MSH^FSH^BHS^"'[(LA7STYP_"^"),$E(LA7SEG(0),4)'=LA7FS D  Q
 | 
|---|
| 35 |  . . S LA7ERR=35
 | 
|---|
| 36 |  . . D CREATE^LA7LOG(LA7ERR)
 | 
|---|
| 37 |  . I $T(@LA7STYP)="" Q  ; No processing logic for this segment type
 | 
|---|
| 38 |  . D @LA7STYP
 | 
|---|
| 39 |  ;
 | 
|---|
| 40 |  ; Set id if only MSH segment received.
 | 
|---|
| 41 |  I LA7SEQ<5 D
 | 
|---|
| 42 |  . D SETID^LA7VHLU1(LA76249,LA7ID,"UNKNOWN")
 | 
|---|
| 43 |  ;
 | 
|---|
| 44 |  ; Set status to purgeable if no errors.
 | 
|---|
| 45 |  I $P($G(^LAHM(62.49,LA76249,0)),"^",3)'="E" D
 | 
|---|
| 46 |  . S FDA(1,62.49,LA76249_",",2)="X"
 | 
|---|
| 47 |  . D FILE^DIE("","FDA(1)","LA7ERR(1)")
 | 
|---|
| 48 |  ;
 | 
|---|
| 49 |  ; Store identifier's found in message.
 | 
|---|
| 50 |  D UPID^LA7VHLU1(LA76249)
 | 
|---|
| 51 |  ;
 | 
|---|
| 52 |  ; Send new result alert for ORU messages if turned on.
 | 
|---|
| 53 |  ; Currently only on LEDI (10) type interfaces.
 | 
|---|
| 54 |  I $G(LA7MTYP)="ORU",$D(^LAHM(62.48,+$G(LA76248),20,"B",1)) D
 | 
|---|
| 55 |  . I LA7INTYP=10,$D(^TMP("LA7-ORU",$J,LA76248)) D XQA^LA7UXQA(1,LA76248)
 | 
|---|
| 56 |  ;
 | 
|---|
| 57 |  ; Send new order alert for ORM messages if turned on.
 | 
|---|
| 58 |  I $G(LA7MTYP)="ORM",$D(^LAHM(62.48,+$G(LA76248),20,"B",3)) D
 | 
|---|
| 59 |  . N LA7ROOT
 | 
|---|
| 60 |  . S LA7ROOT="^TMP(""LA7-ORM"",$J)"
 | 
|---|
| 61 |  . F  S LA7ROOT=$Q(@LA7ROOT) Q:$QS(LA7ROOT,1)'="LA7-ORM"!($QS(LA7ROOT,2)'=$J)  D
 | 
|---|
| 62 |  . . D XQA^LA7UXQA(3,$QS(LA7ROOT,3),"",$QS(LA7ROOT,4),"",$QS(LA7ROOT,5))
 | 
|---|
| 63 |  ;
 | 
|---|
| 64 |  ; Cleanup shipping config test info used to process orders
 | 
|---|
| 65 |  I $G(LA7MTYP)="ORM" K ^TMP("LA7TC",$J)
 | 
|---|
| 66 |  ;
 | 
|---|
| 67 |  ; If amended results received then send bulletins
 | 
|---|
| 68 |  I $D(^TMP("LA7 AMENDED RESULTS",$J)) D SENDARB^LA7VIN1A
 | 
|---|
| 69 |  ;
 | 
|---|
| 70 |  ; If cancelled orders received then send bulletins
 | 
|---|
| 71 |  I $D(^TMP("LA7 ORDER STATUS",$J)) D SENDOSB^LA7VIN1A
 | 
|---|
| 72 |  ;
 | 
|---|
| 73 |  ; If units/normals changed then send bulletins
 | 
|---|
| 74 |  I $D(^TMP("LA7 UNITS/NORMALS CHANGED",$J)) D SENDUNCB^LA7VIN1A
 | 
|---|
| 75 |  ;
 | 
|---|
| 76 |  ; If abnormal/critical results then send bulletins
 | 
|---|
| 77 |  I $D(^TMP("LA7 ABNORMAL RESULTS",$J)) D SENDACB^LA7VIN1A
 | 
|---|
| 78 |  ;
 | 
|---|
| 79 |  D KILLMSH
 | 
|---|
| 80 |  ;
 | 
|---|
| 81 |  Q
 | 
|---|
| 82 |  ;
 | 
|---|
| 83 |  ;
 | 
|---|
| 84 | MSA ;; Process MSA segment
 | 
|---|
| 85 |  ;
 | 
|---|
| 86 |  D KILLMSA
 | 
|---|
| 87 |  ;
 | 
|---|
| 88 |  D MSA^LA7VIN3
 | 
|---|
| 89 |  ;
 | 
|---|
| 90 |  ; Set sequence flag
 | 
|---|
| 91 |  S LA7SEQ=5
 | 
|---|
| 92 |  Q
 | 
|---|
| 93 |  ;
 | 
|---|
| 94 |  ;
 | 
|---|
| 95 | BSH ;; Process various HL7 header segments
 | 
|---|
| 96 | FSH ;;
 | 
|---|
| 97 | MSH ;;
 | 
|---|
| 98 |  D KILLMSH
 | 
|---|
| 99 |  ;
 | 
|---|
| 100 |  D MSH^LA7VIN2
 | 
|---|
| 101 |  ;
 | 
|---|
| 102 |  ; Set sequence flag
 | 
|---|
| 103 |  S LA7SEQ=1
 | 
|---|
| 104 |  Q
 | 
|---|
| 105 |  ;
 | 
|---|
| 106 |  ;
 | 
|---|
| 107 | NTE ;; Process NTE segment
 | 
|---|
| 108 |  ;
 | 
|---|
| 109 |  I LA7SEQ<30 D  Q
 | 
|---|
| 110 |  . ; Put code to log error - no OBR/OBX segment
 | 
|---|
| 111 |  ;
 | 
|---|
| 112 |  ; Flag set that there was problem with OBR segment,
 | 
|---|
| 113 |  ; skip associated NTE segments that follow OBR/OBX segments
 | 
|---|
| 114 |  I LA7QUIT=2 Q
 | 
|---|
| 115 |  ;
 | 
|---|
| 116 |  I LA7MTYP="ORU" D NTE^LA7VIN2
 | 
|---|
| 117 |  I LA7MTYP="ORM" D NTE^LA7VIN2
 | 
|---|
| 118 |  I LA7MTYP="ORR" D NTE^LA7VIN2
 | 
|---|
| 119 |  ;
 | 
|---|
| 120 |  Q
 | 
|---|
| 121 |  ;
 | 
|---|
| 122 |  ;
 | 
|---|
| 123 | OBR ;; Process OBR segment
 | 
|---|
| 124 |  ;
 | 
|---|
| 125 |  D KILLOBR
 | 
|---|
| 126 |  ;
 | 
|---|
| 127 |  ; Clear flag to process this segment
 | 
|---|
| 128 |  I LA7QUIT=2 S LA7QUIT=0
 | 
|---|
| 129 |  ;
 | 
|---|
| 130 |  ; If not UI interface and no PID segment
 | 
|---|
| 131 |  I LA7INTYP'=1,LA7SEQ<10 D  Q
 | 
|---|
| 132 |  . S (LA7ABORT,LA7ERR)=46
 | 
|---|
| 133 |  . D CREATE^LA7LOG(LA7ERR)
 | 
|---|
| 134 |  ;
 | 
|---|
| 135 |  I LA7MTYP="ORR" D OBR^LA7VIN4
 | 
|---|
| 136 |  I LA7MTYP="ORU" D OBR^LA7VIN4
 | 
|---|
| 137 |  I LA7MTYP="ORM" D OBR^LA7VORM
 | 
|---|
| 138 |  ;
 | 
|---|
| 139 |  ; Set sequence flag
 | 
|---|
| 140 |  S LA7SEQ=30
 | 
|---|
| 141 |  Q
 | 
|---|
| 142 |  ;
 | 
|---|
| 143 |  ;
 | 
|---|
| 144 | OBX ;; Process OBX segment
 | 
|---|
| 145 |  ;
 | 
|---|
| 146 |  D KILLOBX
 | 
|---|
| 147 |  ;
 | 
|---|
| 148 |  ; No OBR segment, can't process OBX
 | 
|---|
| 149 |  I LA7SEQ<30 D  Q
 | 
|---|
| 150 |  . S (LA7ABORT,LA7ERR)=9
 | 
|---|
| 151 |  . D CREATE^LA7LOG(LA7ERR)
 | 
|---|
| 152 |  ;
 | 
|---|
| 153 |  ; Flag set that there was problem with OBR segment,
 | 
|---|
| 154 |  ; skip associated OBX segments that follow OBR segment
 | 
|---|
| 155 |  I LA7QUIT=2 Q
 | 
|---|
| 156 |  ;
 | 
|---|
| 157 |  ; Process result messages (ORU).
 | 
|---|
| 158 |  I LA7MTYP="ORU" D
 | 
|---|
| 159 |  . ; Process "CH" subscript results.
 | 
|---|
| 160 |  . I $G(LA7SS)="CH" D
 | 
|---|
| 161 |  . . I '$G(LA7ISQN) Q  ; No place to store results
 | 
|---|
| 162 |  . . D OBX^LA7VIN5
 | 
|---|
| 163 |  . ;
 | 
|---|
| 164 |  . ; Process "AP" subscript results.
 | 
|---|
| 165 |  . ;I $G(LA7SS)="AP",$L($T(OBX^LA7VIN6)) D OBX^LA7VIN6
 | 
|---|
| 166 |  . ;
 | 
|---|
| 167 |  . ; Process "MI" subscript results.
 | 
|---|
| 168 |  . ;I $G(LA7SS)="MI" D OBX^LA7VIN7
 | 
|---|
| 169 |  . ;
 | 
|---|
| 170 |  . ; Process "BB" subscript results.
 | 
|---|
| 171 |  . ;I $G(LA7SS)="BB",$L($T(OBX^LA7VIN8)) D OBX^LA7VIN8
 | 
|---|
| 172 |  . ;
 | 
|---|
| 173 |  . ; Update test status on manifest
 | 
|---|
| 174 |  . I $G(LA7628),LA7UID'="",$G(LA7OTST) D UTS^LA7VHLU1(LA7628,LA7UID,LA7OTST)
 | 
|---|
| 175 |  ;
 | 
|---|
| 176 |  ; Process results that accompany orders
 | 
|---|
| 177 |  I LA7MTYP="ORM" D OBX^LA7VIN5
 | 
|---|
| 178 |  ;
 | 
|---|
| 179 |  ; Set sequence flag
 | 
|---|
| 180 |  S LA7SEQ=40
 | 
|---|
| 181 |  Q
 | 
|---|
| 182 |  ;
 | 
|---|
| 183 |  ;
 | 
|---|
| 184 | ORC ;; Process ORC segment
 | 
|---|
| 185 |  ;
 | 
|---|
| 186 |  D KILLORC
 | 
|---|
| 187 |  ;
 | 
|---|
| 188 |  ; If not UI interface and no PID segment
 | 
|---|
| 189 |  I LA7INTYP'=1,LA7SEQ<10 D  Q
 | 
|---|
| 190 |  . S (LA7ABORT,LA7ERR)=46
 | 
|---|
| 191 |  . D CREATE^LA7LOG(LA7ERR)
 | 
|---|
| 192 |  ;
 | 
|---|
| 193 |  D ORC^LA7VIN2
 | 
|---|
| 194 |  ;
 | 
|---|
| 195 |  ; Set sequence flag
 | 
|---|
| 196 |  S LA7SEQ=20
 | 
|---|
| 197 |  Q
 | 
|---|
| 198 |  ;
 | 
|---|
| 199 |  ;
 | 
|---|
| 200 | PID ;; Process PID segment
 | 
|---|
| 201 |  ;
 | 
|---|
| 202 |  D KILLPID
 | 
|---|
| 203 |  ;
 | 
|---|
| 204 |  ; no MSH segment
 | 
|---|
| 205 |  I LA7SEQ<1 D  Q
 | 
|---|
| 206 |  . S (LA7ABORT,LA7ERR)=7
 | 
|---|
| 207 |  . D CREATE^LA7LOG(LA7ERR)
 | 
|---|
| 208 |  ;
 | 
|---|
| 209 |  ; Clear flag to process this segment
 | 
|---|
| 210 |  I LA7QUIT=1 S LA7QUIT=0
 | 
|---|
| 211 |  ;
 | 
|---|
| 212 |  D PID^LA7VIN2
 | 
|---|
| 213 |  ;
 | 
|---|
| 214 |  ; Set sequence flag
 | 
|---|
| 215 |  S LA7SEQ=10
 | 
|---|
| 216 |  Q
 | 
|---|
| 217 |  ;
 | 
|---|
| 218 |  ;
 | 
|---|
| 219 | PV1 ;; Process PV1 segment
 | 
|---|
| 220 |  ;
 | 
|---|
| 221 |  D KILLPV1
 | 
|---|
| 222 |  ;
 | 
|---|
| 223 |  ; no PID segment
 | 
|---|
| 224 |  I LA7SEQ<10 D  Q
 | 
|---|
| 225 |  . S (LA7ABORT,LA7ERR)=46
 | 
|---|
| 226 |  . D CREATE^LA7LOG(LA7ERR)
 | 
|---|
| 227 |  ;
 | 
|---|
| 228 |  D PV1^LA7VIN2
 | 
|---|
| 229 |  ;
 | 
|---|
| 230 |  ; Set sequence flag
 | 
|---|
| 231 |  S LA7SEQ=11
 | 
|---|
| 232 |  Q
 | 
|---|
| 233 |  ;
 | 
|---|
| 234 |  ;
 | 
|---|
| 235 |  ; The section below is designed to clean up variables that are created
 | 
|---|
| 236 |  ; during the processing of a segment type and any created by processing
 | 
|---|
| 237 |  ; of segments that are within the message definition.
 | 
|---|
| 238 |  ;
 | 
|---|
| 239 | KILLMSH ; Clean up variables used by MSH and following segments
 | 
|---|
| 240 |  K LA7CSITE,LA7CS,LA7ECH,LA7FS,LA7HLV,LA7MEDT,LA7MID,LA7MTYP
 | 
|---|
| 241 |  K LA7RAP,LA7RFAC,LA7SAP,LA7SEQ,LA7SFAC
 | 
|---|
| 242 |  K ^TMP("LA7-ID",$J),^TMP("LA7-ORM",$J),^TMP("LA7-ORU",$J)
 | 
|---|
| 243 |  ;
 | 
|---|
| 244 | KILLMSA ; Clean up variables used by MSA and following segments
 | 
|---|
| 245 |  K LA7MSATM
 | 
|---|
| 246 |  ;
 | 
|---|
| 247 | KILLPID ; Clean up variables used by PID and following segments
 | 
|---|
| 248 |  K DFN
 | 
|---|
| 249 |  K LA7DOB,LA7ICN,LA7PNM,LA7PRACE,LA7PTID2,LA7PTID3,LA7PTID4
 | 
|---|
| 250 |  K LA7SEX,LA7SPID,LA7SSN
 | 
|---|
| 251 |  K LRDFN,LRTDFN
 | 
|---|
| 252 |  ;
 | 
|---|
| 253 | KILLPV1 ; Clean up variables used by PV1 and following segments
 | 
|---|
| 254 |  K LA7LOC,LA7SPV1
 | 
|---|
| 255 |  ;
 | 
|---|
| 256 | KILLORC ; Clean up variables used by ORC and following segments
 | 
|---|
| 257 |  K LA7628,LA7629
 | 
|---|
| 258 |  K LA7CSITE,LA7DUR,LA7DURU,LA7ODUR,LA7ODURU,LA7EOL,LA7OCR,LA7ORDT
 | 
|---|
| 259 |  K LA7OTYPE,LA7OUR,LA7PEB,LA7PON,LA7POP,LA7PVB,LA7SM
 | 
|---|
| 260 |  ;
 | 
|---|
| 261 | KILLOBR ; Clean up variables used by OBR and following segments
 | 
|---|
| 262 |  K LA70070,LA760,LA761,LA762,LA7624,LA7696
 | 
|---|
| 263 |  K LA7AA,LA7AD,LA7ACC,LA7AN,LA7CDT,LA7FID,LA7ISQN,LA7LWL,LA7ONLT,LA7OTST
 | 
|---|
| 264 |  K LA7POC,LA7SAC,LA7SID,LA7SOBR,LA7SPEC,LA7SPTY,LA7SS,LA7UID,LA7UR
 | 
|---|
| 265 |  ;
 | 
|---|
| 266 | KILLOBX ; Clean up variables used by OBX and following segments
 | 
|---|
| 267 |  K LA7ORS,LA7RLNC,LA7RMK,LA7RNLT,LA7RO,LA7SOBX
 | 
|---|
| 268 |  ;
 | 
|---|
| 269 | KILLBLG ;Clean up variables used by BLG and following segments
 | 
|---|
| 270 |  ;
 | 
|---|
| 271 |  Q
 | 
|---|