| 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 | 
|---|