| [613] | 1 | LA7VHLU ;DALOI/JMC - HL7 segment builder utility ; 11-25-1998
 | 
|---|
 | 2 |  ;;5.2;AUTOMATED LAB INSTRUMENTS;**46,62,64**;Sep 27, 1994
 | 
|---|
 | 3 |  ;
 | 
|---|
 | 4 |  ; Reference to PROTOCOL file (#101) supported by DBIA #872
 | 
|---|
 | 5 |  ;
 | 
|---|
 | 6 | STARTMSG(LA7EVNT,LA76249) ; Create/initialize HL message
 | 
|---|
 | 7 |  ;
 | 
|---|
 | 8 |  ; Call with LA7EVNT = Lab event protocol in file (#101)
 | 
|---|
 | 9 |  ;           LA76249 = if entry already exists, do not create new entry
 | 
|---|
 | 10 |  ;
 | 
|---|
 | 11 |  N LA7MSH,X
 | 
|---|
 | 12 |  ;
 | 
|---|
 | 13 |  S LA76249=+$G(LA76249)
 | 
|---|
 | 14 |  D INITHL(LA7EVNT)
 | 
|---|
 | 15 |  I LA76249<1 S LA76249=$$INIT6249^LA7VHLU
 | 
|---|
 | 16 |  I $G(HL) D  Q
 | 
|---|
 | 17 |  . N LA7X
 | 
|---|
 | 18 |  . S LA7X(1)=LA76249,LA7X(2)=$TR(HL,"^","-")
 | 
|---|
 | 19 |  . D CREATE^LA7LOG(28)
 | 
|---|
 | 20 |  S X="MSH"_LA7FS_LA7ECH_LA7FS_HL("SAN")_LA7FS_HL("SAF")_LA7FS
 | 
|---|
 | 21 |  S $P(X,LA7FS,9)=HL("MTN")_$E(LA7ECH,1)_HL("ETN")
 | 
|---|
 | 22 |  S $P(X,LA7FS,11)=HL("PID")
 | 
|---|
 | 23 |  S $P(X,LA7FS,12)=HL("VER")
 | 
|---|
 | 24 |  S:$D(HL("ACAT")) $P(X,LA7FS,15)=HL("ACAT")
 | 
|---|
 | 25 |  S:$D(HL("APAT")) $P(X,LA7FS,16)=HL("APAT")
 | 
|---|
 | 26 |  S LA7MSH(0)=X
 | 
|---|
 | 27 |  D FILE6249^LA7VHLU(LA76249,.LA7MSH)
 | 
|---|
 | 28 |  ;
 | 
|---|
 | 29 |  Q
 | 
|---|
 | 30 |  ;
 | 
|---|
 | 31 | INITHL(LA7EVNT) ; Initialize HL environment
 | 
|---|
 | 32 |  ;
 | 
|---|
 | 33 |  ; Call with LA7EVNT = Lab event protocol in file (#101)
 | 
|---|
 | 34 |  ; HL7 v1.6 interface
 | 
|---|
 | 35 |  ; LA7101 - IEN of event protocol
 | 
|---|
 | 36 |  ; HL  - array of output parameters
 | 
|---|
 | 37 |  ; INT - DHCP-to-DHCP only
 | 
|---|
 | 38 |  ;
 | 
|---|
 | 39 |  K ^TMP("HLS",$J)
 | 
|---|
 | 40 |  K HL,HLCOMP,HLSUB,HLFS,HLERR,HLMID
 | 
|---|
 | 41 |  ;
 | 
|---|
 | 42 |  S LA7101=$O(^ORD(101,"B",LA7EVNT,0))
 | 
|---|
 | 43 |  D INIT^HLFNC2(LA7101,.HL,0)
 | 
|---|
 | 44 |  S (LA7FS,HLFS)=$G(HL("FS"))
 | 
|---|
 | 45 |  S (LA7ECH,HLECH)=$G(HL("ECH"))
 | 
|---|
 | 46 |  S HLCOMP=$E($G(HL("ECH")),1)
 | 
|---|
 | 47 |  S HLSUB=$E($G(HL("ECH")),4)
 | 
|---|
 | 48 |  Q
 | 
|---|
 | 49 |  ;
 | 
|---|
 | 50 |  ;
 | 
|---|
 | 51 | GEN ; Generate HL7 v1.6 message
 | 
|---|
 | 52 |  ; LA7101 - IEN of event protocol
 | 
|---|
 | 53 |  ; HLARYTYP - array type
 | 
|---|
 | 54 |  ; HLFORMAT - HLMA formatted/not formatted
 | 
|---|
 | 55 |  ; HLMTIEN - IEN in 772 (batch messages)
 | 
|---|
 | 56 |  ; HLRESLT = message ID^error code^error description
 | 
|---|
 | 57 |  ; HLP("CONTPTR") - continuation pointer field value
 | 
|---|
 | 58 |  ; HLP("PRIORITY") - priority field value
 | 
|---|
 | 59 |  ; HLP("NAMESPACE") - package namespace
 | 
|---|
 | 60 |  ; 
 | 
|---|
 | 61 |  N HLEID,HLARYTYP,HLFORMAT,HLMTIEN,HLRESLT,I
 | 
|---|
 | 62 |  S HLEID=LA7101,HLARYTYP="GM",HLFORMAT=1,HLMTIEN="",HLRESLT=""
 | 
|---|
 | 63 |  S HLP("NAMESPACE")="LA"
 | 
|---|
 | 64 |  D GENERATE^HLMA(HLEID,HLARYTYP,HLFORMAT,.HLRESLT,HLMTIEN,.HLP)
 | 
|---|
 | 65 |  K LA7MID M LA7MID=HLRESLT
 | 
|---|
 | 66 |  I $P(HLRESLT,"^",2)'="" D CREATE^LA7LOG(23)
 | 
|---|
 | 67 |  I $O(LA7MID(0)) D
 | 
|---|
 | 68 |  . S I=0
 | 
|---|
 | 69 |  . F  S I=$O(LA7MID(I)) Q:'I  I $L($P(LA7MID,"^",2)) S HLRESLT=LA7MID(I) D CREATE^LA7LOG(23)
 | 
|---|
 | 70 |  K HLP
 | 
|---|
 | 71 |  Q
 | 
|---|
 | 72 |  ;
 | 
|---|
 | 73 |  ;
 | 
|---|
 | 74 | BUILDSEG(LA7ARRAY,LA7DATA,LA7FS) ; Build HL segment
 | 
|---|
 | 75 |  ; Call with LA7ARRAY = array containing fields to build into a segment,
 | 
|---|
 | 76 |  ;                      passed by reference.
 | 
|---|
 | 77 |  ;            LA7DATA = array used to build segment, pass by reference
 | 
|---|
 | 78 |  ;                      used to return built segment.
 | 
|---|
 | 79 |  ;              LA7FS = HL field separator
 | 
|---|
 | 80 |  ;
 | 
|---|
 | 81 |  ; Returns         LA7DATA = array with segment built
 | 
|---|
 | 82 |  ;              LA7DATA(0) = if everything fits on one node
 | 
|---|
 | 83 |  ;         LA7DATA(0,1...) = multiple elements if >245 characters
 | 
|---|
 | 84 |  ;
 | 
|---|
 | 85 |  N LA7I,LA7J,LA7LAST,LA7SUB
 | 
|---|
 | 86 |  ;
 | 
|---|
 | 87 |  K LA7DATA
 | 
|---|
 | 88 |  ;
 | 
|---|
 | 89 |  S LA7FS=$G(LA7FS)
 | 
|---|
 | 90 |  ;
 | 
|---|
 | 91 |  ; Node to store data in array
 | 
|---|
 | 92 |  S LA7SUB=0
 | 
|---|
 | 93 |  ;
 | 
|---|
 | 94 |  ; Last element in array
 | 
|---|
 | 95 |  S LA7LAST=$O(LA7ARRAY(""),-1)
 | 
|---|
 | 96 |  ;
 | 
|---|
 | 97 |  F LA7I=0:1:LA7LAST D
 | 
|---|
 | 98 |  . I ($L($G(LA7DATA(LA7SUB)))+$L($G(LA7ARRAY(LA7I))))>245 S LA7SUB=LA7SUB+1
 | 
|---|
 | 99 |  . I $O(LA7ARRAY(LA7I,""))'="" D
 | 
|---|
 | 100 |  . . S LA7J=""
 | 
|---|
 | 101 |  . . F  S LA7J=$O(LA7ARRAY(LA7I,LA7J)) Q:LA7J=""  D
 | 
|---|
 | 102 |  . . . I ($L($G(LA7DATA(LA7SUB)))+$L($G(LA7ARRAY(LA7I,LA7J))))>245 S LA7SUB=LA7SUB+1
 | 
|---|
 | 103 |  . . . S LA7DATA(LA7SUB)=$G(LA7DATA(LA7SUB))_$G(LA7ARRAY(LA7I,LA7J))
 | 
|---|
 | 104 |  . S LA7DATA(LA7SUB)=$G(LA7DATA(LA7SUB))_$G(LA7ARRAY(LA7I))_LA7FS
 | 
|---|
 | 105 |  Q 
 | 
|---|
 | 106 |  ;
 | 
|---|
 | 107 |  ;
 | 
|---|
 | 108 | FILESEG(LA7ROOT,LA7DATA) ; File HL segment in global
 | 
|---|
 | 109 |  ; Call with  LA7ROOT = global root used to store HL segment
 | 
|---|
 | 110 |  ;            LA7DATA = array with data to file (pass by reference)
 | 
|---|
 | 111 |  ;
 | 
|---|
 | 112 |  N LA7HLSN,LA7I
 | 
|---|
 | 113 |  I $G(LA7ROOT)="" Q  ; no global root passed.
 | 
|---|
 | 114 |  ;
 | 
|---|
 | 115 |  ; get next subscript number
 | 
|---|
 | 116 |  S LA7HLSN=($O(@(LA7ROOT)@(""),-1))+1
 | 
|---|
 | 117 |  ;
 | 
|---|
 | 118 |  ; store first 245 characters of segment
 | 
|---|
 | 119 |  S @LA7ROOT@(LA7HLSN)=$G(LA7DATA(0))
 | 
|---|
 | 120 |  ;
 | 
|---|
 | 121 |  ; if segment >245 characters then store rest of message
 | 
|---|
 | 122 |  S LA7I=0
 | 
|---|
 | 123 |  F  S LA7I=$O(LA7DATA(LA7I)) Q:LA7I=""  S @LA7ROOT@(LA7HLSN,LA7I)=LA7DATA(LA7I)
 | 
|---|
 | 124 |  ;
 | 
|---|
 | 125 |  Q
 | 
|---|
 | 126 |  ;
 | 
|---|
 | 127 |  ;
 | 
|---|
 | 128 | INIT6249() ; Create stub entry in file #62.49
 | 
|---|
 | 129 |  ; Returns ien of entry in #62.49 that was created
 | 
|---|
 | 130 |  ; NOTE: set lock on entry in #62.49, does not release it.
 | 
|---|
 | 131 |  ;       calling process should release lock
 | 
|---|
 | 132 |  ;
 | 
|---|
 | 133 |  N LA7ERR,LA7FDA,LA7IEN,X,Y
 | 
|---|
 | 134 |  ;
 | 
|---|
 | 135 |  ; Lock zeroth node of file.
 | 
|---|
 | 136 |  L +^LAHM(62.49,0):99999
 | 
|---|
 | 137 |  I '$T Q -1
 | 
|---|
 | 138 |  ;
 | 
|---|
 | 139 |  F LA76249=$P(^LAHM(62.49,0),"^",3):1 Q:'$D(^LAHM(62.49,LA76249))
 | 
|---|
 | 140 |  ; Lock entry in file 62.49 - Calling process is responsible for releasing
 | 
|---|
 | 141 |  ; lock when no longer needed.
 | 
|---|
 | 142 |  L +^LAHM(62.49,LA76249):99999
 | 
|---|
 | 143 |  I '$T Q -1
 | 
|---|
 | 144 |  ;
 | 
|---|
 | 145 |  S LA7DT=$$NOW^XLFDT
 | 
|---|
 | 146 |  S LA7FDA(1,62.49,"+1,",.01)=LA76249 ; message number
 | 
|---|
 | 147 |  S LA7FDA(1,62.49,"+1,",2)="B" ; status =(B)uilding
 | 
|---|
 | 148 |  S LA7FDA(1,62.49,"+1,",4)=LA7DT ; Date/time entered
 | 
|---|
 | 149 |  S LA7IEN(1)=LA76249
 | 
|---|
 | 150 |  D UPDATE^DIE("S","LA7FDA(1)","LA7IEN","LA7ERR")
 | 
|---|
 | 151 |  I $D(LA7ERR) S LA76249=-1
 | 
|---|
 | 152 |  ;
 | 
|---|
 | 153 |  ; Unlock zero node
 | 
|---|
 | 154 |  L -^LAHM(62.49,0)
 | 
|---|
 | 155 |  Q LA76249
 | 
|---|
 | 156 |  ;
 | 
|---|
 | 157 |  ;
 | 
|---|
 | 158 | FILE6249(LA76249,LA7DATA) ; File HL segment in LAHM(62.49) global
 | 
|---|
 | 159 |  ; Call with  LA76249 = ien of entry in file # 62.49
 | 
|---|
 | 160 |  ;            LA7DATA = array with data to file (pass by reference)
 | 
|---|
 | 161 |  ;
 | 
|---|
 | 162 |  N LA7I,LA7J,LA7WP
 | 
|---|
 | 163 |  I '$G(LA76249) Q  ; no entry passed.
 | 
|---|
 | 164 |  ;
 | 
|---|
 | 165 |  ; move data in positive number subscripts
 | 
|---|
 | 166 |  S LA7I="",LA7J=0
 | 
|---|
 | 167 |  F  S LA7I=$O(LA7DATA(LA7I)) Q:LA7I=""  D
 | 
|---|
 | 168 |  . S LA7J=LA7J+1
 | 
|---|
 | 169 |  . S LA7WP(LA7J)=LA7DATA(LA7I)
 | 
|---|
 | 170 |  ;
 | 
|---|
 | 171 |  ; set blank line which separates each segment
 | 
|---|
 | 172 |  S LA7WP(LA7J+1)=""
 | 
|---|
 | 173 |  ;
 | 
|---|
 | 174 |  ; file data
 | 
|---|
 | 175 |  D WP^DIE(62.49,LA76249_",",150,"A","LA7WP")
 | 
|---|
 | 176 |  Q
 | 
|---|
 | 177 |  ;
 | 
|---|
 | 178 |  ;
 | 
|---|
 | 179 | P(LA7X,LA7P,LA7EC) ; get field LA7P from array (passed by ref.)
 | 
|---|
 | 180 |  ; Call with  LA7X = array to extract data from, pass by reference.
 | 
|---|
 | 181 |  ;            LA7P = field to extract
 | 
|---|
 | 182 |  ;           LA7EC = encoding character separator
 | 
|---|
 | 183 |  ;
 | 
|---|
 | 184 |  ; Returns LA7Y = value of requested piece
 | 
|---|
 | 185 |  ;
 | 
|---|
 | 186 |  N I,L,LA7Y,L1,Y
 | 
|---|
 | 187 |  S L=0,Y=1,LA7Y=""
 | 
|---|
 | 188 |  ;Y=begining piece of each node, L1=number of pieces in each node
 | 
|---|
 | 189 |  ;L=last piece in each node, quit when last piece is greater than LA7P
 | 
|---|
 | 190 |  F I=0:1 Q:'$D(LA7X(I))  S L1=$L(LA7X(I),LA7EC),L=L1+Y-1 D  Q:Y>LA7P
 | 
|---|
 | 191 |  . ;if LA7P is less than last piece, this node has field you want
 | 
|---|
 | 192 |  . S:LA7P'>L LA7Y=LA7Y_$P(LA7X(I),LA7EC,(LA7P-Y+1))
 | 
|---|
 | 193 |  . S Y=L
 | 
|---|
 | 194 |  Q LA7Y
 | 
|---|
 | 195 |  ;
 | 
|---|
 | 196 |  ;
 | 
|---|
 | 197 | PA(LA7X,LA7P,LA7EC,LA7Y) ; get field LA7P from array (passed by ref.)
 | 
|---|
 | 198 |  ; Call with  LA7X = array to extract data from, pass by reference.
 | 
|---|
 | 199 |  ;            LA7P = field to extract
 | 
|---|
 | 200 |  ;           LA7EC = encoding character separator
 | 
|---|
 | 201 |  ;
 | 
|---|
 | 202 |  ; Returns LA7Y = array value of requested piece (returned by reference)
 | 
|---|
 | 203 |  ;
 | 
|---|
 | 204 |  N I,L,L1,X,Y
 | 
|---|
 | 205 |  S (L,LA7Y)=0,Y=1
 | 
|---|
 | 206 |  ;Y=begining piece of each node, L1=number of pieces in each node
 | 
|---|
 | 207 |  ;L=last piece in each node, quit when last piece is greater than LA7P
 | 
|---|
 | 208 |  F I=0:1 Q:'$D(LA7X(I))  S L1=$L(LA7X(I),LA7EC),L=L1+Y-1 D  Q:Y>LA7P
 | 
|---|
 | 209 |  . ;if LA7P is less than last piece, this node has field you want
 | 
|---|
 | 210 |  . I LA7P'>L S X=$P(LA7X(I),LA7EC,(LA7P-Y+1)) S:X]"" LA7Y=LA7Y+1,LA7Y(LA7Y)=X
 | 
|---|
 | 211 |  . S Y=L
 | 
|---|
 | 212 |  Q
 | 
|---|
 | 213 |  ;
 | 
|---|
 | 214 |  ;
 | 
|---|
 | 215 | BLG(LA7ACTN,LA7CHGTY,LA7FS,LA7ECH) ; Build BLG segment -  billing information
 | 
|---|
 | 216 |  ; Call with  LA7ACTN = billing account Number
 | 
|---|
 | 217 |  ;           LA7CHGTY = charge type
 | 
|---|
 | 218 |  ;             LA7ECH = HL encoding characters
 | 
|---|
 | 219 |  ;
 | 
|---|
 | 220 |  ; Returns LA7Y
 | 
|---|
 | 221 |  ;
 | 
|---|
 | 222 |  ; Default to CO (contract) for charge type - table 0122
 | 
|---|
 | 223 |  S LA7CHGTY=$G(LA7CHGTY,"CO")
 | 
|---|
 | 224 |  S LA7Y="BLG"_LA7FS_LA7FS_LA7CHGTY_LA7FS_$$M11^HLFNC(LA7ACTN,LA7ECH)_LA7FS
 | 
|---|
 | 225 |  Q LA7Y
 | 
|---|
 | 226 |  ;
 | 
|---|
 | 227 |  ;
 | 
|---|
 | 228 | PTEXTID(LA74,LA7UID,LA7Y) ; Retrieve patient's id that was transmitted by other system.
 | 
|---|
 | 229 |  ; Used to build PID-2 when returning results to placer.
 | 
|---|
 | 230 |  ; Looks in file LAB PENDING ORDERS (#69.6) for info pertaining to placer's order.
 | 
|---|
 | 231 |  ; Call with  LA74 = ien of placer in INSTITUTION file (#4)
 | 
|---|
 | 232 |  ;          LA7UID = placer's specimen identifier (UID, etc.)
 | 
|---|
 | 233 |  ;
 | 
|---|
 | 234 |  ; Returns array LA7Y by reference
 | 
|---|
 | 235 |  ;               LA7Y("FS")  - original field separator
 | 
|---|
 | 236 |  ;               LA7Y("ECH") - original encoding characters used
 | 
|---|
 | 237 |  ;             LA7Y("PID-2") - original PID-2 sequence
 | 
|---|
 | 238 |  ;             LA7Y("PID-4") - original PID-4 sequence
 | 
|---|
 | 239 |  ;
 | 
|---|
 | 240 |  N LA7696,LA7X
 | 
|---|
 | 241 |  ;
 | 
|---|
 | 242 |  S LA74=$G(LA74),LA7UID=$G(LA7UID),LA7Y=""
 | 
|---|
 | 243 |  ;
 | 
|---|
 | 244 |  ; Return null if no values passed
 | 
|---|
 | 245 |  I LA74<1!(LA7UID="") Q
 | 
|---|
 | 246 |  ;
 | 
|---|
 | 247 |  S LA7696=$O(^LRO(69.6,"RST",LA74,LA7UID,0))
 | 
|---|
 | 248 |  I LA7696 D
 | 
|---|
 | 249 |  . S LA7X=$G(^LRO(69.6,LA7696,700))
 | 
|---|
 | 250 |  . S LA7Y("FS")=$E(LA7X,1)
 | 
|---|
 | 251 |  . S LA7Y("ECH")=$E(LA7X,2,5)
 | 
|---|
 | 252 |  . S LA7Y("PID-2")=$G(^LRO(69.6,LA7696,700.02))
 | 
|---|
 | 253 |  . S LA7Y("PID-4")=$G(^LRO(69.6,LA7696,700.04))
 | 
|---|
 | 254 |  Q
 | 
|---|
 | 255 |  ;
 | 
|---|
 | 256 |  ;
 | 
|---|
 | 257 | RETOBR(LA74,LA7UID,LA7NLT,LA7Y) ; Retrieve placer's various OBR's that were transmitted by other system.
 | 
|---|
 | 258 |  ; Used to build OBR-4/17/18 when returning results to placer.
 | 
|---|
 | 259 |  ; Looks in file LAB PENDING ORDERS (#69.6) for info pertaining to placer's order.
 | 
|---|
 | 260 |  ;
 | 
|---|
 | 261 |  ; Call with   LA74 = ien of placer in INSTITUTION file (#4)
 | 
|---|
 | 262 |  ;           LA7UID = placer's specimen identifier (UID, accession number, etc.)
 | 
|---|
 | 263 |  ;           LA7NLT = ordered NLT test code
 | 
|---|
 | 264 |  ;
 | 
|---|
 | 265 |  ; Returns array LA7Y by reference
 | 
|---|
 | 266 |  ;               LA7Y("FS")     - original field separator
 | 
|---|
 | 267 |  ;               LA7Y("ECH")    - original encoding characters used
 | 
|---|
 | 268 |  ;               LA7Y("OBR-4")  - original OBR-4 sequence
 | 
|---|
 | 269 |  ;               LA7Y("OBR-18") - original OBR-18 sequence
 | 
|---|
 | 270 |  ;               LA7Y("OBR-19") - original OBR-19 sequence
 | 
|---|
 | 271 |  ;
 | 
|---|
 | 272 |  N LA7696,LA76964,LA7X
 | 
|---|
 | 273 |  ;
 | 
|---|
 | 274 |  S LA74=$G(LA74),LA7UID=$G(LA7UID),LA7Y=""
 | 
|---|
 | 275 |  ;
 | 
|---|
 | 276 |  ; Return null if no values passed
 | 
|---|
 | 277 |  I LA74<1!(LA7UID="")!(LA7NLT="") Q
 | 
|---|
 | 278 |  ;
 | 
|---|
 | 279 |  S LA7696=$O(^LRO(69.6,"RST",LA74,LA7UID,0))
 | 
|---|
 | 280 |  I LA7696<1 Q
 | 
|---|
 | 281 |  ;
 | 
|---|
 | 282 |  S LA7X=$G(^LRO(69.6,LA7696,700))
 | 
|---|
 | 283 |  S LA7Y("FS")=$E(LA7X,1)
 | 
|---|
 | 284 |  S LA7Y("ECH")=$E(LA7X,2,5)
 | 
|---|
 | 285 |  ;
 | 
|---|
 | 286 |  S LA76964=$O(^LRO(69.6,LA7696,2,"C",LA7NLT,0))
 | 
|---|
 | 287 |  I LA76964<1 Q
 | 
|---|
 | 288 |  ;
 | 
|---|
 | 289 |  S LA7Y("OBR-4")=$G(^LRO(69.6,LA7696,2,LA76964,700.04))
 | 
|---|
 | 290 |  S LA7Y("OBR-18")=$G(^LRO(69.6,LA7696,2,LA76964,700.18))
 | 
|---|
 | 291 |  S LA7Y("OBR-19")=$G(^LRO(69.6,LA7696,2,LA76964,700.19))
 | 
|---|
 | 292 |  ;
 | 
|---|
 | 293 |  Q
 | 
|---|